scsh-0.5/vm/resume.scm

66 lines
1.9 KiB
Scheme

; -*- Mode: Scheme; Syntax: Scheme; Package: Scheme; -*-
; This is file resume.scm.
; All sizes are in cells
(define (required-init-space startup-vector startup-vector-length)
(+ (+ (do ((i 0 (+ i 1))
(s 0 (+ s (vm-string-size
(string-length
(vector-ref startup-vector i))))))
((>= i startup-vector-length)
s))
(code-vector-size 2))
(+ initial-interpreter-heap-space
(+ initial-stack-heap-space
initial-i/o-heap-space))))
(define (initialize-vm memory-begin memory-size stack-begin stack-size)
(initialize-heap memory-begin memory-size)
(initialize-i/o-system)
(initialize-stack stack-begin stack-size)
(initialize-interpreter))
(define (call-startup-procedure startup-proc
startup-vector
startup-vector-length)
(let ((vector (vm-make-vector startup-vector-length universal-key)))
(do ((i 0 (+ i 1)))
((>= i startup-vector-length))
(vm-vector-set! vector i (enter-string (vector-ref startup-vector i))))
(clear-registers)
(push vector)
(push (initial-input-port))
(push (initial-output-port))
(let ((code (make-code-vector 2 universal-key)))
(code-vector-set! code 0 (enum op call))
(code-vector-set! code 1 3) ; nargs
(set! *code-pointer* (address-after-header code)))
(restart startup-proc)))
(define (restart value)
(set! *val* value)
(let loop ()
(let ((option (interpret)))
(cond ((= option (enum return-option exit))
*val*)
((= option (enum return-option external-call))
(set! *val* (call-external-value ; type inference hack
(fetch (address-after-header (external-value *val*)))
*nargs*
(pointer-to-stack-arguments)))
(remove-stack-arguments (+ *nargs* 1)) ; remove proc and args
(loop))
(else
(error "unkown VM return option" option)
-1)))))
(define-enumeration return-option
(exit
external-call
native-call
native-return
))