org.python.core.BytecodeLoader Maven / Gradle / Ivy
// Copyright (c) Corporation for National Research Initiatives
package org.python.core;
import java.util.Vector;
/**
* Utility class for loading of compiled python modules and java classes defined
* in python modules.
*/
public class BytecodeLoader {
static Vector init() {
Vector parents = new Vector();
parents.addElement(imp.getSyspathJavaLoader());
return parents;
}
static Class findParentClass(Vector parents, String name)
throws ClassNotFoundException {
for (int i = 0; i < parents.size(); i++) {
try {
return ((ClassLoader) parents.elementAt(i)).loadClass(name);
} catch (ClassNotFoundException e) {
}
}
// couldn't find the .class file on sys.path
throw new ClassNotFoundException(name);
}
static void compileClass(Class c) {
// This method has caused much trouble. Using it breaks jdk1.2rc1
// Not using it can make SUN's jdk1.1.6 JIT slightly unhappy.
// Don't use by default, but allow python.options.compileClass to
// override
if (!Options.skipCompile) {
// System.err.println("compile: "+name);
Compiler.compileClass(c);
}
}
private static Class loaderClass = null;
private static Loader makeLoader() {
if (loaderClass == null) {
synchronized (BytecodeLoader.class) {
String version = System.getProperty("java.version");
if (version.compareTo("1.2") >= 0) {
try {
loaderClass = Class
.forName("org.python.core.BytecodeLoader2");
} catch (Throwable e) {
loaderClass = BytecodeLoader1.class;
}
} else
loaderClass = BytecodeLoader1.class;
}
}
try {
return (Loader) loaderClass.newInstance();
} catch (Exception e) {
return new BytecodeLoader1();
}
}
/**
* Turn the java byte code in data into a java class.
*
* @param name the name of the class
* @param referents a list of superclass and interfaces that the new class
* will reference.
* @param data the java byte code.
*/
public static Class makeClass(String name, Vector referents, byte[] data) {
Loader loader = makeLoader();
if (referents != null) {
for (int i = 0; i < referents.size(); i++) {
try {
Class cls = (Class) referents.elementAt(i);
ClassLoader cur = cls.getClassLoader();
if (cur != null) {
loader.addParent(cur);
}
} catch (SecurityException e) {
}
}
}
return loader.loadClassFromBytes(name, data);
}
/**
* Turn the java byte code for a compiled python module into a java class.
*
* @param name the name of the class
* @param data the java byte code.
*/
public static PyCode makeCode(String name, byte[] data, String filename) {
try {
Class c = makeClass(name, null, data);
Object o = c.getConstructor(new Class[] {String.class})
.newInstance(new Object[] {filename});
return ((PyRunnable)o).getMain();
} catch(Exception e) {
throw Py.JavaError(e);
}
}
}