"")
#define FUNC_NAME s_scm_frame_source
{
+ SCM proc;
+
SCM_VALIDATE_VM_FRAME (1, frame);
- return scm_program_source (scm_frame_procedure (frame),
- scm_frame_instruction_pointer (frame),
- SCM_UNDEFINED);
+ proc = scm_frame_procedure (frame);
+
+ if (SCM_PROGRAM_P (proc))
+ return scm_program_source (scm_frame_procedure (frame),
+ scm_frame_instruction_pointer (frame),
+ SCM_UNDEFINED);
+
+ return SCM_BOOL_F;
}
#undef FUNC_NAME
"")
#define FUNC_NAME s_scm_frame_num_locals
{
- SCM *sp, *p;
+ SCM *fp, *sp, *p;
unsigned int n = 0;
SCM_VALIDATE_VM_FRAME (1, frame);
+ fp = SCM_VM_FRAME_FP (frame);
+ sp = SCM_VM_FRAME_SP (frame);
+ p = SCM_FRAME_STACK_ADDRESS (SCM_VM_FRAME_FP (frame));
+
+ if (SCM_RTL_PROGRAM_P (fp[-1]))
+ /* The frame size of an RTL program is fixed, except in the case of
+ passing a wrong number of arguments to the program. So we do
+ need to use an SP for determining the number of locals. */
+ return scm_from_uint32 (sp + 1 - p);
+
sp = SCM_VM_FRAME_SP (frame);
p = SCM_FRAME_STACK_ADDRESS (SCM_VM_FRAME_FP (frame));
while (p <= sp)
"")
#define FUNC_NAME s_scm_frame_instruction_pointer
{
+ SCM program;
const struct scm_objcode *c_objcode;
SCM_VALIDATE_VM_FRAME (1, frame);
+ program = scm_frame_procedure (frame);
+
+ if (!SCM_PROGRAM_P (program))
+ return SCM_INUM0;
- c_objcode = SCM_PROGRAM_DATA (scm_frame_procedure (frame));
+ c_objcode = SCM_PROGRAM_DATA (program);
return scm_from_unsigned_integer ((SCM_VM_FRAME_IP (frame)
- SCM_C_OBJCODE_BASE (c_objcode)));
}
#define FUNC_NAME s_scm_frame_previous
{
SCM *this_fp, *new_fp, *new_sp;
+ SCM proc;
SCM_VALIDATE_VM_FRAME (1, frame);
this_fp = SCM_VM_FRAME_FP (frame);
new_fp = SCM_FRAME_DYNAMIC_LINK (this_fp);
if (new_fp)
- { new_fp = RELOC (frame, new_fp);
+ {
+ new_fp = RELOC (frame, new_fp);
new_sp = SCM_FRAME_LOWER_ADDRESS (this_fp) - 1;
frame = scm_c_make_frame (SCM_VM_FRAME_STACK_HOLDER (frame),
new_fp, new_sp,
SCM_FRAME_RETURN_ADDRESS (this_fp),
SCM_VM_FRAME_OFFSET (frame));
- if (SCM_PROGRAM_IS_BOOT (scm_frame_procedure (frame)))
+ proc = scm_frame_procedure (frame);
+
+ if (SCM_PROGRAM_P (proc) && SCM_PROGRAM_IS_BOOT (proc))
goto again;
else
return frame;