bp = SCM_PROGRAM_DATA (SCM_FRAME_PROGRAM (fp));
return scm_c_program_source (SCM_FRAME_PROGRAM (fp),
- SCM_VM_FRAME_IP (frame) - bp->base);
+ SCM_VM_FRAME_IP (frame)
+ - SCM_C_OBJCODE_BASE (bp));
}
#undef FUNC_NAME
"")
#define FUNC_NAME s_scm_frame_instruction_pointer
{
+ const struct scm_objcode *c_objcode;
+
SCM_VALIDATE_VM_FRAME (1, frame);
+
+ c_objcode = SCM_PROGRAM_DATA (scm_frame_procedure (frame));
return scm_from_ulong ((unsigned long)
(SCM_VM_FRAME_IP (frame)
- - SCM_PROGRAM_DATA (scm_frame_procedure (frame))->base));
+ - SCM_C_OBJCODE_BASE (c_objcode)));
}
#undef FUNC_NAME
#define FUNC_NAME "make-objcode-slice"
{
const struct scm_objcode *data, *parent_data;
+ const scm_t_uint8 *parent_base;
SCM ret;
SCM_VALIDATE_OBJCODE (1, parent);
parent_data = SCM_OBJCODE_DATA (parent);
-
- if (ptr < parent_data->base
- || ptr >= (parent_data->base + parent_data->len + parent_data->metalen
+ parent_base = SCM_C_OBJCODE_BASE (parent_data);
+
+ if (ptr < parent_base
+ || ptr >= (parent_base + parent_data->len + parent_data->metalen
- sizeof (struct scm_objcode)))
scm_misc_error (FUNC_NAME, "offset out of bounds (~a vs ~a + ~a + ~a)",
- scm_list_4 (scm_from_ulong ((unsigned long)ptr),
- scm_from_ulong ((unsigned long)parent_data->base),
+ scm_list_4 (scm_from_ulong ((unsigned long) ptr),
+ scm_from_ulong ((unsigned long) parent_base),
scm_from_uint32 (parent_data->len),
scm_from_uint32 (parent_data->metalen)));
assert ((((scm_t_bits) ptr) &
(alignof_type (struct scm_objcode) - 1UL)) == 0);
- data = (struct scm_objcode*)ptr;
- if (data->base + data->len + data->metalen > parent_data->base + parent_data->len + parent_data->metalen)
- abort ();
+ data = (struct scm_objcode*) ptr;
+ assert (SCM_C_OBJCODE_BASE (data) + data->len + data->metalen
+ <= parent_base + parent_data->len + parent_data->metalen);
SCM_NEWSMOB2 (ret, scm_tc16_objcode, data, parent);
SCM_SET_SMOB_FLAGS (ret, SCM_F_OBJCODE_IS_SLICE);
#include <libguile.h>
-/* objcode data should be directly mappable to this C structure. */
-struct scm_objcode {
+/* Objcode data should be directly mappable to this C structure. */
+struct scm_objcode
+{
scm_t_uint32 len; /* the maximum index of base[] */
scm_t_uint32 metalen; /* well, i lie. this many bytes at the end of
base[] for metadata */
- scm_t_uint8 base[0];
+ /* In C99, we'd have:
+ scm_t_uint8 base[]; */
};
+/* Return a pointer to the base of objcode OBJ. */
+#define SCM_C_OBJCODE_BASE(obj) \
+ ((scm_t_uint8 *)(obj) + sizeof (struct scm_objcode))
+
#define SCM_F_OBJCODE_IS_MMAP (1<<0)
#define SCM_F_OBJCODE_IS_U8VECTOR (1<<1)
#define SCM_F_OBJCODE_IS_SLICE (1<<2)
#define SCM_OBJCODE_LEN(x) (SCM_OBJCODE_DATA (x)->len)
#define SCM_OBJCODE_META_LEN(x) (SCM_OBJCODE_DATA (x)->metalen)
#define SCM_OBJCODE_TOTAL_LEN(x) (SCM_OBJCODE_LEN (x) + SCM_OBJCODE_META_LEN (x))
-#define SCM_OBJCODE_BASE(x) (SCM_OBJCODE_DATA (x)->base)
+#define SCM_OBJCODE_BASE(x) (SCM_C_OBJCODE_BASE (SCM_OBJCODE_DATA (x)))
#define SCM_OBJCODE_IS_MMAP(x) (SCM_SMOB_FLAGS (x) & SCM_F_OBJCODE_IS_MMAP)
#define SCM_OBJCODE_IS_U8VECTOR(x) (SCM_SMOB_FLAGS (x) & SCM_F_OBJCODE_IS_U8VECTOR)
"")
#define FUNC_NAME s_scm_program_base
{
+ const struct scm_objcode *c_objcode;
+
SCM_VALIDATE_PROGRAM (1, program);
- return scm_from_ulong ((unsigned long) SCM_PROGRAM_DATA (program)->base);
+ c_objcode = SCM_PROGRAM_DATA (program);
+ return scm_from_ulong ((unsigned long) SCM_C_OBJCODE_BASE (c_objcode));
}
#undef FUNC_NAME
CACHE_PROGRAM ();
PUSH (program);
fp = sp + 1;
- ip = bp->base;
+ ip = SCM_C_OBJCODE_BASE (bp);
/* MV-call frame, function & arguments */
PUSH ((SCM)fp); /* dynamic link */
PUSH (0); /* mvra */
ASSERT (SCM_FRAME_MV_RETURN_ADDRESS (fp) == 0);
SCM_FRAME_SET_RETURN_ADDRESS (fp, ip);
SCM_FRAME_SET_MV_RETURN_ADDRESS (fp, 0);
- ip = bp->base;
+ ip = SCM_C_OBJCODE_BASE (bp);
ENTER_HOOK ();
APPLY_HOOK ();
NEXT;
NULLSTACK (old_sp - sp);
- ip = bp->base;
+ ip = SCM_C_OBJCODE_BASE (bp);
ENTER_HOOK ();
APPLY_HOOK ();
ASSERT (SCM_FRAME_MV_RETURN_ADDRESS (fp) == 0);
SCM_FRAME_SET_RETURN_ADDRESS (fp, ip);
SCM_FRAME_SET_MV_RETURN_ADDRESS (fp, mvra);
- ip = bp->base;
+ ip = SCM_C_OBJCODE_BASE (bp);
ENTER_HOOK ();
APPLY_HOOK ();
NEXT;
text[1] = (scm_t_uint8)nargs;
bp = scm_malloc (sizeof (struct scm_objcode) + sizeof (text));
- memcpy (bp->base, text, sizeof (text));
+ memcpy (SCM_C_OBJCODE_BASE (bp), text, sizeof (text));
bp->len = sizeof(text);
bp->metalen = 0;