summaryrefslogtreecommitdiff
path: root/src/vm_loader.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm_loader.c')
-rw-r--r--src/vm_loader.c43
1 files changed, 26 insertions, 17 deletions
diff --git a/src/vm_loader.c b/src/vm_loader.c
index fe7e2b518..d221ecdd1 100644
--- a/src/vm_loader.c
+++ b/src/vm_loader.c
@@ -109,18 +109,27 @@ VM_DEFINE_LOADER (load_program, "load-program")
{
size_t len;
SCM prog, x;
+ struct scm_program *p;
FETCH_LENGTH (len);
prog = scm_c_make_program (ip, len, program);
+ p = SCM_PROGRAM_DATA (prog);
ip += len;
+ POP (x);
+
+ /* init meta data */
+ if (SCM_CONSP (x))
+ {
+ p->meta = x;
+ POP (x);
+ }
+
/* init object table */
- x = *sp;
if (SCM_VECTORP (x))
{
- SCM_PROGRAM_OBJS (prog) = x;
- DROP ();
- x = *sp;
+ p->objs = x;
+ POP (x);
}
/* init parameters */
@@ -131,31 +140,31 @@ VM_DEFINE_LOADER (load_program, "load-program")
if (-128 <= i && i <= 127)
{
/* 8-bit representation */
- SCM_PROGRAM_NARGS (prog) = (i >> 6) & 0x03; /* 7-6 bits */
- SCM_PROGRAM_NREST (prog) = (i >> 5) & 0x01; /* 5 bit */
- SCM_PROGRAM_NLOCS (prog) = (i >> 2) & 0x07; /* 4-2 bits */
- SCM_PROGRAM_NEXTS (prog) = i & 0x03; /* 1-0 bits */
+ p->nargs = (i >> 6) & 0x03; /* 7-6 bits */
+ p->nrest = (i >> 5) & 0x01; /* 5 bit */
+ p->nlocs = (i >> 2) & 0x07; /* 4-2 bits */
+ p->nexts = i & 0x03; /* 1-0 bits */
}
else
{
/* 16-bit representation */
- SCM_PROGRAM_NARGS (prog) = (i >> 12) & 0x07; /* 15-12 bits */
- SCM_PROGRAM_NREST (prog) = (i >> 11) & 0x01; /* 11 bit */
- SCM_PROGRAM_NLOCS (prog) = (i >> 4) & 0x7f; /* 10-04 bits */
- SCM_PROGRAM_NEXTS (prog) = i & 0x0f; /* 03-00 bits */
+ p->nargs = (i >> 12) & 0x07; /* 15-12 bits */
+ p->nrest = (i >> 11) & 0x01; /* 11 bit */
+ p->nlocs = (i >> 4) & 0x7f; /* 10-04 bits */
+ p->nexts = i & 0x0f; /* 03-00 bits */
}
}
else
{
/* Other cases */
sp -= 4;
- SCM_PROGRAM_NARGS (prog) = SCM_INUM (sp[1]);
- SCM_PROGRAM_NREST (prog) = SCM_INUM (sp[2]);
- SCM_PROGRAM_NLOCS (prog) = SCM_INUM (sp[3]);
- SCM_PROGRAM_NEXTS (prog) = SCM_INUM (sp[4]);
+ p->nargs = SCM_INUM (sp[0]);
+ p->nrest = SCM_INUM (sp[1]);
+ p->nlocs = SCM_INUM (sp[2]);
+ p->nexts = SCM_INUM (sp[3]);
}
- *sp = prog;
+ PUSH (prog);
NEXT;
}