org.python.modules.jffi.JITHandle Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython-slim Show documentation
Show all versions of jython-slim Show documentation
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
/*
*
*/
package org.python.modules.jffi;
import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
import java.util.concurrent.atomic.AtomicInteger;
/**
*
*/
final class JITHandle {
private static final int THRESHOLD = Integer.getInteger("jython.ctypes.compile.threshold", 100);
private final JITSignature jitSignature;
private volatile boolean compilationFailed = false;
private final AtomicInteger counter = new AtomicInteger(0);
private final JITCompiler compiler;
private WeakReference> compiledClassRef = null;
JITHandle(JITCompiler compiler, JITSignature signature, boolean compilationFailed) {
this.compiler = compiler;
this.jitSignature = signature;
this.compilationFailed = compilationFailed;
}
final boolean compilationFailed() {
return compilationFailed;
}
final Invoker compile(com.kenai.jffi.Function function, NativeDataConverter resultConverter, NativeDataConverter[] parameterConverters) {
if (compilationFailed || counter.incrementAndGet() < THRESHOLD) {
return null;
}
Class extends Invoker> compiledClass;
synchronized (this) {
if (compiledClassRef == null || (compiledClass = compiledClassRef.get()) == null) {
compiledClass = newInvokerClass(jitSignature);
if (compiledClass == null) {
compilationFailed = true;
return null;
}
compiler.registerClass(this, compiledClass);
compiledClassRef = new WeakReference>(compiledClass);
}
}
try {
Constructor extends Invoker> cons = compiledClass.getDeclaredConstructor(com.kenai.jffi.Function.class,
NativeDataConverter.class, NativeDataConverter[].class, Invoker.class);
return cons.newInstance(function, resultConverter, parameterConverters,
createFallbackInvoker(function, jitSignature));
} catch (Throwable t) {
t.printStackTrace();
return null;
}
}
Class extends Invoker> newInvokerClass(JITSignature jitSignature) {
JITMethodGenerator generator = null;
JITMethodGenerator[] generators = {
new FastIntMethodGenerator(),
new FastLongMethodGenerator(),
new FastNumericMethodGenerator(),};
for (int i = 0; i < generators.length; i++) {
if (generators[i].isSupported(jitSignature)) {
generator = generators[i];
break;
}
}
if (generator == null) {
return null;
}
return new AsmClassBuilder(generator, jitSignature).build();
}
static Invoker createFallbackInvoker(com.kenai.jffi.Function function, JITSignature signature) {
NativeType[] parameterTypes = new NativeType[signature.getParameterCount()];
for (int i = 0; i < parameterTypes.length; i++) {
parameterTypes[i] = signature.getParameterType(i);
}
return DefaultInvokerFactory.getFactory().createInvoker(function, parameterTypes, signature.getResultType());
}
}