moving the trampoline testing to the front of each basic block
This commit is contained in:
parent
61a245e4b4
commit
3755768485
12
cm.rkt
12
cm.rkt
|
@ -582,7 +582,8 @@
|
||||||
|
|
||||||
;; assemble-basic-block: basic-block -> string
|
;; assemble-basic-block: basic-block -> string
|
||||||
(define (assemble-basic-block a-basic-block)
|
(define (assemble-basic-block a-basic-block)
|
||||||
(format "var ~a=function(){~a};"
|
(format "var ~a=function(){\nif(--MACHINE.callsBeforeTrampoline < 0) { throw ~a; }\n~a};"
|
||||||
|
(basic-block-name a-basic-block)
|
||||||
(basic-block-name a-basic-block)
|
(basic-block-name a-basic-block)
|
||||||
(string-join (map assemble-stmt (basic-block-stmts a-basic-block))
|
(string-join (map assemble-stmt (basic-block-stmts a-basic-block))
|
||||||
"\n")))
|
"\n")))
|
||||||
|
@ -637,12 +638,11 @@
|
||||||
(assemble-op-expression (op-name (cadr stmt))
|
(assemble-op-expression (op-name (cadr stmt))
|
||||||
(cddr stmt)))]
|
(cddr stmt)))]
|
||||||
[(tagged-list? stmt 'branch)
|
[(tagged-list? stmt 'branch)
|
||||||
(format "if(--MACHINE.callsBeforeTrampoline){return ~a()}else{throw ~a}}"
|
;; the unbalanced } is deliberate: test and branch always follow each other.
|
||||||
(assemble-location (cadr stmt))
|
(format "return ~a();}"
|
||||||
(assemble-location (cadr stmt)))]
|
(assemble-location (cadr stmt)))]
|
||||||
[(tagged-list? stmt 'goto)
|
[(tagged-list? stmt 'goto)
|
||||||
(format "if(--MACHINE.callsBeforeTrampoline){return ~a()}else{throw ~a}"
|
(format "return ~a();"
|
||||||
(assemble-location (cadr stmt))
|
|
||||||
(assemble-location (cadr stmt)))]
|
(assemble-location (cadr stmt)))]
|
||||||
[(tagged-list? stmt 'save)
|
[(tagged-list? stmt 'save)
|
||||||
(format "MACHINE.stack.push(MACHINE.~a);"
|
(format "MACHINE.stack.push(MACHINE.~a);"
|
||||||
|
@ -735,7 +735,7 @@
|
||||||
(second assembled-inputs)
|
(second assembled-inputs)
|
||||||
(fourth assembled-inputs))]
|
(fourth assembled-inputs))]
|
||||||
[(check-bound-global!)
|
[(check-bound-global!)
|
||||||
(format "if (! (~a).globalBindings.hasOwnProperty(~a)) { throw new Error('Not bound: ~a') }"
|
(format "if (! (~a).globalBindings.hasOwnProperty(~a)) { throw new Error(\"Not bound: \" + ~a); }"
|
||||||
(second assembled-inputs)
|
(second assembled-inputs)
|
||||||
(first assembled-inputs)
|
(first assembled-inputs)
|
||||||
(first assembled-inputs))]
|
(first assembled-inputs))]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user