diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/vm_engine.c | 4 | ||||
-rw-r--r-- | src/vm_engine.h | 24 | ||||
-rw-r--r-- | src/vm_loader.c | 6 | ||||
-rw-r--r-- | src/vm_system.c | 2 |
4 files changed, 25 insertions, 11 deletions
diff --git a/src/vm_engine.c b/src/vm_engine.c index 8c93c1de0..aa45971bf 100644 --- a/src/vm_engine.c +++ b/src/vm_engine.c @@ -58,6 +58,7 @@ vm_run (SCM vm, SCM program, SCM args) struct scm_program *bp = NULL; /* program base pointer */ SCM external = SCM_EOL; /* external environment */ SCM *objects = NULL; /* constant objects */ + scm_t_array_handle objects_handle; /* handle of the OBJECTS array */ size_t object_count; /* length of OBJECTS */ SCM *stack_base = vp->stack_base; /* stack base address */ SCM *stack_limit = vp->stack_limit; /* stack limit address */ @@ -178,6 +179,9 @@ vm_run (SCM vm, SCM program, SCM args) vm_error: SYNC_ALL (); + if (objects) + scm_array_handle_release (&objects_handle); + vp->last_frame = vm_heapify_frames (vm); scm_ithrow (sym_vm_error, SCM_LIST3 (sym_vm_run, err_msg, err_args), 1); } diff --git a/src/vm_engine.h b/src/vm_engine.h index ac12caabe..02b719375 100644 --- a/src/vm_engine.h +++ b/src/vm_engine.h @@ -134,16 +134,20 @@ /* Get a local copy of the program's "object table" (i.e. the vector of external bindings that are referenced by the program), initialized by `load-program'. */ -#define CACHE_PROGRAM() \ -{ \ - ssize_t _vincr; \ - scm_t_array_handle _vhandle; \ - \ - bp = SCM_PROGRAM_DATA (program); \ - /* Was: objects = SCM_VELTS (bp->objs); */ \ - objects = scm_vector_elements (bp->objs, &_vhandle, \ - &object_count, &_vincr); \ - scm_array_handle_release (&_vhandle); \ +/* XXX: We could instead use the "simple vector macros", thus not having to + call `scm_vector_writable_elements ()' and the likes. */ +#define CACHE_PROGRAM() \ +{ \ + ssize_t _vincr; \ + \ + bp = SCM_PROGRAM_DATA (program); \ + /* Was: objects = SCM_VELTS (bp->objs); */ \ + \ + if (objects) \ + scm_array_handle_release (&objects_handle); \ + \ + objects = scm_vector_writable_elements (bp->objs, &objects_handle, \ + &object_count, &_vincr); \ } #define SYNC_BEFORE_GC() \ diff --git a/src/vm_loader.c b/src/vm_loader.c index 59aae86a2..e8eaec122 100644 --- a/src/vm_loader.c +++ b/src/vm_loader.c @@ -132,6 +132,12 @@ VM_DEFINE_LOADER (load_program, "load-program") /* init object table */ if (scm_is_vector (x)) { +#if 0 + if (scm_is_simple_vector (x)) + printf ("is_simple_vector!\n"); + else + printf ("NOT is_simple_vector\n"); +#endif p->objs = x; POP (x); } diff --git a/src/vm_system.c b/src/vm_system.c index 5eb125b88..e220b613c 100644 --- a/src/vm_system.c +++ b/src/vm_system.c @@ -208,7 +208,7 @@ VM_DEFINE_INSTRUCTION (list_break, "list-break", 0, 0, 0) VM_DEFINE_INSTRUCTION (object_ref, "object-ref", 1, 0, 1) { - register objnum = FETCH (); + register unsigned objnum = FETCH (); CHECK_OBJECT (objnum); PUSH (OBJECT_REF (objnum)); NEXT; |