lexical address lookup
This commit is contained in:
parent
31e1b0a5d8
commit
c08c6ed667
|
@ -208,10 +208,24 @@
|
||||||
|
|
||||||
[(ApplyPrimitiveProcedure? op)
|
[(ApplyPrimitiveProcedure? op)
|
||||||
m]
|
m]
|
||||||
|
|
||||||
[(LookupLexicalAddress? op)
|
[(LookupLexicalAddress? op)
|
||||||
m]
|
(let: ([a-val : SlotValue (env-ref m (LookupLexicalAddress-depth op))])
|
||||||
|
(cond
|
||||||
|
[(toplevel? a-val)
|
||||||
|
(error 'lookup-lexical-address)]
|
||||||
|
[else
|
||||||
|
(target-updater m a-val)]))]
|
||||||
|
|
||||||
[(LookupToplevelAddress? op)
|
[(LookupToplevelAddress? op)
|
||||||
m]
|
(let: ([a-top : SlotValue (env-ref m (LookupToplevelAddress-depth op))])
|
||||||
|
(cond
|
||||||
|
[(toplevel? a-top)
|
||||||
|
(target-updater m (list-ref (toplevel-vals a-top)
|
||||||
|
(LookupToplevelAddress-pos op)))]
|
||||||
|
[else
|
||||||
|
(error 'lookup-toplevel "not a toplevel: ~s" a-top)]))]
|
||||||
|
|
||||||
[(GetControlStackLabel? op)
|
[(GetControlStackLabel? op)
|
||||||
m])))
|
m])))
|
||||||
|
|
||||||
|
|
|
@ -373,9 +373,35 @@
|
||||||
'moe))))
|
'moe))))
|
||||||
|
|
||||||
|
|
||||||
|
;; Test toplevel lookup
|
||||||
|
(let ([m (new-machine `(,(make-PerformStatement (make-ExtendEnvironment/Prefix! '(+)))
|
||||||
|
,(make-AssignPrimOpStatement 'val (make-LookupToplevelAddress 0 0 '+))))])
|
||||||
|
(test (machine-val (run m))
|
||||||
|
(lookup-primitive '+)))
|
||||||
|
|
||||||
|
;; Test lexical lookup
|
||||||
|
(let ([m (new-machine `(,(make-PerformStatement (make-ExtendEnvironment/Prefix! '(+)))
|
||||||
|
,(make-PushEnvironment 3)
|
||||||
|
,(make-AssignImmediateStatement (make-EnvLexicalReference 0) (make-Const 'larry))
|
||||||
|
,(make-AssignImmediateStatement (make-EnvLexicalReference 1) (make-Const 'curly))
|
||||||
|
,(make-AssignImmediateStatement (make-EnvLexicalReference 2) (make-Const 'moe))
|
||||||
|
|
||||||
|
,(make-AssignPrimOpStatement 'val (make-LookupLexicalAddress 0))))])
|
||||||
|
(test (machine-val (run m))
|
||||||
|
'larry))
|
||||||
|
;; Another lexical lookup test
|
||||||
|
(let ([m (new-machine `(,(make-PerformStatement (make-ExtendEnvironment/Prefix! '(+)))
|
||||||
|
,(make-PushEnvironment 3)
|
||||||
|
,(make-AssignImmediateStatement (make-EnvLexicalReference 0) (make-Const 'larry))
|
||||||
|
,(make-AssignImmediateStatement (make-EnvLexicalReference 1) (make-Const 'curly))
|
||||||
|
,(make-AssignImmediateStatement (make-EnvLexicalReference 2) (make-Const 'moe))
|
||||||
|
|
||||||
|
,(make-AssignPrimOpStatement 'val (make-LookupLexicalAddress 1))))])
|
||||||
|
(test (machine-val (run m))
|
||||||
|
'curly))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#;(let ([m (new-machine `(,(make-AssignPrimOpStatement (make-ApplyPrimitiveProcedure))))])
|
|
||||||
(test ...))
|
|
||||||
#;(let ([m (new-machine `(,(make-AssignPrimOpStatement (make-LookupLexicalAddress))))])
|
#;(let ([m (new-machine `(,(make-AssignPrimOpStatement (make-LookupLexicalAddress))))])
|
||||||
(test ...))
|
(test ...))
|
||||||
#;(let ([m (new-machine `(,(make-AssignPrimOpStatement (make-LookupToplevelAddress))))])
|
#;(let ([m (new-machine `(,(make-AssignPrimOpStatement (make-LookupToplevelAddress))))])
|
||||||
|
|
Loading…
Reference in New Issue
Block a user