Modify the stack parser and environment utilities to handle interrupt
authorGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Tue, 21 Aug 1990 04:19:12 +0000 (04:19 +0000)
committerGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Tue, 21 Aug 1990 04:19:12 +0000 (04:19 +0000)
frames from compiled code in which the return address is a procedure.

13 files changed:
v7/src/runtime/conpar.scm
v7/src/runtime/debug.scm
v7/src/runtime/framex.scm
v7/src/runtime/infutl.scm
v7/src/runtime/runtime.pkg
v7/src/runtime/udata.scm
v7/src/runtime/uenvir.scm
v7/src/runtime/version.scm
v8/src/runtime/conpar.scm
v8/src/runtime/framex.scm
v8/src/runtime/infutl.scm
v8/src/runtime/runtime.pkg
v8/src/runtime/uenvir.scm

index 7c011c7b65ceb9ecfd438486930b8646b280d907..6f811794e61313b2678bb4c1acbca53cf4db6ccc 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/conpar.scm,v 14.16 1990/08/08 00:57:07 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/conpar.scm,v 14.17 1990/08/21 04:18:26 jinx Exp $
 
 Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
 
@@ -140,7 +140,8 @@ MIT in each case. |#
   (previous-history-control-point false read-only true)
   (element-stream false read-only true)
   (n-elements false read-only true)
-  (next-control-point false read-only true))
+  (next-control-point false read-only true)
+  (allow-next-extended? false read-only true))
 
 (define (continuation->stack-frame continuation)
   (parse/control-point (continuation/control-point continuation)
@@ -159,14 +160,16 @@ MIT in each case. |#
         (control-point/previous-history-control-point control-point)
         (control-point/element-stream control-point)
         (control-point/n-elements control-point)
-        (control-point/next-control-point control-point)))))
+        (control-point/next-control-point control-point)
+        false))))
 
 (define (parse/start state)
   (let ((stream (parser-state/element-stream state)))
     (if (stream-pair? stream)
        (let ((type
               (return-address->stack-frame-type
-               (element-stream/head stream))))
+               (element-stream/head stream)
+               (parser-state/allow-next-extended? state))))
          (let ((length
                 (let ((length (stack-frame-type/length type)))
                   (if (exact-nonnegative-integer? length)
@@ -175,12 +178,13 @@ MIT in each case. |#
            ((stack-frame-type/parser type)
             type
             (list->vector (stream-head stream length))
-            (parse/next-state state length (stream-tail stream length)))))
+            (parse/next-state state length (stream-tail stream length)
+                              (stack-frame-type/allow-extended? type)))))
        (parse/control-point (parser-state/next-control-point state)
                             (parser-state/dynamic-state state)
                             (parser-state/fluid-bindings state)))))
 \f
-(define (parse/next-state state length stream)
+(define (parse/next-state state length stream allow-extended?)
   (let ((previous-history-control-point
         (parser-state/previous-history-control-point state)))
     (make-parser-state
@@ -195,7 +199,8 @@ MIT in each case. |#
      previous-history-control-point
      stream
      (- (parser-state/n-elements state) length)
-     (parser-state/next-control-point state))))
+     (parser-state/next-control-point state)
+     allow-extended?)))
 
 (define (make-frame type elements state element-stream n-elements)
   (let ((history-subproblem?
@@ -227,7 +232,8 @@ MIT in each case. |#
                       previous-history-control-point
                       element-stream
                       n-elements
-                      (parser-state/next-control-point state)))))
+                      (parser-state/next-control-point state)
+                      (stack-frame-type/allow-extended? type)))))
 
 (define (element-stream/head stream)
   (if (not (stream-pair? stream)) (error "not a stream-pair" stream))
@@ -312,11 +318,16 @@ MIT in each case. |#
          (1+ frame-size)
          (stack-address->index (element-stream/ref stream 1) offset)))))
 
