Jelajahi Sumber

[java/cs] Added array function that creates a new array; Added NativeArray helpers; Closes #3979

Cauê Waneck 10 tahun lalu
induk
melakukan
4dbea25f8d
5 mengubah file dengan 66 tambahan dan 13 penghapusan
  1. 3 1
      gencs.ml
  2. 11 6
      genjava.ml
  3. 26 4
      std/cs/NativeArray.hx
  4. 3 2
      std/java/NativeArray.hx
  5. 23 0
      tests/unit/src/unit/issues/Issue3979.hx

+ 3 - 1
gencs.ml

@@ -1323,7 +1323,9 @@ let configure gen =
 				| TMeta (_,e) ->
 						expr_s w e
 				| TArrayDecl el
-				| TCall ({ eexpr = TLocal { v_name = "__array__" } }, el) ->
+				| TCall ({ eexpr = TLocal { v_name = "__array__" } }, el)
+				| TCall ({ eexpr = TField(_, FStatic({ cl_path = (["cs"],"NativeArray") }, { cf_name = "array" })) }, el) ->
+					let _, el = extract_tparams [] el in
 					print w "new %s" (t_s e.etype);
 					write w "{";
 					ignore (List.fold_left (fun acc e ->

+ 11 - 6
genjava.ml

@@ -1174,6 +1174,13 @@ let configure gen =
 		| _ -> t
 	in
 
+	let rec extract_tparams params el =
+		match el with
+			| ({ eexpr = TLocal({ v_name = "$type_param" }) } as tp) :: tl ->
+				extract_tparams (tp.etype :: params) tl
+			| _ -> (params, el)
+	in
+
 	let line_directive =
 		if Common.defined gen.gcon Define.RealPosition then
 			fun w p -> ()
@@ -1261,7 +1268,9 @@ let configure gen =
 				| TMeta (_,e) ->
 					expr_s w e
 				| TCall ({ eexpr = TLocal { v_name = "__array__" } }, el)
+				| TCall ({ eexpr = TField(_, FStatic({ cl_path = (["java"],"NativeArray") }, { cf_name = "array" })) }, el)
 				| TArrayDecl el when t_has_type_param e.etype ->
+					let _, el = extract_tparams [] el in
 					print w "( (%s) (new %s " (t_s e.epos e.etype) (t_s e.epos (replace_type_param e.etype));
 					write w "{";
 					ignore (List.fold_left (fun acc e ->
@@ -1271,7 +1280,9 @@ let configure gen =
 					) 0 el);
 					write w "}) )"
 				| TCall ({ eexpr = TLocal { v_name = "__array__" } }, el)
+				| TCall ({ eexpr = TField(_, FStatic({ cl_path = (["java"],"NativeArray") }, { cf_name = "array" })) }, el)
 				| TArrayDecl el ->
+					let _, el = extract_tparams [] el in
 					print w "new %s" (param_t_s e.epos (transform_nativearray_t e.etype));
 					let is_double = match follow e.etype with
 					 | TInst(_,[ t ]) -> if like_float t && not (like_int t) then Some t else None
@@ -1332,12 +1343,6 @@ let configure gen =
 					expr_s w expr;
 					write w ".class"
 				| TCall (e, el) ->
-					let rec extract_tparams params el =
-						match el with
-							| ({ eexpr = TLocal({ v_name = "$type_param" }) } as tp) :: tl ->
-								extract_tparams (tp.etype :: params) tl
-							| _ -> (params, el)
-					in
 					let params, el = extract_tparams [] el in
 
 					expr_s w e;

+ 26 - 4
std/cs/NativeArray.hx

@@ -23,12 +23,34 @@ package cs;
 
 extern class NativeArray<T> extends cs.system.Array implements ArrayAccess<T>
 {
-	// public var Length(default, null):Int;
-
+	public static function array<T>(elements:haxe.Rest<T>):NativeArray<T>;
 	public function new(len:Int):Void;
+	public var length(get,never):Int;
 
-	// @:overload(function(arr:cs.system.Array, destIndex:haxe.Int64):Void {} )
-	// public function CopyTo(arr:cs.system.Array, destIndex:Int):Void;
+	@:extern inline private function get_length():Int return this.Length;
 
 	static function Reverse(arr:cs.system.Array):Void;
+
+	@:extern inline public function iterator():NativeArrayIterator<T>
+		return new NativeArrayIterator(this);
+}
+
+@:nativeGen private class NativeArrayIterator<T>
+{
+	public var arr(default,null):NativeArray<T>;
+	public var idx(default,null):UInt;
+
+	inline public function new(arr)
+	{
+		this.arr = arr;
+		this.idx = 0;
+	}
+
+	inline public function hasNext():Bool
+		return this.idx < this.arr.Length;
+
+	inline public function next():T
+	{
+		return this.arr[this.idx++];
+	}
 }

+ 3 - 2
std/java/NativeArray.hx

@@ -28,8 +28,9 @@ package java;
 
 @:nativeGen extern class NativeArray<T> implements ArrayAccess<T>
 {
+	public static function array<T>(elements:haxe.Rest<T>):NativeArray<T>;
+
 	public var length(default, null):Int;
 
 	public function new(len:Int):Void;
-
-}
+}

+ 23 - 0
tests/unit/src/unit/issues/Issue3979.hx

@@ -0,0 +1,23 @@
+package unit.issues;
+#if java
+import java.NativeArray;
+#elseif cs
+import cs.NativeArray;
+#end
+
+class Issue3979 extends Test
+{
+	public function test()
+	{
+#if (java || cs)
+		var v = 0;
+		var nv = NativeArray.array(1,2,3,4,5,6);
+		eq(nv.length,6);
+		for (val in nv)
+		{
+			eq(val,++v);
+		}
+		eq(v,6);
+#end
+	}
+}