diff --git a/compiler/optimize-il.rkt b/compiler/optimize-il.rkt index e41988e..f89ecea 100644 --- a/compiler/optimize-il.rkt +++ b/compiler/optimize-il.rkt @@ -54,6 +54,7 @@ (define goto-target (GotoStatement-target next-stmt)) (cond [(Label? goto-target) + (log-debug (format "merging label ~a and ~a" last-stmt (Label-name goto-target))) (ufind:union-set a-forest last-stmt (Label-name goto-target)) (loop (rest stmts) next-stmt)] [else diff --git a/js-assembler/assemble.rkt b/js-assembler/assemble.rkt index 9ea956d..7dcf542 100644 --- a/js-assembler/assemble.rkt +++ b/js-assembler/assemble.rkt @@ -179,19 +179,25 @@ EOF };" (assemble-label (make-Label (BasicBlock-name a-basic-block))) (assemble-label (make-Label (BasicBlock-name a-basic-block))) - (string-join (assemble-block-statements (BasicBlock-stmts a-basic-block) + (string-join (assemble-block-statements (BasicBlock-name a-basic-block) + (BasicBlock-stmts a-basic-block) blockht entry-points) "\n"))) -(: assemble-block-statements ((Listof UnlabeledStatement) Blockht (Setof Symbol) -> (Listof String))) -(define (assemble-block-statements stmts blockht entry-points) +(: assemble-block-statements (Symbol (Listof UnlabeledStatement) Blockht (Setof Symbol) -> (Listof String))) +(define (assemble-block-statements name stmts blockht entry-points) (: default (UnlabeledStatement -> (Listof String))) (define (default stmt) + (when (and (empty? (rest stmts)) + (not (GotoStatement? stmt))) + (log-debug (format "Last statement of the block ~a is not a goto" name))) + (cons (assemble-statement stmt) - (assemble-block-statements (rest stmts) + (assemble-block-statements name + (rest stmts) blockht entry-points))) @@ -244,12 +250,14 @@ EOF [(set-contains? entry-points (TestAndJumpStatement-label stmt)) (list (assemble-jump (make-Label (TestAndJumpStatement-label stmt))))] [else - (assemble-block-statements (BasicBlock-stmts + (assemble-block-statements (BasicBlock-name + (hash-ref blockht (TestAndJumpStatement-label stmt))) + (BasicBlock-stmts (hash-ref blockht (TestAndJumpStatement-label stmt))) blockht entry-points)]) "} else {" - ,@(assemble-block-statements (rest stmts) blockht entry-points) + ,@(assemble-block-statements name (rest stmts) blockht entry-points) "}")] [(GotoStatement? stmt) @@ -261,7 +269,9 @@ EOF (default stmt)] [else (log-debug (format "Assembling inlined jump into ~a" (Label-name target)) ) - (assemble-block-statements (BasicBlock-stmts + (assemble-block-statements (BasicBlock-name + (hash-ref blockht (Label-name target))) + (BasicBlock-stmts (hash-ref blockht (Label-name target))) blockht entry-points)])] diff --git a/js-assembler/runtime-src/baselib-modules.js b/js-assembler/runtime-src/baselib-modules.js index 40c2612..ee98f15 100644 --- a/js-assembler/runtime-src/baselib-modules.js +++ b/js-assembler/runtime-src/baselib-modules.js @@ -53,7 +53,10 @@ var oldErrorHandler = MACHINE.params['currentErrorHandler']; var afterGoodInvoke = function (MACHINE) { MACHINE.params['currentErrorHandler'] = oldErrorHandler; - succ(); + if (isInternal) { succ(); } + else { + throw new plt.runtime.HaltError(succ) + } }; if (this.isInvoked) { diff --git a/js-assembler/runtime-src/runtime.js b/js-assembler/runtime-src/runtime.js index b9ef11b..ee7f914 100644 --- a/js-assembler/runtime-src/runtime.js +++ b/js-assembler/runtime-src/runtime.js @@ -562,7 +562,7 @@ // Executes all programs that have been labeled as a main module var invokeMains = function(machine, succ, fail) { - runtime.ready(function() { + runtime.ready(function invokeMain() { setReadyFalse(); machine = machine || runtime.currentMachine; succ = succ || function() {};