Parcourir la source

FOR..IN fixes

Vladislav Folts il y a 9 ans
Parent
commit
d439d7ebb7

BIN
bin/compiled.zip


+ 8 - 3
src/eberon/EberonContextLoop.ob

@@ -140,7 +140,7 @@ PROCEDURE ForEach.handleExpression(e: Expression.PType);
 BEGIN
     type <- e.type();
     IF ~(type IS Types.PArray) THEN
-        Errors.raise("expression of type MAP is expected in FOR, got '" 
+        Errors.raise("expression of type ARRAY or MAP is expected in FOR, got '" 
                      + type.description() + "'");
     ELSE
         root <- SELF.root();
@@ -151,14 +151,19 @@ BEGIN
         SELF.scopeWasCreated := TRUE;
 
         code <- SELF.parent().codeGenerator();
-        mapVar <- root.currentScope().generateTempVar("map");
+        mapVar <- root.currentScope().generateTempVar("seq");
         code.write("var " + mapVar + " = " + e.code() + ";" + Chars.ln);
         code.write("for(var " + SELF.keyId + " in " + mapVar + ")");
         code.openScope();
         code.write("var " + SELF.valueId + " = " + mapVar + "[" + SELF.keyId + "];" + Chars.ln);
         SELF.code := code;
 
-        makeVariable(SELF.keyId, EberonString.string, scope);
+        keyType <- Types.basic.integer;
+        IF type IS EberonMap.PType THEN
+            keyType := EberonString.string;
+        END;
+
+        makeVariable(SELF.keyId, keyType, scope);
         makeVariable(SELF.valueId, type.elementsType, scope);
     END;
 END;

+ 12 - 0
test/expected/eberon/for_in.js

@@ -0,0 +1,12 @@
+<rtl code>
+var test = function (){
+
+function array(){
+	var a = RTL$.makeArray(3, false);
+	var $seq1 = a;
+	for(var i in $seq1){
+		var v = $seq1[i];
+		RTL$.assert(a[i] == v);
+	}
+}
+}();

+ 30 - 30
test/expected/eberon/map.js

@@ -17,9 +17,9 @@ function RecordWithMapInitializedInConstructor(m/*MAP OF INTEGER*/){
 
 function ForEach(){
 	var m = {};
-	var $map1 = m;
-	for(var k in $map1){
-		var v = $map1[k];
+	var $seq1 = m;
+	for(var k in $seq1){
+		var v = $seq1[k];
 		RTL$.assert(v == 0);
 		RTL$.assert(k != "");
 	}
@@ -31,9 +31,9 @@ function makeMap(){
 }
 
 function ForEachWithExpression(){
-	var $map1 = makeMap();
-	for(var k in $map1){
-		var v = $map1[k];
+	var $seq1 = makeMap();
+	for(var k in $seq1){
+		var v = $seq1[k];
 	}
 }
 
@@ -41,29 +41,29 @@ function NestedForEach(){
 	var m = {};
 	
 	function inner(){
-		var $map1 = m;
-		for(var k in $map1){
-			var v = $map1[k];
-			var $map2 = m;
-			for(var k2 in $map2){
-				var v2 = $map2[k2];
+		var $seq1 = m;
+		for(var k in $seq1){
+			var v = $seq1[k];
+			var $seq2 = m;
+			for(var k2 in $seq2){
+				var v2 = $seq2[k2];
 			}
 		}
 	}
-	var $map1 = m;
-	for(var k in $map1){
-		var v = $map1[k];
-		var $map2 = m;
-		for(var k2 in $map2){
-			var v2 = $map2[k2];
+	var $seq1 = m;
+	for(var k in $seq1){
+		var v = $seq1[k];
+		var $seq2 = m;
+		for(var k2 in $seq2){
+			var v2 = $seq2[k2];
 		}
 	}
-	var $map3 = m;
-	for(var k3 in $map3){
-		var v3 = $map3[k3];
-		var $map4 = m;
-		for(var k in $map4){
-			var v = $map4[k];
+	var $seq3 = m;
+	for(var k3 in $seq3){
+		var v3 = $seq3[k3];
+		var $seq4 = m;
+		for(var k in $seq4){
+			var v = $seq4[k];
 		}
 	}
 }
@@ -177,12 +177,12 @@ function passMapMapElementByRef(m/*VAR MAP OF INTEGER*/){
 
 function passMapArrayElementByRef(a/*VAR ARRAY * OF INTEGER*/){
 }
-var $map1 = m;
-for(var k in $map1){
-	var v = $map1[k];
-	var $map2 = m;
-	for(var k2 in $map2){
-		var v2 = $map2[k2];
+var $seq1 = m;
+for(var k in $seq1){
+	var v = $seq1[k];
+	var $seq2 = m;
+	for(var k2 in $seq2){
+		var v2 = $seq2[k2];
 	}
 }
 passByRef(m);

+ 12 - 0
test/input/eberon/for_in.ob

@@ -0,0 +1,12 @@
+MODULE test;
+
+PROCEDURE array();
+VAR
+    a: ARRAY 3 OF BOOLEAN;
+BEGIN
+    FOR i, v IN a DO
+        ASSERT(a[i] = v);
+    END;
+END;
+
+END test.

+ 3 - 2
test/test_unit_eberon.js

@@ -1341,7 +1341,8 @@ exports.suite = {
     "array": testWithContext(
         context(grammar.statement, 
                 "VAR a: ARRAY 3 OF BOOLEAN;"),
-        pass("FOR i, v IN a DO END"),
+        pass("FOR i, v IN a DO END",
+             "FOR i, v IN a DO ASSERT(a[i] = v); END"),
         fail()
     ),
 },
@@ -1439,7 +1440,7 @@ exports.suite = {
              ["FOR k, m IN m DO END", "'m' already declared in module scope"],
              ["FOR k, v IN m DO k := \"\"; END", "cannot assign to FOR variable"],
              ["FOR k, v IN m DO v := 0; END", "cannot assign to FOR variable"],
-             ["FOR k, v IN r DO END", "expression of type MAP is expected in FOR, got 'T'"],
+             ["FOR k, v IN r DO END", "expression of type ARRAY or MAP is expected in FOR, got 'T'"],
              ["FOR k, v IN T DO END", "type name 'T' cannot be used as an expression"]
             )
         ),