diff --git a/scheme/vm/heap.scm b/scheme/vm/heap.scm index 8ae2c4b..8a2b378 100644 --- a/scheme/vm/heap.scm +++ b/scheme/vm/heap.scm @@ -59,6 +59,9 @@ (swap! *newspace-begin* *oldspace-begin*) (swap! *newspace-end* *oldspace-end*)) +(define (s48-newspace () boolean))) (define s48-available (external "s48_available" (=> () integer))) (define s48-heap-size diff --git a/scheme/vm/package-defs.scm b/scheme/vm/package-defs.scm index d2fb635..005dc94 100644 --- a/scheme/vm/package-defs.scm +++ b/scheme/vm/package-defs.scm @@ -83,7 +83,7 @@ interpreter-internal channel-io vmio memory data struct - images interpreter-gc + images interpreter-gc heap symbols external-opcodes stack ;pop stob) ;immutable diff --git a/scheme/vm/prim-io.scm b/scheme/vm/prim-io.scm index 32c9d19..3e225fb 100644 --- a/scheme/vm/prim-io.scm +++ b/scheme/vm/prim-io.scm @@ -414,11 +414,21 @@ (let ((status (write-string (extract-string comment-string) port))) (if (error? status) (port-lose (enum exception os-error) status port) - (let ((status (s48-write-image resume-proc port))) - (if (error? status) - (port-lose (enum exception os-error) status port) - (let ((status (close-output-port port))) - (if (error? status) + ;; little hack for faster startup: + ;; trigger a GC to ensure newspace is behind oldspace + ;; write-image will also GC and thereby move newspace + ;; to the front. + ;; We can't do this in s48-write-image because it doesn't + ;; know collect-saving-temp. + (let ((resume-proc + (if (s48-newspace