From d9e96d3dab2d23adb0d17669cb74d9bd1aaf1490 Mon Sep 17 00:00:00 2001 From: Danny Yoo Date: Wed, 4 May 2011 18:27:42 -0400 Subject: [PATCH] test case for assembling make-CompiledProcedureClosureReference --- assemble-helpers.rkt | 3 ++- assemble-perform-statement.rkt | 5 +++++ test-assemble.rkt | 30 ++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/assemble-helpers.rkt b/assemble-helpers.rkt index 25c9909..ae2bb36 100644 --- a/assemble-helpers.rkt +++ b/assemble-helpers.rkt @@ -181,7 +181,8 @@ (: assemble-compiled-procedure-closure-reference (CompiledProcedureClosureReference -> String)) (define (assemble-compiled-procedure-closure-reference a-ref) - (format "(~a).closedVals[~a]" + (format "(~a).closedVals[(~a).closedVals.length - 1 - ~a]" + (assemble-oparg (CompiledProcedureClosureReference-proc a-ref)) (assemble-oparg (CompiledProcedureClosureReference-proc a-ref)) (CompiledProcedureClosureReference-n a-ref))) diff --git a/assemble-perform-statement.rkt b/assemble-perform-statement.rkt index cd46a1f..33072a1 100644 --- a/assemble-perform-statement.rkt +++ b/assemble-perform-statement.rkt @@ -58,8 +58,10 @@ [(InstallClosureValues!? op) "MACHINE.env.splice.apply(MACHINE.env, [MACHINE.env.length, 0].concat(MACHINE.proc.closedVals));"] + [(RestoreEnvironment!? op) "MACHINE.env = MACHINE.env[MACHINE.env.length - 2].slice(0);"] + [(RestoreControl!? op) (format "RUNTIME.restoreControl(MACHINE, ~a);" (let: ([tag : (U DefaultContinuationPromptTag OpArg) @@ -69,6 +71,7 @@ (assemble-default-continuation-prompt-tag)] [(OpArg? tag) (assemble-oparg tag)])))] + [(FixClosureShellMap!? op) (format "MACHINE.env[MACHINE.env.length - 1 - ~a].closedVals = [~a]" (FixClosureShellMap!-depth op) @@ -80,9 +83,11 @@ ;; during install-closure-values. (reverse (FixClosureShellMap!-closed-vals op))) ", "))] + [(SetFrameCallee!? op) (format "MACHINE.control[MACHINE.control.length-1].proc = ~a;" (assemble-oparg (SetFrameCallee!-proc op)))] + [(SpliceListIntoStack!? op) (format "RUNTIME.spliceListIntoStack(MACHINE, ~a);" (assemble-oparg (SpliceListIntoStack!-depth op)))] diff --git a/test-assemble.rkt b/test-assemble.rkt index 9056606..bc3b545 100644 --- a/test-assemble.rkt +++ b/test-assemble.rkt @@ -493,3 +493,33 @@ end) "MACHINE.val") "ok") + + + + +;; Let's test closure value lookup. +(test (E-many `(,(make-PushImmediateOntoEnvironment (make-Const 3) #f) + ,(make-PushImmediateOntoEnvironment (make-Const 4) #f) + procedure-entry + ;; doesn't matter about the procedure entry... + ,(make-AssignPrimOpStatement + 'proc + (make-MakeCompiledProcedure 'procedure-entry (make-ArityAtLeast 2) (list 0 1) 'procedure-entry)) + ,(make-AssignImmediateStatement 'val (make-CompiledProcedureClosureReference (make-Reg 'proc) 0))) + "MACHINE.val") + "4") + +(test (E-many `(,(make-PushImmediateOntoEnvironment (make-Const 3) #f) + ,(make-PushImmediateOntoEnvironment (make-Const 4) #f) + procedure-entry + ;; doesn't matter about the procedure entry... + ,(make-AssignPrimOpStatement + 'proc + (make-MakeCompiledProcedure 'procedure-entry (make-ArityAtLeast 2) (list 0 1) 'procedure-entry)) + ,(make-AssignImmediateStatement 'val (make-CompiledProcedureClosureReference (make-Reg 'proc) 1))) + "MACHINE.val") + "3") + + + +