ソースを参照

move eberon-specific code to eberon_rtl.js

Vladislav Folts 10 年 前
コミット
15bcf575d2

BIN
bin/compiled.zip


+ 7 - 1
src/eberon/eberon_grammar.js

@@ -7,6 +7,7 @@ var CodeGenerator = require("js/CodeGenerator.js");
 var EbContext = require("eberon/eberon_context.js");
 var Grammar = require("grammar.js");
 var EbRtl = require("js/EberonRtl.js");
+var EbRtlCode = require("eberon/eberon_rtl.js");
 var Parser = require("parser.js");
 var Symbols = require("js/EberonSymbols.js");
 
@@ -168,5 +169,10 @@ exports.language = {
         make: CodeGenerator.makeGenerator,
         nil: CodeGenerator.nullGenerator()
     },
-    rtlBase: EbRtl.Type
+    rtl: {
+        base: EbRtl.Type,
+        methods: EbRtlCode.rtl.methods,
+        dependencies: EbRtlCode.rtl.dependencies,
+        nodejsModule: EbRtlCode.rtl.nodejsModule
+    }
 };

+ 23 - 0
src/eberon/eberon_rtl.js

@@ -0,0 +1,23 @@
+"use strict";
+
+var oberon_rtl = require("rtl.js");
+
+var methods = {
+    getMappedValue: function(map, key){
+        if (!map.hasOwnProperty(key))
+            throw new Error("invalid key: " + key);
+        return map[key];
+    },
+    clearMap: function(map){
+        for(var p in map)
+            delete map[p];
+    }
+};
+oberon_rtl.copyMap(oberon_rtl.rtl.methods, methods);
+oberon_rtl.copyMap(methods, exports);
+
+exports.rtl = {
+    dependencies: oberon_rtl.rtl.dependencies,
+    methods: methods,
+    nodejsModule: "eberon/eberon_rtl.js"
+};

+ 2 - 2
src/nodejs.js

