summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/vm_engine.c4
-rw-r--r--src/vm_engine.h24
-rw-r--r--src/vm_loader.c6
-rw-r--r--src/vm_system.c2
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;