Bläddra i källkod

Apply texpr.for_remap in ForRemap filter when a TFor escapes (#9673)

* Apply texpr.for_remap in ForRemap filter when a TFor escapes

* Add test for For loop iterator inlining.
Mario Carbajal 5 år sedan
förälder
incheckning
efaecfea3c
2 ändrade filer med 22 tillägg och 2 borttagningar
  1. 4 1
      src/filters/filters.ml
  2. 18 1
      tests/optimization/src/TestInlineConstructors.hx

+ 4 - 1
src/filters/filters.ml

@@ -672,7 +672,10 @@ module ForRemap = struct
 			let restore = save_locals ctx in
 			let restore = save_locals ctx in
 			let e = ForLoop.IterationKind.to_texpr ctx v iterator e2 e.epos in
 			let e = ForLoop.IterationKind.to_texpr ctx v iterator e2 e.epos in
 			restore();
 			restore();
-			e
+			begin match e.eexpr with
+			| TFor _ -> for_remap ctx.com.basic v e1 e2 e.epos
+			| _ -> e
+			end
 		| _ ->
 		| _ ->
 			Type.map_expr loop e
 			Type.map_expr loop e
 		in
 		in

+ 18 - 1
tests/optimization/src/TestInlineConstructors.hx

@@ -19,6 +19,13 @@ class InlineClass {
 	}
 	}
 }
 }
 
 
+class InlineIterator {
+	public var i = 0;
+	public inline function new() {};
+	public inline function hasNext() return i < 10;
+	public inline function next() return i++;
+}
+
 class NestedInlineClass {
 class NestedInlineClass {
 	public var a : InlineClass;
 	public var a : InlineClass;
 	public var b : Array<Int>;
 	public var b : Array<Int>;
@@ -113,4 +120,14 @@ class TestInlineConstructors extends TestBase {
 		var arr = a.cancelThis();
 		var arr = a.cancelThis();
 		return [arr[0], arr[1]];
 		return [arr[0], arr[1]];
 	}
 	}
-}
+
+	@:js('var v_i = 0;var acc = 0;while(v_i < 10) acc += v_i++;return acc;')
+	static function testIteratorMethodInliningInForLoop() {
+		var iter : Iterator<Int> = new InlineIterator();
+		var acc = 0;
+		for ( v in iter ) {
+			acc += v;
+		}
+		return acc;
+	}
+}