You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2022/11/27 20:08:15 UTC

[commons-bcel] 01/02: Unit tests and coverage for binary operations #174

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-bcel.git

commit ae5c94c832bcc2f481601e4bd1fc73652140b3e8
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sun Nov 27 15:08:03 2022 -0500

    Unit tests and coverage for binary operations #174
---
 src/changes/changes.xml                            |   1 +
 .../org/apache/bcel/generic/BinaryOpCreator.java   | 816 +++++++++++----------
 .../org/apache/bcel/util/BCELifierTestCase.java    | 112 +--
 3 files changed, 469 insertions(+), 460 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index c5e12995..aab0029b 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -113,6 +113,7 @@ The <action> type attribute can be add,update,fix,remove.
       <action                  type="fix" dev="markt" due-to="OSS-Fuzz">org.apache.bcel.classfile.StackMapType constructors now throw ClassFormatException on invalid input.</action>
       <action                  type="fix" dev="markt" due-to="OSS-Fuzz">When parsing class files, limit arrays to no more than 255 dimensions as per section 4.4.1 of the JVM specification.</action>
       <action                  type="fix" dev="ggregory" due-to="nbauma109">Tests and coverage for Utility class #175.</action>
+      <action                  type="fix" dev="ggregory" due-to="nbauma109">Unit tests and coverage for binary operations #174.</action>
       <!-- UPDATE -->
       <action                  type="update" dev="ggregory" due-to="Gary Gregory">Bump spotbugs-maven-plugin from 4.7.2.2 to 4.7.3.0 #167.</action>
       <action                  type="update" dev="ggregory" due-to="Dependabot">Bump jmh.version from 1.35 to 1.36 #170.</action>
diff --git a/src/test/java/org/apache/bcel/generic/BinaryOpCreator.java b/src/test/java/org/apache/bcel/generic/BinaryOpCreator.java
index cd654c90..3d372b8f 100644
--- a/src/test/java/org/apache/bcel/generic/BinaryOpCreator.java
+++ b/src/test/java/org/apache/bcel/generic/BinaryOpCreator.java
@@ -20,6 +20,7 @@ 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;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -31,12 +32,23 @@ 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, new String[] {});
+        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);
 
@@ -85,7 +97,8 @@ public class BinaryOpCreator {
 
     private void createConstructor() {
         final InstructionList il = new InstructionList();
-        final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] {}, "<init>", ORG_APACHE_BCEL_GENERIC_BINARY_OP, il, cp);
+        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));
@@ -96,676 +109,679 @@ public class BinaryOpCreator {
         il.dispose();
     }
 
-    private void createMethodISUB() {
+    private void createMethodCalculate() {
         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);
+        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, StackMapType.EMPTY_ARRAY, cp.getConstantPool()),
+                new StackMapEntry(251, 65, StackMapType.EMPTY_ARRAY, StackMapType.EMPTY_ARRAY, cp.getConstantPool()),
+                new StackMapEntry(251, 65, StackMapType.EMPTY_ARRAY, StackMapType.EMPTY_ARRAY, cp.getConstantPool()),
+                new StackMapEntry(251, 65, StackMapType.EMPTY_ARRAY, StackMapType.EMPTY_ARRAY, cp.getConstantPool()) };
+        method.addCodeAttribute(new StackMap(cp.addUtf8("StackMapTable"), 17, table, cp.getConstantPool()));
 
