MethodHandle mh = null;
if (method.getNativeCall() != null) {
DynamicMethod.NativeCall nc = method.getNativeCall();
if (method.getArity().isFixed()) {
if (method.getArity().getValue() <= 3) {
Binder b = Binder.from(site.type());
if (!nc.hasContext()) {
b.drop(0);
}
if (nc.hasBlock() && !block) {
b.insert(site.type().parameterCount() - 1, Block.NULL_BLOCK);
} else if (!nc.hasBlock() && block) {
b.drop(site.type().parameterCount() - 2, 1);
}
if (nc.isStatic()) {
if (b.type().parameterCount() == nc.getNativeSignature().length) {
mh = b
.cast(nc.getNativeReturn(), nc.getNativeSignature())
.invokeStaticQuiet(MethodHandles.lookup(), nc.getNativeTarget(), nc.getNativeName());
// System.out.println(mh);
}
} else {
// System.out.println(b.type());
// System.out.println(Arrays.toString(nc.getNativeSignature()));
if (b.type().parameterCount() == nc.getNativeSignature().length + 1) {
// only threadcontext-receivers right now
mh = b
.permute(PERMUTES[arity])
.cast(MethodType.methodType(nc.getNativeReturn(), nc.getNativeTarget(), nc.getNativeSignature()))
.invokeVirtualQuiet(MethodHandles.lookup(), nc.getNativeName());
// System.out.println(mh);
}