+(define (length/interrupt-compiled-procedure stream offset)
+  offset                               ; ignored
+  (1+ (compiled-procedure-frame-size (element-stream/head stream))))
+
 (define (verify paranoia-index stream offset)
   (or (zero? paranoia-index)
       (stream-null? stream)
       (let* ((type (return-address->stack-frame-type
-                   (element-stream/head stream)))
+                   (element-stream/head stream)
+                   false))
             (length
              (let ((length (stack-frame-type/length type)))
                (if (exact-nonnegative-integer? length)
@@ -325,10 +336,9 @@ MIT in each case. |#
             (ltail (stream-tail* stream length)))
        (and ltail
             (return-address? (element-stream/head ltail))
-            (verify (-1+ paranoia-index)
-                    ltail
-                    (+ offset length))))))
-
+            (loop (-1+ paranoia-index)
+                  ltail
+                  (+ offset length))))))
 (define (stream-tail* stream n)
   (cond ((or (zero? n) (stream-null? stream))
         stream)
@@ -366,7 +376,8 @@ MIT in each case. |#
                      previous-history-control-point
                      (parser-state/element-stream state)
                      (parser-state/n-elements state)
-                     (parser-state/next-control-point state))))
+                     (parser-state/next-control-point state)
+                     false)))
 \f
 (define (parser/restore-dynamic-state type elements state)
   (make-restore-frame type elements state
@@ -427,12 +438,21 @@ MIT in each case. |#
   (length false read-only true)
   (parser false read-only true))
 
+(define allow-extended-return-addresses?-tag
+  "stack-frame-type/allow-extended")
+
+(define (stack-frame-type/allow-extended? type)
+  (1d-table/get
+   (stack-frame-type/properties type)
+   allow-extended-return-addresses?-tag
+   false))
+
 (define (microcode-return/code->type code)
   (if (not (< code (vector-length stack-frame-types)))
       (error "return-code too large" code))
   (vector-ref stack-frame-types code))
 
-(define (return-address->stack-frame-type return-address)
+(define (return-address->stack-frame-type return-address allow-extended?)
   (cond ((interpreter-return-address? return-address)
         (let ((code (return-address/code return-address)))
           (let ((type (microcode-return/code->type code)))
@@ -444,6 +464,10 @@ MIT in each case. |#
              return-address)
             stack-frame-type/return-to-interpreter
             stack-frame-type/compiled-return-address))
+       ((and allow-extended? (compiled-procedure? return-address))
+        stack-frame-type/interrupt-compiled-procedure)
+       ((and allow-extended? (compiled-expression? return-address))
+        stack-frame-type/interrupt-compiled-expression)
        (else
         (error "illegal return address" return-address))))
 
@@ -467,6 +491,19 @@ MIT in each case. |#
                               true
                               1
                               parser/standard-next))
