#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/fgopt/offset.scm,v 4.7 1990/05/03 15:09:17 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/fgopt/offset.scm,v 4.8 1990/08/24 20:20:30 jinx Rel $
Copyright (c) 1988, 1990 Massachusetts Institute of Technology
(continuation/offset procedure)))
(begin
(for-each
- (lambda (value)
+ (lambda (value name)
(cond ((and (rvalue/procedure? value)
(not (procedure-continuation? value)))
(let ((context (procedure-closure-context value)))
(if (reference-context? context)
- (update-reference-context/offset! context 0)))
+ (let ((closing-block
+ (procedure-closing-block value)))
+ (if (eq? closing-block
+ (block-shared-block closing-block))
+ (update-reference-context/offset! context
+ 0)
+ (update-reference-context/fake-offset!
+ context name)))))
(walk-rvalue value 0))
((rvalue/block? value)
(enqueue-grafted-procedures! value))
(else
(walk-rvalue value 0))))
- (procedure-values procedure))
+ (procedure-values procedure)
+ (procedure-names procedure))
(walk-next (procedure-entry-node procedure) 0)))))
;; This is a kludge. If the procedure hasn't been encountered
;; elsewhere, tag it as closed when the letrec was done.
(define (update-reference-context/offset! context offset)
(let ((offset* (reference-context/offset context)))
- (cond ((not offset*) (set-reference-context/offset! context offset))
+ (cond ((not offset*)
+ (set-reference-context/offset! context offset))
+ ((not (= offset offset*))
+ (error "mismatched offsets" context)))))
+
+(define (update-reference-context/fake-offset! context name)
+ (let ((offset (- -1 (variable-normal-offset name)))
+ (offset* (reference-context/offset context)))
+ (cond ((or (not offset*)
+ (zero? offset*))
+ (set-reference-context/offset! context offset))
((not (= offset offset*))
(error "mismatched offsets" context)))))
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/make.scm-68040,v 4.75 1990/08/21 02:20:43 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/make.scm-68040,v 4.76 1990/08/24 20:19:45 jinx Exp $
Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
((package/reference (find-package name) 'INITIALIZE-PACKAGE!)))
'((COMPILER MACROS)
(COMPILER DECLARATIONS)))
-(add-system! (make-system "Liar (Motorola MC68020)" 4 75 '()))
\ No newline at end of file
+(add-system! (make-system "Liar (Motorola MC68020)" 4 76 '()))
\ No newline at end of file
-d3 1
-a4 1
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgrval.scm,v 4.16 1990/05/03 15:11:58 jinx Exp $
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgrval.scm,v 4.16 1990/05/03 15:11:58 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgrval.scm,v 4.17 1990/08/24 20:19:59 jinx Rel $
Copyright (c) 1988, 1990 Massachusetts Institute of Technology
(code (load-closure-parent (block-parent block) false)))
(if (null? entries)
code
+ (loop
+ (cdr entries)
+ (scfg*scfg->scfg!
+ (rtl:make-assignment
+ (rtl:locative-offset closure-locative
+ (cdar entries))
+ (let* ((variable (caar entries))
+ (value (lvalue-known-value variable)))
+ (cond
+ ;; Paranoia.
+ ((and value
+ (rvalue/procedure? value)
+ (procedure/trivial-or-virtual? value)
+ (error "known ignorable procedure"
+ value variable))
+ (make-trivial-closure-cons value))
+ ((and (eq? value
(reference-context/procedure context))
- (loop (cdr entries)
- (scfg*scfg->scfg!
- (rtl:make-assignment
- (rtl:locative-offset closure-locative
- (cdar entries))
- (let* ((variable (caar entries))
- (value (lvalue-known-value variable)))
- (cond
- ;; Paranoia.
- ((and value
- (rvalue/procedure? value)
- (procedure/trivial-or-virtual? value)
- (error "known ignorable procedure"
- value variable))
- (make-trivial-closure-cons value))
- ((eq? value
+ (bypass-closure-reference? value))
+ (rtl:make-fetch
+ (block-closure-locative context)))
+ (else
+ (find-closure-variable context variable)))))
+ code)))))
(else
- (rtl:make-fetch
- (block-closure-locative context)))
- (else
- (find-closure-variable context variable)))))
- code)))))
- (error "Unknown block type" block))))))
(error "Unknown block type" block))))))
+
+(define (bypass-closure-reference? procedure)
+ ;; This checks whether the closure object at the top of the stack
+ ;; is the same as the value of a variable bound to the closure.
+ ;; It typically is, but is not on the 68k if the closure is not the
+ ;; first entry of the shared closure because the closure-for-environment
+ ;; is always the canonical entry point.
+ (let* ((closure-block (procedure-closing-block procedure))
+ (shared-block (block-shared-block closure-block)))
+ (zero? (closure-environment-adjustment
+ (block-number-of-entries shared-block)
+ (closure-block-entry-number closure-block)))))
\ No newline at end of file