浏览代码

update Reflect.callMethod in HL: don't allow to switch closure object (crash unless HL 1.8)

Nicolas Cannasse 7 年之前
父节点
当前提交
dcede2fb20
共有 2 个文件被更改,包括 15 次插入22 次删除
  1. 9 21
      std/hl/_std/Reflect.hx
  2. 6 1
      std/hl/_std/Type.hx

+ 9 - 21
std/hl/_std/Reflect.hx

@@ -57,38 +57,26 @@ class Reflect {
 
 	public static function callMethod( o : Dynamic, func : haxe.Constraints.Function, args : Array<Dynamic> ) : Dynamic {
 		var args : hl.types.ArrayDyn = cast args;
-		var count = args.length;
 
 		var ft = hl.Type.getDynamic(func);
 		if( ft.kind != HFun )
 			throw "Invalid function " + func;
+
+		var count = args.length;
 		var need = ft.getArgsCount();
+		var nargs = count < need ? need : count;
 		var cval : Dynamic = hl.Api.getClosureValue(func);
-		var isClosure = cval != null && need >= 0;
-		if( isClosure ) {
-			if( o == null )
-				o = cval;
-			else if( isFunction(cval) ) {
-				// swap the sub object for closure wrapping
-				// see hashlink/#143
-				var subO = hl.Api.getClosureValue(cval);
-				if( subO != null )
-					o = hl.Api.makeClosure(cval, o);
-			}
-		} else {
-			if( count == need )
-				o = null;
+		if( cval != null ) {
+			func = hl.Api.noClosure(func);
+			nargs++;
 		}
-		var nargs = o == null ? count : count + 1;
-		if( isClosure ) need++;
-		if( nargs < need ) nargs = need;
+
 		var a = new hl.NativeArray<Dynamic>(nargs);
-		if( o == null || need < 0 ) {
+		if( cval == null ) {
 			for( i in 0...count )
 				a[i] = args.getDyn(i);
 		} else {
-			func = hl.Api.noClosure(func);
-			a[0] = o;
+			a[0] = cval;
 			for( i in 0...count )
 				a[i+1] = args.getDyn(i);
 		}

+ 6 - 1
std/hl/_std/Type.hx

@@ -127,7 +127,12 @@ class Type {
 		if( t == hl.Type.get((null : hl.types.ArrayBase.ArrayAccess)) )
 			return cast new Array<Dynamic>();
 		var o = t.allocObject();
-		if( c.__constructor__ != null ) Reflect.callMethod(o, c.__constructor__, args);
+		if( c.__constructor__ != null ) {
+			var v : Dynamic = hl.Api.noClosure(c.__constructor__);
+			var args = args.copy();
+			args.unshift(o);
+			Reflect.callMethod(null, v, args);
+		}
 		return o;
 	}