@@ -57,7 +57,7 @@ function writeCompiledModule(name, code, outDir){
 
 function compile(sources, language, handleErrors, includeDirs, outDir, importDir){
     var rtlCodeWatcher = new RtlCodeUsingWatcher();
-    var rtl = new makeRTL(language.rtlBase, rtlCodeWatcher.using.bind(rtlCodeWatcher));
+    var rtl = new makeRTL(language.rtl, rtlCodeWatcher.using.bind(rtlCodeWatcher));
     var moduleCode = function(name, imports){
         return new ModuleGenerator(name, imports, importDir);};
 
@@ -92,7 +92,7 @@ function compile(sources, language, handleErrors, includeDirs, outDir, importDir
             function(e){handleErrors("File \"" + compiledFilesStack[compiledFilesStack.length - 1] + "\", " + e);},
             function(name, code){
                 if (rtlCodeWatcher.used()){
-                    code = "var " + rtl.name() + " = require(\"rtl.js\");\n" + code;
+                    code = "var " + rtl.name() + " = require(\"" + rtl.module() + "\");\n" + code;
                     rtlCodeWatcher.reset();
                 }
                 writeCompiledModule(name, code, outDir);

+ 7 - 1
src/oberon/oberon_grammar.js

@@ -6,6 +6,7 @@ var Context = require("context.js");
 var Grammar = require("grammar.js");
 var ObContext = require("oberon/oberon_context.js");
 var ObRtl = require("js/OberonRtl.js");
+var ObRtlCode = require("rtl.js");
 var Parser = require("parser.js");
 var Symbols = require("js/OberonSymbols.js");
 var Types = require("js/Types.js");
@@ -135,7 +136,12 @@ exports.language = {
         make: CodeGenerator.makeGenerator,
         nil: CodeGenerator.nullGenerator()
     },
-    rtlBase: ObRtl.Type
+    rtl: {
+        base: ObRtl.Type,
+        methods: ObRtlCode.rtl.methods,
+        dependencies: ObRtlCode.rtl.dependencies,
+        nodejsModule: ObRtlCode.rtl.nodejsModule
+    }
 };
 
 

+ 1 - 1
src/oc.js

@@ -122,7 +122,7 @@ function compileModules(names, moduleReader, grammar, contextFactory, handleErro
 
 function compile(text, language, handleErrors){
     var result = "";
-    var rtl = new makeRTL(language.rtlBase);
+    var rtl = new makeRTL(language.rtl);
     var moduleCode = function(name, imports){return new Code.ModuleGenerator(name, imports);};
     var resolver = makeResolver(
             language.grammar,

+ 20 - 23
src/rtl.js

@@ -8,11 +8,15 @@ if (typeof Uint16Array == "undefined"){
     };
 }
 
+function copyMap(from, to){
+    for(var p in from)
+        to[p] = from[p];
+}
+
 function Class(){}
 Class.extend = function extend(methods){
         function Type(){
-            for(var m in methods)
-                this[m] = methods[m];
+            copyMap(methods, this);
         }
         Type.prototype = this.prototype;
 
@@ -24,7 +28,7 @@ Class.extend = function extend(methods){
         return result;
     };
 
-var impl = {
+var methods = {
     extend: function(cons, base){
         function Type(){}
         Type.prototype = base.prototype;
@@ -55,15 +59,6 @@ var impl = {
         }
         return from;
     },
-    getMappedValue: function(map, key){
-        if (!map.hasOwnProperty(key))
-            throw new Error("invalid key: " + key);
-        return map[key];
-    },
-    clearMap: function(map){
-        for(var p in map)
-            delete map[p];
-    },
     makeArray: function(/*dimensions, initializer*/){
         var forward = Array.prototype.slice.call(arguments);
         var result = new Array(forward.shift());
@@ -242,15 +237,17 @@ var impl = {
 };
 
 exports.Class = Class;
-exports.dependencies = { 
-    "cloneRecord": ["copyRecord"],
-    "cloneArrayOfRecords": ["cloneRecord"],
-    "copyArrayOfRecords": ["cloneArrayOfRecords", "cloneRecord"],
-    "copyArrayOfScalars": ["cloneArrayOfScalars"],
-    "makeCharArray": ["__makeCharArray"],
-    "__makeCharArray": ["__setupCharArrayMethods"]
+exports.rtl = {
+    dependencies: { 
+        "cloneRecord": ["copyRecord"],
+        "cloneArrayOfRecords": ["cloneRecord"],
+        "copyArrayOfRecords": ["cloneArrayOfRecords", "cloneRecord"],
+        "copyArrayOfScalars": ["cloneArrayOfScalars"],
+        "makeCharArray": ["__makeCharArray"],
+        "__makeCharArray": ["__setupCharArrayMethods"]
+    },
+    methods: methods,
+    nodejsModule: "rtl.js"
 };
-
-exports.methods = impl;
-for(var e in impl)
-    exports[e] = impl[e];
+exports.copyMap = copyMap;
+copyMap(methods, exports);

+ 9 - 10
src/rtl_code.js

@@ -1,8 +1,5 @@
 "use strict";
 
-var Rtl = require("rtl.js");
-//var OberonRtl = require("js/OberonRtl.js");
-
 // support IE8
 if (!Array.prototype.indexOf)
     Array.prototype.indexOf = function(x){
@@ -22,17 +19,19 @@ if (!Function.prototype.bind)
         };
     };
 
-function RtlCons(demandedCallback){
+function RtlCons(rtl, demandedCallback){
     this.__entries = {};
+    this.__rtl = rtl;
     this.__demandedCallback = demandedCallback;
 
-    for(var name in Rtl.methods){
+    for(var name in rtl.methods){
         this[name] = this.__makeOnDemand(name);
         this[name + "Id"] = this.__makeIdOnDemand(name);
     }
 }
 var rtlPrototype = {
     name: function(){return "RTL$";},
+    module: function(){return this.__rtl.nodejsModule;},
     generate: function(){
         var result = "var " + this.name() + " = {\n";
         var firstEntry = true;
@@ -52,9 +51,9 @@ var rtlPrototype = {
     },
     __putEntry: function(name){
         if (!this.__entries[name])
-            this.__entries[name] = Rtl.methods[name];
+            this.__entries[name] = this.__rtl.methods[name];
         
-        var dependencies = Rtl.dependencies[name];
+        var dependencies = this.__rtl.dependencies[name];
         if (dependencies)
             for(var i = 0; i < dependencies.length; ++i)
                 this.__putEntry(dependencies[i]);
@@ -81,15 +80,15 @@ var rtlPrototype = {
     }
 };
 
-function makeRTL(base, demandedCallback){
+function makeRTL(rtl, demandedCallback){
     function RTL(){
         RtlCons.apply(this, arguments);
     }
 
-    Rtl.extend(RTL, base);
+    rtl.methods.extend(RTL, rtl.base);
     for(var m in rtlPrototype)
         RTL.prototype[m] = rtlPrototype[m];
-    return new RTL(demandedCallback);
+    return new RTL(rtl, demandedCallback);
 }
 
 exports.makeRTL = makeRTL;

+ 1 - 1
test/expected/nodejs/modules/m1.js

@@ -1,4 +1,4 @@
-var RTL$ = require("rtl.js");
+var RTL$ = require("test_rtl.js");
 var ci = 123;
 function Base(){
 	this.i = 0;

+ 1 - 1
test/expected/nodejs/modules/m2.js

@@ -1,4 +1,4 @@
-var RTL$ = require("rtl.js");
+var RTL$ = require("test_rtl.js");
 var m1 = require("m1.js");
 var r = new m1.T();
 var pb = null;

+ 1 - 1
test/expected/nodejs/modules/m3.js

@@ -1,4 +1,4 @@
-var RTL$ = require("rtl.js");
+var RTL$ = require("test_rtl.js");
 var m1 = require("m2.js");
 var m2 = require("m1.js");
 var r = new m2.T();

+ 2 - 0
test/test_compile.js

@@ -30,6 +30,8 @@ function compile(src, language){
 }
 
 function compileNodejs(src, dirs, language){
+    language.rtl.nodejsModule = "test_rtl.js"; // make test results the same for oberon/eberon
+
     var subdir = path.basename(src);
     subdir = subdir.substr(0, subdir.length - path.extname(subdir).length);
 

+ 1 - 1
test/test_unit_common.js

@@ -32,7 +32,7 @@ var TestContext = Context.Context.extend({
                 this,
                 { codeGenerator: language.codeGenerator.nil,
                   moduleGenerator: function(){return new TestModuleGenerator();},
-                  rtl: new makeRTL(language.rtlBase),
+                  rtl: new makeRTL(language.rtl),
                   types: language.types,
                   stdSymbols: language.stdSymbols
                 });