+  (set! stack-frame-type/interrupt-compiled-procedure
+       (make-stack-frame-type false
+                              true
+                              false
+                              length/interrupt-compiled-procedure
+                              parser/standard-next))
+  (set! stack-frame-type/interrupt-compiled-expression
+       (make-stack-frame-type false
+                              true
+                              false
+                              1
+                              parser/standard-next))
+  
   (set! word-size
        (let ((initial (system-vector-length (make-bit-string 1 #f))))
          (let loop ((size 2))
@@ -480,6 +517,8 @@ MIT in each case. |#
 (define stack-frame-type/compiled-return-address)
 (define stack-frame-type/return-to-interpreter)
 (define stack-frame-type/hardware-trap)
+(define stack-frame-type/interrupt-compiled-procedure)
+(define stack-frame-type/interrupt-compiled-expression)
 
 (define (make-stack-frame-types)
   (let ((types (make-vector (microcode-return/code-limit) false)))
@@ -488,11 +527,11 @@ MIT in each case. |#
                              history-subproblem?
                              length parser)
       (let ((code (microcode-return name)))
-       (vector-set! types
-                    code
-                    (make-stack-frame-type code subproblem?
-                                           history-subproblem?
-                                           length parser))))
+       (let ((type (make-stack-frame-type code subproblem?
+                                          history-subproblem?
+                                          length parser)))
+         (vector-set! types code type)
+         type)))
 
     (define (standard-frame name length #!optional parser)
       (stack-frame-type name
@@ -564,7 +603,13 @@ MIT in each case. |#
        (compiler-subproblem 'COMPILER-LOOKUP-APPLY-TRAP-RESTART length)
        (compiler-subproblem 'COMPILER-OPERATOR-LOOKUP-TRAP-RESTART length))
 
-      (compiler-frame 'COMPILER-INTERRUPT-RESTART 3)      (compiler-frame 'COMPILER-LINK-CACHES-RESTART 8)
+      (let ((type
+            (compiler-frame 'COMPILER-INTERRUPT-RESTART 3)))
+       (1d-table/put! (stack-frame-type/properties type)
+                      allow-extended-return-addresses?-tag
+                      true))
+
+      (compiler-frame 'COMPILER-LINK-CACHES-RESTART 8)
       (compiler-frame 'REENTER-COMPILED-CODE 2)
 
       (compiler-subproblem 'COMPILER-ACCESS-RESTART 4)
index 65ce1ab70169cdfeee8037fa59bd475806e1086b..9df335c9400aea2a28b7fd78e84b29b39a9f83ba 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/debug.scm,v 14.17 1989/12/19 15:37:09 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/debug.scm,v 14.18 1990/08/21 04:18:33 jinx Exp $
 
 Copyright (c) 1988, 1989 Massachusetts Institute of Technology
 
@@ -559,11 +559,14 @@ MIT in each case. |#
                (return value))))
        (debugger-failure "Can't continue!!!"))))
 
+(define *dstate*)
+
 (define (command/internal dstate)
-  dstate                               ;ignore
-  (debug/read-eval-print (->environment '(RUNTIME DEBUGGER))
-                        "You are now in the debugger environment"
-                        "Debugger-->"))
+  (fluid-let ((*dstate* dstate))
+    (debug/read-eval-print (->environment '(RUNTIME DEBUGGER))
+                          "You are now in the debugger environment"
+                          "Debugger-->")))
+
 (define (command/frame dstate)
   (presentation
    (lambda ()
index ef7e3af24b4a91975e6e32714d3148ced18852fb..7c5449668a21743bbf4f02cf933822211a23e092 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/framex.scm,v 14.10 1990/01/29 22:34:56 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/framex.scm,v 14.11 1990/08/21 04:18:40 jinx Exp $
 
 Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
 
@@ -108,26 +108,36 @@ MIT in each case. |#
 
 (define (method/compiled-code frame)
   (values
-   (let ((continuation
+   (let ((object
          (compiled-entry/dbg-object (stack-frame/return-address frame)))
         (lose (lambda () compiled-code)))
-     (if continuation
-        (let ((source-code (dbg-continuation/source-code continuation)))
-          (if (and (vector? source-code)
-                   (not (zero? (vector-length source-code))))
-              (case (vector-ref source-code 0)
-                ((SEQUENCE-2-SECOND
-                  SEQUENCE-3-SECOND
-                  SEQUENCE-3-THIRD
-                  CONDITIONAL-DECIDE
-                  ASSIGNMENT-CONTINUE
-                  DEFINITION-CONTINUE
-                  COMBINATION-OPERAND)
-                 (vector-ref source-code 1))
-                (else
-                 (lose)))
-              (lose)))
-        (lose)))
+     (cond ((not object)
+           (lose))
+          ((dbg-continuation? object)
+           (let ((source-code (dbg-continuation/source-code object)))
+             (if (and (vector? source-code)
+                      (not (zero? (vector-length source-code))))
+                 (case (vector-ref source-code 0)
+                   ((SEQUENCE-2-SECOND
+                     SEQUENCE-3-SECOND
+                     SEQUENCE-3-THIRD
+                     CONDITIONAL-DECIDE
+                     ASSIGNMENT-CONTINUE
+                     DEFINITION-CONTINUE
+                     COMBINATION-OPERAND)
+                    (vector-ref source-code 1))
+                   (else
+                    (lose)))
+                 (lose))))
+          ((dbg-procedure? object)
+           (lambda-body (dbg-procedure/source-code object)))
+          #|
+          ((dbg-expression? object)
+           ;; no expression!
+           (lose))
+          |#
+          (else
+           (lose))))
    (stack-frame/environment frame undefined-environment)))
 
 (define (method/primitive-combination-3-first-operand frame)
@@ -289,7 +299,13 @@ MIT in each case. |#
 
            (,method/hardware-trap
             HARDWARE-TRAP)))
-  (1d-table/put!
-   (stack-frame-type/properties stack-frame-type/compiled-return-address)
-   method-tag
-   method/compiled-code))
\ No newline at end of file
+  (for-each
+   (lambda (type)
+     (1d-table/put!
+      (stack-frame-type/properties type)
+      method-tag
+      method/compiled-code))
+   (list
+    stack-frame-type/compiled-return-address
+    stack-frame-type/interrupt-compiled-procedure
+    stack-frame-type/interrupt-compiled-expression)))
\ No newline at end of file
index af89424f89b01f988c13d153dda4c163d76aed4a..131a8da40ba598384e567e7e063ddd0d1d6500d1 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/infutl.scm,v 1.17 1990/06/28 16:35:56 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/infutl.scm,v 1.18 1990/08/21 04:18:47 jinx Exp $
 
 Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
 
@@ -136,10 +136,12 @@ MIT in each case. |#
             (discriminate-compiled-entry entry
               find-procedure
               (lambda ()
-                (vector-binary-search (dbg-info/continuations dbg-info)
-                                      <
-                                      dbg-continuation/label-offset
-                                      offset))        (lambda ()
+                (or (vector-binary-search (dbg-info/continuations dbg-info)
+                                          <
+                                          dbg-continuation/label-offset
+                                          offset)
+                    (find-procedure)))
+              (lambda ()
                 (let ((expression (dbg-info/expression dbg-info)))
                   (if (= offset (dbg-expression/label-offset expression))
                       expression
index d531b339b1d4449c4eccb6509967c62e8b8fd265..f7bf699497f04647204b62ec5d7b0d414a38a107 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/runtime.pkg,v 14.72 1990/07/20 01:21:23 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/runtime.pkg,v 14.73 1990/08/21 04:18:57 jinx Exp $
 
 Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
 
@@ -245,8 +245,11 @@ MIT in each case. |#
          dbg-block/stack-link
          dbg-block/static-link-index
          dbg-block/type
+         dbg-continuation?
          dbg-continuation/block
          dbg-continuation/offset
+         dbg-expression?
+         dbg-procedure?
          dbg-procedure/block
          dbg-procedure/name
          dbg-procedure/required
@@ -258,7 +261,12 @@ MIT in each case. |#
          dbg-variable/value
          dbg-variable?)
   (export (runtime debugging-info)
-         dbg-continuation/source-code)
+         dbg-continuation?
+         dbg-continuation/source-code
+         dbg-procedure?
+         dbg-procedure/source-code
+         dbg-expression?
+         )
   (initialization (initialize-package!)))
 
 (define-package (runtime console-input)
@@ -330,7 +338,11 @@ MIT in each case. |#
          stack-frame/type
          stack-frame?)
   (export (runtime debugger)
-         stack-frame/compiled-code?)  (initialization (initialize-package!)))
+         stack-frame/compiled-code?)
+  (export (runtime debugging-info)
+         stack-frame-type/interrupt-compiled-procedure
+         stack-frame-type/interrupt-compiled-expression)
+  (initialization (initialize-package!)))
 
 (define-package (runtime control-point)
   (files "cpoint")
index 30ff92e77731d13f0078f8c62cd5c6c456a972f1..0c7021a1749447035e86a9cba2c186e7a2fbec05 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/udata.scm,v 14.13 1990/06/07 19:55:02 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/udata.scm,v 14.14 1990/08/21 04:19:05 jinx Exp $
 
 Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
 
@@ -124,10 +124,25 @@ MIT in each case. |#
   (let ((info ((ucode-primitive compiled-entry-kind 1) object)))
     (if (not (= (system-hunk3-cxr0 info) 0))
        (error "COMPILED-PROCEDURE-ARITY: bad compiled procedure" object))
+    ;; max = (-1)^tail? * (1 + req + opt + tail?)
+    ;; min = (1 + req)
     (cons (-1+ (system-hunk3-cxr1 info))
          (let ((max (system-hunk3-cxr2 info)))
            (and (not (negative? max))
                 (-1+ max))))))
+
+(define (compiled-procedure-frame-size procedure)
+  (let ((info ((ucode-primitive compiled-entry-kind 1) procedure)))
+    (if (not (= (system-hunk3-cxr0 info) 0))
+       (error "COMPILED-PROCEDURE-FRAME-SIZE: bad compiled procedure"
+              procedure))
+    (let ((max (system-hunk3-cxr2 info)))
+      ;; max = (-1)^tail? * (1 + req + opt + tail?)
+      ;; frame = req + opt + tail?
+      (if (negative? max)
+         (- -1 max)
+         (-1+ max)))))
+
 (define (compiled-continuation/next-continuation-offset entry)
   (let ((offset
         (system-hunk3-cxr2 ((ucode-primitive compiled-entry-kind 1) entry))))
index b78d354af921645df0fc51de090fbd51b84a444d..0eadd99ca728f12e74a35a00bc7e7ee5d4d83d36 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/uenvir.scm,v 14.18 1990/08/07 20:11:06 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/uenvir.scm,v 14.19 1990/08/21 04:19:12 jinx Exp $
 
 Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
 
@@ -279,26 +279,47 @@ MIT in each case. |#
   (start-index false read-only true))
 
 (define (stack-frame/environment frame default)
-  (let ((continuation
-        (compiled-entry/dbg-object (stack-frame/return-address frame))))
-    (if continuation
-       (let ((block (dbg-continuation/block continuation)))
-         (let ((parent (dbg-block/parent block)))
-           (case (dbg-block/type parent)
-             ((STACK)
-              (make-stack-ccenv
-               parent
-               frame
-               (+ (dbg-continuation/offset continuation)
-                  (vector-length (dbg-block/layout-vector block)))))
-             ((IC)
-              (let ((index (dbg-block/ic-parent-index block)))
-                (if index
-                    (guarantee-ic-environment (stack-frame/ref frame index))
-                    default)))
-             (else
-              (error "Illegal continuation parent block" parent)))))
-       default)))
+  (let* ((ret-add (stack-frame/return-address frame))
+        (object (compiled-entry/dbg-object ret-add)))
+    (cond ((not object)
+          default)
+         ((dbg-continuation? object)
+          (let ((block (dbg-continuation/block object)))
+            (let ((parent (dbg-block/parent block)))
+              (case (dbg-block/type parent)
+                ((STACK)
+                 (make-stack-ccenv
+                  parent
+                  frame
+                  (+ (dbg-continuation/offset object)
+                     (vector-length (dbg-block/layout-vector block)))))
+                ((IC)
+                 (let ((index (dbg-block/ic-parent-index block)))
+                   (if index
+                       (guarantee-ic-environment (stack-frame/ref frame index))
+                       default)))
+                (else
+                 (error "Illegal continuation parent block" parent))))))
+         ((dbg-procedure? object)
+          (let ((block (dbg-procedure/block object)))
+            (case (dbg-block/type block)
+              ((STACK)
+               (make-stack-ccenv
+                block
+                frame
+                (if (compiled-closure? ret-add)
+                    0
+                    1)))
+              (else
+               (error "Illegal procedure block" block)))))
+         #|
+         ((dbg-expression? object)
+          ;; for now
+          default)
+         |#
+         (else
+          default))))
+
 (define (compiled-procedure/environment entry)
   (let ((procedure (compiled-entry/dbg-object entry)))
     (if (not procedure)
index 2cc2afa4162fd33b4ffc8bc7313317393f7f181c..b788b150db0236a677bec367c797599cbd248d71 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/version.scm,v 14.92 1990/08/16 20:13:17 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/version.scm,v 14.93 1990/08/21 04:17:42 jinx Exp $
 
 Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
 
@@ -45,7 +45,8 @@ MIT in each case. |#
                     '()))
   (add-system! microcode-system)
   (add-event-receiver! event:after-restore snarf-microcode-version!)
-  (add-identification! "Runtime" 14 92))
+  (add-identification! "Runtime" 14 93))
+
 (define microcode-system)
 
 (define (snarf-microcode-version!)
index fbc7d19d4729a3781d5fc59b5e6a9b3bd00d85ff..700a2380ec22d79713ba336d898559ef07e8f429 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/runtime/conpar.scm,v 14.16 1990/08/08 00:57:07 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/runtime/conpar.scm,v 14.17 1990/08/21 04:18:26 jinx Exp $
 
 Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
 
@@ -140,7 +140,8 @@ MIT in each case. |#
   (previous-history-control-point false read-only true)
   (element-stream false read-only true)
   (n-elements false read-only true)
-  (next-control-point false read-only true))
+  (next-control-point false read-only true)
+  (allow-next-extended? false read-only true))
 
 (define (continuation->stack-frame continuation)
   (parse/control-point (continuation/control-point continuation)
@@ -159,14 +160,16 @@ MIT in each case. |#
         (control-point/previous-history-control-point control-point)
         (control-point/element-stream control-point)
         (control-point/n-elements control-point)
-        (control-point/next-control-point control-point)))))
+        (control-point/next-control-point control-point)
+        false))))
 
 (define (parse/start state)
   (let ((stream (parser-state/element-stream state)))
     (if (stream-pair? stream)
        (let ((type
               (return-address->stack-frame-type
-               (element-stream/head stream))))
+               (element-stream/head stream)
+               (parser-state/allow-next-extended? state))))
          (let ((length
                 (let ((length (stack-frame-type/length type)))
                   (if (exact-nonnegative-integer? length)
@@ -175,12 +178,13 @@ MIT in each case. |#
            ((stack-frame-type/parser type)
             type
             (list->vector (stream-head stream length))
-            (parse/next-state state length (stream-tail stream length)))))
+            (parse/next-state state length (stream-tail stream length)
+                              (stack-frame-type/allow-extended? type)))))
        (parse/control-point (parser-state/next-control-point state)
                             (parser-state/dynamic-state state)
                             (parser-state/fluid-bindings state)))))
 \f
-(define (parse/next-state state length stream)
+(define (parse/next-state state length stream allow-extended?)
   (let ((previous-history-control-point
         (parser-state/previous-history-control-point state)))
     (make-parser-state
@@ -195,7 +199,8 @@ MIT in each case. |#
      previous-history-control-point
      stream
      (- (parser-state/n-elements state) length)
-     (parser-state/next-control-point state))))
+     (parser-state/next-control-point state)
+     allow-extended?)))
 
 (define (make-frame type elements state element-stream n-elements)
   (let ((history-subproblem?
@@ -227,7 +232,8 @@ MIT in each case. |#
                       previous-history-control-point
                       element-stream
                       n-elements
-                      (parser-state/next-control-point state)))))
+                      (parser-state/next-control-point state)
+                      (stack-frame-type/allow-extended? type)))))
 
 (define (element-stream/head stream)
   (if (not (stream-pair? stream)) (error "not a stream-pair" stream))
@@ -312,11 +318,16 @@ MIT in each case. |#
          (1+ frame-size)
          (stack-address->index (element-stream/ref stream 1) offset)))))
 
