diff options
author | Andy Wingo <wingo@pobox.com> | 2013-07-21 16:17:59 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2013-07-21 17:12:22 +0200 |
commit | 14d102920fea11039cdae7fe05a2dc56f7e1264a (patch) | |
tree | 1327f1cef81f0356c352478628199649e62029a1 /libguile/vm-engine.c | |
parent | b21713128e84480c9665b288deff41b883ef4905 (diff) | |
download | guile-14d102920fea11039cdae7fe05a2dc56f7e1264a.tar.gz |
add allocate-struct primitive and rtl opcode
* libguile/struct.h:
* libguile/struct.c (scm_allocate_struct): New interface: allocates a
struct.
* libguile/vm-engine.c (allocate_struct): Instead of make-struct with a
rest arg, separate allocation from initialization.
Diffstat (limited to 'libguile/vm-engine.c')
-rw-r--r-- | libguile/vm-engine.c | 47 |
1 files changed, 11 insertions, 36 deletions
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index 822280962..1300a1e5b 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -3090,50 +3090,25 @@ RTL_VM_NAME (SCM vm, SCM program, SCM *argv, size_t nargs_) RETURN (SCM_STRUCT_VTABLE (obj)); } - /* make-struct dst:12 vtable:12 _:8 n-init:24 init0:24 0:8 ... + /* allocate-struct dst:8 vtable:8 nfields:8 * - * Make a new struct with VTABLE, and place it in DST. The struct - * will be constructed with N-INIT initializers, which are located in - * the locals given by INIT0.... The format of INIT0... is as in the - * "call" opcode: unsigned 24-bit values, with 0 in the high byte. + * Allocate a new struct with VTABLE, and place it in DST. The struct + * will be constructed with space for NFIELDS fields, which should + * correspond to the field count of the VTABLE. */ - VM_DEFINE_OP (102, make_struct, "make-struct", OP2 (U8_U12_U12, X8_R24)) -#if 0 + VM_DEFINE_OP (102, allocate_struct, "allocate-struct", OP1 (U8_U8_U8_U8) | OP_DST) { - scm_t_uint16 dst, vtable_r; - scm_t_uint32 n_init, n; - SCM vtable, ret; + scm_t_uint8 dst, vtable, nfields; + SCM ret; - SCM_UNPACK_RTL_12_12 (op, dst, vtable_r); - vtable = LOCAL_REF (vtable_r); - SCM_UNPACK_RTL_24 (ip[1], n_init); + SCM_UNPACK_RTL_8_8_8 (op, dst, vtable, nfields); SYNC_IP (); - - if (SCM_LIKELY (SCM_STRUCTP (vtable) - && SCM_VTABLE_FLAG_IS_SET (vtable, SCM_VTABLE_FLAG_SIMPLE) - && (SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size) - == n_init) - && !SCM_VTABLE_INSTANCE_FINALIZER (vtable))) - { - /* Verily, we are making a simple struct with the right number of - initializers, and no finalizer. */ - ret = scm_words ((scm_t_bits)SCM_STRUCT_DATA (vtable) | scm_tc3_struct, - n_init + 2); - SCM_SET_CELL_WORD_1 (ret, (scm_t_bits)SCM_CELL_OBJECT_LOC (ret, 2)); - - for (n = 0; n < n_init; n++) - SCM_STRUCT_DATA (ret)[n] = SCM_UNPACK (LOCAL_REF (ip[n + 1])); - } - else - ret = scm_c_make_structvs (vtable, fp, &ip[1], n_init); - + ret = scm_allocate_struct (LOCAL_REF (vtable), SCM_I_MAKINUM (nfields)); LOCAL_SET (dst, ret); - NEXT (n_init + 1); + + NEXT (1); } -#else - abort (); -#endif /* struct-ref dst:8 src:8 idx:8 * |