diff --git a/assemble.rkt b/assemble.rkt index 983f878..e3e000b 100644 --- a/assemble.rkt +++ b/assemble.rkt @@ -302,13 +302,15 @@ EOF (cond [(GetCompiledProcedureEntry? op) "proc.label"] + [(MakeCompiledProcedure? op) - (format "new Closure(~a, ~a, ~a)" + (format "new Closure(~a, ~a, [~a], ~s)" (MakeCompiledProcedure-label op) (MakeCompiledProcedure-arity op) (string-join (map assemble-env-reference (MakeCompiledProcedure-closed-vals op)) - ", "))] + ", ") + (symbol->string (MakeCompiledProcedure-label op)))] [(ApplyPrimitiveProcedure? op) (error 'assemble-op-expression)] diff --git a/runtime.js b/runtime.js index 8c885ff..c9346ae 100644 --- a/runtime.js +++ b/runtime.js @@ -78,9 +78,11 @@ var Primitives = { // A closure consists of its free variables as well as a label // into its text segment. -var Closure = function(env, label) { - this.env = env; +var Closure = function(label, arity, closedVals, displayName) { this.label = label; + this.arity = arity; + this.closedVals = closedVals; + this.displayName = displayName; }; diff --git a/test-assemble.rkt b/test-assemble.rkt index b5b0c1d..715e320 100644 --- a/test-assemble.rkt +++ b/test-assemble.rkt @@ -22,7 +22,7 @@ (printf "Running ~s ...\n" (syntax->datum #'expr)) (let ([actual expr]) (unless (equal? actual expected) - (raise-syntax-error #f (format "Expected ~s, got ~s" exp actual) + (raise-syntax-error #f (format "Expected ~s, got ~s" expected actual) #'stx)) (printf "ok.\n\n")))))])) @@ -124,3 +124,12 @@ (make-Const 12345))) "MACHINE.env[0]") "12345") + +;; A do-nothing closure +(test (E-many (list (make-GotoStatement (make-Label 'afterLambda)) + 'closureStart + (make-GotoStatement (make-Label 'afterLambda)) + 'afterLambda + (make-AssignPrimOpStatement 'val (make-MakeCompiledProcedure 'afterLambda 0 '()))) + "MACHINE.val.displayName") + "afterLambda")