src.org.python.compiler.JavaMaker Maven / Gradle / Ivy
// Copyright (c) Corporation for National Research Initiatives
package org.python.compiler;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import org.python.core.PyObject;
public class JavaMaker extends ProxyMaker {
public String pythonClass, pythonModule;
PyObject methods;
public JavaMaker(Class> superclass,
Class>[] interfaces,
String pythonClass,
String pythonModule,
String myClass,
PyObject methods) {
super(myClass, superclass, interfaces);
this.pythonClass = pythonClass;
this.pythonModule = pythonModule;
this.methods = methods;
}
@Override
public void addConstructor(String name,
Class>[] parameters,
Class> ret,
String sig,
int access) throws Exception {
/* Need a fancy constructor for the Java side of things */
Code code = classfile.addMethod("", sig, access);
callSuper(code, "", name, parameters, null, sig);
code.visitVarInsn(ALOAD, 0);
getArgs(code, parameters);
code.visitMethodInsn(INVOKEVIRTUAL, classfile.name, "__initProxy__", makeSig("V", $objArr));
code.visitInsn(RETURN);
}
@Override
public void addProxy() throws Exception {
if (methods != null)
super.addProxy();
// _initProxy method
Code code = classfile.addMethod("__initProxy__", makeSig("V", $objArr), Modifier.PUBLIC);
code.visitVarInsn(ALOAD, 0);
code.visitLdcInsn(pythonModule);
code.visitLdcInsn(pythonClass);
code.visitVarInsn(ALOAD, 1);
code.visitMethodInsn(INVOKESTATIC, "org/python/core/Py", "initProxy",
makeSig("V", $pyProxy, $str, $str, $objArr));
code.visitInsn(RETURN);
}
@Override
public void addMethod(Method method, int access) throws Exception {
if (Modifier.isAbstract(access)) {
// Maybe throw an exception here???
super.addMethod(method, access);
} else if (methods.__finditem__(method.getName().intern()) != null) {
super.addMethod(method, access);
} else if (Modifier.isProtected(method.getModifiers())) {
addSuperMethod(method, access);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy