Răsfoiți Sursa

[php] keep iterator fields on maps (fixes #8851)

Aleksandr Kuzmenko 6 ani în urmă
părinte
comite
9fd86d599b

+ 2 - 2
std/php/_std/Array.hx

@@ -84,8 +84,8 @@ final class Array<T> implements ArrayAccess<Int, T> implements IteratorAggregate
 		Global.array_splice(arr, pos, 0, Syntax.arrayDecl(x));
 	}
 
-	@:keep
-	public function iterator():Iterator<T> {
+	@:ifFeature("dynamic_read.iterator", "anon_optional_read.iterator", "anon_read.iterator")
+	public inline function iterator():Iterator<T> {
 		return new ArrayIterator(this);
 	}
 

+ 3 - 1
std/php/_std/haxe/ds/IntMap.hx

@@ -59,11 +59,13 @@ import php.NativeIndexedArray;
 		return Global.array_keys(data).iterator();
 	}
 
+	@:ifFeature("dynamic_read.iterator", "anon_optional_read.iterator", "anon_read.iterator")
 	public inline function iterator():Iterator<T> {
 		return Global.array_values(data).iterator();
 	}
 
-	@:runtime public inline function keyValueIterator():KeyValueIterator<Int, T> {
+	@:ifFeature("dynamic_read.keyValueIterator", "anon_optional_read.keyValueIterator", "anon_read.keyValueIterator")
+	public inline function keyValueIterator():KeyValueIterator<Int, T> {
 		return new haxe.iterators.MapKeyValueIterator(this);
 	}
 

+ 3 - 1
std/php/_std/haxe/ds/ObjectMap.hx

@@ -63,11 +63,13 @@ class ObjectMap<K:{}, V> implements haxe.Constraints.IMap<K, V> {
 		return _keys.iterator();
 	}
 
+	@:ifFeature("dynamic_read.iterator", "anon_optional_read.iterator", "anon_read.iterator")
 	public inline function iterator():Iterator<V> {
 		return _values.iterator();
 	}
 
-	@:runtime public inline function keyValueIterator():KeyValueIterator<K, V> {
+	@:ifFeature("dynamic_read.keyValueIterator", "anon_optional_read.keyValueIterator", "anon_read.keyValueIterator")
+	public inline function keyValueIterator():KeyValueIterator<K, V> {
 		return new haxe.iterators.MapKeyValueIterator(this);
 	}
 

+ 3 - 1
std/php/_std/haxe/ds/StringMap.hx

@@ -60,11 +60,13 @@ import haxe.Constraints;
 		return Global.array_map('strval', Global.array_keys(data)).iterator();
 	}
 
+	@:ifFeature("dynamic_read.iterator", "anon_optional_read.iterator", "anon_read.iterator")
 	public inline function iterator():Iterator<T> {
 		return data.iterator();
 	}
 
-	@:runtime public inline function keyValueIterator():KeyValueIterator<String, T> {
+	@:ifFeature("dynamic_read.keyValueIterator", "anon_optional_read.keyValueIterator", "anon_read.keyValueIterator")
+	public inline function keyValueIterator():KeyValueIterator<String, T> {
 		return new haxe.iterators.MapKeyValueIterator(this);
 	}
 

+ 5 - 0
tests/misc/php/projects/Issue8851/compile.hxml

@@ -0,0 +1,5 @@
+-cp src
+-main Main
+-dce full
+-php bin
+--cmd php bin/index.php

+ 16 - 0
tests/misc/php/projects/Issue8851/src/Main.hx

@@ -0,0 +1,16 @@
+class Main {
+	static var tmp:Any;
+
+	static function main() {
+		iter([1 => 2]);
+		iter(['1' => 2]);
+		iter([{field:1} => 2]);
+		iter([1, 2]);
+	}
+
+	static function iter<T>(it:Iterable<T>) {
+		for(i in it) {
+			tmp = i;
+		}
+	}
+}