mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-02 13:00:26 +02:00
avoid 8 words of allocation per lambda, whoooo
* libguile/objcodes.c (scm_bytecode_to_objcode): Check that the length of the vector matches the length embedded in the bytecode. * libguile/programs.c (scm_program_meta): Call through to scm_objcode_meta, instead of looking in the object table. Avoids consing up a program+objcode slice for the meta until the meta is actually called. * libguile/vm-i-loader.c (load-program): Step past the metadata too. * module/language/glil/compile-assembly.scm (make-meta): Just return the load-program form, or #f. (assoc-ref-or-acons, object-index-and-alist, make-object-table): Don't write the meta into the object table. (glil->assembly): Instead write the meta into the load-program form.
This commit is contained in:
parent
1f1ec13b5c
commit
ac47d5f639
4 changed files with 29 additions and 29 deletions
|
@ -190,14 +190,17 @@ SCM_DEFINE (scm_bytecode_to_objcode, "bytecode->objcode", 1, 0, 0,
|
|||
data = (struct scm_objcode*)c_bytecode;
|
||||
SCM_NEWSMOB2 (objcode, scm_tc16_objcode, data, bytecode);
|
||||
scm_array_handle_release (&handle);
|
||||
|
||||
SCM_ASSERT_RANGE (0, bytecode, size >= sizeof(struct scm_objcode));
|
||||
if (data->len + data->metalen != (size - sizeof (*data)))
|
||||
scm_misc_error (FUNC_NAME, "bad u8vector size (~a != ~a)",
|
||||
SCM_LIST2 (scm_from_size_t (size),
|
||||
scm_from_uint32 (sizeof (*data) + data->len + data->metalen)));
|
||||
assert (increment == 1);
|
||||
SCM_ASSERT_RANGE (0, bytecode, size < 1<<31);
|
||||
SCM_ASSERT_RANGE (0, bytecode, size >= sizeof(*data));
|
||||
SCM_SET_SMOB_FLAGS (objcode, SCM_F_OBJCODE_IS_U8VECTOR);
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue