summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLudovic Courtes <ludovic.courtes@laas.fr>2005-06-25 06:57:20 +0000
committerLudovic Courtès <ludo@gnu.org>2008-04-25 19:09:30 +0200
commita52b2d3d5547564c10cfce9ae9993ee0a9ae698e (patch)
tree627a219a1f1d8d501113ec389a311bd67a47a053 /src
parent0b5f0e49a8b172544e2a7cb564c01c2ec439aaec (diff)
downloadguile-a52b2d3d5547564c10cfce9ae9993ee0a9ae698e.tar.gz
Started documenting the compiler.
* doc/guile-vm.texi: Documented the compiler (node `The Compiler'). Removed a number of things that might have been relevant to Guile-VM 0.0. * module/system/il/compile.scm (optimize): Commented out the case using `<ghil-inst?>'. * src/vm_engine.c (vm_run)[objects_handle]: New variable. Before leaving the function, release OBJECTS_HANDLE. * src/vm_engine.h (CACHE_PROGRAM): Use `scm_vector_writable_elements' instead of `scm_vector_elements'; don't release the handle right away. * src/vm_loader.c (load-program): New commented out piece of code dealing with simple vectors. * src/vm_system.c (object-ref): Added the type of OBJNUM. git-archimport-id: lcourtes@laas.fr--2005-mobile/guile-vm--mobile--0.6--patch-3
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;