blob: 1b320e96641306b927bd7b9d51627175caa9598e [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.bcel.generic;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.apache.bcel.Const;
import org.apache.bcel.classfile.StackMap;
import org.apache.bcel.classfile.StackMapEntry;
import org.apache.bcel.classfile.StackMapType;
import org.apache.commons.lang.ArrayUtils;
public class BinaryOpCreator {
private static final String ORG_APACHE_BCEL_GENERIC_BINARY_OP = "org.apache.bcel.generic.BinaryOp";
public static void main(final String[] args) throws Exception {
final BinaryOpCreator creator = new BinaryOpCreator();
final Path path = Paths.get("target/test-classes/org/apache/bcel/generic/BinaryOp.class");
Files.deleteIfExists(path);
try (OutputStream out = Files.newOutputStream(path)) {
creator.create(out);
}
}
private final InstructionFactory factory;
private final ConstantPoolGen cp;
private final ClassGen cg;
public BinaryOpCreator() {
cg = new ClassGen(ORG_APACHE_BCEL_GENERIC_BINARY_OP, "java.lang.Object", "BinaryOp.java", Const.ACC_PUBLIC | Const.ACC_SUPER,
ArrayUtils.EMPTY_STRING_ARRAY);
cg.setMajor(Const.MAJOR_1_8);
cg.setMinor(Const.MINOR_1_8);
cp = cg.getConstantPool();
factory = new InstructionFactory(cg, cp);
}
public void create(final OutputStream out) throws IOException {
createConstructor();
createMethodISUB();
createMethodIADD();
createMethodIREM();
createMethodIMUL();
createMethodIDIV();
createMethodIAND();
createMethodIOR();
createMethodIXOR();
createMethodISHL();
createMethodISHR();
createMethodIUSHR();
createMethodLSUB();
createMethodLADD();
createMethodLREM();
createMethodLMUL();
createMethodLDIV();
createMethodLAND();
createMethodLOR();
createMethodLXOR();
createMethodLSHL();
createMethodLSHR();
createMethodLUSHR();
createMethodFSUB();
createMethodFADD();
createMethodFREM();
createMethodFMUL();
createMethodFDIV();
createMethodDSUB();
createMethodDADD();
createMethodDREM();
createMethodDMUL();
createMethodDDIV();
createMethodCalculate();
createMethodMain();
cg.getJavaClass().dump(out);
}
private void createConstructor() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, ArrayUtils.EMPTY_STRING_ARRAY, "<init>",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.OBJECT, 0));
il.append(factory.createInvoke("java.lang.Object", "<init>", Type.VOID, Type.NO_ARGS, Const.INVOKESPECIAL));
il.append(InstructionFactory.createReturn(Type.VOID));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodCalculate() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.OBJECT, new Type[] { new ArrayType(Type.STRING, 1) }, new String[] { "args" },
"calculate", ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
method.addException("java.lang.Exception");
final StackMapType[] typesOfLocals = { new StackMapType((byte) 7, cp.addClass("java.lang.String"), cp.getConstantPool()) };
final StackMapEntry[] table = { new StackMapEntry(252, 70, typesOfLocals, null, cp.getConstantPool()),
new StackMapEntry(251, 65, null, null, cp.getConstantPool()),
new StackMapEntry(251, 65, null, null, cp.getConstantPool()),
new StackMapEntry(251, 65, null, null, cp.getConstantPool()) };
final StackMap stackMap = new StackMap(cp.addUtf8("StackMapTable"), 17, table, cp.getConstantPool());
stackMap.setStackMap(table);
method.addCodeAttribute(stackMap);
il.append(InstructionFactory.createLoad(Type.OBJECT, 1));
il.append(new PUSH(cp, 0));
il.append(InstructionConst.AALOAD);
il.append(InstructionFactory.createStore(Type.OBJECT, 2));
il.append(InstructionFactory.createLoad(Type.OBJECT, 2));
il.append(new PUSH(cp, "i"));
il.append(factory.createInvoke("java.lang.String", "startsWith", Type.BOOLEAN, new Type[] { Type.STRING }, Const.INVOKEVIRTUAL));
final BranchInstruction ifeq1 = InstructionFactory.createBranchInstruction(Const.IFEQ, null);
il.append(ifeq1);
il.append(InstructionFactory.createLoad(Type.OBJECT, 0));
il.append(factory.createInvoke("java.lang.Object", "getClass", new ObjectType("java.lang.Class"), Type.NO_ARGS, Const.INVOKEVIRTUAL));
il.append(InstructionFactory.createLoad(Type.OBJECT, 2));
il.append(new PUSH(cp, 2));
il.append(factory.createNewArray(new ObjectType("java.lang.Class"), (short) 1));
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 0));
il.append(factory.createFieldAccess("java.lang.Integer", "TYPE", new ObjectType("java.lang.Class"), Const.GETSTATIC));
il.append(InstructionConst.AASTORE);
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 1));
il.append(factory.createFieldAccess("java.lang.Integer", "TYPE", new ObjectType("java.lang.Class"), Const.GETSTATIC));
il.append(InstructionConst.AASTORE);
il.append(factory.createInvoke("java.lang.Class", "getMethod", new ObjectType("java.lang.reflect.Method"),
new Type[] { Type.STRING, new ArrayType(new ObjectType("java.lang.Class"), 1) }, Const.INVOKEVIRTUAL));
il.append(InstructionFactory.createLoad(Type.OBJECT, 0));
il.append(new PUSH(cp, 2));
il.append(factory.createNewArray(Type.OBJECT, (short) 1));
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 0));
il.append(InstructionFactory.createLoad(Type.OBJECT, 1));
il.append(new PUSH(cp, 1));
il.append(InstructionConst.AALOAD);
il.append(factory.createInvoke("java.lang.Integer", "parseInt", Type.INT, new Type[] { Type.STRING }, Const.INVOKESTATIC));
il.append(factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Const.INVOKESTATIC));
il.append(InstructionConst.AASTORE);
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 1));
il.append(InstructionFactory.createLoad(Type.OBJECT, 1));
il.append(new PUSH(cp, 2));
il.append(InstructionConst.AALOAD);
il.append(factory.createInvoke("java.lang.Integer", "parseInt", Type.INT, new Type[] { Type.STRING }, Const.INVOKESTATIC));
il.append(factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Const.INVOKESTATIC));
il.append(InstructionConst.AASTORE);
il.append(factory.createInvoke("java.lang.reflect.Method", "invoke", Type.OBJECT, new Type[] { Type.OBJECT, new ArrayType(Type.OBJECT, 1) },
Const.INVOKEVIRTUAL));
il.append(InstructionFactory.createReturn(Type.OBJECT));
final InstructionHandle ih1 = il.append(InstructionFactory.createLoad(Type.OBJECT, 2));
il.append(new PUSH(cp, "l"));
il.append(factory.createInvoke("java.lang.String", "startsWith", Type.BOOLEAN, new Type[] { Type.STRING }, Const.INVOKEVIRTUAL));
final BranchInstruction ifeq2 = InstructionFactory.createBranchInstruction(Const.IFEQ, null);
il.append(ifeq2);
il.append(InstructionFactory.createLoad(Type.OBJECT, 0));
il.append(factory.createInvoke("java.lang.Object", "getClass", new ObjectType("java.lang.Class"), Type.NO_ARGS, Const.INVOKEVIRTUAL));
il.append(InstructionFactory.createLoad(Type.OBJECT, 2));
il.append(new PUSH(cp, 2));
il.append(factory.createNewArray(new ObjectType("java.lang.Class"), (short) 1));
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 0));
il.append(factory.createFieldAccess("java.lang.Long", "TYPE", new ObjectType("java.lang.Class"), Const.GETSTATIC));
il.append(InstructionConst.AASTORE);
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 1));
il.append(factory.createFieldAccess("java.lang.Long", "TYPE", new ObjectType("java.lang.Class"), Const.GETSTATIC));
il.append(InstructionConst.AASTORE);
il.append(factory.createInvoke("java.lang.Class", "getMethod", new ObjectType("java.lang.reflect.Method"),
new Type[] { Type.STRING, new ArrayType(new ObjectType("java.lang.Class"), 1) }, Const.INVOKEVIRTUAL));
il.append(InstructionFactory.createLoad(Type.OBJECT, 0));
il.append(new PUSH(cp, 2));
il.append(factory.createNewArray(Type.OBJECT, (short) 1));
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 0));
il.append(InstructionFactory.createLoad(Type.OBJECT, 1));
il.append(new PUSH(cp, 1));
il.append(InstructionConst.AALOAD);
il.append(factory.createInvoke("java.lang.Long", "parseLong", Type.LONG, new Type[] { Type.STRING }, Const.INVOKESTATIC));
il.append(factory.createInvoke("java.lang.Long", "valueOf", new ObjectType("java.lang.Long"), new Type[] { Type.LONG }, Const.INVOKESTATIC));
il.append(InstructionConst.AASTORE);
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 1));
il.append(InstructionFactory.createLoad(Type.OBJECT, 1));
il.append(new PUSH(cp, 2));
il.append(InstructionConst.AALOAD);
il.append(factory.createInvoke("java.lang.Long", "parseLong", Type.LONG, new Type[] { Type.STRING }, Const.INVOKESTATIC));
il.append(factory.createInvoke("java.lang.Long", "valueOf", new ObjectType("java.lang.Long"), new Type[] { Type.LONG }, Const.INVOKESTATIC));
il.append(InstructionConst.AASTORE);
il.append(factory.createInvoke("java.lang.reflect.Method", "invoke", Type.OBJECT, new Type[] { Type.OBJECT, new ArrayType(Type.OBJECT, 1) },
Const.INVOKEVIRTUAL));
il.append(InstructionFactory.createReturn(Type.OBJECT));
final InstructionHandle ih2 = il.append(InstructionFactory.createLoad(Type.OBJECT, 2));
il.append(new PUSH(cp, "f"));
il.append(factory.createInvoke("java.lang.String", "startsWith", Type.BOOLEAN, new Type[] { Type.STRING }, Const.INVOKEVIRTUAL));
final BranchInstruction ifeq3 = InstructionFactory.createBranchInstruction(Const.IFEQ, null);
il.append(ifeq3);
il.append(InstructionFactory.createLoad(Type.OBJECT, 0));
il.append(factory.createInvoke("java.lang.Object", "getClass", new ObjectType("java.lang.Class"), Type.NO_ARGS, Const.INVOKEVIRTUAL));
il.append(InstructionFactory.createLoad(Type.OBJECT, 2));
il.append(new PUSH(cp, 2));
il.append(factory.createNewArray(new ObjectType("java.lang.Class"), (short) 1));
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 0));
il.append(factory.createFieldAccess("java.lang.Float", "TYPE", new ObjectType("java.lang.Class"), Const.GETSTATIC));
il.append(InstructionConst.AASTORE);
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 1));
il.append(factory.createFieldAccess("java.lang.Float", "TYPE", new ObjectType("java.lang.Class"), Const.GETSTATIC));
il.append(InstructionConst.AASTORE);
il.append(factory.createInvoke("java.lang.Class", "getMethod", new ObjectType("java.lang.reflect.Method"),
new Type[] { Type.STRING, new ArrayType(new ObjectType("java.lang.Class"), 1) }, Const.INVOKEVIRTUAL));
il.append(InstructionFactory.createLoad(Type.OBJECT, 0));
il.append(new PUSH(cp, 2));
il.append(factory.createNewArray(Type.OBJECT, (short) 1));
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 0));
il.append(InstructionFactory.createLoad(Type.OBJECT, 1));
il.append(new PUSH(cp, 1));
il.append(InstructionConst.AALOAD);
il.append(factory.createInvoke("java.lang.Float", "parseFloat", Type.FLOAT, new Type[] { Type.STRING }, Const.INVOKESTATIC));
il.append(factory.createInvoke("java.lang.Float", "valueOf", new ObjectType("java.lang.Float"), new Type[] { Type.FLOAT }, Const.INVOKESTATIC));
il.append(InstructionConst.AASTORE);
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 1));
il.append(InstructionFactory.createLoad(Type.OBJECT, 1));
il.append(new PUSH(cp, 2));
il.append(InstructionConst.AALOAD);
il.append(factory.createInvoke("java.lang.Float", "parseFloat", Type.FLOAT, new Type[] { Type.STRING }, Const.INVOKESTATIC));
il.append(factory.createInvoke("java.lang.Float", "valueOf", new ObjectType("java.lang.Float"), new Type[] { Type.FLOAT }, Const.INVOKESTATIC));
il.append(InstructionConst.AASTORE);
il.append(factory.createInvoke("java.lang.reflect.Method", "invoke", Type.OBJECT, new Type[] { Type.OBJECT, new ArrayType(Type.OBJECT, 1) },
Const.INVOKEVIRTUAL));
il.append(InstructionFactory.createReturn(Type.OBJECT));
final InstructionHandle ih3 = il.append(InstructionFactory.createLoad(Type.OBJECT, 2));
il.append(new PUSH(cp, "d"));
il.append(factory.createInvoke("java.lang.String", "startsWith", Type.BOOLEAN, new Type[] { Type.STRING }, Const.INVOKEVIRTUAL));
final BranchInstruction ifeq4 = InstructionFactory.createBranchInstruction(Const.IFEQ, null);
il.append(ifeq4);
il.append(InstructionFactory.createLoad(Type.OBJECT, 0));
il.append(factory.createInvoke("java.lang.Object", "getClass", new ObjectType("java.lang.Class"), Type.NO_ARGS, Const.INVOKEVIRTUAL));
il.append(InstructionFactory.createLoad(Type.OBJECT, 2));
il.append(new PUSH(cp, 2));
il.append(factory.createNewArray(new ObjectType("java.lang.Class"), (short) 1));
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 0));
il.append(factory.createFieldAccess("java.lang.Double", "TYPE", new ObjectType("java.lang.Class"), Const.GETSTATIC));
il.append(InstructionConst.AASTORE);
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 1));
il.append(factory.createFieldAccess("java.lang.Double", "TYPE", new ObjectType("java.lang.Class"), Const.GETSTATIC));
il.append(InstructionConst.AASTORE);
il.append(factory.createInvoke("java.lang.Class", "getMethod", new ObjectType("java.lang.reflect.Method"),
new Type[] { Type.STRING, new ArrayType(new ObjectType("java.lang.Class"), 1) }, Const.INVOKEVIRTUAL));
il.append(InstructionFactory.createLoad(Type.OBJECT, 0));
il.append(new PUSH(cp, 2));
il.append(factory.createNewArray(Type.OBJECT, (short) 1));
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 0));
il.append(InstructionFactory.createLoad(Type.OBJECT, 1));
il.append(new PUSH(cp, 1));
il.append(InstructionConst.AALOAD);
il.append(factory.createInvoke("java.lang.Double", "parseDouble", Type.DOUBLE, new Type[] { Type.STRING }, Const.INVOKESTATIC));
il.append(factory.createInvoke("java.lang.Double", "valueOf", new ObjectType("java.lang.Double"), new Type[] { Type.DOUBLE }, Const.INVOKESTATIC));
il.append(InstructionConst.AASTORE);
il.append(InstructionConst.DUP);
il.append(new PUSH(cp, 1));
il.append(InstructionFactory.createLoad(Type.OBJECT, 1));
il.append(new PUSH(cp, 2));
il.append(InstructionConst.AALOAD);
il.append(factory.createInvoke("java.lang.Double", "parseDouble", Type.DOUBLE, new Type[] { Type.STRING }, Const.INVOKESTATIC));
il.append(factory.createInvoke("java.lang.Double", "valueOf", new ObjectType("java.lang.Double"), new Type[] { Type.DOUBLE }, Const.INVOKESTATIC));
il.append(InstructionConst.AASTORE);
il.append(factory.createInvoke("java.lang.reflect.Method", "invoke", Type.OBJECT, new Type[] { Type.OBJECT, new ArrayType(Type.OBJECT, 1) },
Const.INVOKEVIRTUAL));
il.append(InstructionFactory.createReturn(Type.OBJECT));
final InstructionHandle ih4 = il.append(InstructionConst.ACONST_NULL);
il.append(InstructionFactory.createReturn(Type.OBJECT));
ifeq1.setTarget(ih1);
ifeq2.setTarget(ih2);
ifeq3.setTarget(ih3);
ifeq4.setTarget(ih4);
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodDADD() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.DOUBLE, new Type[] { Type.DOUBLE, Type.DOUBLE }, new String[] { "a", "b" }, "dadd",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.DOUBLE, 1));
il.append(InstructionFactory.createLoad(Type.DOUBLE, 3));
il.append(InstructionFactory.createBinaryOperation("+", Type.DOUBLE));
il.append(InstructionFactory.createReturn(Type.DOUBLE));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodDDIV() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.DOUBLE, new Type[] { Type.DOUBLE, Type.DOUBLE }, new String[] { "a", "b" }, "ddiv",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.DOUBLE, 1));
il.append(InstructionFactory.createLoad(Type.DOUBLE, 3));
il.append(InstructionFactory.createBinaryOperation("/", Type.DOUBLE));
il.append(InstructionFactory.createReturn(Type.DOUBLE));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodDMUL() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.DOUBLE, new Type[] { Type.DOUBLE, Type.DOUBLE }, new String[] { "a", "b" }, "dmul",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.DOUBLE, 1));
il.append(InstructionFactory.createLoad(Type.DOUBLE, 3));
il.append(InstructionFactory.createBinaryOperation("*", Type.DOUBLE));
il.append(InstructionFactory.createReturn(Type.DOUBLE));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodDREM() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.DOUBLE, new Type[] { Type.DOUBLE, Type.DOUBLE }, new String[] { "a", "b" }, "drem",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.DOUBLE, 1));
il.append(InstructionFactory.createLoad(Type.DOUBLE, 3));
il.append(InstructionFactory.createBinaryOperation("%", Type.DOUBLE));
il.append(InstructionFactory.createReturn(Type.DOUBLE));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodDSUB() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.DOUBLE, new Type[] { Type.DOUBLE, Type.DOUBLE }, new String[] { "a", "b" }, "dsub",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.DOUBLE, 1));
il.append(InstructionFactory.createLoad(Type.DOUBLE, 3));
il.append(InstructionFactory.createBinaryOperation("-", Type.DOUBLE));
il.append(InstructionFactory.createReturn(Type.DOUBLE));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodFADD() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.FLOAT, new Type[] { Type.FLOAT, Type.FLOAT }, new String[] { "a", "b" }, "fadd",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.FLOAT, 1));
il.append(InstructionFactory.createLoad(Type.FLOAT, 2));
il.append(InstructionFactory.createBinaryOperation("+", Type.FLOAT));
il.append(InstructionFactory.createReturn(Type.FLOAT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodFDIV() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.FLOAT, new Type[] { Type.FLOAT, Type.FLOAT }, new String[] { "a", "b" }, "fdiv",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.FLOAT, 1));
il.append(InstructionFactory.createLoad(Type.FLOAT, 2));
il.append(InstructionFactory.createBinaryOperation("/", Type.FLOAT));
il.append(InstructionFactory.createReturn(Type.FLOAT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodFMUL() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.FLOAT, new Type[] { Type.FLOAT, Type.FLOAT }, new String[] { "a", "b" }, "fmul",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.FLOAT, 1));
il.append(InstructionFactory.createLoad(Type.FLOAT, 2));
il.append(InstructionFactory.createBinaryOperation("*", Type.FLOAT));
il.append(InstructionFactory.createReturn(Type.FLOAT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodFREM() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.FLOAT, new Type[] { Type.FLOAT, Type.FLOAT }, new String[] { "a", "b" }, "frem",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.FLOAT, 1));
il.append(InstructionFactory.createLoad(Type.FLOAT, 2));
il.append(InstructionFactory.createBinaryOperation("%", Type.FLOAT));
il.append(InstructionFactory.createReturn(Type.FLOAT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodFSUB() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.FLOAT, new Type[] { Type.FLOAT, Type.FLOAT }, new String[] { "a", "b" }, "fsub",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.FLOAT, 1));
il.append(InstructionFactory.createLoad(Type.FLOAT, 2));
il.append(InstructionFactory.createBinaryOperation("-", Type.FLOAT));
il.append(InstructionFactory.createReturn(Type.FLOAT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodIADD() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.INT, new Type[] { Type.INT, Type.INT }, new String[] { "a", "b" }, "iadd",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.INT, 1));
il.append(InstructionFactory.createLoad(Type.INT, 2));
il.append(InstructionFactory.createBinaryOperation("+", Type.INT));
il.append(InstructionFactory.createReturn(Type.INT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodIAND() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.INT, new Type[] { Type.INT, Type.INT }, new String[] { "a", "b" }, "iand",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.INT, 1));
il.append(InstructionFactory.createLoad(Type.INT, 2));
il.append(InstructionFactory.createBinaryOperation("&", Type.INT));
il.append(InstructionFactory.createReturn(Type.INT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodIDIV() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.INT, new Type[] { Type.INT, Type.INT }, new String[] { "a", "b" }, "idiv",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.INT, 1));
il.append(InstructionFactory.createLoad(Type.INT, 2));
il.append(InstructionFactory.createBinaryOperation("/", Type.INT));
il.append(InstructionFactory.createReturn(Type.INT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodIMUL() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.INT, new Type[] { Type.INT, Type.INT }, new String[] { "a", "b" }, "imul",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.INT, 1));
il.append(InstructionFactory.createLoad(Type.INT, 2));
il.append(InstructionFactory.createBinaryOperation("*", Type.INT));
il.append(InstructionFactory.createReturn(Type.INT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodIOR() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.INT, new Type[] { Type.INT, Type.INT }, new String[] { "a", "b" }, "ior",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.INT, 1));
il.append(InstructionFactory.createLoad(Type.INT, 2));
il.append(InstructionFactory.createBinaryOperation("|", Type.INT));
il.append(InstructionFactory.createReturn(Type.INT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodIREM() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.INT, new Type[] { Type.INT, Type.INT }, new String[] { "a", "b" }, "irem",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.INT, 1));
il.append(InstructionFactory.createLoad(Type.INT, 2));
il.append(InstructionFactory.createBinaryOperation("%", Type.INT));
il.append(InstructionFactory.createReturn(Type.INT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodISHL() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.INT, new Type[] { Type.INT, Type.INT }, new String[] { "a", "b" }, "ishl",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.INT, 1));
il.append(InstructionFactory.createLoad(Type.INT, 2));
il.append(InstructionFactory.createBinaryOperation("<<", Type.INT));
il.append(InstructionFactory.createReturn(Type.INT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodISHR() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.INT, new Type[] { Type.INT, Type.INT }, new String[] { "a", "b" }, "ishr",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.INT, 1));
il.append(InstructionFactory.createLoad(Type.INT, 2));
il.append(InstructionFactory.createBinaryOperation(">>", Type.INT));
il.append(InstructionFactory.createReturn(Type.INT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodISUB() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.INT, new Type[] { Type.INT, Type.INT }, new String[] { "a", "b" }, "isub",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.INT, 1));
il.append(InstructionFactory.createLoad(Type.INT, 2));
il.append(InstructionFactory.createBinaryOperation("-", Type.INT));
il.append(InstructionFactory.createReturn(Type.INT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodIUSHR() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.INT, new Type[] { Type.INT, Type.INT }, new String[] { "a", "b" }, "iushr",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.INT, 1));
il.append(InstructionFactory.createLoad(Type.INT, 2));
il.append(InstructionFactory.createBinaryOperation(">>>", Type.INT));
il.append(InstructionFactory.createReturn(Type.INT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodIXOR() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.INT, new Type[] { Type.INT, Type.INT }, new String[] { "a", "b" }, "ixor",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.INT, 1));
il.append(InstructionFactory.createLoad(Type.INT, 2));
il.append(InstructionFactory.createBinaryOperation("^", Type.INT));
il.append(InstructionFactory.createReturn(Type.INT));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodLADD() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.LONG, new Type[] { Type.LONG, Type.LONG }, new String[] { "a", "b" }, "ladd",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.LONG, 1));
il.append(InstructionFactory.createLoad(Type.LONG, 3));
il.append(InstructionFactory.createBinaryOperation("+", Type.LONG));
il.append(InstructionFactory.createReturn(Type.LONG));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodLAND() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.LONG, new Type[] { Type.LONG, Type.LONG }, new String[] { "a", "b" }, "land",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.LONG, 1));
il.append(InstructionFactory.createLoad(Type.LONG, 3));
il.append(InstructionFactory.createBinaryOperation("&", Type.LONG));
il.append(InstructionFactory.createReturn(Type.LONG));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodLDIV() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.LONG, new Type[] { Type.LONG, Type.LONG }, new String[] { "a", "b" }, "ldiv",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.LONG, 1));
il.append(InstructionFactory.createLoad(Type.LONG, 3));
il.append(InstructionFactory.createBinaryOperation("/", Type.LONG));
il.append(InstructionFactory.createReturn(Type.LONG));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodLMUL() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.LONG, new Type[] { Type.LONG, Type.LONG }, new String[] { "a", "b" }, "lmul",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.LONG, 1));
il.append(InstructionFactory.createLoad(Type.LONG, 3));
il.append(InstructionFactory.createBinaryOperation("*", Type.LONG));
il.append(InstructionFactory.createReturn(Type.LONG));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodLOR() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.LONG, new Type[] { Type.LONG, Type.LONG }, new String[] { "a", "b" }, "lor",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.LONG, 1));
il.append(InstructionFactory.createLoad(Type.LONG, 3));
il.append(InstructionFactory.createBinaryOperation("|", Type.LONG));
il.append(InstructionFactory.createReturn(Type.LONG));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodLREM() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.LONG, new Type[] { Type.LONG, Type.LONG }, new String[] { "a", "b" }, "lrem",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.LONG, 1));
il.append(InstructionFactory.createLoad(Type.LONG, 3));
il.append(InstructionFactory.createBinaryOperation("%", Type.LONG));
il.append(InstructionFactory.createReturn(Type.LONG));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodLSHL() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.LONG, new Type[] { Type.LONG, Type.LONG }, new String[] { "a", "b" }, "lshl",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.LONG, 1));
il.append(InstructionFactory.createLoad(Type.LONG, 3));
il.append(InstructionConst.L2I);
il.append(InstructionFactory.createBinaryOperation("<<", Type.LONG));
il.append(InstructionFactory.createReturn(Type.LONG));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodLSHR() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.LONG, new Type[] { Type.LONG, Type.LONG }, new String[] { "a", "b" }, "lshr",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.LONG, 1));
il.append(InstructionFactory.createLoad(Type.LONG, 3));
il.append(InstructionConst.L2I);
il.append(InstructionFactory.createBinaryOperation(">>", Type.LONG));
il.append(InstructionFactory.createReturn(Type.LONG));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodLSUB() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.LONG, new Type[] { Type.LONG, Type.LONG }, new String[] { "a", "b" }, "lsub",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.LONG, 1));
il.append(InstructionFactory.createLoad(Type.LONG, 3));
il.append(InstructionFactory.createBinaryOperation("-", Type.LONG));
il.append(InstructionFactory.createReturn(Type.LONG));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodLUSHR() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.LONG, new Type[] { Type.LONG, Type.LONG }, new String[] { "a", "b" }, "lushr",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.LONG, 1));
il.append(InstructionFactory.createLoad(Type.LONG, 3));
il.append(InstructionConst.L2I);
il.append(InstructionFactory.createBinaryOperation(">>>", Type.LONG));
il.append(InstructionFactory.createReturn(Type.LONG));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodLXOR() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.LONG, new Type[] { Type.LONG, Type.LONG }, new String[] { "a", "b" }, "lxor",
ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
il.append(InstructionFactory.createLoad(Type.LONG, 1));
il.append(InstructionFactory.createLoad(Type.LONG, 3));
il.append(InstructionFactory.createBinaryOperation("^", Type.LONG));
il.append(InstructionFactory.createReturn(Type.LONG));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
private void createMethodMain() {
final InstructionList il = new InstructionList();
final MethodGen method = new MethodGen(Const.ACC_PUBLIC | Const.ACC_STATIC, Type.VOID, new Type[] { new ArrayType(Type.STRING, 1) },
new String[] { "args" }, "main", ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
method.addException("java.lang.Exception");
il.append(factory.createNew(ORG_APACHE_BCEL_GENERIC_BINARY_OP));
il.append(InstructionConst.DUP);
il.append(factory.createInvoke(ORG_APACHE_BCEL_GENERIC_BINARY_OP, "<init>", Type.VOID, Type.NO_ARGS, Const.INVOKESPECIAL));
il.append(InstructionFactory.createStore(Type.OBJECT, 1));
il.append(factory.createFieldAccess("java.lang.System", "out", new ObjectType("java.io.PrintStream"), Const.GETSTATIC));
il.append(InstructionFactory.createLoad(Type.OBJECT, 1));
il.append(InstructionFactory.createLoad(Type.OBJECT, 0));
il.append(factory.createInvoke(ORG_APACHE_BCEL_GENERIC_BINARY_OP, "calculate", Type.OBJECT, new Type[] { new ArrayType(Type.STRING, 1) },
Const.INVOKEVIRTUAL));
il.append(factory.createInvoke("java.io.PrintStream", "println", Type.VOID, new Type[] { Type.OBJECT }, Const.INVOKEVIRTUAL));
il.append(InstructionFactory.createReturn(Type.VOID));
method.setMaxStack();
method.setMaxLocals();
cg.addMethod(method.getMethod());
il.dispose();
}
}