+(define (length/interrupt-compiled-procedure stream offset)
+  offset                               ; ignored
+  (1+ (compiled-procedure-frame-size (element-stream/head stream))))
+
 (define (verify paranoia-index stream offset)
   (or (zero? paranoia-index)
       (stream-null? stream)
       (let* ((type (return-address->stack-frame-type
-                   (element-stream/head stream)))
+                   (element-stream/head stream)
+                   false))
             (length
              (let ((length (stack-frame-type/length type)))
                (if (exact-nonnegative-integer? length)
@@ -325,10 +336,9 @@ MIT in each case. |#
             (ltail (stream-tail* stream length)))
        (and ltail
             (return-address? (element-stream/head ltail))
-            (verify (-1+ paranoia-index)
-                    ltail
-                    (+ offset length))))))
-
+            (loop (-1+ paranoia-index)
+                  ltail
+                  (+ offset length))))))
 (define (stream-tail* stream n)
   (cond ((or (zero? n) (stream-null? stream))
         stream)
@@ -366,7 +376,8 @@ MIT in each case. |#
                      previous-history-control-point
                      (parser-state/element-stream state)
                      (parser-state/n-elements state)
-                     (parser-state/next-control-point state))))
+                     (parser-state/next-control-point state)
+                     false)))
 \f
 (define (parser/restore-dynamic-state type elements state)
   (make-restore-frame type elements state
@@ -427,12 +438,21 @@ MIT in each case. |#
   (length false read-only true)
   (parser false read-only true))
 
+(define allow-extended-return-addresses?-tag
+  "stack-frame-type/allow-extended")
+
+(define (stack-frame-type/allow-extended? type)
+  (1d-table/get
+   (stack-frame-type/properties type)
+   allow-extended-return-addresses?-tag
+   false))
+
 (define (microcode-return/code->type code)
   (if (not (< code (vector-length stack-frame-types)))
       (error "return-code too large" code))
   (vector-ref stack-frame-types code))
 
-(define (return-address->stack-frame-type return-address)
+(define (return-address->stack-frame-type return-address allow-extended?)
   (cond ((interpreter-return-address? return-address)
         (let ((code (return-address/code return-address)))
           (let ((type (microcode-return/code->type code)))
@@ -444,6 +464,10 @@ MIT in each case. |#
              return-address)
             stack-frame-type/return-to-interpreter
             stack-frame-type/compiled-return-address))
+       ((and allow-extended? (compiled-procedure? return-address))
+        stack-frame-type/interrupt-compiled-procedure)
+       ((and allow-extended? (compiled-expression? return-address))
+        stack-frame-type/interrupt-compiled-expression)
        (else
         (error "illegal return address" return-address))))
 
@@ -467,6 +491,19 @@ MIT in each case. |#
                               true
                               1
                               parser/standard-next))
