diff options
author | Andy Wingo <wingo@pobox.com> | 2009-02-01 10:15:00 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2009-02-01 10:15:00 +0100 |
commit | 1f1ec13b5c459717b22030565e591f1f713ee39d (patch) | |
tree | 8e404fed86e857fd6a860cfdc9eaae0466dc0bbf /libguile/objcodes.c | |
parent | 9aeaabdc4571b5a2319c88e02904bd8996d5ac01 (diff) | |
download | guile-1f1ec13b5c459717b22030565e591f1f713ee39d.tar.gz |
add code for writing out metadata to the end of a program
* libguile/objcodes.c (make_objcode_by_mmap, scm_c_make_objcode_slice):
Verify the lengths with the meta-length.
(scm_objcode_meta): New procedure, for getting at the meta-info of an
objcode.
(scm_objcode_to_bytecode):
(scm_write_objcode): Write bytecode with the metadata too.
* module/system/vm/objcode.scm: Export object-meta.
* module/language/assembly.scm (byte-length):
* module/language/assembly/compile-bytecode.scm (write-bytecode):
* module/language/assembly/decompile-bytecode.scm (decode-load-program):
* module/language/assembly/disassemble.scm (disassemble-load-program):
* module/language/glil/compile-assembly.scm (glil->assembly):
* test-suite/tests/asm-to-bytecode.test ("compiler"): Change to
load-program format to have meta-or-#f instead of meta-length, so that
we can serialize the meta as objcode without a load-program byte. Add a
test for writing out the meta.
Diffstat (limited to 'libguile/objcodes.c')
-rw-r--r-- | libguile/objcodes.c | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/libguile/objcodes.c b/libguile/objcodes.c index 5796a5486..eb40213e9 100644 --- a/libguile/objcodes.c +++ b/libguile/objcodes.c @@ -92,10 +92,10 @@ make_objcode_by_mmap (int fd) data = (struct scm_objcode*)(addr + strlen (OBJCODE_COOKIE)); - if (data->len != (st.st_size - sizeof (*data) - strlen (OBJCODE_COOKIE))) + if (data->len + data->metalen != (st.st_size - sizeof (*data) - strlen (OBJCODE_COOKIE))) scm_misc_error (FUNC_NAME, "bad length header (~a, ~a)", SCM_LIST2 (scm_from_size_t (st.st_size), - scm_from_uint32 (data->len))); + scm_from_uint32 (sizeof (*data) + data->len + data->metalen))); SCM_NEWSMOB3 (sret, scm_tc16_objcode, addr + strlen (OBJCODE_COOKIE), SCM_PACK (SCM_BOOL_F), fd); @@ -118,14 +118,16 @@ scm_c_make_objcode_slice (SCM parent, scm_t_uint8 *ptr) parent_data = SCM_OBJCODE_DATA (parent); if (ptr < parent_data->base - || ptr >= (parent_data->base + parent_data->len + || ptr >= (parent_data->base + parent_data->len + parent_data->metalen - sizeof (struct scm_objcode))) - scm_misc_error (FUNC_NAME, "offset out of bounds (~a vs ~a)", - SCM_LIST2 (scm_from_ulong ((ulong)ptr), - scm_from_uint32 (parent_data->len))); + scm_misc_error (FUNC_NAME, "offset out of bounds (~a vs ~a + ~a + ~a)", + SCM_LIST4 (scm_from_ulong ((ulong)ptr), + scm_from_ulong ((ulong)parent_data->base), + scm_from_uint32 (parent_data->len), + scm_from_uint32 (parent_data->metalen))); data = (struct scm_objcode*)ptr; - if (data->base + data->len > parent_data->base + parent_data->len) + if (data->base + data->len + data->metalen > parent_data->base + parent_data->len + parent_data->metalen) abort (); SCM_NEWSMOB2 (ret, scm_tc16_objcode, data, parent); @@ -154,6 +156,21 @@ SCM_DEFINE (scm_objcode_p, "objcode?", 1, 0, 0, } #undef FUNC_NAME +SCM_DEFINE (scm_objcode_meta, "objcode-meta", 1, 0, 0, + (SCM objcode), + "") +#define FUNC_NAME s_scm_objcode_meta +{ + SCM_VALIDATE_OBJCODE (1, objcode); + + if (SCM_OBJCODE_META_LEN (objcode) == 0) + return SCM_BOOL_F; + else + return scm_c_make_objcode_slice (objcode, (SCM_OBJCODE_BASE (objcode) + + SCM_OBJCODE_LEN (objcode))); +} +#undef FUNC_NAME + SCM_DEFINE (scm_bytecode_to_objcode, "bytecode->objcode", 1, 0, 0, (SCM bytecode), "") @@ -180,6 +197,7 @@ SCM_DEFINE (scm_bytecode_to_objcode, "bytecode->objcode", 1, 0, 0, /* foolishly, we assume that as long as bytecode is around, that c_bytecode will be of the same length; perhaps a bad assumption? */ + /* FIXME: check length of bytecode */ return objcode; } @@ -214,7 +232,7 @@ SCM_DEFINE (scm_objcode_to_bytecode, "objcode->bytecode", 1, 0, 0, SCM_VALIDATE_OBJCODE (1, objcode); - len = SCM_OBJCODE_DATA (objcode)->len + sizeof(struct scm_objcode); + len = sizeof(struct scm_objcode) + SCM_OBJCODE_TOTAL_LEN (objcode); /* FIXME: Is `gc_malloc' ok here? */ u8vector = scm_gc_malloc (len, "objcode-u8vector"); memcpy (u8vector, SCM_OBJCODE_DATA (objcode), len); @@ -233,7 +251,7 @@ SCM_DEFINE (scm_write_objcode, "write-objcode", 2, 0, 0, scm_c_write (port, OBJCODE_COOKIE, strlen (OBJCODE_COOKIE)); scm_c_write (port, SCM_OBJCODE_DATA (objcode), - SCM_OBJCODE_LEN (objcode) + sizeof (struct scm_objcode)); + sizeof (struct scm_objcode) + SCM_OBJCODE_TOTAL_LEN (objcode)); return SCM_UNSPECIFIED; } |