mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-12 06:41:13 +02:00
heapify the bootstrap program
* src/vm_engine.c (vm_run): * src/programs.c (scm_c_make_program): If the holder is #f, malloc *and* copy the bytecode. * module/system/vm/frame.scm (bootstrap-frame?): Now that we actually heapify the bootstrap program, we can check for `halt' in the bytecode.
This commit is contained in:
parent
e15f47740b
commit
29711eb918
3 changed files with 9 additions and 6 deletions
|
@ -45,8 +45,9 @@
|
||||||
|
|
||||||
(define (bootstrap-frame? frame)
|
(define (bootstrap-frame? frame)
|
||||||
(let ((code (program-bytecode (frame-program frame))))
|
(let ((code (program-bytecode (frame-program frame))))
|
||||||
;; XXX: need to fix the bootstrap prog, its code is on the C stack
|
(and (= (uniform-vector-length code) 3)
|
||||||
(and (= (uniform-vector-length code) 3))))
|
(= (uniform-vector-ref code 2)
|
||||||
|
(instruction->opcode 'halt)))))
|
||||||
|
|
||||||
(define (make-frame-chain frame addr)
|
(define (make-frame-chain frame addr)
|
||||||
(define (make-rest)
|
(define (make-rest)
|
||||||
|
|
|
@ -71,8 +71,11 @@ scm_c_make_program (void *addr, size_t size, SCM holder)
|
||||||
p->holder = holder;
|
p->holder = holder;
|
||||||
|
|
||||||
/* If nobody holds bytecode's address, then allocate a new memory */
|
/* If nobody holds bytecode's address, then allocate a new memory */
|
||||||
if (SCM_FALSEP (holder))
|
if (SCM_FALSEP (holder))
|
||||||
p->base = scm_gc_malloc (size, "program-base");
|
{
|
||||||
|
p->base = scm_gc_malloc (size, "program-base");
|
||||||
|
memcpy (p->base, addr, size);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
p->base = addr;
|
p->base = addr;
|
||||||
|
|
||||||
|
|
|
@ -100,10 +100,9 @@ vm_run (SCM vm, SCM program, SCM args)
|
||||||
SCM prog = program;
|
SCM prog = program;
|
||||||
|
|
||||||
/* Boot program */
|
/* Boot program */
|
||||||
/* FIXME: heap program object points to objcode on the stack. Badness! */
|
|
||||||
scm_byte_t bytes[3] = {scm_op_call, 0, scm_op_halt};
|
scm_byte_t bytes[3] = {scm_op_call, 0, scm_op_halt};
|
||||||
bytes[1] = scm_ilength (args); /* FIXME: argument overflow */
|
bytes[1] = scm_ilength (args); /* FIXME: argument overflow */
|
||||||
program = scm_c_make_program (bytes, 3, SCM_BOOL_T);
|
program = scm_c_make_program (bytes, 3, SCM_BOOL_F);
|
||||||
|
|
||||||
/* Initial frame */
|
/* Initial frame */
|
||||||
CACHE_REGISTER ();
|
CACHE_REGISTER ();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue