src.org.python.expose.generate.OverridableNewExposer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython-standalone Show documentation
Show all versions of jython-standalone 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.expose.generate;
import org.python.core.PyOverridableNew;
import org.objectweb.asm.Label;
import org.objectweb.asm.Type;
public class OverridableNewExposer extends Exposer {
private Type onType, subtype;
private String name;
public OverridableNewExposer(Type onType,
Type subtype,
int access,
String methodName,
String descriptor,
String[] exceptions) {
super(PyOverridableNew.class, onType.getClassName() + "$exposed___new__");
this.onType = onType;
this.subtype = subtype;
this.name = methodName;
}
@Override
protected void generate() {
generateConstructor();
generateOfType();
generateOfSubtype();
}
private void generateConstructor() {
startConstructor();
mv.visitVarInsn(ALOAD, 0);
superConstructor();
endConstructor();
}
private void generateOfType() {
startMethod("createOfType", PYOBJ, BOOLEAN, APYOBJ, ASTRING);
instantiate(onType, new Instantiator(PYTYPE) {
public void pushArgs() {
get("for_type", PYTYPE);
}
});
mv.visitVarInsn(ASTORE, 4);
Label regularReturn = new Label();
mv.visitVarInsn(ILOAD, 1);
mv.visitJumpInsn(IFEQ, regularReturn);
mv.visitVarInsn(ALOAD, 4);
mv.visitVarInsn(ALOAD, 2);
mv.visitVarInsn(ALOAD, 3);
call(onType, name, VOID, APYOBJ, ASTRING);
mv.visitLabel(regularReturn);
mv.visitVarInsn(ALOAD, 4);
endMethod(ARETURN);
}
private void generateOfSubtype() {
startMethod("createOfSubtype", PYOBJ, PYTYPE);
instantiate(subtype, new Instantiator(PYTYPE) {
public void pushArgs() {
mv.visitVarInsn(ALOAD, 1);
}
});
endMethod(ARETURN);
}
}