+  (set! stack-frame-type/interrupt-compiled-procedure
+       (make-stack-frame-type false
+                              true
+                              false
+                              length/interrupt-compiled-procedure
+                              parser/standard-next))
+  (set! stack-frame-type/interrupt-compiled-expression
+       (make-stack-frame-type false
+                              true
+                              false
+                              1
+                              parser/standard-next))
+  
   (set! word-size
        (let ((initial (system-vector-length (make-bit-string 1 #f))))
          (let loop ((size 2))
@@ -480,6 +517,8 @@ MIT in each case. |#
 (define stack-frame-type/compiled-return-address)
 (define stack-frame-type/return-to-interpreter)
 (define stack-frame-type/hardware-trap)
+(define stack-frame-type/interrupt-compiled-procedure)
+(define stack-frame-type/interrupt-compiled-expression)
 
 (define (make-stack-frame-types)
   (let ((types (make-vector (microcode-return/code-limit) false)))
@@ -488,11 +527,11 @@ MIT in each case. |#
                              history-subproblem?
                              length parser)
       (let ((code (microcode-return name)))
-       (vector-set! types
-                    code
-                    (make-stack-frame-type code subproblem?
-                                           history-subproblem?
-                                           length parser))))
+       (let ((type (make-stack-frame-type code subproblem?
+                                          history-subproblem?
+                                          length parser)))
+         (vector-set! types code type)
+         type)))
 
     (define (standard-frame name length #!optional parser)
       (stack-frame-type name
@@ -564,7 +603,13 @@ MIT in each case. |#
        (compiler-subproblem 'COMPILER-LOOKUP-APPLY-TRAP-RESTART length)
        (compiler-subproblem 'COMPILER-OPERATOR-LOOKUP-TRAP-RESTART length))
 
-      (compiler-frame 'COMPILER-INTERRUPT-RESTART 3)      (compiler-frame 'COMPILER-LINK-CACHES-RESTART 8)
+      (let ((type
+            (compiler-frame 'COMPILER-INTERRUPT-RESTART 3)))
+       (1d-table/put! (stack-frame-type/properties type)
+                      allow-extended-return-addresses?-tag
+                      true))
+
+      (compiler-frame 'COMPILER-LINK-CACHES-RESTART 8)
       (compiler-frame 'REENTER-COMPILED-CODE 2)
 
       (compiler-subproblem 'COMPILER-ACCESS-RESTART 4)
index 94bf78c989799e03edd47d7873981add83677364..8ce3c1221354e7a2981ca0bc2790de96ae4eebb0 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/runtime/framex.scm,v 14.10 1990/01/29 22:34:56 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/runtime/framex.scm,v 14.11 1990/08/21 04:18:40 jinx Exp $
 
 Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
 
@@ -108,26 +108,36 @@ MIT in each case. |#
 
 (define (method/compiled-code frame)
   (values
-   (let ((continuation
+   (let ((object
          (compiled-entry/dbg-object (stack-frame/return-address frame)))
         (lose (lambda () compiled-code)))
-     (if continuation
-        (let ((source-code (dbg-continuation/source-code continuation)))
-          (if (and (vector? source-code)
-                   (not (zero? (vector-length source-code))))
-              (case (vector-ref source-code 0)
-                ((SEQUENCE-2-SECOND
-                  SEQUENCE-3-SECOND
-                  SEQUENCE-3-THIRD
-                  CONDITIONAL-DECIDE
-                  ASSIGNMENT-CONTINUE
-                  DEFINITION-CONTINUE
-                  COMBINATION-OPERAND)
-                 (vector-ref source-code 1))
-                (else
-                 (lose)))
-              (lose)))
-        (lose)))
+     (cond ((not object)
+           (lose))
+          ((dbg-continuation? object)
+           (let ((source-code (dbg-continuation/source-code object)))
+             (if (and (vector? source-code)
+                      (not (zero? (vector-length source-code))))
+                 (case (vector-ref source-code 0)
+                   ((SEQUENCE-2-SECOND
+                     SEQUENCE-3-SECOND
+                     SEQUENCE-3-THIRD
+                     CONDITIONAL-DECIDE
+                     ASSIGNMENT-CONTINUE
+                     DEFINITION-CONTINUE
+                     COMBINATION-OPERAND)
+                    (vector-ref source-code 1))
+                   (else
+                    (lose)))
+                 (lose))))
+          ((dbg-procedure? object)
+           (lambda-body (dbg-procedure/source-code object)))
+          #|
+          ((dbg-expression? object)
+           ;; no expression!
+           (lose))
+          |#
+          (else
+           (lose))))
    (stack-frame/environment frame undefined-environment)))
 
 (define (method/primitive-combination-3-first-operand frame)
@@ -289,7 +299,13 @@ MIT in each case. |#
 
            (,method/hardware-trap
             HARDWARE-TRAP)))
-  (1d-table/put!
-   (stack-frame-type/properties stack-frame-type/compiled-return-address)
-   method-tag
-   method/compiled-code))
\ No newline at end of file
+  (for-each
+   (lambda (type)
+     (1d-table/put!
+      (stack-frame-type/properties type)
+      method-tag
+      method/compiled-code))
+   (list
+    stack-frame-type/compiled-return-address
+    stack-frame-type/interrupt-compiled-procedure
+    stack-frame-type/interrupt-compiled-expression)))
\ No newline at end of file
index 24826ac14c63d94c69ba59d5fab7246b211a9f88..c57a73ed38550cfbd55de1d00979001cec500181 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/runtime/infutl.scm,v 1.17 1990/06/28 16:35:56 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/runtime/infutl.scm,v 1.18 1990/08/21 04:18:47 jinx Exp $
 
 Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
 
@@ -136,10 +136,12 @@ MIT in each case. |#
             (discriminate-compiled-entry entry
               find-procedure
               (lambda ()
-                (vector-binary-search (dbg-info/continuations dbg-info)
-                                      <
-                                      dbg-continuation/label-offset
-                                      offset))        (lambda ()
+                (or (vector-binary-search (dbg-info/continuations dbg-info)
+                                          <
+                                          dbg-continuation/label-offset
+                                          offset)
+                    (find-procedure)))
+              (lambda ()
                 (let ((expression (dbg-info/expression dbg-info)))
                   (if (= offset (dbg-expression/label-offset expression))
                       expression
index 1b67bebfde6ed237ae4dd1622156cc91d76132d8..2f5d57c631b19978c1410b72de9ff25065e62be7 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/runtime/runtime.pkg,v 14.72 1990/07/20 01:21:23 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/runtime/runtime.pkg,v 14.73 1990/08/21 04:18:57 jinx Exp $
 
 Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
 
@@ -245,8 +245,11 @@ MIT in each case. |#
          dbg-block/stack-link
          dbg-block/static-link-index
          dbg-block/type
+         dbg-continuation?
          dbg-continuation/block
          dbg-continuation/offset
+         dbg-expression?
+         dbg-procedure?
          dbg-procedure/block
          dbg-procedure/name
          dbg-procedure/required
@@ -258,7 +261,12 @@ MIT in each case. |#
          dbg-variable/value
          dbg-variable?)
   (export (runtime debugging-info)
-         dbg-continuation/source-code)
+         dbg-continuation?
+         dbg-continuation/source-code
+         dbg-procedure?
+         dbg-procedure/source-code
+         dbg-expression?
+         )
   (initialization (initialize-package!)))
 
 (define-package (runtime console-input)
@@ -330,7 +338,11 @@ MIT in each case. |#
          stack-frame/type
          stack-frame?)
   (export (runtime debugger)
-         stack-frame/compiled-code?)  (initialization (initialize-package!)))
+         stack-frame/compiled-code?)
+  (export (runtime debugging-info)
+         stack-frame-type/interrupt-compiled-procedure
+         stack-frame-type/interrupt-compiled-expression)
+  (initialization (initialize-package!)))
 
 (define-package (runtime control-point)
   (files "cpoint")
index 9717e4138203680b57f2fd81db2f53b14d8c52b9..98dfcc16567a30d89c40e3bb301c12d553af13ad 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/runtime/uenvir.scm,v 14.18 1990/08/07 20:11:06 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/runtime/uenvir.scm,v 14.19 1990/08/21 04:19:12 jinx Exp $
 
 Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
 
@@ -279,26 +279,47 @@ MIT in each case. |#
   (start-index false read-only true))
 
 (define (stack-frame/environment frame default)
-  (let ((continuation
-        (compiled-entry/dbg-object (stack-frame/return-address frame))))
-    (if continuation
-       (let ((block (dbg-continuation/block continuation)))
-         (let ((parent (dbg-block/parent block)))
-           (case (dbg-block/type parent)
-             ((STACK)
-              (make-stack-ccenv
-               parent
-               frame
-               (+ (dbg-continuation/offset continuation)
-                  (vector-length (dbg-block/layout-vector block)))))
-             ((IC)
-              (let ((index (dbg-block/ic-parent-index block)))
-                (if index
-                    (guarantee-ic-environment (stack-frame/ref frame index))
-                    default)))
-             (else
-              (error "Illegal continuation parent block" parent)))))
-       default)))
+  (let* ((ret-add (stack-frame/return-address frame))
+        (object (compiled-entry/dbg-object ret-add)))
+    (cond ((not object)
+          default)
+         ((dbg-continuation? object)
+          (let ((block (dbg-continuation/block object)))
+            (let ((parent (dbg-block/parent block)))
+              (case (dbg-block/type parent)
+                ((STACK)
+                 (make-stack-ccenv
+                  parent
+                  frame
+                  (+ (dbg-continuation/offset object)
+                     (vector-length (dbg-block/layout-vector block)))))
+                ((IC)
+                 (let ((index (dbg-block/ic-parent-index block)))
+                   (if index
+                       (guarantee-ic-environment (stack-frame/ref frame index))
+                       default)))
+                (else
+                 (error "Illegal continuation parent block" parent))))))
+         ((dbg-procedure? object)
+          (let ((block (dbg-procedure/block object)))
+            (case (dbg-block/type block)
+              ((STACK)
+               (make-stack-ccenv
+                block
+                frame
+                (if (compiled-closure? ret-add)
+                    0
+                    1)))
+              (else
+               (error "Illegal procedure block" block)))))
+         #|
+         ((dbg-expression? object)
+          ;; for now
+          default)
+         |#
+         (else
+          default))))
+
 (define (compiled-procedure/environment entry)
   (let ((procedure (compiled-entry/dbg-object entry)))
     (if (not procedure)