use of org.apache.bcel.generic.PUSH in project core by s4.
the class ClonerGenerator method generate.
public Class generate(Class clazz) {
String className = clazz.getName();
Random rand = new Random(System.currentTimeMillis());
String clonerClassname = "Cloner" + (Math.abs(rand.nextInt() % 3256));
ClassGen cg = new ClassGen(clonerClassname, "java.lang.Object", clonerClassname + ".java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { "io.s4.util.Cloner" });
ConstantPoolGen cp = cg.getConstantPool();
InstructionFactory instFactory = new InstructionFactory(cg, cp);
InstructionList il = new InstructionList();
// build constructor method for new class
MethodGen constructor = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] {}, "<init>", clonerClassname, il, cp);
il.append(InstructionFactory.createLoad(Type.OBJECT, 0));
il.append(instFactory.createInvoke("java.lang.Object", "<init>", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL));
il.append(InstructionFactory.createReturn(Type.VOID));
constructor.setMaxStack();
constructor.setMaxLocals();
cg.addMethod(constructor.getMethod());
il.dispose();
// build clone method
il = new InstructionList();
MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.OBJECT, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "clone", clonerClassname, il, cp);
il.append(InstructionConstants.ACONST_NULL);
il.append(InstructionFactory.createStore(Type.OBJECT, 2));
il.append(InstructionFactory.createLoad(Type.OBJECT, 1));
il.append(new INSTANCEOF(cp.addClass(new ObjectType(className))));
BranchInstruction ifeq_6 = InstructionFactory.createBranchInstruction(Constants.IFEQ, null);
il.append(ifeq_6);
il.append(InstructionFactory.createLoad(Type.OBJECT, 1));
il.append(instFactory.createCheckCast(new ObjectType(className)));
il.append(InstructionFactory.createStore(Type.OBJECT, 2));
InstructionHandle ih_14 = il.append(InstructionFactory.createLoad(Type.OBJECT, 2));
il.append(new INSTANCEOF(cp.addClass(new ObjectType("java.lang.Cloneable"))));
BranchInstruction ifne_18 = InstructionFactory.createBranchInstruction(Constants.IFNE, null);
il.append(ifne_18);
il.append(instFactory.createFieldAccess("java.lang.System", "out", new ObjectType("java.io.PrintStream"), Constants.GETSTATIC));
il.append(new PUSH(cp, "Not cloneable!"));
il.append(instFactory.createInvoke("java.io.PrintStream", "println", Type.VOID, new Type[] { Type.STRING }, Constants.INVOKEVIRTUAL));
il.append(InstructionConstants.ACONST_NULL);
il.append(InstructionFactory.createReturn(Type.OBJECT));
InstructionHandle ih_31 = il.append(InstructionFactory.createLoad(Type.OBJECT, 2));
il.append(instFactory.createInvoke(className, "clone", Type.OBJECT, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
il.append(InstructionFactory.createReturn(Type.OBJECT));
ifeq_6.setTarget(ih_14);
ifne_18.setTarget(ih_31);
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
JavaClass jc = cg.getJavaClass();
ClonerClassLoader cl = new ClonerClassLoader();
return cl.loadClassFromBytes(clonerClassname, jc.getBytes());
}
use of org.apache.bcel.generic.PUSH in project jop by jop-devel.
the class ReplaceAtomicAnnotation method transform.
public static Method transform(Method m, JavaClass clazz, ConstantPoolGen _cp) {
MethodGen method = new MethodGen(m, clazz.getClassName(), _cp);
InstructionList oldIl = method.getInstructionList();
Type returnType = m.getReturnType();
if (returnType.equals(Type.LONG) || returnType.equals(Type.DOUBLE)) {
throw new UnsupportedOperationException();
}
final int transactionLocals = 2;
/*
* local variable indices:
* isNotNestedTransaction is -2+2
* result is -2+3
* Throwable e is -2+3
*/
final int maxLocals = method.getMaxLocals();
final int transactionLocalsBaseIndex = maxLocals;
final int copyBaseIndex = transactionLocalsBaseIndex + transactionLocals;
SortedSet<Integer> modifiedArguments = getModifiedArguments(method);
// maps modified arguments indices to copies
Map<Integer, Integer> modifiedArgumentsCopies = new TreeMap<Integer, Integer>();
{
int copyIndex = copyBaseIndex;
for (Integer i : modifiedArguments) {
System.out.println("RTTM: method " + method.getClassName() + "." + method.getName() + method.getSignature() + ": saving argument " + i + " to variable " + copyIndex);
modifiedArgumentsCopies.put(i, copyIndex++);
}
}
InstructionList il = new InstructionList();
InstructionFactory _factory = new InstructionFactory(_cp);
method.setInstructionList(il);
{
// InstructionHandle ih_0 = il.append(new PUSH(_cp, -559038737));
// il.append(_factory.createStore(Type.INT, transactionLocalsBaseIndex-2+1));
InstructionHandle ih_3 = il.append(_factory.createFieldAccess("rttm.internal.Utils", "inTransaction", new ArrayType(Type.BOOLEAN, 1), Constants.GETSTATIC));
il.append(new PUSH(_cp, -122));
il.append(_factory.createInvoke("com.jopdesign.sys.Native", "rd", Type.INT, new Type[] { Type.INT }, Constants.INVOKESTATIC));
il.append(InstructionConstants.BALOAD);
BranchInstruction ifne_12 = InstructionFactory.createBranchInstruction(Constants.IFNE, null);
il.append(ifne_12);
il.append(new PUSH(_cp, 1));
BranchInstruction goto_16 = InstructionFactory.createBranchInstruction(Constants.GOTO, null);
il.append(goto_16);
InstructionHandle ih_19 = il.append(new PUSH(_cp, 0));
InstructionHandle ih_20 = il.append(InstructionFactory.createStore(Type.INT, transactionLocalsBaseIndex - 2 + 2));
InstructionHandle ih_21 = il.append(InstructionFactory.createLoad(Type.INT, transactionLocalsBaseIndex - 2 + 2));
BranchInstruction ifeq_22 = InstructionFactory.createBranchInstruction(Constants.IFEQ, null);
il.append(ifeq_22);
// InstructionHandle ih_25 = il.append(_factory.createLoad(Type.INT, transactionLocalsBaseIndex-2+0));
// il.append(_factory.createStore(Type.INT, transactionLocalsBaseIndex-2+1));
{
// only save arguments which might be modified
for (int i : modifiedArguments) {
il.append(InstructionFactory.createLoad(Type.INT, i));
il.append(InstructionFactory.createStore(Type.INT, modifiedArgumentsCopies.get(i)));
}
}
InstructionHandle ih_27 = il.append(new PUSH(_cp, 0));
il.append(new PUSH(_cp, -128));
il.append(_factory.createInvoke("com.jopdesign.sys.Native", "wr", Type.VOID, new Type[] { Type.INT, Type.INT }, Constants.INVOKESTATIC));
InstructionHandle ih_33 = il.append(_factory.createFieldAccess("rttm.internal.Utils", "inTransaction", new ArrayType(Type.BOOLEAN, 1), Constants.GETSTATIC));
il.append(new PUSH(_cp, -122));
il.append(_factory.createInvoke("com.jopdesign.sys.Native", "rd", Type.INT, new Type[] { Type.INT }, Constants.INVOKESTATIC));
il.append(new PUSH(_cp, 1));
il.append(InstructionConstants.BASTORE);
// transaction loop
InstructionHandle ih_43 = il.append(InstructionFactory.createLoad(Type.INT, transactionLocalsBaseIndex - 2 + 2));
BranchInstruction ifeq_44 = InstructionFactory.createBranchInstruction(Constants.IFEQ, null);
il.append(ifeq_44);
InstructionHandle ih_47 = il.append(new PUSH(_cp, 1));
il.append(new PUSH(_cp, Const.MEM_TM_MAGIC));
il.append(_factory.createInvoke("com.jopdesign.sys.Native", "wrMem", Type.VOID, new Type[] { Type.INT, Type.INT }, Constants.INVOKESTATIC));
// InstructionHandle ih_53 = il.append(_factory.createLoad(Type.INT, transactionLocalsBaseIndex-2+0));
// il.append(_factory.createInvoke("rttm.swtest.Transaction", "atomicSection", Type.INT, new Type[] { Type.INT }, Constants.INVOKESTATIC));
// il.append(_factory.createStore(Type.INT, transactionLocalsBaseIndex-2+3));
InstructionHandle ih_53 = oldIl.getStart();
Collection<BranchInstruction> gotos_transactionCommit = new ArrayList<BranchInstruction>();
{
// redirect returns
InstructionFinder f = new InstructionFinder(oldIl);
String returnInstructionsPattern = "ARETURN|IRETURN|FRETURN|RETURN";
for (Iterator i = f.search(returnInstructionsPattern); i.hasNext(); ) {
InstructionHandle oldIh = ((InstructionHandle[]) i.next())[0];
InstructionList nl = new InstructionList();
if (!method.getReturnType().equals(Type.VOID)) {
nl.append(InstructionFactory.createStore(method.getReturnType(), transactionLocalsBaseIndex - 2 + 3));
}
BranchInstruction goto_transactionCommit = InstructionFactory.createBranchInstruction(Constants.GOTO, null);
nl.append(goto_transactionCommit);
gotos_transactionCommit.add(goto_transactionCommit);
InstructionHandle newTarget = nl.getStart();
oldIl.append(oldIh, nl);
try {
oldIl.delete(oldIh);
} catch (TargetLostException e) {
InstructionHandle[] targets = e.getTargets();
for (int k = 0; k < targets.length; k++) {
InstructionTargeter[] targeters = targets[k].getTargeters();
for (int j = 0; j < targeters.length; j++) {
targeters[j].updateTarget(targets[k], newTarget);
}
}
}
}
il.append(oldIl);
}
InstructionHandle ih_58 = il.append(InstructionFactory.createLoad(Type.INT, transactionLocalsBaseIndex - 2 + 2));
BranchInstruction ifeq_59 = InstructionFactory.createBranchInstruction(Constants.IFEQ, null);
il.append(ifeq_59);
InstructionHandle ih_62 = il.append(new PUSH(_cp, 0));
il.append(new PUSH(_cp, Const.MEM_TM_MAGIC));
il.append(_factory.createInvoke("com.jopdesign.sys.Native", "wrMem", Type.VOID, new Type[] { Type.INT, Type.INT }, Constants.INVOKESTATIC));
InstructionHandle ih_68 = il.append(_factory.createFieldAccess("rttm.internal.Utils", "inTransaction", new ArrayType(Type.BOOLEAN, 1), Constants.GETSTATIC));
il.append(new PUSH(_cp, -122));
il.append(_factory.createInvoke("com.jopdesign.sys.Native", "rd", Type.INT, new Type[] { Type.INT }, Constants.INVOKESTATIC));
il.append(new PUSH(_cp, 0));
il.append(InstructionConstants.BASTORE);
InstructionHandle ih_78 = il.append(new PUSH(_cp, 1));
il.append(new PUSH(_cp, -128));
il.append(_factory.createInvoke("com.jopdesign.sys.Native", "wr", Type.VOID, new Type[] { Type.INT, Type.INT }, Constants.INVOKESTATIC));
// InstructionHandle ih_84 = il.append(_factory.createLoad(Type.INT, transactionLocalsBaseIndex-2+3));
// il.append(_factory.createReturn(Type.INT));
InstructionHandle ih_84;
{
// return
if (!method.getReturnType().equals(Type.VOID)) {
ih_84 = il.append(InstructionFactory.createLoad(method.getReturnType(), transactionLocalsBaseIndex - 2 + 3));
il.append(InstructionFactory.createReturn(method.getReturnType()));
} else {
ih_84 = il.append(InstructionFactory.createReturn(method.getReturnType()));
}
}
// catch block
// variable e has index 3
// } catch (Throwable e) {
InstructionHandle nih_86 = il.append(InstructionFactory.createStore(Type.OBJECT, transactionLocalsBaseIndex - 2 + 3));
// if (isNotNestedTransaction) {
InstructionHandle nih_87 = il.append(InstructionFactory.createLoad(Type.INT, transactionLocalsBaseIndex - 2 + 2));
BranchInstruction ifeq_88 = InstructionFactory.createBranchInstruction(Constants.IFEQ, null);
il.append(ifeq_88);
InstructionHandle nih_91 = il.append(InstructionFactory.createLoad(Type.OBJECT, transactionLocalsBaseIndex - 2 + 3));
il.append(_factory.createFieldAccess("com.jopdesign.sys.RetryException", "instance", new ObjectType("com.jopdesign.sys.RetryException"), Constants.GETSTATIC));
BranchInstruction if_acmpne_95 = InstructionFactory.createBranchInstruction(Constants.IF_ACMPNE, null);
il.append(if_acmpne_95);
// InstructionHandle nih_98 = il.append(_factory.createLoad(Type.INT,
// 1));
// il.append(_factory.createStore(Type.INT, 0));
{
for (int i : modifiedArguments) {
il.append(InstructionFactory.createLoad(Type.INT, modifiedArgumentsCopies.get(i)));
il.append(InstructionFactory.createStore(Type.INT, i));
}
}
BranchInstruction goto_110 = InstructionFactory.createBranchInstruction(Constants.GOTO, ih_43);
InstructionHandle ih_110 = il.append(goto_110);
// exception was manually aborted or a bug triggered
InstructionHandle nih_103 = il.append(_factory.createFieldAccess("rttm.internal.Utils", "inTransaction", new ArrayType(Type.BOOLEAN, 1), Constants.GETSTATIC));
il.append(new PUSH(_cp, -122));
il.append(_factory.createInvoke("com.jopdesign.sys.Native", "rd", Type.INT, new Type[] { Type.INT }, Constants.INVOKESTATIC));
il.append(new PUSH(_cp, 0));
il.append(InstructionConstants.BASTORE);
InstructionHandle nih_113 = il.append(new PUSH(_cp, 1));
il.append(new PUSH(_cp, -128));
il.append(_factory.createInvoke("com.jopdesign.sys.Native", "wrMem", Type.VOID, new Type[] { Type.INT, Type.INT }, Constants.INVOKESTATIC));
InstructionHandle nih_119 = il.append(InstructionFactory.createLoad(Type.OBJECT, transactionLocalsBaseIndex - 2 + 3));
// il.append(_factory.createCheckCast(new
// ObjectType("java.lang.RuntimeException")));
il.append(InstructionConstants.ATHROW);
// set branch targets
ifne_12.setTarget(ih_19);
goto_16.setTarget(ih_20);
ifeq_22.setTarget(ih_43);
ifeq_44.setTarget(ih_53);
ifeq_59.setTarget(ih_84);
ifeq_88.setTarget(nih_119);
if_acmpne_95.setTarget(nih_103);
{
for (BranchInstruction b : gotos_transactionCommit) {
b.setTarget(ih_58);
}
}
// set exception handlers
// TODO restrict exception handler
method.addExceptionHandler(ih_53, ih_84, nih_86, null);
method.setMaxStack();
method.setMaxLocals();
}
m = method.getMethod();
oldIl.dispose();
il.dispose();
return m;
}
use of org.apache.bcel.generic.PUSH in project servicemix-bundles by apache.
the class FunctionCall method translate.
/**
* Translate a function call. The compiled code will leave the function's
* return value on the JVM's stack.
*/
public void translate(ClassGenerator classGen, MethodGenerator methodGen) {
final int n = argumentCount();
final ConstantPoolGen cpg = classGen.getConstantPool();
final InstructionList il = methodGen.getInstructionList();
final boolean isSecureProcessing = classGen.getParser().getXSLTC().isSecureProcessing();
int index;
// Translate calls to methods in the BasisLibrary
if (isStandard() || isExtension()) {
for (int i = 0; i < n; i++) {
final Expression exp = argument(i);
exp.translate(classGen, methodGen);
exp.startIterator(classGen, methodGen);
}
// append "F" to the function's name
final String name = _fname.toString().replace('-', '_') + "F";
String args = Constants.EMPTYSTRING;
// Special precautions for some method calls
if (name.equals("sumF")) {
args = DOM_INTF_SIG;
il.append(methodGen.loadDOM());
} else if (name.equals("normalize_spaceF")) {
if (_chosenMethodType.toSignature(args).equals("()Ljava/lang/String;")) {
args = "I" + DOM_INTF_SIG;
il.append(methodGen.loadContextNode());
il.append(methodGen.loadDOM());
}
}
// Invoke the method in the basis library
index = cpg.addMethodref(BASIS_LIBRARY_CLASS, name, _chosenMethodType.toSignature(args));
il.append(new INVOKESTATIC(index));
} else // run-time error message for unsupported external functions
if (unresolvedExternal) {
index = cpg.addMethodref(BASIS_LIBRARY_CLASS, "unresolved_externalF", "(Ljava/lang/String;)V");
il.append(new PUSH(cpg, _fname.toString()));
il.append(new INVOKESTATIC(index));
} else if (_isExtConstructor) {
if (isSecureProcessing)
translateUnallowedExtension(cpg, il);
final String clazz = _chosenConstructor.getDeclaringClass().getName();
Class[] paramTypes = _chosenConstructor.getParameterTypes();
LocalVariableGen[] paramTemp = new LocalVariableGen[n];
for (int i = 0; i < n; i++) {
final Expression exp = argument(i);
Type expType = exp.getType();
exp.translate(classGen, methodGen);
// Convert the argument to its Java type
exp.startIterator(classGen, methodGen);
expType.translateTo(classGen, methodGen, paramTypes[i]);
paramTemp[i] = methodGen.addLocalVariable("function_call_tmp" + i, expType.toJCType(), null, null);
paramTemp[i].setStart(il.append(expType.STORE(paramTemp[i].getIndex())));
}
il.append(new NEW(cpg.addClass(_className)));
il.append(InstructionConstants.DUP);
for (int i = 0; i < n; i++) {
final Expression arg = argument(i);
paramTemp[i].setEnd(il.append(arg.getType().LOAD(paramTemp[i].getIndex())));
}
final StringBuffer buffer = new StringBuffer();
buffer.append('(');
for (int i = 0; i < paramTypes.length; i++) {
buffer.append(getSignature(paramTypes[i]));
}
buffer.append(')');
buffer.append("V");
index = cpg.addMethodref(clazz, "<init>", buffer.toString());
il.append(new INVOKESPECIAL(index));
// Convert the return type back to our internal type
(Type.Object).translateFrom(classGen, methodGen, _chosenConstructor.getDeclaringClass());
} else // Invoke function calls that are handled in separate classes
{
if (isSecureProcessing)
translateUnallowedExtension(cpg, il);
final String clazz = _chosenMethod.getDeclaringClass().getName();
Class[] paramTypes = _chosenMethod.getParameterTypes();
// Push "this" if it is an instance method
if (_thisArgument != null) {
_thisArgument.translate(classGen, methodGen);
}
for (int i = 0; i < n; i++) {
final Expression exp = argument(i);
exp.translate(classGen, methodGen);
// Convert the argument to its Java type
exp.startIterator(classGen, methodGen);
exp.getType().translateTo(classGen, methodGen, paramTypes[i]);
}
final StringBuffer buffer = new StringBuffer();
buffer.append('(');
for (int i = 0; i < paramTypes.length; i++) {
buffer.append(getSignature(paramTypes[i]));
}
buffer.append(')');
buffer.append(getSignature(_chosenMethod.getReturnType()));
if (_thisArgument != null && _clazz.isInterface()) {
index = cpg.addInterfaceMethodref(clazz, _fname.getLocalPart(), buffer.toString());
il.append(new INVOKEINTERFACE(index, n + 1));
} else {
index = cpg.addMethodref(clazz, _fname.getLocalPart(), buffer.toString());
il.append(_thisArgument != null ? (InvokeInstruction) new INVOKEVIRTUAL(index) : (InvokeInstruction) new INVOKESTATIC(index));
}
// Convert the return type back to our internal type
_type.translateFrom(classGen, methodGen, _chosenMethod.getReturnType());
}
}
use of org.apache.bcel.generic.PUSH in project servicemix-bundles by apache.
the class FunctionCall method translateUnallowedExtension.
/**
* Translate code to call the BasisLibrary.unallowed_extensionF(String)
* method.
*/
private void translateUnallowedExtension(ConstantPoolGen cpg, InstructionList il) {
int index = cpg.addMethodref(BASIS_LIBRARY_CLASS, "unallowed_extension_functionF", "(Ljava/lang/String;)V");
il.append(new PUSH(cpg, _fname.toString()));
il.append(new INVOKESTATIC(index));
}
Aggregations