getting lookup-primitive to return primitive values
This commit is contained in:
parent
865181ddc4
commit
700c637e47
|
@ -21,8 +21,9 @@
|
||||||
(define-type OpArg (U Const ;; an constant
|
(define-type OpArg (U Const ;; an constant
|
||||||
Label ;; an label
|
Label ;; an label
|
||||||
Reg ;; an register
|
Reg ;; an register
|
||||||
EnvLexicalReference
|
EnvLexicalReference ;; a reference into the stack
|
||||||
EnvWholePrefixReference))
|
EnvWholePrefixReference ;; a reference into a toplevel prefix in the stack.
|
||||||
|
))
|
||||||
|
|
||||||
(define-struct: Label ([name : Symbol])
|
(define-struct: Label ([name : Symbol])
|
||||||
#:transparent)
|
#:transparent)
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
)
|
)
|
||||||
#:transparent)
|
#:transparent)
|
||||||
|
|
||||||
(define-struct: toplevel ([vals : (Listof Any)])
|
(define-struct: toplevel ([vals : (Listof PrimitiveValue)])
|
||||||
#:transparent)
|
#:transparent)
|
||||||
|
|
||||||
|
|
||||||
|
@ -49,4 +49,8 @@
|
||||||
|
|
||||||
;; undefined value
|
;; undefined value
|
||||||
(define-struct: undefined ()
|
(define-struct: undefined ()
|
||||||
#:transparent)
|
#:transparent)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(define-predicate PrimitiveValue? PrimitiveValue)
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
(for-syntax racket/base))
|
(for-syntax racket/base))
|
||||||
|
|
||||||
(require/typed "simulator-prims.rkt"
|
(require/typed "simulator-prims.rkt"
|
||||||
[lookup-primitive (Symbol -> Any)])
|
[lookup-primitive (Symbol -> PrimitiveValue)])
|
||||||
|
|
||||||
|
|
||||||
(provide new-machine can-step? step)
|
(provide new-machine can-step? step)
|
||||||
|
@ -41,7 +41,7 @@
|
||||||
[(AssignImmediateStatement? i)
|
[(AssignImmediateStatement? i)
|
||||||
(step-assign-immediate m i)]
|
(step-assign-immediate m i)]
|
||||||
[(AssignPrimOpStatement? i)
|
[(AssignPrimOpStatement? i)
|
||||||
(error 'step)]
|
(step-assign-primitive-operation m i)]
|
||||||
[(PerformStatement? i)
|
[(PerformStatement? i)
|
||||||
(step-perform m i)]
|
(step-perform m i)]
|
||||||
[(GotoStatement? i)
|
[(GotoStatement? i)
|
||||||
|
@ -143,8 +143,7 @@
|
||||||
(SetToplevel!-depth op)
|
(SetToplevel!-depth op)
|
||||||
(toplevel-mutate (ensure-toplevel (env-ref m (SetToplevel!-depth op)))
|
(toplevel-mutate (ensure-toplevel (env-ref m (SetToplevel!-depth op)))
|
||||||
(SetToplevel!-pos op)
|
(SetToplevel!-pos op)
|
||||||
|
(ensure-primitive-value (machine-val m))))]
|
||||||
(machine-val m)))]
|
|
||||||
[(CheckToplevelBound!? op)
|
[(CheckToplevelBound!? op)
|
||||||
(let: ([a-top : toplevel (ensure-toplevel (env-ref m (CheckToplevelBound!-depth op)))])
|
(let: ([a-top : toplevel (ensure-toplevel (env-ref m (CheckToplevelBound!-depth op)))])
|
||||||
(cond
|
(cond
|
||||||
|
@ -166,6 +165,10 @@
|
||||||
[else
|
[else
|
||||||
(error 'step-perform "Procedure register doesn't hold a procedure: ~s"
|
(error 'step-perform "Procedure register doesn't hold a procedure: ~s"
|
||||||
a-proc)]))])))
|
a-proc)]))])))
|
||||||
|
|
||||||
|
(: step-assign-primitive-operation (machine AssignPrimOpStatement -> machine))
|
||||||
|
(define (step-assign-primitive-operation m stmt)
|
||||||
|
m)
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -176,8 +179,10 @@
|
||||||
(cond
|
(cond
|
||||||
[(Const? an-oparg)
|
[(Const? an-oparg)
|
||||||
(ensure-primitive-value (Const-const an-oparg))]
|
(ensure-primitive-value (Const-const an-oparg))]
|
||||||
|
|
||||||
[(Label? an-oparg)
|
[(Label? an-oparg)
|
||||||
(Label-name an-oparg)]
|
(Label-name an-oparg)]
|
||||||
|
|
||||||
[(Reg? an-oparg)
|
[(Reg? an-oparg)
|
||||||
(let: ([n : AtomicRegisterSymbol (Reg-name an-oparg)])
|
(let: ([n : AtomicRegisterSymbol (Reg-name an-oparg)])
|
||||||
(cond
|
(cond
|
||||||
|
@ -185,14 +190,27 @@
|
||||||
(machine-proc m)]
|
(machine-proc m)]
|
||||||
[(eq? n 'val)
|
[(eq? n 'val)
|
||||||
(machine-val m)]))]
|
(machine-val m)]))]
|
||||||
|
|
||||||
[(EnvLexicalReference? an-oparg)
|
[(EnvLexicalReference? an-oparg)
|
||||||
(list-ref (machine-env m) (EnvLexicalReference-depth an-oparg))]
|
(let: ([v : SlotValue
|
||||||
|
(list-ref (machine-env m) (EnvLexicalReference-depth an-oparg))])
|
||||||
|
(cond
|
||||||
|
[(PrimitiveValue? v)
|
||||||
|
v]
|
||||||
|
[(toplevel? v)
|
||||||
|
(error 'evaluate-oparg
|
||||||
|
"Unexpected toplevel at depth ~s"
|
||||||
|
(EnvLexicalReference-depth an-oparg))]))]
|
||||||
|
|
||||||
[(EnvWholePrefixReference? an-oparg)
|
[(EnvWholePrefixReference? an-oparg)
|
||||||
(unless (toplevel? (list-ref (machine-env m)
|
(let: ([v : SlotValue
|
||||||
(EnvWholePrefixReference-depth an-oparg)))
|
(list-ref (machine-env m) (EnvWholePrefixReference-depth an-oparg))])
|
||||||
(error 'evaluate-oparg "Internal error: not a toplevel at depth ~s"
|
(cond
|
||||||
(EnvWholePrefixReference-depth an-oparg)))
|
[(PrimitiveValue? v)
|
||||||
(list-ref (machine-env m) (EnvWholePrefixReference-depth an-oparg))]))
|
(error 'evaluate-oparg "Internal error: primitive value at depth ~s"
|
||||||
|
(EnvWholePrefixReference-depth an-oparg))]
|
||||||
|
[(toplevel? v)
|
||||||
|
v]))]))
|
||||||
|
|
||||||
|
|
||||||
(: ensure-primitive-value (Any -> PrimitiveValue))
|
(: ensure-primitive-value (Any -> PrimitiveValue))
|
||||||
|
@ -343,9 +361,8 @@
|
||||||
(loop (add1 i))])))
|
(loop (add1 i))])))
|
||||||
|
|
||||||
|
|
||||||
(: toplevel-mutate (toplevel Natural Any -> toplevel))
|
(: toplevel-mutate (toplevel Natural PrimitiveValue -> toplevel))
|
||||||
(define (toplevel-mutate a-top index v)
|
(define (toplevel-mutate a-top index v)
|
||||||
(make-toplevel (append (take (toplevel-vals a-top) index)
|
(make-toplevel (append (take (toplevel-vals a-top) index)
|
||||||
(list v)
|
(list v)
|
||||||
(drop (toplevel-vals a-top) (add1 index)))))
|
(drop (toplevel-vals a-top) (add1 index)))))
|
||||||
|
|
|
@ -284,4 +284,7 @@
|
||||||
)))])
|
)))])
|
||||||
(test (machine-env (run m))
|
(test (machine-env (run m))
|
||||||
;; Check that the environment has installed the expected closure values.
|
;; Check that the environment has installed the expected closure values.
|
||||||
(list 1 2 3 true false)))
|
(list 1 2 3 true false)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user