Bläddra i källkod

pad missing args with nulls in Reflect.callMethod (closed #2223)

Nicolas Cannasse 12 år sedan
förälder
incheckning
c368c5b9bb
2 ändrade filer med 17 tillägg och 7 borttagningar
  1. 10 2
      std/neko/_std/Reflect.hx
  2. 7 5
      std/neko/_std/Type.hx

+ 10 - 2
std/neko/_std/Reflect.hx

@@ -46,8 +46,16 @@
 		}
 	}
 
-	public inline static function callMethod( o : Dynamic, func : Dynamic, args : Array<Dynamic> ) : Dynamic untyped {
-		return $call(func,o,args.__neko());
+	public static function callMethod( o : Dynamic, func : Dynamic, args : Array<Dynamic> ) : Dynamic untyped {
+		var a = args.__neko();
+		// pad missing args with null's
+		var n = $nargs(func);
+		if( n > $asize(a) ) {
+			var a2 = $amake(n);
+			$ablit(a2,0,a,0,$asize(a));
+			a = a2;
+		}
+		return $call(func,o,a);
 	}
 
 	public static function fields( o : Dynamic ) : Array<String> untyped {

+ 7 - 5
std/neko/_std/Type.hx

@@ -97,13 +97,15 @@ enum ValueType {
 
 	public static function createInstance<T>( cl : Class<T>, args : Array<Dynamic> ) : T untyped {
 		var fnew = $objget(cl,$hash("new".__s));
+		var a = args.__neko();
+		// pad missing args with null's
 		var n = $nargs(fnew);
-		if( args.length < n ) {
-			args = args.copy();
-			while( args.length < n )
-				args.push(null);
+		if( n > $asize(a) ) {
+			var a2 = $amake(n);
+			$ablit(a2,0,a,0,$asize(a));
+			a = a2;
 		}
-		return $call(fnew,cl,args.__neko());
+		return $call(fnew,cl,a);
 	}
 
 	public static function createEmptyInstance<T>( cl : Class<T> ) : T untyped {