浏览代码

Fix code generation for dynamic arrays assignment.

Vladislav Folts 10 年之前
父节点
当前提交
c34fe56e5c
共有 4 个文件被更改,包括 23 次插入18 次删除
  1. 二进制
      bin/compiled.zip
  2. 9 4
      src/eberon/eberon_context.js
  3. 12 12
      test/expected/eberon/dynamic_array.js
  4. 2 2
      test/input/eberon/run/dynamic_array.ob

二进制
bin/compiled.zip


+ 9 - 4
src/eberon/eberon_context.js

@@ -323,19 +323,24 @@ var AssignmentOrProcedureCall = Context.Chained.extend({
     codeGenerator: function(){return Code.nullGenerator();},
     endParse: function(){
         var d = this.__left;
+        var type = d.type();
         var code;
         if (this.__right){
-            var left = Code.makeExpression(d.code(), d.type(), d);
-            code = op.assign(left, this.__right, this.language());
+            if (type instanceof EberonDynamicArray.DynamicArray)
+                code = d.code() + " = " + this.language().rtl.clone(this.__right.code());
+            else {
+                var left = Code.makeExpression(d.code(), type, d);
+                code = op.assign(left, this.__right, this.language());
+            } 
         }
         else if (!(d.info() instanceof ResultVariable)){
-            var procCall = Context.makeProcCall(this, d.type(), d.info());
+            var procCall = Context.makeProcCall(this, type, d.info());
             var result = procCall.end();
             Context.assertProcStatementResult(result.type());
             code = d.code() + result.code();
         }
         else{
-            Context.assertProcStatementResult(d.type());
+            Context.assertProcStatementResult(type);
             code = d.code();
         }
     

+ 12 - 12
test/expected/eberon/dynamic_array.js

@@ -31,17 +31,6 @@ var RTL$ = {
                 result[i] = this.makeArray.apply(this, forward);
         return result;
     },
-    copy: function (from, to){
-        for(var prop in to){
-            if (to.hasOwnProperty(prop)){
-                var v = from[prop];
-                if (v !== null && typeof v == "object")
-                    this.copy(v, to[prop]);
-                else
-                    to[prop] = v;
-            }
-        }
-    },
     clone: function (from){
         var to;
         var len;
@@ -73,6 +62,17 @@ var RTL$ = {
         }
         return to;
     },
+    copy: function (from, to){
+        for(var prop in to){
+            if (to.hasOwnProperty(prop)){
+                var v = from[prop];
+                if (v !== null && typeof v == "object")
+                    this.copy(v, to[prop]);
+                else
+                    to[prop] = v;
+            }
+        }
+    },
     __makeCharArray: function (length){
         var result = new Uint16Array(length);
         result.charCodeAt = function(i){return this[i];};
@@ -99,7 +99,7 @@ var byte = 0;
 function assignDynamicArrayFromStatic(){
 	var static$ = RTL$.makeArray(3, 0);
 	var dynamic = [];
-	RTL$.copy(static$, dynamic);
+	dynamic = RTL$.clone(static$);
 }
 dynamicInt.push(3);
 dynamicInt.push(i);

+ 2 - 2
test/input/eberon/run/dynamic_array.ob

@@ -31,10 +31,10 @@ BEGIN
     
     ASSERT(LEN(dynamic) = 0);
     dynamic := static;
-    (*ASSERT(LEN(dynamic) = 3);
+    ASSERT(LEN(dynamic) = 3);
     ASSERT(dynamic[0] = 1);
     ASSERT(dynamic[1] = 2);
-    ASSERT(dynamic[2] = 3);*)
+    ASSERT(dynamic[2] = 3);
 
     testAddRemove();
 END m.