right in the middle of fixing namespace bugs.

This commit is contained in:
Danny Yoo 2013-03-06 15:55:08 -07:00
parent ee86bce394
commit d8fd834442
4 changed files with 24 additions and 64 deletions

View File

@ -192,19 +192,21 @@
[(FinalizeModuleInvokation!? op) [(FinalizeModuleInvokation!? op)
(define modname (symbol->string (ModuleLocator-name (FinalizeModuleInvokation!-path op)))) (define modname (symbol->string (ModuleLocator-name (FinalizeModuleInvokation!-path op))))
(string-append (string-append
(format "M.modules[~s].finalizeModuleInvokation();" "(function (selfMod,ns,prefix) {"
modname)
"(function (ns) {"
(string-join (for/list: : (Listof String) ([a-provide : ModuleProvide (FinalizeModuleInvokation!-provides op)]) (string-join (for/list: : (Listof String) ([a-provide : ModuleProvide (FinalizeModuleInvokation!-provides op)])
(cond [(kernel-module-name? (ModuleProvide-source a-provide)) (cond [(kernel-module-name? (ModuleProvide-source a-provide))
(format "ns.set(~s, M.primitives[~s]);" (format "ns.set(~s, M.primitives[~s]);"
(symbol->string (ModuleProvide-external-name a-provide)) (symbol->string (ModuleProvide-external-name a-provide))
(symbol->string (ModuleProvide-internal-name a-provide)))] (symbol->string (ModuleProvide-internal-name a-provide)))]
[(equal? (ModuleLocator-name (ModuleProvide-source a-provide))
(ModuleLocator-name (FinalizeModuleInvokation!-path op)))
(format "ns.set(~s, prefix[selfMod.getPrefixOffset(~s)]);"
(symbol->string (ModuleProvide-internal-name a-provide))
(symbol->string (ModuleProvide-internal-name a-provide)))]
[else [else
(format "ns.set(~s, M.modules[~s].getNamespace().get(~s));" (format "ns.set(~s, M.modules[~s].getNamespace().get(~s));"
(symbol->string (ModuleProvide-external-name a-provide)) (symbol->string (ModuleProvide-external-name a-provide))
(symbol->string (ModuleLocator-name (ModuleProvide-source a-provide))) (symbol->string (ModuleLocator-name (ModuleProvide-source a-provide)))
(symbol->string (ModuleProvide-internal-name a-provide)))])) (symbol->string (ModuleProvide-internal-name a-provide)))]))
"") "")
(format "}(M.modules[~s].getNamespace()));" modname))])) (format "}(M.modules[~s],M.modules[~s].getNamespace(),M.modules[~s].prefix));" modname modname modname))]))

View File