-        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));
+        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 createMethodIADD() {
+    private void createMethodDADD() {
         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);
+        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.INT, 1));
-        il.append(InstructionFactory.createLoad(Type.INT, 2));
-        il.append(InstructionFactory.createBinaryOperation("+", Type.INT));
-        il.append(InstructionFactory.createReturn(Type.INT));
+        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 createMethodIREM() {
+    private void createMethodDDIV() {
         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);
+        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.INT, 1));
-        il.append(InstructionFactory.createLoad(Type.INT, 2));
-        il.append(InstructionFactory.createBinaryOperation("%", Type.INT));
-        il.append(InstructionFactory.createReturn(Type.INT));
+        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 createMethodIMUL() {
+    private void createMethodDMUL() {
         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);
+        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.INT, 1));
-        il.append(InstructionFactory.createLoad(Type.INT, 2));
-        il.append(InstructionFactory.createBinaryOperation("*", Type.INT));
-        il.append(InstructionFactory.createReturn(Type.INT));
+        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 createMethodIDIV() {
+    private void createMethodDREM() {
         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);
+        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.INT, 1));
-        il.append(InstructionFactory.createLoad(Type.INT, 2));
-        il.append(InstructionFactory.createBinaryOperation("/", Type.INT));
-        il.append(InstructionFactory.createReturn(Type.INT));
+        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 createMethodIAND() {
+    private void createMethodDSUB() {
         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);
+        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.INT, 1));
-        il.append(InstructionFactory.createLoad(Type.INT, 2));
-        il.append(InstructionFactory.createBinaryOperation("&", Type.INT));
-        il.append(InstructionFactory.createReturn(Type.INT));
+        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 createMethodIOR() {
+    private void createMethodFADD() {
         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);
+        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.INT, 1));
-        il.append(InstructionFactory.createLoad(Type.INT, 2));
-        il.append(InstructionFactory.createBinaryOperation("|", Type.INT));
-        il.append(InstructionFactory.createReturn(Type.INT));
+        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 createMethodIXOR() {
+    private void createMethodFDIV() {
         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);
+        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.INT, 1));
-        il.append(InstructionFactory.createLoad(Type.INT, 2));
-        il.append(InstructionFactory.createBinaryOperation("^", Type.INT));
-        il.append(InstructionFactory.createReturn(Type.INT));
+        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 createMethodISHL() {
+    private void createMethodFMUL() {
         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);
+        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.INT, 1));
-        il.append(InstructionFactory.createLoad(Type.INT, 2));
-        il.append(InstructionFactory.createBinaryOperation("<<", Type.INT));
-        il.append(InstructionFactory.createReturn(Type.INT));
+        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 createMethodISHR() {
+    private void createMethodFREM() {
         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);
+        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.INT, 1));
-        il.append(InstructionFactory.createLoad(Type.INT, 2));
-        il.append(InstructionFactory.createBinaryOperation(">>", Type.INT));
-        il.append(InstructionFactory.createReturn(Type.INT));
+        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 createMethodIUSHR() {
+    private void createMethodFSUB() {
         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);
+        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.INT, 1));
-        il.append(InstructionFactory.createLoad(Type.INT, 2));
-        il.append(InstructionFactory.createBinaryOperation(">>>", Type.INT));
-        il.append(InstructionFactory.createReturn(Type.INT));
+        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 createMethodLSUB() {
+    private void createMethodIADD() {
         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",
+        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.LONG, 1));
-        il.append(InstructionFactory.createLoad(Type.LONG, 3));
-        il.append(InstructionFactory.createBinaryOperation("-", Type.LONG));
-        il.append(InstructionFactory.createReturn(Type.LONG));
+        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() {
+    private void createMethodIAND() {
         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",
+        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.LONG, 1));
-        il.append(InstructionFactory.createLoad(Type.LONG, 3));
-        il.append(InstructionFactory.createBinaryOperation("+", Type.LONG));
-        il.append(InstructionFactory.createReturn(Type.LONG));
+        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 createMethodLREM() {
+    private void createMethodIDIV() {
         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",
+        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.LONG, 1));
-        il.append(InstructionFactory.createLoad(Type.LONG, 3));
-        il.append(InstructionFactory.createBinaryOperation("%", Type.LONG));
-        il.append(InstructionFactory.createReturn(Type.LONG));
+        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 createMethodLMUL() {
+    private void createMethodIMUL() {
         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",
+        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.LONG, 1));
-        il.append(InstructionFactory.createLoad(Type.LONG, 3));
-        il.append(InstructionFactory.createBinaryOperation("*", Type.LONG));
-        il.append(InstructionFactory.createReturn(Type.LONG));
+        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 createMethodLDIV() {
+    private void createMethodIOR() {
         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",
+        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.LONG, 1));
-        il.append(InstructionFactory.createLoad(Type.LONG, 3));
-        il.append(InstructionFactory.createBinaryOperation("/", Type.LONG));
-        il.append(InstructionFactory.createReturn(Type.LONG));
+        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 createMethodLAND() {
+    private void createMethodIREM() {
         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",
+        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.LONG, 1));
-        il.append(InstructionFactory.createLoad(Type.LONG, 3));
-        il.append(InstructionFactory.createBinaryOperation("&", Type.LONG));
-        il.append(InstructionFactory.createReturn(Type.LONG));
+        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 createMethodLOR() {
+    private void createMethodISHL() {
         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",
+        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.LONG, 1));
-        il.append(InstructionFactory.createLoad(Type.LONG, 3));
-        il.append(InstructionFactory.createBinaryOperation("|", Type.LONG));
-        il.append(InstructionFactory.createReturn(Type.LONG));
+        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 createMethodLXOR() {
+    private void createMethodISHR() {
         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",
+        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.LONG, 1));
-        il.append(InstructionFactory.createLoad(Type.LONG, 3));
-        il.append(InstructionFactory.createBinaryOperation("^", Type.LONG));
-        il.append(InstructionFactory.createReturn(Type.LONG));
+        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 createMethodLSHL() {
+    private void createMethodISUB() {
         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",
+        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.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));
+        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 createMethodLSHR() {
+    private void createMethodIUSHR() {
         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",
+        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.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));
+        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 createMethodLUSHR() {
+    private void createMethodIXOR() {
         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",
+        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.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));
+        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 createMethodFSUB() {
+    private void createMethodLADD() {
         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",
+        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.FLOAT, 1));
-        il.append(InstructionFactory.createLoad(Type.FLOAT, 2));
-        il.append(InstructionFactory.createBinaryOperation("-", Type.FLOAT));
-        il.append(InstructionFactory.createReturn(Type.FLOAT));
+        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 createMethodFADD() {
+    private void createMethodLAND() {
         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",
+        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.FLOAT, 1));
-        il.append(InstructionFactory.createLoad(Type.FLOAT, 2));
-        il.append(InstructionFactory.createBinaryOperation("+", Type.FLOAT));
-        il.append(InstructionFactory.createReturn(Type.FLOAT));
+        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 createMethodFREM() {
+    private void createMethodLDIV() {
         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",
+        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.FLOAT, 1));
-        il.append(InstructionFactory.createLoad(Type.FLOAT, 2));
-        il.append(InstructionFactory.createBinaryOperation("%", Type.FLOAT));
-        il.append(InstructionFactory.createReturn(Type.FLOAT));
+        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 createMethodFMUL() {
+    private void createMethodLMUL() {
         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",
+        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.FLOAT, 1));
-        il.append(InstructionFactory.createLoad(Type.FLOAT, 2));
-        il.append(InstructionFactory.createBinaryOperation("*", Type.FLOAT));
-        il.append(InstructionFactory.createReturn(Type.FLOAT));
+        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 createMethodFDIV() {
+    private void createMethodLOR() {
         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",
+        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.FLOAT, 1));
-        il.append(InstructionFactory.createLoad(Type.FLOAT, 2));
-        il.append(InstructionFactory.createBinaryOperation("/", Type.FLOAT));
-        il.append(InstructionFactory.createReturn(Type.FLOAT));
+        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 createMethodDSUB() {
+    private void createMethodLREM() {
         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",
+        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.DOUBLE, 1));
-        il.append(InstructionFactory.createLoad(Type.DOUBLE, 3));
-        il.append(InstructionFactory.createBinaryOperation("-", Type.DOUBLE));
-        il.append(InstructionFactory.createReturn(Type.DOUBLE));
+        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 createMethodDADD() {
+    private void createMethodLSHL() {
         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",
+        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.DOUBLE, 1));
-        il.append(InstructionFactory.createLoad(Type.DOUBLE, 3));
-        il.append(InstructionFactory.createBinaryOperation("+", Type.DOUBLE));
-        il.append(InstructionFactory.createReturn(Type.DOUBLE));
+        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 createMethodDREM() {
+    private void createMethodLSHR() {
         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",
+        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.DOUBLE, 1));
-        il.append(InstructionFactory.createLoad(Type.DOUBLE, 3));
-        il.append(InstructionFactory.createBinaryOperation("%", Type.DOUBLE));
-        il.append(InstructionFactory.createReturn(Type.DOUBLE));
+        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 createMethodDMUL() {
+    private void createMethodLSUB() {
         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",
+        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.DOUBLE, 1));
-        il.append(InstructionFactory.createLoad(Type.DOUBLE, 3));
-        il.append(InstructionFactory.createBinaryOperation("*", Type.DOUBLE));
-        il.append(InstructionFactory.createReturn(Type.DOUBLE));
+        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 createMethodDDIV() {
+    private void createMethodLUSHR() {
         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",
+        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.DOUBLE, 1));
-        il.append(InstructionFactory.createLoad(Type.DOUBLE, 3));
-        il.append(InstructionFactory.createBinaryOperation("/", Type.DOUBLE));
-        il.append(InstructionFactory.createReturn(Type.DOUBLE));
+        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 createMethodCalculate() {
+    private void createMethodLXOR() {
         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",
+        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);
-        method.addException("java.lang.Exception");
-        final StackMapType[] typesOfLocals = new StackMapType[] {new StackMapType((byte)7, cp.addClass("java.lang.String"), cp.getConstantPool()) };
-        final StackMapEntry[] table = new StackMapEntry[] {
-                new StackMapEntry(252, 70, typesOfLocals, StackMapType.EMPTY_ARRAY, cp.getConstantPool()),
-                new StackMapEntry(251, 65, StackMapType.EMPTY_ARRAY, StackMapType.EMPTY_ARRAY, cp.getConstantPool()),
-                new StackMapEntry(251, 65, StackMapType.EMPTY_ARRAY, StackMapType.EMPTY_ARRAY, cp.getConstantPool()),
-                new StackMapEntry(251, 65, StackMapType.EMPTY_ARRAY, StackMapType.EMPTY_ARRAY, cp.getConstantPool())};
-        method.addCodeAttribute(new StackMap(cp.addUtf8("StackMapTable"), 17, table, cp.getConstantPool()));
 
-        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);
+        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());
@@ -774,8 +790,8 @@ public class BinaryOpCreator {
 
     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);
