diff --git a/simulator.rkt b/simulator.rkt index a9a3074..2ed89ad 100644 --- a/simulator.rkt +++ b/simulator.rkt @@ -208,10 +208,24 @@ [(ApplyPrimitiveProcedure? op) m] + [(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) - 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) m]))) diff --git a/test-simulator.rkt b/test-simulator.rkt index 0f63c47..cdea91d 100644 --- a/test-simulator.rkt +++ b/test-simulator.rkt @@ -373,9 +373,35 @@ '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))))]) (test ...)) #;(let ([m (new-machine `(,(make-AssignPrimOpStatement (make-LookupToplevelAddress))))])