fixing assignment to targets.
This commit is contained in:
parent
c8c3947e0a
commit
f53c96abc5
50
assemble.rkt
50
assemble.rkt
|
@ -171,33 +171,28 @@ EOF
|
||||||
"\n")))
|
"\n")))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(: assemble-statement (UnlabeledStatement -> String))
|
(: assemble-statement (UnlabeledStatement -> String))
|
||||||
;; Generates the code to assemble a statement.
|
;; Generates the code to assemble a statement.
|
||||||
(define (assemble-statement stmt)
|
(define (assemble-statement stmt)
|
||||||
(cond
|
(cond
|
||||||
[(AssignImmediateStatement? stmt)
|
[(AssignImmediateStatement? stmt)
|
||||||
(let ([v (AssignImmediateStatement-value stmt)])
|
(let ([t (assemble-target (AssignImmediateStatement-target stmt))]
|
||||||
|
[v (AssignImmediateStatement-value stmt)])
|
||||||
|
(format "~a = ~a;"
|
||||||
|
t
|
||||||
(cond
|
(cond
|
||||||
[(Reg? v)
|
[(Reg? v)
|
||||||
(format "MACHINE.~a=~a"
|
(assemble-reg v)]
|
||||||
(AssignImmediateStatement-target stmt)
|
|
||||||
(assemble-reg v))]
|
|
||||||
[(Label? v)
|
[(Label? v)
|
||||||
(format "MACHINE.~a=~a;"
|
(assemble-label v)]
|
||||||
(AssignImmediateStatement-target stmt)
|
|
||||||
(assemble-label v))]
|
|
||||||
[(Const? v)
|
[(Const? v)
|
||||||
(format "MACHINE.~a=~a;"
|
(assemble-const v)]
|
||||||
(AssignImmediateStatement-target stmt)
|
|
||||||
(assemble-const v))]
|
|
||||||
[(EnvLexicalReference? v)
|
[(EnvLexicalReference? v)
|
||||||
(format "MACHINE.~a=~a;"
|
(assemble-lexical-reference v)]
|
||||||
(AssignImmediateStatement-target stmt)
|
|
||||||
(assemble-lexical-reference v))]
|
|
||||||
[(EnvWholePrefixReference? v)
|
[(EnvWholePrefixReference? v)
|
||||||
(format "MACHINE.~a=~a;"
|
(assemble-whole-prefix-reference v)])))]
|
||||||
(AssignImmediateStatement-target stmt)
|
|
||||||
(assemble-whole-prefix-reference v))]))]
|
|
||||||
|
|
||||||
[(AssignPrimOpStatement? stmt)
|
[(AssignPrimOpStatement? stmt)
|
||||||
(format "MACHINE.~a=~a;"
|
(format "MACHINE.~a=~a;"
|
||||||
|
@ -227,7 +222,24 @@ EOF
|
||||||
"undefined"))
|
"undefined"))
|
||||||
", "))]
|
", "))]
|
||||||
[(PopEnvironment? stmt)
|
[(PopEnvironment? stmt)
|
||||||
"fixme"]))
|
(format "MACHINE.env.splice(MACHINE.env.length-(~a),~a);"
|
||||||
|
(+ (PopEnvironment-skip stmt)
|
||||||
|
(PopEnvironment-n stmt))
|
||||||
|
(PopEnvironment-n stmt))]))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(: assemble-target (Target -> String))
|
||||||
|
(define (assemble-target target)
|
||||||
|
(cond
|
||||||
|
[(eq? target 'proc)
|
||||||
|
"MACHINE.proc"]
|
||||||
|
[(eq? target 'val)
|
||||||
|
"MACHINE.val"]
|
||||||
|
[(EnvLexicalReference? target)
|
||||||
|
(assemble-lexical-reference target)]))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; fixme: use js->string
|
;; fixme: use js->string
|
||||||
|
@ -248,12 +260,12 @@ EOF
|
||||||
|
|
||||||
(: assemble-lexical-reference (EnvLexicalReference -> String))
|
(: assemble-lexical-reference (EnvLexicalReference -> String))
|
||||||
(define (assemble-lexical-reference a-lex-ref)
|
(define (assemble-lexical-reference a-lex-ref)
|
||||||
(format "MACHINE.env[~a]"
|
(format "MACHINE.env[MACHINE.env.length - 1 - ~a]"
|
||||||
(EnvLexicalReference-depth a-lex-ref)))
|
(EnvLexicalReference-depth a-lex-ref)))
|
||||||
|
|
||||||
(: assemble-whole-prefix-reference (EnvWholePrefixReference -> String))
|
(: assemble-whole-prefix-reference (EnvWholePrefixReference -> String))
|
||||||
(define (assemble-whole-prefix-reference a-prefix-ref)
|
(define (assemble-whole-prefix-reference a-prefix-ref)
|
||||||
(format "MACHINE.env[~a]"
|
(format "MACHINE.env[MACHINE.env.length - 1 - ~a]"
|
||||||
(EnvWholePrefixReference-depth a-prefix-ref)))
|
(EnvWholePrefixReference-depth a-prefix-ref)))
|
||||||
|
|
||||||
(: assemble-env-reference (EnvReference -> String))
|
(: assemble-env-reference (EnvReference -> String))
|
||||||
|
|
|
@ -210,6 +210,7 @@ function createXMLHTTPObject() {
|
||||||
var comet = function() {
|
var comet = function() {
|
||||||
sendRequest("/eval",
|
sendRequest("/eval",
|
||||||
function(req) {
|
function(req) {
|
||||||
|
console.log(req.responseText);
|
||||||
var invoke = eval(req.responseText)();
|
var invoke = eval(req.responseText)();
|
||||||
var output = [];
|
var output = [];
|
||||||
var startTime, endTime;
|
var startTime, endTime;
|
||||||
|
|
|
@ -59,7 +59,7 @@
|
||||||
(display ";" op)
|
(display ";" op)
|
||||||
|
|
||||||
(fprintf op
|
(fprintf op
|
||||||
"return function(succ, fail, params) { console.log('here'); myInvoke(function(v) { console.log('there!');succ(String(~a));}, fail, params); }"
|
"return function(succ, fail, params) { myInvoke(function(v) { succ(String(~a));}, fail, params); }"
|
||||||
inspector)
|
inspector)
|
||||||
(display "})" op))))))
|
(display "})" op))))))
|
||||||
(define (E-many stmts (inspector "MACHINE.val"))
|
(define (E-many stmts (inspector "MACHINE.val"))
|
||||||
|
@ -97,6 +97,30 @@
|
||||||
"MACHINE.env.length")
|
"MACHINE.env.length")
|
||||||
"20")
|
"20")
|
||||||
|
|
||||||
(test (E-many (list (make-PushEnvironment 1))
|
;; PopEnvironment
|
||||||
|
(test (E-many (list (make-PushEnvironment 2))
|
||||||
|
"MACHINE.env.length")
|
||||||
|
"2")
|
||||||
|
(test (E-many (list (make-PushEnvironment 2)
|
||||||
|
(make-PopEnvironment 1 0))
|
||||||
"MACHINE.env.length")
|
"MACHINE.env.length")
|
||||||
"1")
|
"1")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;; Assigning to the environment
|
||||||
|
(test (E-many (list (make-PushEnvironment 2)
|
||||||
|
(make-AssignImmediateStatement (make-EnvLexicalReference 0)
|
||||||
|
(make-Const 12345)))
|
||||||
|
"MACHINE.env[1]")
|
||||||
|
"12345")
|
||||||
|
(test (E-many (list (make-PushEnvironment 2)
|
||||||
|
(make-AssignImmediateStatement (make-EnvLexicalReference 0)
|
||||||
|
(make-Const 12345)))
|
||||||
|
"MACHINE.env[0]")
|
||||||
|
"undefined")
|
||||||
|
(test (E-many (list (make-PushEnvironment 2)
|
||||||
|
(make-AssignImmediateStatement (make-EnvLexicalReference 1)
|
||||||
|
(make-Const 12345)))
|
||||||
|
"MACHINE.env[0]")
|
||||||
|
"12345")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user