check-toplevel-bound

This commit is contained in:
Danny Yoo 2011-03-09 17:17:03 -05:00
parent 0de23ee06e
commit 808ad8b7be
4 changed files with 36 additions and 26 deletions

View File

@ -341,29 +341,16 @@ EOF
(define (assemble-op-statement op) (define (assemble-op-statement op)
(cond (cond
[(SetToplevel!? op) [(SetToplevel!? op)
(error 'assemble-op-statement) (format "MACHINE.env[MACHINE.env.length - 1 - ~a][~a] = MACHINE.val;"
#;(let ([depth (first assembled-inputs)] (SetToplevel!-depth op)
[pos (second assembled-inputs)] (SetToplevel!-pos op))]
[name (third assembled-inputs)]
[env (fourth assembled-inputs)]
[val (fifth assembled-inputs)])
(format "(~a).valss[~a][~a] = ~a;"
env
depth
pos
val))]
[(CheckToplevelBound!? op) [(CheckToplevelBound!? op)
(error 'assemble-op-statement) (format "if (MACHINE.env[MACHINE.env.length - 1 - ~a][~a] === undefined) { throw new Error(\"Not bound: \" + ~s); }"
#;(let ([depth (first assembled-inputs)] (CheckToplevelBound!-depth op)
[pos (second assembled-inputs)] (CheckToplevelBound!-pos op)
[name (third assembled-inputs)] (symbol->string (CheckToplevelBound!-name op)))]
[env (fourth assembled-inputs)])
(format "if ((~a).valss[~a][~a] === undefined) { throw new Error(\"Not bound: \" + ~a); }"
env
depth
pos
name))]
[(CheckClosureArity!? op) [(CheckClosureArity!? op)
;; fixme ;; fixme
(error 'assemble-op-statement)] (error 'assemble-op-statement)]

View File

@ -3,7 +3,7 @@
(require "test-find-toplevel-variables.rkt" (require "test-find-toplevel-variables.rkt"
"test-simulator.rkt" "test-simulator.rkt"
"test-compiler.rkt" "test-compiler.rkt"
"test-assemble.rkt"
#; test-browser-evaluate #; test-browser-evaluate
#; test-package #; test-package
) )

View File

@ -20,7 +20,12 @@
(syntax/loc #'stx (syntax/loc #'stx
(begin (begin
(printf "Running ~s ...\n" (syntax->datum #'expr)) (printf "Running ~s ...\n" (syntax->datum #'expr))
(let ([actual expr]) (let ([actual
(with-handlers ([void
(lambda (exn)
(raise-syntax-error #f (format "Runtime error: got ~s" exn)
#'stx))])
expr)])
(unless (equal? actual expected) (unless (equal? actual expected)
(raise-syntax-error #f (format "Expected ~s, got ~s" expected actual) (raise-syntax-error #f (format "Expected ~s, got ~s" expected actual)
#'stx)) #'stx))
@ -247,6 +252,26 @@
;; Set-toplevel
(test (E-many `(,(make-PerformStatement (make-ExtendEnvironment/Prefix! '(advisor)))
,(make-AssignImmediateStatement 'val (make-Const "Kathi"))
,(make-PerformStatement (make-SetToplevel! 0 0 'some-variable)))
"MACHINE.env[0][0]")
"Kathi")
;; check-toplevel-bound
(let/ec return
(let ([dont-care
(with-handlers ([void (lambda (exn) (return))])
(E-many `(,(make-PerformStatement (make-ExtendEnvironment/Prefix! '(some-variable)))
,(make-PerformStatement (make-CheckToplevelBound! 0 0 'some-variable)))))])
(raise "I expected an error")))
;; check-toplevel-bound shouldn't fail here.
(test (E-many `(,(make-PerformStatement (make-ExtendEnvironment/Prefix! '(another-advisor)))
,(make-AssignImmediateStatement 'val (make-Const "Shriram"))
,(make-PerformStatement (make-SetToplevel! 0 0 'some-variable))
,(make-PerformStatement (make-CheckToplevelBound! 0 0 'another-advisor)))
"MACHINE.env[0][0]")
"Shriram")

View File

@ -223,8 +223,6 @@
;; AssignPrimOpStatement ;; AssignPrimOpStatement
(let ([m (new-machine `(,(make-PerformStatement (make-ExtendEnvironment/Prefix! '(+ - * =)))))]) (let ([m (new-machine `(,(make-PerformStatement (make-ExtendEnvironment/Prefix! '(+ - * =)))))])
;; FIXME: I'm hitting what appears to be a Typed Racket bug that prevents me from inspecting
;; the toplevel structure in the environment... :(
(test (first (machine-env (run m))) (test (first (machine-env (run m)))
(make-toplevel (list (lookup-primitive '+) (make-toplevel (list (lookup-primitive '+)
(lookup-primitive '-) (lookup-primitive '-)