瀏覽代碼

fix tricky VarArgs again (runtime array on the call site and tuple on the receiving site) (fixes #2937)

frabbit 11 年之前
父節點
當前提交
e683253e88
共有 3 個文件被更改,包括 20 次插入5 次删除
  1. 11 3
      std/python/VarArgs.hx
  2. 1 1
      std/python/_std/Reflect.hx
  3. 8 1
      tests/unit/TestPython.hx

+ 11 - 3
std/python/VarArgs.hx

@@ -1,14 +1,22 @@
 
 package python;
 
-abstract VarArgs (Array<Dynamic>)
+import python.lib.Builtin;
+
+abstract VarArgs (Dynamic)
 {
 	inline function new (d:Array<Dynamic>) this = d;
 
-	@:to inline function toArray ():Array<Dynamic>
-	{
+
+	inline function raw ():Dynamic {
 		return this;
 	}
+
+	@:to public inline function toArray ():Array<Dynamic>
+	{
+		return if (!Std.is(raw(), Array)) Builtin.list(raw()) else (raw():Array<Dynamic>);
+	}
+
 	@:from static inline function fromArray (d:Array<Dynamic>):VarArgs
 	{
 		return new VarArgs(d);

+ 1 - 1
std/python/_std/Reflect.hx

@@ -153,7 +153,7 @@ class Reflect {
 	@:overload(function( f : Array<Dynamic> -> Void ) : Dynamic {})
 	public static function makeVarArgs( f : Array<Dynamic> -> Dynamic ) : Dynamic {
 		return function (v:VarArgs) {
-			return f(Builtin.list(v));
+			return f(v);
 		}
 	}
 

+ 8 - 1
tests/unit/TestPython.hx

@@ -292,7 +292,7 @@ class TestPython extends Test {
 	}
 
 	// Issue #2936
-	function testArrayEq () {
+	function testIssue36 () {
 		f([1,2,3] == [1,2,3]);
 		f(([1,2,3]:Dynamic) == ([1,2,3]:Dynamic));
 		f(([1,2,3]:Dynamic) == [1,2,3]);
@@ -304,4 +304,11 @@ class TestPython extends Test {
 		t([1,2,3] != ([1,2,3]:Dynamic));
 	}
 
+	function testIssue2937 () {
+		var f = Reflect.makeVarArgs(function(args:Array<Dynamic>) {
+            t(Std.is(args, Array)); // false, but should be true
+        });
+        f(1,2,3);
+	}
+
 }