Browse Source

pastojs: fixed arraySetLength shrink

git-svn-id: trunk@46272 -
Mattias Gaertner 5 years ago
parent
commit
68a3e33cac
1 changed files with 37 additions and 30 deletions
  1. 37 30
      utils/pas2js/dist/rtl.js

+ 37 - 30
utils/pas2js/dist/rtl.js

@@ -916,44 +916,51 @@ var rtl = {
         srclen = 0;
         oldlen = a.length;
       }
-      a.length = stack[depth].dim;
+      lastlen = stack[depth].dim;
+      a.length = lastlen;
       if (depth>0){
         item.a[item.i]=a;
         item.i++;
+        if ((lastlen===0) && (item.i<item.a.length)) continue;
       }
-      if (depth<dimmax){
-        item = stack[depth];
-        item.a = a;
-        item.i = 0;
-        item.src = src;
-        depth++;
-      } else {
-        if (rtl.isArray(defaultvalue)){
-          // array of dyn array
-          for (var i=0; i<srclen; i++) a[i]=src[i];
-          for (var i=oldlen; i<lastlen; i++) a[i]=[];
-        } else if (rtl.isObject(defaultvalue)) {
-          if (rtl.isTRecord(defaultvalue)){
-            // array of record
-            for (var i=0; i<srclen; i++) a[i]=defaultvalue.$clone(src[i]);
-            for (var i=oldlen; i<lastlen; i++) a[i]=defaultvalue.$new();
+      if (lastlen>0){
+        if (depth<dimmax){
+          item = stack[depth];
+          item.a = a;
+          item.i = 0;
+          item.src = src;
+          depth++;
+          continue;
+        } else {
+          if (srclen>lastlen) srclen=lastlen;
+          if (rtl.isArray(defaultvalue)){
+            // array of dyn array
+            for (var i=0; i<srclen; i++) a[i]=src[i];
+            for (var i=oldlen; i<lastlen; i++) a[i]=[];
+          } else if (rtl.isObject(defaultvalue)) {
+            if (rtl.isTRecord(defaultvalue)){
+              // array of record
+              for (var i=0; i<srclen; i++) a[i]=defaultvalue.$clone(src[i]);
+              for (var i=oldlen; i<lastlen; i++) a[i]=defaultvalue.$new();
+            } else {
+              // array of set
+              for (var i=0; i<srclen; i++) a[i]=rtl.refSet(src[i]);
+              for (var i=oldlen; i<lastlen; i++) a[i]={};
+            }
           } else {
-            // array of set
-            for (var i=0; i<srclen; i++) a[i]=rtl.refSet(src[i]);
-            for (var i=oldlen; i<lastlen; i++) a[i]={};
+            for (var i=0; i<srclen; i++) a[i]=src[i];
+            for (var i=oldlen; i<lastlen; i++) a[i]=defaultvalue;
           }
-        } else {
-          for (var i=0; i<srclen; i++) a[i]=src[i];
-          for (var i=oldlen; i<lastlen; i++) a[i]=defaultvalue;
-        }
-        while ((depth>0) && (stack[depth-1].i>=stack[depth-1].dim)){
-          depth--;
-        };
-        if (depth===0){
-          if (dimmax===0) return a;
-          return stack[0].a;
         }
       }
+      // backtrack
+      while ((depth>0) && (stack[depth-1].i>=stack[depth-1].dim)){
+        depth--;
+      };
+      if (depth===0){
+        if (dimmax===0) return a;
+        return stack[0].a;
+      }
     }while (true);
   },