diff --git a/compiler.rkt b/compiler.rkt index c45ee1c..7b2966f 100644 --- a/compiler.rkt +++ b/compiler.rkt @@ -344,6 +344,9 @@ ;; 2. Next, evaluate the module body. (make-instruction-sequence `(,(make-PerformStatement (make-ExtendEnvironment/Prefix! names)))) + + (make-AssignImmediateStatement (make-ModulePrefixTarget path) + (make-EnvWholePrefixReference 0)) ;; TODO: we need to sequester the prefix of the module with the record. (compile (Module-code mod) (cons (Module-prefix mod) module-cenv) @@ -2122,6 +2125,8 @@ [(PrimitivesReference? target) target] [(ControlFrameTemporary? target) + target] + [(ModulePrefixTarget? target) target])) diff --git a/il-structs.rkt b/il-structs.rkt index 0ce9026..64809e4 100644 --- a/il-structs.rkt +++ b/il-structs.rkt @@ -45,7 +45,8 @@ EnvLexicalReference EnvPrefixReference PrimitivesReference - ControlFrameTemporary)) + ControlFrameTemporary + ModulePrefixTarget)) ;; When we need to store a value temporarily in the top control frame, we can use this as a target. @@ -57,6 +58,11 @@ #:transparent) +;; Targetting the prefix attribute of a module. +(define-struct: ModulePrefixTarget ([path : ModuleLocator]) + #:transparent) + + (define-struct: Label ([name : Symbol]) #:transparent) diff --git a/js-assembler/assemble-helpers.rkt b/js-assembler/assemble-helpers.rkt index 58faf45..a121b90 100644 --- a/js-assembler/assemble-helpers.rkt +++ b/js-assembler/assemble-helpers.rkt @@ -82,7 +82,10 @@ [(PrimitivesReference? target) (format "MACHINE.primitives[~s]" (symbol->string (PrimitivesReference-name target)))] [(ControlFrameTemporary? target) - (assemble-control-frame-temporary target)])) + (assemble-control-frame-temporary target)] + [(ModulePrefixTarget? target) + (format "MACHINE.modules[~s].prefix" + (symbol->string (ModuleLocator-name (ModulePrefixTarget-path target))))])) (: assemble-control-frame-temporary (ControlFrameTemporary -> String)) diff --git a/js-assembler/mini-runtime.js b/js-assembler/mini-runtime.js index 5c4e64c..cbfd6e0 100644 --- a/js-assembler/mini-runtime.js +++ b/js-assembler/mini-runtime.js @@ -97,7 +97,7 @@ this.name = name; this.label = label; this.isInvoked = false; - this.exports = {}; + this.prefix = false; }; diff --git a/simulator/simulator-structs.rkt b/simulator/simulator-structs.rkt index 7f9baee..8a3b936 100644 --- a/simulator/simulator-structs.rkt +++ b/simulator/simulator-structs.rkt @@ -74,7 +74,8 @@ [self-path : Symbol] [label : Symbol] [invoked? : Boolean] - [exports : (HashTable Symbol PrimitiveValue)]) + [exports : (HashTable Symbol PrimitiveValue)] + [toplevel : (U False toplevel)]) #:transparent #:mutable) diff --git a/simulator/simulator.rkt b/simulator/simulator.rkt index 8a842f4..f65617f 100644 --- a/simulator/simulator.rkt +++ b/simulator/simulator.rkt @@ -464,7 +464,8 @@ (InstallModuleEntry!-path op)) (InstallModuleEntry!-entry-point op) #f - (make-hash))) + (make-hash) + #f)) 'ok] @@ -554,6 +555,15 @@ (hash-set! ht (ControlFrameTemporary-name t) (ensure-primitive-value v)) + 'ok))] + [(ModulePrefixTarget? t) + (lambda: ([m : machine] [v : SlotValue]) + (let ([module-record + (hash-ref (machine-modules m) + (ModuleLocator-name + (ModulePrefixTarget-path t)))]) + (set-module-record-toplevel! module-record + (ensure-toplevel v)) 'ok))]))