diff --git a/compiler.rkt b/compiler.rkt index 778f752..49710b9 100644 --- a/compiler.rkt +++ b/compiler.rkt @@ -361,35 +361,46 @@ ;; FIXME: assumes the module has already been linked. We should error out ;; if the module hasn't been linked yet. (define (compile-module-invoke a-module-name) - (let* ([linked (make-label 'linked)] - [already-loaded (make-label 'alreadyLoaded)] - [on-return-multiple (make-label 'onReturnMultiple)] - [on-return (make-LinkedLabel (make-label 'onReturn) - on-return-multiple)]) - (make-instruction-sequence - `(,(make-TestAndBranchStatement (make-TestTrue - (make-IsModuleLinked a-module-name)) - linked) - ;; TODO: raise an exception here that says that the module hasn't been - ;; linked yet. - ,(make-DebugPrint (make-Const - (format "DEBUG: the module ~a hasn't been linked in!!!" - (ModuleName-name a-module-name)))) - ,(make-GotoStatement (make-Label already-loaded)) - ,linked - ,(make-TestAndBranchStatement (make-TestTrue - (make-IsModuleInvoked a-module-name)) - already-loaded) - ,(make-PushControlFrame/Call on-return) - ,(make-GotoStatement (ModuleEntry a-module-name)) - ,on-return-multiple - ,(make-PopEnvironment (make-SubtractArg (make-Reg 'argcount) - (make-Const 1)) - (make-Const 0)) - ,on-return - ,already-loaded)))) + (cond + [(kernel-module-name? a-module-name) + empty-instruction-sequence] + [else + (let* ([linked (make-label 'linked)] + [already-loaded (make-label 'alreadyLoaded)] + [on-return-multiple (make-label 'onReturnMultiple)] + [on-return (make-LinkedLabel (make-label 'onReturn) + on-return-multiple)]) + (make-instruction-sequence + `(,(make-TestAndBranchStatement (make-TestTrue + (make-IsModuleLinked a-module-name)) + linked) + ;; TODO: raise an exception here that says that the module hasn't been + ;; linked yet. + ,(make-DebugPrint (make-Const + (format "DEBUG: the module ~a hasn't been linked in!!!" + (ModuleName-name a-module-name)))) + ,(make-GotoStatement (make-Label already-loaded)) + ,linked + ,(make-TestAndBranchStatement (make-TestTrue + (make-IsModuleInvoked a-module-name)) + already-loaded) + ,(make-PushControlFrame/Call on-return) + ,(make-GotoStatement (ModuleEntry a-module-name)) + ,on-return-multiple + ,(make-PopEnvironment (make-SubtractArg (make-Reg 'argcount) + (make-Const 1)) + (make-Const 0)) + ,on-return + ,already-loaded)))])) +(: kernel-module-name? (ModuleName -> Boolean)) +;; Produces true if the module is hardcoded. +(define (kernel-module-name? name) + (or (and (eq? (ModuleName-name name) '#%kernel) + (eq? (ModuleName-real-path name) '#%kernel)) + (eq? (ModuleName-name name) 'whalesong/lang/kernel))) + diff --git a/js-assembler/assemble.rkt b/js-assembler/assemble.rkt index edc3d3d..639779f 100644 --- a/js-assembler/assemble.rkt +++ b/js-assembler/assemble.rkt @@ -12,7 +12,8 @@ racket/string racket/list) -(provide assemble/write-invoke +(provide assemble/write-invoke-module-as-main + assemble/write-invoke fracture assemble-basic-block assemble-statement) @@ -23,6 +24,14 @@ + +(: assemble/write-invoke-module-as-main (Symbol Output-Port -> Void)) +(define (assemble/write-invoke-module-as-main module-name op) + ;; FIXME + (void)) + + + (: assemble/write-invoke ((Listof Statement) Output-Port -> Void)) ;; Writes out the JavaScript code that represents the anonymous invocation expression. ;; What's emitted is a function expression that, when invoked, runs the diff --git a/js-assembler/mini-runtime.js b/js-assembler/mini-runtime.js index cac6885..5c4e64c 100644 --- a/js-assembler/mini-runtime.js +++ b/js-assembler/mini-runtime.js @@ -1108,6 +1108,7 @@ }; + var HaltError = function() {} var trampoline = function(MACHINE, initialJump) { @@ -1138,7 +1139,10 @@ 0); return; } - } else { + } else if (e instanceof HaltError) { + // FIXME: work out what it really means to Halt. + return; + } else { MACHINE.running = false; return MACHINE.params.currentErrorHandler(MACHINE, e); } @@ -1248,6 +1252,6 @@ exports['heir'] = heir; exports['makeClassPredicate'] = makeClassPredicate; - + exports['HaltError'] = HaltError; }).call(this); \ No newline at end of file diff --git a/package.rkt b/js-assembler/package.rkt similarity index 91% rename from package.rkt rename to js-assembler/package.rkt index 992503c..3717657 100644 --- a/package.rkt +++ b/js-assembler/package.rkt @@ -1,17 +1,17 @@ #lang racket/base -(require "compiler.rkt" - "compiler-structs.rkt" - "parse-bytecode.rkt" - "language-namespace.rkt" - "il-structs.rkt" - "bootstrapped-primitives.rkt" - "get-module-bytecode.rkt" - "get-dependencies.rkt" - "js-assembler/assemble.rkt" - "js-assembler/get-runtime.rkt" - "lexical-structs.rkt" - "quote-cdata.rkt" +(require "assemble.rkt" + "get-runtime.rkt" + "../compiler.rkt" + "../compiler-structs.rkt" + "../parse-bytecode.rkt" + "../language-namespace.rkt" + "../il-structs.rkt" + "../bootstrapped-primitives.rkt" + "../get-module-bytecode.rkt" + "../get-dependencies.rkt" + "../lexical-structs.rkt" + "../quote-cdata.rkt" racket/runtime-path racket/port racket/list diff --git a/tests/test-assemble.rkt b/tests/test-assemble.rkt index 736659e..92f2356 100644 --- a/tests/test-assemble.rkt +++ b/tests/test-assemble.rkt @@ -9,6 +9,8 @@ racket/promise racket/runtime-path) +(printf "test-assemble.rkt\n") + (define runtime (get-runtime)) diff --git a/tests/test-browser-evaluate.rkt b/tests/test-browser-evaluate.rkt index bfcdba9..2483bd4 100644 --- a/tests/test-browser-evaluate.rkt +++ b/tests/test-browser-evaluate.rkt @@ -1,8 +1,9 @@ #lang racket (require "../js-assembler/get-runtime.rkt" "../browser-evaluate.rkt" - "../package.rkt") - + "../js-assembler/package.rkt") + +(printf "test-browser-evaluate.rkt\n") (define should-follow? (lambda (p) #t)) diff --git a/tests/test-compiler-2.rkt b/tests/test-compiler-2.rkt index 9c4bc40..e0281f7 100644 --- a/tests/test-compiler-2.rkt +++ b/tests/test-compiler-2.rkt @@ -5,7 +5,7 @@ "../simulator/simulator-helpers.rkt" "test-helpers.rkt") - +(printf "test-compiler-2.rkt\n") ;; run: machine -> (machine number) ;; Run the machine to completion. diff --git a/tests/test-compiler.rkt b/tests/test-compiler.rkt index 1e537b6..1bf1baf 100644 --- a/tests/test-compiler.rkt +++ b/tests/test-compiler.rkt @@ -5,7 +5,10 @@ "../simulator/simulator-helpers.rkt" "../parameters.rkt" "test-helpers.rkt" - racket/runtime-path) + racket/runtime-path + rackunit) + +(printf "test-compiler.rkt\n") (define-runtime-path this-test-path ".") @@ -1339,12 +1342,16 @@ #:with-bootstrapping? #t) -(parameterize ([current-module-path (build-path this-test-path "foo.rkt")]) - (test '(module foo racket/base - (printf "hello world")) - (make-undefined) +(parameterize ([current-module-path (build-path this-test-path "foo.rkt")] + [current-simulated-output-port (open-output-bytes)]) + (test '(module foo '#%kernel + (display "hello world") + (newline)) + (void) #:as-main-module 'whalesong/tests/foo.rkt - #:with-bootstrapping? #t)) + #:with-bootstrapping? #t) + (check-equal? (get-output-bytes (current-simulated-output-port)) + #"hello world\n")) diff --git a/tests/test-conform-browser.rkt b/tests/test-conform-browser.rkt index 3354fa2..4d58d0f 100644 --- a/tests/test-conform-browser.rkt +++ b/tests/test-conform-browser.rkt @@ -1,10 +1,12 @@ #lang racket (require "../browser-evaluate.rkt" - "../package.rkt" + "../js-assembler/package.rkt" "../js-assembler/get-runtime.rkt" racket/port racket/runtime-path) +(printf "test-conform-browser.rkt\n") + (define-runtime-path conform-path (build-path "conform")) diff --git a/tests/test-earley-browser.rkt b/tests/test-earley-browser.rkt index 49458be..741678a 100644 --- a/tests/test-earley-browser.rkt +++ b/tests/test-earley-browser.rkt @@ -1,12 +1,14 @@ #lang racket (require "../browser-evaluate.rkt" - "../package.rkt" + "../js-assembler/package.rkt" "../js-assembler/get-runtime.rkt" racket/port racket/runtime-path racket/runtime-path (for-syntax racket/base)) +(printf "test-earley-browser.rkt\n") + (define-runtime-path earley-file-path (build-path "earley")) diff --git a/tests/test-get-dependencies.rkt b/tests/test-get-dependencies.rkt index 3b86133..2a735ba 100644 --- a/tests/test-get-dependencies.rkt +++ b/tests/test-get-dependencies.rkt @@ -7,6 +7,8 @@ racket/runtime-path rackunit) +(printf "test-get-dependencies.rkt\n") + (define-runtime-path compiler-path "..") diff --git a/tests/test-package.rkt b/tests/test-package.rkt index fa18574..8dda8d3 100644 --- a/tests/test-package.rkt +++ b/tests/test-package.rkt @@ -1,7 +1,8 @@ #lang racket/base -(require "../package.rkt") +(require "../js-assembler/package.rkt") +(printf "test-package.rkt\n") (define (follow? p) diff --git a/tests/test-parse-bytecode.rkt b/tests/test-parse-bytecode.rkt index 043deff..ed0351a 100644 --- a/tests/test-parse-bytecode.rkt +++ b/tests/test-parse-bytecode.rkt @@ -11,6 +11,8 @@ racket/runtime-path (for-syntax racket/base)) +(printf "test-parse-bytecode.rkt\n") + (define-runtime-path this-test-path ".") (define (run-zo-parse stx) diff --git a/tests/test-parse.rkt b/tests/test-parse.rkt index 8bb4e37..e5ae9ef 100644 --- a/tests/test-parse.rkt +++ b/tests/test-parse.rkt @@ -6,6 +6,8 @@ "../lam-entry-gensym.rkt" (for-syntax racket/base)) +(printf "test-parse.rkt\n"); + ; Test out the compiler, using the simulator. (define-syntax (test stx) (syntax-case stx () diff --git a/tests/test-simulator.rkt b/tests/test-simulator.rkt index 50e504b..a770cdc 100644 --- a/tests/test-simulator.rkt +++ b/tests/test-simulator.rkt @@ -6,6 +6,8 @@ "../simulator/simulator-primitives.rkt" "../simulator/simulator.rkt") +(printf "test-simulator.rkt\n") + (define-syntax (test stx) (syntax-case stx ()