+        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));
@@ -785,7 +801,8 @@ public class BinaryOpCreator {
         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(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();
@@ -793,13 +810,4 @@ public class BinaryOpCreator {
         cg.addMethod(method.getMethod());
         il.dispose();
     }
-
-    public static void main(final String[] args) throws Exception {
-        final org.apache.bcel.generic.BinaryOpCreator creator = new org.apache.bcel.generic.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);
-        }
-    }
 }
diff --git a/src/test/java/org/apache/bcel/util/BCELifierTestCase.java b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java
index 5e5b15ff..24d2eb2e 100644
--- a/src/test/java/org/apache/bcel/util/BCELifierTestCase.java
+++ b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java
@@ -72,6 +72,62 @@ public class BCELifierTestCase extends AbstractTestCase {
         }
     }
 
+    @ParameterizedTest
+    @ValueSource(strings = {
+    // @formatter:off
+        "iadd 3 2 = 5",
+        "isub 3 2 = 1",
+        "imul 3 2 = 6",
+        "idiv 3 2 = 1",
+        "irem 3 2 = 1",
+        "iand 3 2 = 2",
+        "ior 3 2 = 3",
+        "ixor 3 2 = 1",
+        "ishl 4 1 = 8",
+        "ishr 4 1 = 2",
+        "iushr 4 1 = 2",
+        "ladd 3 2 = 5",
+        "lsub 3 2 = 1",
+        "lmul 3 2 = 6",
+        "ldiv 3 2 = 1",
+        "lrem 3 2 = 1",
+        "land 3 2 = 2",
+        "lor 3 2 = 3",
+        "lxor 3 2 = 1",
+        "lshl 4 1 = 8",
+        "lshr 4 1 = 2",
+        "lushr 4 1 = 2",
+        "fadd 3 2 = 5.0",
+        "fsub 3 2 = 1.0",
+        "fmul 3 2 = 6.0",
+        "fdiv 3 2 = 1.5",
+        "frem 3 2 = 1.0",
+        "dadd 3 2 = 5.0",
+        "dsub 3 2 = 1.0",
+        "dmul 3 2 = 6.0",
+        "ddiv 3 2 = 1.5",
+        "drem 3 2 = 1.0"
+    // @formatter:on
+    })
+    public void testBinaryOp(final String exp) throws Exception {
+        BinaryOpCreator.main(new String[] {});
+        final File workDir = new File("target");
+        final Pattern pattern = Pattern.compile("([a-z]{3,5}) ([-+]?\\d*\\.?\\d+) ([-+]?\\d*\\.?\\d+) = ([-+]?\\d*\\.?\\d+)");
+        final Matcher matcher = pattern.matcher(exp);
+        assertTrue(matcher.matches());
+        final String op = matcher.group(1);
+        final String a = matcher.group(2);
+        final String b = matcher.group(3);
+        final String expected = matcher.group(4);
+        final String javaAgent = getJavaAgent();
+        if (javaAgent == null) {
+            assertEquals(expected + EOL, exec(workDir, "java", "-cp", CLASSPATH, "org.apache.bcel.generic.BinaryOp", op, a, b));
+        } else {
+            final String runtimeExecJavaAgent = javaAgent.replace("jacoco.exec", "jacoco_org.apache.bcel.generic.BinaryOp.exec");
+            assertEquals(expected + EOL, exec(workDir, "java", runtimeExecJavaAgent, "-cp", CLASSPATH, "org.apache.bcel.generic.BinaryOp", op, a, b));
+        }
+    }
+
     private void testClassOnPath(final String javaClassFileName) throws Exception {
         final File workDir = new File("target");
         final File infile = new File(javaClassFileName);
@@ -160,60 +216,4 @@ public class BCELifierTestCase extends AbstractTestCase {
         final BCELifier bcelifier = new BCELifier(javaClass, os);
         bcelifier.start();
     }
-
-    @ParameterizedTest
-    @ValueSource(strings = {
-    // @formatter:off
-        "iadd 3 2 = 5",
-        "isub 3 2 = 1",
-        "imul 3 2 = 6",
-        "idiv 3 2 = 1",
-        "irem 3 2 = 1",
-        "iand 3 2 = 2",
-        "ior 3 2 = 3",
-        "ixor 3 2 = 1",
-        "ishl 4 1 = 8",
-        "ishr 4 1 = 2",
-        "iushr 4 1 = 2",
-        "ladd 3 2 = 5",
-        "lsub 3 2 = 1",
-        "lmul 3 2 = 6",
-        "ldiv 3 2 = 1",
-        "lrem 3 2 = 1",
-        "land 3 2 = 2",
-        "lor 3 2 = 3",
-        "lxor 3 2 = 1",
-        "lshl 4 1 = 8",
-        "lshr 4 1 = 2",
-        "lushr 4 1 = 2",
-        "fadd 3 2 = 5.0",
-        "fsub 3 2 = 1.0",
-        "fmul 3 2 = 6.0",
-        "fdiv 3 2 = 1.5",
-        "frem 3 2 = 1.0",
-        "dadd 3 2 = 5.0",
-        "dsub 3 2 = 1.0",
-        "dmul 3 2 = 6.0",
-        "ddiv 3 2 = 1.5",
-        "drem 3 2 = 1.0"
-    // @formatter:on
-    })
-    public void testBinaryOp(final String exp) throws Exception {
-        BinaryOpCreator.main(new String[] {});
-        final File workDir = new File("target");
-        final Pattern pattern = Pattern.compile("([a-z]{3,5}) ([-+]?\\d*\\.?\\d+) ([-+]?\\d*\\.?\\d+) = ([-+]?\\d*\\.?\\d+)");
-        final Matcher matcher = pattern.matcher(exp);
-        assertTrue(matcher.matches());
-        final String op = matcher.group(1);
-        final String a = matcher.group(2);
-        final String b = matcher.group(3);
-        final String expected = matcher.group(4);
-        final String javaAgent = getJavaAgent();
-        if (javaAgent == null) {
-            assertEquals(expected + EOL, exec(workDir, "java", "-cp", CLASSPATH, "org.apache.bcel.generic.BinaryOp", op, a, b));
-        } else {
-            final String runtimeExecJavaAgent = javaAgent.replace("jacoco.exec", "jacoco_org.apache.bcel.generic.BinaryOp.exec");
-            assertEquals(expected + EOL, exec(workDir, "java", runtimeExecJavaAgent, "-cp", CLASSPATH, "org.apache.bcel.generic.BinaryOp", op, a, b));
-        }
-    }
 }