summaryrefslogtreecommitdiff
path: root/libguile/programs.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-01-17 16:42:53 +0100
committerAndy Wingo <wingo@pobox.com>2009-01-17 16:42:53 +0100
commit2fda0242214e1b650b8fd3eb084e1c930a8399a5 (patch)
treecb0e118575713554b98b11e4d15c91a0605f6941 /libguile/programs.c
parenta72317988fa29377928d30c7e52b5acf63b6943a (diff)
downloadguile-2fda0242214e1b650b8fd3eb084e1c930a8399a5.tar.gz
move module and meta inside programs' object tables
* libguile/programs.h (struct scm_program): Remove the module and meta fields. * libguile/programs.c (scm_c_make_program): Add a new argument, `objs'. If it's a vector, we'll look for the module and the metadata in there, instead of having them in the scm_program structure. (scm_c_make_closure, program_mark, scm_program_meta) (scm_c_program_source, scm_program_module): Adapt to the new program representation. * libguile/objcodes.c (scm_objcode_to_program): Pass #f as the object table when making the program. * libguile/vm-engine.h (CACHE_PROGRAM): * libguile/vm-engine.c (vm_run): Rework to use the simple vector API for getting the current object table. Call the helper, vm_make_boot_program, to make the boot program. * libguile/vm-i-loader.c (load-program): Set the current module and the meta in the object vector, which we pass to scm_c_make_program. * libguile/vm-i-system.c (toplevel-ref, toplevel-set): Adapt to the new program representation. * module/language/glil/compile-objcode.scm (codegen): Clarify.
Diffstat (limited to 'libguile/programs.c')
-rw-r--r--libguile/programs.c41
1 files changed, 23 insertions, 18 deletions
diff --git a/libguile/programs.c b/libguile/programs.c
index 235422ac8..f5b5d42ba 100644
--- a/libguile/programs.c
+++ b/libguile/programs.c
@@ -57,7 +57,7 @@ static SCM zero_vector;
static SCM write_program = SCM_BOOL_F;
SCM
-scm_c_make_program (void *addr, size_t size, SCM holder)
+scm_c_make_program (void *addr, size_t size, SCM objs, SCM holder)
#define FUNC_NAME "scm_c_make_program"
{
struct scm_program *p = scm_gc_malloc (sizeof (struct scm_program),
@@ -67,11 +67,9 @@ scm_c_make_program (void *addr, size_t size, SCM holder)
p->nrest = 0;
p->nlocs = 0;
p->nexts = 0;
- p->meta = SCM_BOOL_F;
- p->objs = zero_vector;
+ p->objs = objs;
p->external = SCM_EOL;
p->holder = holder;
- p->module = scm_current_module ();
/* If nobody holds bytecode's address, then allocate a new memory */
if (SCM_FALSEP (holder))
@@ -89,22 +87,22 @@ scm_c_make_program (void *addr, size_t size, SCM holder)
SCM
scm_c_make_closure (SCM program, SCM external)
{
- SCM prog = scm_c_make_program (0, 0, program);
- if (!SCM_PROGRAM_P (program))
- abort ();
- *SCM_PROGRAM_DATA (prog) = *SCM_PROGRAM_DATA (program);
- SCM_PROGRAM_DATA (prog)->external = external;
- return prog;
+ struct scm_program *p = scm_gc_malloc (sizeof (struct scm_program),
+ "program");
+ *p = *SCM_PROGRAM_DATA (program);
+ p->holder = program;
+ p->external = external;
+ SCM_RETURN_NEWSMOB (scm_tc16_program, p);
}
static SCM
program_mark (SCM obj)
{
struct scm_program *p = SCM_PROGRAM_DATA (obj);
- scm_gc_mark (p->meta);
- scm_gc_mark (p->objs);
- scm_gc_mark (p->external);
- scm_gc_mark (p->module);
+ if (scm_is_true (p->objs))
+ scm_gc_mark (p->objs);
+ if (!scm_is_null (p->external))
+ scm_gc_mark (p->external);
return p->holder;
}
@@ -194,8 +192,10 @@ SCM_DEFINE (scm_program_meta, "program-meta", 1, 0, 0,
"")
#define FUNC_NAME s_scm_program_meta
{
+ SCM objs;
SCM_VALIDATE_PROGRAM (1, program);
- return SCM_PROGRAM_DATA (program)->meta;
+ objs = SCM_PROGRAM_DATA (program)->objs;
+ return scm_is_true (objs) ? scm_c_vector_ref (objs, 1) : SCM_BOOL_F;
}
#undef FUNC_NAME
@@ -204,9 +204,12 @@ scm_c_program_source (struct scm_program *p, size_t ip)
{
SCM meta, sources, source;
- if (scm_is_false (p->meta))
+ if (scm_is_false (p->objs))
+ return SCM_BOOL_F;
+ meta = scm_c_vector_ref (p->objs, 1);
+ if (scm_is_false (meta))
return SCM_BOOL_F;
- meta = scm_call_0 (p->meta);
+ meta = scm_call_0 (meta);
if (scm_is_false (meta))
return SCM_BOOL_F;
sources = scm_cadr (meta);
@@ -232,8 +235,10 @@ SCM_DEFINE (scm_program_module, "program-module", 1, 0, 0,
"")
#define FUNC_NAME s_scm_program_module
{
+ SCM objs;
SCM_VALIDATE_PROGRAM (1, program);
- return SCM_PROGRAM_DATA (program)->module;
+ objs = SCM_PROGRAM_DATA (program)->objs;
+ return scm_is_true (objs) ? scm_c_vector_ref (objs, 0) : SCM_BOOL_F;
}
#undef FUNC_NAME