summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/programs.c14
-rw-r--r--src/vm.c23
-rw-r--r--src/vm_loader.c1
3 files changed, 23 insertions, 15 deletions
diff --git a/src/programs.c b/src/programs.c
index d224524ca..406c00952 100644
--- a/src/programs.c
+++ b/src/programs.c
@@ -119,18 +119,12 @@ static int
program_print (SCM obj, SCM port, scm_print_state *pstate)
{
SCM name = scm_object_property (obj, scm_sym_name);
+ scm_puts ("#<program ", port);
if (SCM_FALSEP (name))
- {
- scm_puts ("#<program 0x", port);
- scm_intprint ((long) SCM_PROGRAM_BASE (obj), 16, port);
- scm_putc ('>', port);
- }
+ scm_intprint ((long) SCM_PROGRAM_BASE (obj), 16, port);
else
- {
- scm_puts ("#<program ", port);
- scm_display (name, port);
- scm_putc ('>', port);
- }
+ scm_display (name, port);
+ scm_putc ('>', port);
return 1;
}
diff --git a/src/vm.c b/src/vm.c
index 9428890f3..4aae67880 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -203,6 +203,7 @@ SCM_SYMBOL (sym_vm_error, "vm-error");
static scm_byte_t *
vm_fetch_length (scm_byte_t *ip, size_t *lenp)
{
+ /* NOTE: format defined in system/vm/conv.scm */
*lenp = *ip++;
if (*lenp < 254)
return ip;
@@ -566,18 +567,30 @@ SCM_DEFINE (scm_vm_fetch_stack, "vm-fetch-stack", 1, 0, 0,
#undef FUNC_NAME
SCM_DEFINE (scm_vm_load, "vm-load", 2, 0, 0,
- (SCM vm, SCM bytes),
+ (SCM vm, SCM bootcode),
"")
#define FUNC_NAME s_scm_vm_load
{
SCM prog;
+ int len;
+ char *base;
SCM_VALIDATE_VM (1, vm);
- SCM_VALIDATE_STRING (2, bytes);
+ SCM_VALIDATE_STRING (2, bootcode);
- prog = scm_c_make_program (SCM_STRING_CHARS (bytes),
- SCM_STRING_LENGTH (bytes),
- bytes);
+ base = SCM_STRING_CHARS (bootcode);
+ len = SCM_STRING_LENGTH (bootcode);
+
+ /* Check bootcode */
+ if (strncmp (base, "\0GBC", 4) != 0)
+ SCM_MISC_ERROR ("Invalid bootcode: ~S", SCM_LIST1 (bootcode));
+
+ /* Create program */
+ prog = scm_c_make_program (base + 10, len - 10, bootcode);
+ SCM_PROGRAM_NLOCS (prog) = base[8];
+ SCM_PROGRAM_NEXTS (prog) = base[9];
+
+ /* Load it */
return scm_vm_apply (vm, prog, SCM_EOL);
}
#undef FUNC_NAME
diff --git a/src/vm_loader.c b/src/vm_loader.c
index 6578198f6..558997232 100644
--- a/src/vm_loader.c
+++ b/src/vm_loader.c
@@ -124,6 +124,7 @@ VM_DEFINE_INSTRUCTION (load_program, "load-program", -1, 0, 1)
}
/* init parameters */
+ /* NOTE: format defined in system/vm/assemble.scm */
if (SCM_INUMP (x))
{
int i = SCM_INUM (x);