Browse Source

Merge pull request #2594 from nadako/cs_array_iter

use class for array iterator on c#
Nicolas Cannasse 11 years ago
parent
commit
4b78f33247
3 changed files with 50 additions and 19 deletions
  1. 20 8
      std/cs/_std/Array.hx
  2. 20 8
      std/java/_std/Array.hx
  3. 10 3
      typer.ml

+ 20 - 8
std/cs/_std/Array.hx

@@ -408,15 +408,9 @@ import cs.NativeArray;
 		return ofNative(newarr);
 		return ofNative(newarr);
 	}
 	}
 
 
-	public function iterator() : Iterator<T>
+	public inline function iterator() : Iterator<T>
 	{
 	{
-		var i = 0;
-		var len = length;
-		return
-		{
-			hasNext:function() return i < len,
-			next:function() return __a[i++]
-		};
+		return new ArrayIterator<T>(this);
 	}
 	}
 
 
 	private function __get(idx:Int):T
 	private function __get(idx:Int):T
@@ -459,3 +453,21 @@ import cs.NativeArray;
 		return __a[idx] = val;
 		return __a[idx] = val;
 	}
 	}
 }
 }
+
+@:final
+private class ArrayIterator<T>
+{
+	var arr:Array<T>;
+	var len:Int;
+	var i:Int;
+
+	public inline function new(a:Array<T>)
+	{
+		arr = a;
+		len = a.length;
+		i = 0;
+	}
+
+	public inline function hasNext():Bool return i < len;
+	public inline function next():T return arr[i++];
+}

+ 20 - 8
std/java/_std/Array.hx

@@ -402,15 +402,9 @@ import java.NativeArray;
 		return ofNative(newarr);
 		return ofNative(newarr);
 	}
 	}
 
 
-	public function iterator() : Iterator<T>
+	public inline function iterator() : Iterator<T>
 	{
 	{
-		var i = 0;
-		var len = length;
-		return
-		{
-			hasNext:function() return i < len,
-			next:function() return __a[i++]
-		};
+		return new ArrayIterator<T>(this);
 	}
 	}
 
 
 	public function map<S>( f : T -> S ) : Array<S> {
 	public function map<S>( f : T -> S ) : Array<S> {
@@ -467,3 +461,21 @@ import java.NativeArray;
 		return __a[idx] = val;
 		return __a[idx] = val;
 	}
 	}
 }
 }
+
+@:final
+private class ArrayIterator<T>
+{
+	var arr:Array<T>;
+	var len:Int;
+	var i:Int;
+
+	public inline function new(a:Array<T>)
+	{
+		arr = a;
+		len = a.length;
+		i = 0;
+	}
+
+	public inline function hasNext():Bool return i < len;
+	public inline function next():T return arr[i++];
+}

+ 10 - 3
typer.ml

@@ -4274,9 +4274,16 @@ let rec create com =
 	| [TClassDecl c] -> ctx.t.tstring <- TInst (c,[])
 	| [TClassDecl c] -> ctx.t.tstring <- TInst (c,[])
 	| _ -> assert false);
 	| _ -> assert false);
 	let m = Typeload.load_module ctx ([],"Array") null_pos in
 	let m = Typeload.load_module ctx ([],"Array") null_pos in
-	(match m.m_types with
-	| [TClassDecl c] -> ctx.t.tarray <- (fun t -> TInst (c,[t]))
-	| _ -> assert false);
+	(try
+		List.iter (fun t -> (
+			match t with
+			| TClassDecl ({cl_path = ([],"Array")} as c) ->
+				ctx.t.tarray <- (fun t -> TInst (c,[t]));
+				raise Exit
+			| _ -> ()
+		)) m.m_types;
+		assert false
+	with Exit -> ());
 	let m = Typeload.load_module ctx (["haxe"],"EnumTools") null_pos in
 	let m = Typeload.load_module ctx (["haxe"],"EnumTools") null_pos in
 	(match m.m_types with
 	(match m.m_types with
 	| [TClassDecl c1;TClassDecl c2] -> ctx.g.global_using <- c1 :: c2 :: ctx.g.global_using
 	| [TClassDecl c1;TClassDecl c2] -> ctx.g.global_using <- c1 :: c2 :: ctx.g.global_using