1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-09 07:00:23 +02:00

*** empty log message ***

This commit is contained in:
Keisuke Nishida 2001-04-23 06:17:52 +00:00
parent af988bbf9c
commit a6df585ae7
4 changed files with 23 additions and 24 deletions

View file

@ -251,10 +251,10 @@
;; (set VARS)... ;; (set VARS)...
;; BODY ;; BODY
(for-each comp-push vals) (for-each comp-push vals)
(for-each (lambda (var) (push-code! (make-glil-var 'set env var)))
(reverse vars))
(let ((vars (map (lambda (v) (list v.name v.kind v.index)) vars))) (let ((vars (map (lambda (v) (list v.name v.kind v.index)) vars)))
(if (not (null? vars)) (push-code! (<glil-bind> vars)))) (if (not (null? vars)) (push-code! (<glil-bind> vars))))
(for-each (lambda (var) (push-code! (make-glil-var 'set env var)))
(reverse vars))
(comp-tail body) (comp-tail body)
(push-code! (<glil-unbind>))) (push-code! (<glil-unbind>)))

View file

@ -45,11 +45,15 @@
(define (trace-next vm) (define (trace-next vm)
(define (puts x) (display #\tab) (write x)) (define (puts x) (display #\tab) (write x))
(define (truncate! x n)
(if (> (length x) n)
(list-cdr-set! x (1- n) '(...))) x)
;; main
(format #t "0x~8X ~16S" (vm:ip vm) (vm-fetch-code vm)) (format #t "0x~8X ~16S" (vm:ip vm) (vm-fetch-code vm))
(do ((opts (vm-option vm 'trace-options) (cdr opts))) (do ((opts (vm-option vm 'trace-options) (cdr opts)))
((null? opts) (newline)) ((null? opts) (newline))
(case (car opts) (case (car opts)
((:s) (puts (vm-fetch-stack vm))) ((:s) (puts (truncate! (vm-fetch-stack vm) 3)))
((:l) (puts (vm-fetch-locals vm))) ((:l) (puts (vm-fetch-locals vm)))
((:e) (puts (vm-fetch-externals vm)))))) ((:e) (puts (vm-fetch-externals vm))))))

View file

@ -149,34 +149,28 @@ vm_fetch_length (scm_byte_t *ip, size_t *lenp)
} }
static SCM static SCM
vm_heapify_frames_1 (struct scm_vm *vp, SCM *fp, SCM *limit, SCM **basep) vm_heapify_frames_1 (struct scm_vm *vp, SCM *fp, SCM *sp, SCM **destp)
{ {
SCM *base, frame; SCM frame;
SCM *dl = SCM_FRAME_DYNAMIC_LINK (fp); SCM *dl = SCM_FRAME_DYNAMIC_LINK (fp);
SCM *sp = SCM_FRAME_UPPER_ADDRESS (fp); SCM *src = SCM_FRAME_UPPER_ADDRESS (fp);
SCM *dest = SCM_FRAME_LOWER_ADDRESS (fp);
if (!dl) if (!dl)
{ {
/* The top frame */ /* The top frame */
base = vp->stack_base;
frame = scm_c_make_heap_frame (fp); frame = scm_c_make_heap_frame (fp);
fp = SCM_HEAP_FRAME_POINTER (frame); fp = SCM_HEAP_FRAME_POINTER (frame);
SCM_FRAME_HEAP_LINK (fp) = SCM_BOOL_T; SCM_FRAME_HEAP_LINK (fp) = SCM_BOOL_T;
} }
else else
{ {
/* Other frames */ /* Child frames */
SCM link = SCM_FRAME_HEAP_LINK (dl); SCM link = SCM_FRAME_HEAP_LINK (dl);
if (!SCM_FALSEP (link)) if (!SCM_FALSEP (link))
{ link = SCM_FRAME_LOWER_ADDRESS (dl)[-1]; /* self link */
link = SCM_FRAME_LOWER_ADDRESS (dl)[-1]; /* self link */
base = SCM_FRAME_LOWER_ADDRESS (fp);
}
else else
{ link = vm_heapify_frames_1 (vp, dl, dest - 1, &dest);
link = vm_heapify_frames_1 (vp, dl, SCM_FRAME_LOWER_ADDRESS (fp),
&base);
}
frame = scm_c_make_heap_frame (fp); frame = scm_c_make_heap_frame (fp);
fp = SCM_HEAP_FRAME_POINTER (frame); fp = SCM_HEAP_FRAME_POINTER (frame);
SCM_FRAME_HEAP_LINK (fp) = link; SCM_FRAME_HEAP_LINK (fp) = link;
@ -184,9 +178,9 @@ vm_heapify_frames_1 (struct scm_vm *vp, SCM *fp, SCM *limit, SCM **basep)
} }
/* Move stack data */ /* Move stack data */
for (; sp < limit; base++, sp++) for (; src <= sp; src++, dest++)
*base = *sp; *dest = *src;
*basep = base; *destp = dest;
return frame; return frame;
} }
@ -197,10 +191,10 @@ vm_heapify_frames (SCM vm)
struct scm_vm *vp = SCM_VM_DATA (vm); struct scm_vm *vp = SCM_VM_DATA (vm);
if (SCM_FALSEP (SCM_FRAME_HEAP_LINK (vp->fp))) if (SCM_FALSEP (SCM_FRAME_HEAP_LINK (vp->fp)))
{ {
SCM *base; SCM *dest;
vp->this_frame = vm_heapify_frames_1 (vp, vp->fp, vp->sp + 1, &base); vp->this_frame = vm_heapify_frames_1 (vp, vp->fp, vp->sp, &dest);
vp->fp = SCM_HEAP_FRAME_POINTER (vp->this_frame); vp->fp = SCM_HEAP_FRAME_POINTER (vp->this_frame);
vp->sp = base - 1; vp->sp = dest - 1;
} }
return vp->this_frame; return vp->this_frame;
} }

View file

@ -54,9 +54,10 @@ VM_DEFINE_INSTRUCTION (nop, "nop", 0, 0, 0)
VM_DEFINE_INSTRUCTION (halt, "halt", 0, 0, 0) VM_DEFINE_INSTRUCTION (halt, "halt", 0, 0, 0)
{ {
SCM ret = *sp; SCM ret;
vp->time += scm_c_get_internal_run_time () - start_time; vp->time += scm_c_get_internal_run_time () - start_time;
HALT_HOOK (); HALT_HOOK ();
POP (ret);
FREE_FRAME (); FREE_FRAME ();
SYNC_ALL (); SYNC_ALL ();
return ret; return ret;
@ -490,9 +491,9 @@ VM_DEFINE_INSTRUCTION (return, "return", 0, 0, 1)
{ {
SCM ret; SCM ret;
vm_return: vm_return:
POP (ret);
EXIT_HOOK (); EXIT_HOOK ();
RETURN_HOOK (); RETURN_HOOK ();
POP (ret);
FREE_FRAME (); FREE_FRAME ();
/* Restore the last program */ /* Restore the last program */