Przeglądaj źródła

code generation for dynamic array initializtion

Vladislav Folts 11 lat temu
rodzic
commit
d260cacb50

+ 14 - 10
src/context.js

@@ -737,20 +737,14 @@ exports.ArrayDecl = HandleSymbolAsType.extend({
         this.__dimensions = undefined;
     },
     handleDimensions: function(dimensions){this.__dimensions = dimensions;},
-    setType: function(type){
-        var initializer = type instanceof Type.Array || type instanceof Type.Record
-            ? "function(){return " + type.initializer(this) + ";}"
-            : type.initializer(this);
-        var isCharArray = (type == basicTypes.ch);
+    setType: function(elementsType){
+        var type = elementsType;
         var dimensions = "";
         for(var i = this.__dimensions.length; i-- ;){
             var length = this.__dimensions[i];
             dimensions = length + (dimensions.length ? ", " + dimensions : "");
-            var rtl = this.language().rtl;
-            var arrayInit = !i
-                ? isCharArray ? rtl.makeCharArray(dimensions)
-                              : rtl.makeArray(dimensions + ", " + initializer)
-                : undefined;
+            var arrayInit = i ? undefined
+                              : this._makeInit(elementsType, dimensions, length);
             type = this._makeType(type, arrayInit, length);
         }
 
@@ -758,6 +752,16 @@ exports.ArrayDecl = HandleSymbolAsType.extend({
     },
     isAnonymousDeclaration: function(){return true;},
     endParse: function(){this.parent().setType(this.__type);},
+    _makeInit: function(type, dimensions, length){
+        var rtl = this.language().rtl;
+        if (type == basicTypes.ch)
+            return rtl.makeCharArray(dimensions);
+
+        var initializer = type instanceof Type.Array || type instanceof Type.Record
+            ? "function(){return " + type.initializer(this) + ";}"
+            : type.initializer(this);
+        return rtl.makeArray(dimensions + ", " + initializer);
+    },
     _makeType: function(elementsType, init, length){
         return Type.makeArray(init,
                               elementsType,

+ 5 - 0
src/eberon/eberon_context.js

@@ -1113,6 +1113,11 @@ var ArrayDecl = Context.ArrayDecl.extend({
     init: function EberonContext$ArrayDecl(context){
         Context.ArrayDecl.prototype.init.call(this, context);
     },
+    _makeInit: function(type, dimensions, length){
+        if (length == EberonTypes.dynamicArrayLength)
+            return '[]';
+        return Context.ArrayDecl.prototype._makeInit.call(this, type, dimensions, length);
+    },
     _makeType: function(elementsType, init, length){
         return EberonTypes.makeArray(init, elementsType, length);
     }

+ 3 - 0
test/expected/eberon/dynamic_array.js

@@ -0,0 +1,3 @@
+var m = function (){
+var a = [];
+}();

+ 4 - 0
test/input/eberon/dynamic_array.ob

@@ -0,0 +1,4 @@
+MODULE m;
+VAR
+    a: ARRAY * OF INTEGER;
+END m.