@ -173,12 +173,13 @@
(for/list ([modprovide (get-provided-names bytecode)] (for/list ([modprovide (get-provided-names bytecode)]
[i (in-naturals)]) [i (in-naturals)])
(string-append (string-append
; (format "modrec.getNamespace().set(~s,exports[~s]);\n" (format "modrec.getNamespace().set(~s,exports[~s]);\n"
; (symbol->string (ModuleProvide-internal-name modprovide)) (symbol->string (ModuleProvide-external-name modprovide))
; (symbol->string (ModuleProvide-external-name modprovide))) (symbol->string (ModuleProvide-internal-name modprovide)))
(format "modrec.prefix[~a]=exports[~s];\n" ;(format "modrec.prefix[~a]=exports[~s];\n"
i ; i
(symbol->string (ModuleProvide-external-name modprovide))))))) ; (symbol->string (ModuleProvide-external-name modprovide))))
))))
(define (get-prefix-code bytecode) (define (get-prefix-code bytecode)
(format "modrec.prefix=[~a];modrec.prefix.names=[~a];modrec.prefix.internalNames=[~a];" (format "modrec.prefix=[~a];modrec.prefix.names=[~a];modrec.prefix.internalNames=[~a];"
@ -220,7 +221,6 @@
(function(MACHINE, EXPORTS){~a})(M, exports); (function(MACHINE, EXPORTS){~a})(M, exports);
~a ~a
modrec.privateExports = exports; modrec.privateExports = exports;
modrec.finalizeModuleInvokation();
return M.c.pop().label(M);" return M.c.pop().label(M);"
(symbol->string name) (symbol->string name)
(get-prefix-code bytecode) (get-prefix-code bytecode)

View File

@ -10,36 +10,13 @@
var Namespace = function(modrec) { var Namespace = function(modrec) {
this.modrec = modrec; this.modrec = modrec;
// string -> integer // Returns the key/value pairs of the prefix.
// Returns the position within the prefix that we should be looking. // mapping: string -> value
this.mapping = {}; this.mapping = {};
this.prefix = void(0);
this.extra = {};
}; };
Namespace.prototype.get = function(name) { Namespace.prototype.get = function(name) {
if (this.mapping.hasOwnProperty(name)) { return this.mapping[name];
return this.prefix[this.mapping[name]];
}
if (this.extra.hasOwnProperty(name)) {
return this.extra[name];
}
return void(0);
};
Namespace.prototype.refreshPrefixMapping = function() {
var prefix = this.modrec.prefix;
var name;
var i;
for (i = 0; i < prefix.length; i++) {
name = prefix.names[i];
this.mapping[name] = i;
if (this.extra.hasOwnProperty(name)) {
prefix[i] = this.extra[name];
delete this.extra[name];
}
}
this.prefix = prefix;
}; };
Namespace.prototype.hasKey = function(name) { Namespace.prototype.hasKey = function(name) {
@ -47,16 +24,7 @@
}; };
Namespace.prototype.set = function(name, value) { Namespace.prototype.set = function(name, value) {
if (this.mapping.hasOwnProperty(name)) { this.mapping[name] = value;
this.prefix[this.mapping[name]] = value;
return;
};
if (this.extra.hasOwnProperty(name)) {
this.extra[name] = value;
return;
}
this.extra[name] = value;
return;
}; };
var ModuleRecord = function (name, label) { var ModuleRecord = function (name, label) {
@ -87,11 +55,6 @@
return this.namespace; return this.namespace;
}; };
ModuleRecord.prototype.finalizeModuleInvokation = function () {
this.namespace.refreshPrefixMapping();
};
// External invokation of a module. // External invokation of a module.
ModuleRecord.prototype.invoke = function (MACHINE, succ, fail) { ModuleRecord.prototype.invoke = function (MACHINE, succ, fail) {
this._invoke(false, MACHINE, succ, fail); this._invoke(false, MACHINE, succ, fail);

View File

@ -14,11 +14,6 @@
"../js-assembler/package.rkt" "../js-assembler/package.rkt"
"../parser/parse-bytecode.rkt" "../parser/parse-bytecode.rkt"
"../compiler/compiler.rkt" "../compiler/compiler.rkt"
"../compiler/expression-structs.rkt"
"../compiler/il-structs.rkt"
"../compiler/lexical-structs.rkt"
"../compiler/compiler-structs.rkt"
"../compiler/optimize-il.rkt"
"../js-assembler/assemble.rkt" "../js-assembler/assemble.rkt"
"write-runtime.rkt" "write-runtime.rkt"
(for-syntax racket/base)) (for-syntax racket/base))
@ -79,7 +74,7 @@
(define op (open-output-bytes)) (define op (open-output-bytes))
(write raw-bytecode op) (write raw-bytecode op)
(define whalesong-bytecode (parse-bytecode (open-input-bytes (get-output-bytes op)))) (define whalesong-bytecode (parse-bytecode (open-input-bytes (get-output-bytes op))))
#;(pretty-print whalesong-bytecode) (pretty-print whalesong-bytecode)
(define compiled-bytecode (compile-for-repl whalesong-bytecode)) (define compiled-bytecode (compile-for-repl whalesong-bytecode))
#;(pretty-print compiled-bytecode) #;(pretty-print compiled-bytecode)
(define assembled-op (open-output-string)) (define assembled-op (open-output-string))