66 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
package jvm;
 | 
						|
 | 
						|
import java.NativeArray;
 | 
						|
import java.lang.reflect.Method;
 | 
						|
 | 
						|
@:native("haxe.jvm.Closure")
 | 
						|
@:nativeGen
 | 
						|
@:keep
 | 
						|
class Closure extends ClosureDispatch {
 | 
						|
	public var context:Dynamic;
 | 
						|
	public var method:Method;
 | 
						|
 | 
						|
	var isStatic:Bool;
 | 
						|
	var params:NativeArray<java.lang.Class<Dynamic>>;
 | 
						|
 | 
						|
	public function new(context:Null<Dynamic>, method:Method) {
 | 
						|
		super();
 | 
						|
		this.context = context;
 | 
						|
		this.method = method;
 | 
						|
		isStatic = method.getModifiers() & java.lang.reflect.Modifier.STATIC != 0;
 | 
						|
		params = method.getParameterTypes();
 | 
						|
	}
 | 
						|
 | 
						|
	public function bindTo(context:Dynamic) {
 | 
						|
		return new Closure(context, method);
 | 
						|
	}
 | 
						|
 | 
						|
	override public function equals(other:java.lang.Object) {
 | 
						|
		if (!Jvm.instanceof(other, Closure)) {
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
		var other:Closure = cast other;
 | 
						|
		return context == other.context && method == other.method;
 | 
						|
	}
 | 
						|
 | 
						|
	public override function invokeDynamic(args:NativeArray<Dynamic>):Dynamic {
 | 
						|
		if (isStatic && context != null) {
 | 
						|
			var newArgs = new NativeArray(args.length + 1);
 | 
						|
			haxe.ds.Vector.blit(cast args, 0, cast newArgs, 1, args.length);
 | 
						|
			newArgs[0] = context;
 | 
						|
			args = newArgs;
 | 
						|
		}
 | 
						|
		var args = switch (jvm.Jvm.unifyCallArguments(args, params, true)) {
 | 
						|
			case Some(args):
 | 
						|
				args;
 | 
						|
			case None:
 | 
						|
				args;
 | 
						|
		};
 | 
						|
		try {
 | 
						|
			return method.invoke(context, args);
 | 
						|
		} catch (e:java.lang.reflect.InvocationTargetException) {
 | 
						|
			throw e.getCause();
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
@:native("haxe.jvm.ClosureDispatch")
 | 
						|
extern class ClosureDispatch extends Function {}
 | 
						|
 | 
						|
@:native("haxe.jvm.VarArgs")
 | 
						|
extern class VarArgs extends Function {
 | 
						|
	var func:Function;
 | 
						|
 | 
						|
	public function new(func:Function):Void;
 | 
						|
}
 |