Просмотр исходного кода

[cs] Generic method call support

Caue Waneck 13 лет назад
Родитель
Сommit
9e389484a5

+ 2 - 2
std/cs/_std/haxe/lang/Null.hx

@@ -25,13 +25,13 @@ package haxe.lang;
 	@:functionBody('
 			if (! (v is System.ValueType))
 			{
-				if (v.Equals(default(T)))
+				if (System.Object.ReferenceEquals(v, default(T)))
 				{
 					hasValue = false;
 				}
 			}
 			
-			if (!v.Equals(default(T)))
+			if (!System.Object.ReferenceEquals(v, null) && !v.Equals(default(T)))
 			{
 				hasValue = true;
 			}

+ 18 - 10
std/cs/_std/haxe/lang/Runtime.hx

@@ -5,6 +5,7 @@ import cs.NativeArray;
 import system.Activator;
 import system.IConvertible;
 import system.reflection.MethodBase;
+import system.reflection.MethodInfo;
 import system.Type;
 
 /**
@@ -316,7 +317,8 @@ import system.Type;
 		for (i in 0...length)
 		{
 			oargs[i] = args[i];
-			ts[i] = Lib.getNativeType(args[i]);
+			if (args[i] != null)
+				ts[i] = Lib.getNativeType(args[i]);
 		}
 		
 		var last = 0;
@@ -380,6 +382,19 @@ import system.Type;
 			}
 		}
 		
+		if (methods[0].ContainsGenericParameters && Std.is(methods[0], system.reflection.MethodInfo))
+		{
+			var m:MethodInfo = cast methods[0];
+			var tgs = m.GetGenericArguments();
+			for (i in 0...tgs.Length)
+			{
+				tgs[i] = untyped __typeof__(Dynamic);
+			}
+			m = m.MakeGenericMethod(tgs);
+			var retg = m.Invoke(obj, oargs);
+			return haxe.lang.Runtime.unbox(retg);
+		}
+		
 		var ret = methods[0].Invoke(obj, oargs);
 		return unbox(ret);
 	}
@@ -395,6 +410,8 @@ import system.Type;
 	}
 	
 	@:functionBody('
+		if (nullableType.ContainsGenericParameters)
+			return haxe.lang.Null<object>.ofDynamic<object>(obj);
 		return nullableType.GetMethod("_ofDynamic").Invoke(null, new object[] { obj });
 	')
 	public static function mkNullable(obj:Dynamic, nullableType:system.Type):Dynamic
@@ -415,15 +432,6 @@ import system.Type;
 			obj = null;
 			bf = System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public;
 		}
-
-		int length = (int)haxe.lang.Runtime.getField_f(args, "length", 520590566, true);
-		object[] oargs = new object[length];
-		System.Type[] ts = new System.Type[length];
-		for (int i = 0; i < length; i++)
-		{
-			oargs[i] = args[i];
-			ts[i] = oargs[i].GetType();
-		}
 		
 		System.Reflection.MethodInfo[] mis = t.GetMethods(bf);
 		int last = 0;

+ 2 - 0
std/cs/_std/system/reflection/MethodBase.hx

@@ -4,6 +4,8 @@ import cs.NativeArray;
 @:native('System.Reflection.MethodBase') extern class MethodBase 
 {
 	var Name(default, null):String;
+	var ContainsGenericParameters(default, null):Bool;
 	function GetParameters():NativeArray<ParameterInfo>;
+	function GetGenericArguments():NativeArray<system.Type>;
 	function Invoke(obj:Dynamic, args:NativeArray<Dynamic>):Dynamic;
 }

+ 9 - 0
std/cs/_std/system/reflection/MethodInfo.hx

@@ -0,0 +1,9 @@
+package system.reflection;
+import cs.NativeArray;
+import cs.NativeArray;
+import system.Type;
+
+@:native('System.Reflection.MethodInfo') extern class MethodInfo extends MethodBase 
+{
+	function MakeGenericMethod(g:NativeArray<Type>):MethodInfo;
+}