From 6c3dba4b30af8c0c0731f68da839f4c1c40788d8 Mon Sep 17 00:00:00 2001 From: Chris Hanson Date: Thu, 23 Sep 1993 19:57:43 +0000 Subject: [PATCH] Redo last change -- can't just rewrite frame elements because that potentially screws up operation that builds continuations from stack frames. --- v7/src/runtime/conpar.scm | 144 ++++++++++++++++++++++---------------- v8/src/runtime/conpar.scm | 144 ++++++++++++++++++++++---------------- 2 files changed, 170 insertions(+), 118 deletions(-) diff --git a/v7/src/runtime/conpar.scm b/v7/src/runtime/conpar.scm index 771f56220..97bb1d32e 100644 --- a/v7/src/runtime/conpar.scm +++ b/v7/src/runtime/conpar.scm @@ -1,6 +1,6 @@ #| -*-Scheme-*- -$Id: conpar.scm,v 14.30 1993/09/23 03:36:13 cph Exp $ +$Id: conpar.scm,v 14.31 1993/09/23 19:57:43 cph Exp $ Copyright (c) 1988-93 Massachusetts Institute of Technology @@ -109,12 +109,13 @@ MIT in each case. |# (and (interpreter-return-address? return-address) (return-address/code return-address)))) -(define (stack-frame/subproblem? stack-frame) - (or (stack-frame-type/subproblem? (stack-frame/type stack-frame)) - (stack-frame/repl-eval-boundary? stack-frame))) - (define-integrable (stack-frame/compiled-code? stack-frame) (compiled-return-address? (stack-frame/return-address stack-frame))) + +(define (stack-frame/subproblem? stack-frame) + (if (stack-frame/stack-marker? stack-frame) + (stack-marker-frame/repl-eval-boundary? stack-frame) + (stack-frame-type/subproblem? (stack-frame/type stack-frame)))) (define (stack-frame/resolve-stack-address frame address) (let loop @@ -132,7 +133,7 @@ MIT in each case. |# (eq? (stack-frame/return-address stack-frame) continuation-return-address)))) stack-frame) - ((eq? type stack-frame-type/stack-marker) + ((stack-frame/stack-marker? stack-frame) (let loop ((stack-frame stack-frame)) (let ((stack-frame (stack-frame/next stack-frame))) (and stack-frame @@ -327,6 +328,34 @@ MIT in each case. |# (parse/standard-next type elements state valid-history? valid-history?))) +(define (parser/restore-interrupt-mask type elements state) + (parser/standard + type + elements + (make-parser-state (parser-state/dynamic-state state) + (vector-ref elements 1) + (parser-state/history state) + (parser-state/previous-history-offset state) + (parser-state/previous-history-control-point state) + (parser-state/element-stream state) + (parser-state/n-elements state) + (parser-state/next-control-point state) + (parser-state/previous-type state)))) + +(define (parser/restore-history type elements state) + (parser/standard + type + elements + (make-parser-state (parser-state/dynamic-state state) + (parser-state/interrupt-mask state) + (history-transform (vector-ref elements 1)) + (vector-ref elements 2) + (vector-ref elements 3) + (parser-state/element-stream state) + (parser-state/n-elements state) + (parser-state/next-control-point state) + (parser-state/previous-type state)))) + (define-integrable code/special-compiled/internal-apply 0) (define-integrable code/special-compiled/restore-interrupt-mask 1) (define-integrable code/special-compiled/stack-marker 2) @@ -339,35 +368,36 @@ MIT in each case. |# ((fix:= code code/special-compiled/restore-interrupt-mask) (parser/%stack-marker (parser-state/dynamic-state state) (vector-ref elements 2) - stack-frame-type/stack-marker - (vector-tail elements 1) - state)) + type elements state)) ((fix:= code code/special-compiled/stack-marker) - (parser/stack-marker stack-frame-type/stack-marker - (vector-tail elements 1) - state)) + (parser/stack-marker type elements state)) ((fix:= code code/special-compiled/compiled-code-bkpt) (parse/standard-next type elements state false false)) (else (error "Unknown special compiled frame" code))))) (define (parser/stack-marker type elements state) - (let ((marker (vector-ref elements 1)) - (marker2 (vector-ref elements 2)) - (continue - (lambda (dynamic-state interrupt-mask) - (parser/%stack-marker dynamic-state interrupt-mask - type elements state)))) - (cond ((eq? marker %translate-to-state-point) - (continue (merge-dynamic-state (parser-state/dynamic-state state) - marker2) - (parser-state/interrupt-mask state))) - ((eq? marker set-interrupt-enables!) - (continue (parser-state/dynamic-state state) - marker2)) - (else - (continue (parser-state/dynamic-state state) - (parser-state/interrupt-mask state)))))) + (call-with-values + (lambda () + (if (eq? type stack-frame-type/stack-marker) + (values (vector-ref elements 1) (vector-ref elements 2)) + (values (vector-ref elements 2) (vector-ref elements 3)))) + (lambda (marker-type marker-instance) + (let ((continue + (lambda (dynamic-state interrupt-mask) + (parser/%stack-marker dynamic-state interrupt-mask + type elements state)))) + (cond ((eq? marker-type %translate-to-state-point) + (continue (merge-dynamic-state + (parser-state/dynamic-state state) + marker-instance) + (parser-state/interrupt-mask state))) + ((eq? marker-type set-interrupt-enables!) + (continue (parser-state/dynamic-state state) + marker-instance)) + (else + (continue (parser-state/dynamic-state state) + (parser-state/interrupt-mask state)))))))) (define (parser/%stack-marker dynamic-state interrupt-mask type elements state) @@ -385,39 +415,35 @@ MIT in each case. |# (parser-state/next-control-point state) (parser-state/previous-type state)))) -(define (stack-frame/repl-eval-boundary? stack-frame) - (let ((type (stack-frame/type stack-frame))) - (and (eq? type stack-frame-type/stack-marker) - (eq? with-repl-eval-boundary - (vector-ref (stack-frame/elements stack-frame) 1))))) +(define (stack-frame/stack-marker? stack-frame) + (or (%stack-frame/stack-marker? stack-frame) + (and (stack-frame/special-compiled? stack-frame) + (let ((code (vector-ref (stack-frame/elements stack-frame) 1))) + (or (fix:= code/special-compiled/restore-interrupt-mask code) + (fix:= code/special-compiled/stack-marker code)))))) -(define (parser/restore-interrupt-mask type elements state) - (parser/standard - type - elements - (make-parser-state (parser-state/dynamic-state state) - (vector-ref elements 1) - (parser-state/history state) - (parser-state/previous-history-offset state) - (parser-state/previous-history-control-point state) - (parser-state/element-stream state) - (parser-state/n-elements state) - (parser-state/next-control-point state) - (parser-state/previous-type state)))) +(define (stack-marker-frame/type stack-frame) + (if (%stack-frame/stack-marker? stack-frame) + (vector-ref (stack-frame/elements stack-frame) 1) + (vector-ref (stack-frame/elements stack-frame) 2))) -(define (parser/restore-history type elements state) - (parser/standard - type - elements - (make-parser-state (parser-state/dynamic-state state) - (parser-state/interrupt-mask state) - (history-transform (vector-ref elements 1)) - (vector-ref elements 2) - (vector-ref elements 3) - (parser-state/element-stream state) - (parser-state/n-elements state) - (parser-state/next-control-point state) - (parser-state/previous-type state)))) +(define (stack-marker-frame/instance stack-frame) + (if (%stack-frame/stack-marker? stack-frame) + (vector-ref (stack-frame/elements stack-frame) 2) + (vector-ref (stack-frame/elements stack-frame) 3))) + +(define-integrable (%stack-frame/stack-marker? stack-frame) + (eq? stack-frame-type/stack-marker (stack-frame/type stack-frame))) + +(define-integrable (stack-frame/special-compiled? stack-frame) + (eq? stack-frame-type/special-compiled (stack-frame/type stack-frame))) + +(define (stack-frame/repl-eval-boundary? stack-frame) + (and (stack-frame/stack-marker? stack-frame) + (stack-marker-frame/repl-eval-boundary? stack-frame))) + +(define-integrable (stack-marker-frame/repl-eval-boundary? stack-frame) + (eq? with-repl-eval-boundary (stack-marker-frame/type stack-frame))) ;;;; Unparser diff --git a/v8/src/runtime/conpar.scm b/v8/src/runtime/conpar.scm index 771f56220..97bb1d32e 100644 --- a/v8/src/runtime/conpar.scm +++ b/v8/src/runtime/conpar.scm @@ -1,6 +1,6 @@ #| -*-Scheme-*- -$Id: conpar.scm,v 14.30 1993/09/23 03:36:13 cph Exp $ +$Id: conpar.scm,v 14.31 1993/09/23 19:57:43 cph Exp $ Copyright (c) 1988-93 Massachusetts Institute of Technology @@ -109,12 +109,13 @@ MIT in each case. |# (and (interpreter-return-address? return-address) (return-address/code return-address)))) -(define (stack-frame/subproblem? stack-frame) - (or (stack-frame-type/subproblem? (stack-frame/type stack-frame)) - (stack-frame/repl-eval-boundary? stack-frame))) - (define-integrable (stack-frame/compiled-code? stack-frame) (compiled-return-address? (stack-frame/return-address stack-frame))) + +(define (stack-frame/subproblem? stack-frame) + (if (stack-frame/stack-marker? stack-frame) + (stack-marker-frame/repl-eval-boundary? stack-frame) + (stack-frame-type/subproblem? (stack-frame/type stack-frame)))) (define (stack-frame/resolve-stack-address frame address) (let loop @@ -132,7 +133,7 @@ MIT in each case. |# (eq? (stack-frame/return-address stack-frame) continuation-return-address)))) stack-frame) - ((eq? type stack-frame-type/stack-marker) + ((stack-frame/stack-marker? stack-frame) (let loop ((stack-frame stack-frame)) (let ((stack-frame (stack-frame/next stack-frame))) (and stack-frame @@ -327,6 +328,34 @@ MIT in each case. |# (parse/standard-next type elements state valid-history? valid-history?))) +(define (parser/restore-interrupt-mask type elements state) + (parser/standard + type + elements + (make-parser-state (parser-state/dynamic-state state) + (vector-ref elements 1) + (parser-state/history state) + (parser-state/previous-history-offset state) + (parser-state/previous-history-control-point state) + (parser-state/element-stream state) + (parser-state/n-elements state) + (parser-state/next-control-point state) + (parser-state/previous-type state)))) + +(define (parser/restore-history type elements state) + (parser/standard + type + elements + (make-parser-state (parser-state/dynamic-state state) + (parser-state/interrupt-mask state) + (history-transform (vector-ref elements 1)) + (vector-ref elements 2) + (vector-ref elements 3) + (parser-state/element-stream state) + (parser-state/n-elements state) + (parser-state/next-control-point state) + (parser-state/previous-type state)))) + (define-integrable code/special-compiled/internal-apply 0) (define-integrable code/special-compiled/restore-interrupt-mask 1) (define-integrable code/special-compiled/stack-marker 2) @@ -339,35 +368,36 @@ MIT in each case. |# ((fix:= code code/special-compiled/restore-interrupt-mask) (parser/%stack-marker (parser-state/dynamic-state state) (vector-ref elements 2) - stack-frame-type/stack-marker - (vector-tail elements 1) - state)) + type elements state)) ((fix:= code code/special-compiled/stack-marker) - (parser/stack-marker stack-frame-type/stack-marker - (vector-tail elements 1) - state)) + (parser/stack-marker type elements state)) ((fix:= code code/special-compiled/compiled-code-bkpt) (parse/standard-next type elements state false false)) (else (error "Unknown special compiled frame" code))))) (define (parser/stack-marker type elements state) - (let ((marker (vector-ref elements 1)) - (marker2 (vector-ref elements 2)) - (continue - (lambda (dynamic-state interrupt-mask) - (parser/%stack-marker dynamic-state interrupt-mask - type elements state)))) - (cond ((eq? marker %translate-to-state-point) - (continue (merge-dynamic-state (parser-state/dynamic-state state) - marker2) - (parser-state/interrupt-mask state))) - ((eq? marker set-interrupt-enables!) - (continue (parser-state/dynamic-state state) - marker2)) - (else - (continue (parser-state/dynamic-state state) - (parser-state/interrupt-mask state)))))) + (call-with-values + (lambda () + (if (eq? type stack-frame-type/stack-marker) + (values (vector-ref elements 1) (vector-ref elements 2)) + (values (vector-ref elements 2) (vector-ref elements 3)))) + (lambda (marker-type marker-instance) + (let ((continue + (lambda (dynamic-state interrupt-mask) + (parser/%stack-marker dynamic-state interrupt-mask + type elements state)))) + (cond ((eq? marker-type %translate-to-state-point) + (continue (merge-dynamic-state + (parser-state/dynamic-state state) + marker-instance) + (parser-state/interrupt-mask state))) + ((eq? marker-type set-interrupt-enables!) + (continue (parser-state/dynamic-state state) + marker-instance)) + (else + (continue (parser-state/dynamic-state state) + (parser-state/interrupt-mask state)))))))) (define (parser/%stack-marker dynamic-state interrupt-mask type elements state) @@ -385,39 +415,35 @@ MIT in each case. |# (parser-state/next-control-point state) (parser-state/previous-type state)))) -(define (stack-frame/repl-eval-boundary? stack-frame) - (let ((type (stack-frame/type stack-frame))) - (and (eq? type stack-frame-type/stack-marker) - (eq? with-repl-eval-boundary - (vector-ref (stack-frame/elements stack-frame) 1))))) +(define (stack-frame/stack-marker? stack-frame) + (or (%stack-frame/stack-marker? stack-frame) + (and (stack-frame/special-compiled? stack-frame) + (let ((code (vector-ref (stack-frame/elements stack-frame) 1))) + (or (fix:= code/special-compiled/restore-interrupt-mask code) + (fix:= code/special-compiled/stack-marker code)))))) -(define (parser/restore-interrupt-mask type elements state) - (parser/standard - type - elements - (make-parser-state (parser-state/dynamic-state state) - (vector-ref elements 1) - (parser-state/history state) - (parser-state/previous-history-offset state) - (parser-state/previous-history-control-point state) - (parser-state/element-stream state) - (parser-state/n-elements state) - (parser-state/next-control-point state) - (parser-state/previous-type state)))) +(define (stack-marker-frame/type stack-frame) + (if (%stack-frame/stack-marker? stack-frame) + (vector-ref (stack-frame/elements stack-frame) 1) + (vector-ref (stack-frame/elements stack-frame) 2))) -(define (parser/restore-history type elements state) - (parser/standard - type - elements - (make-parser-state (parser-state/dynamic-state state) - (parser-state/interrupt-mask state) - (history-transform (vector-ref elements 1)) - (vector-ref elements 2) - (vector-ref elements 3) - (parser-state/element-stream state) - (parser-state/n-elements state) - (parser-state/next-control-point state) - (parser-state/previous-type state)))) +(define (stack-marker-frame/instance stack-frame) + (if (%stack-frame/stack-marker? stack-frame) + (vector-ref (stack-frame/elements stack-frame) 2) + (vector-ref (stack-frame/elements stack-frame) 3))) + +(define-integrable (%stack-frame/stack-marker? stack-frame) + (eq? stack-frame-type/stack-marker (stack-frame/type stack-frame))) + +(define-integrable (stack-frame/special-compiled? stack-frame) + (eq? stack-frame-type/special-compiled (stack-frame/type stack-frame))) + +(define (stack-frame/repl-eval-boundary? stack-frame) + (and (stack-frame/stack-marker? stack-frame) + (stack-marker-frame/repl-eval-boundary? stack-frame))) + +(define-integrable (stack-marker-frame/repl-eval-boundary? stack-frame) + (eq? with-repl-eval-boundary (stack-marker-frame/type stack-frame))) ;;;; Unparser -- 2.25.1