op = "sipush " + x;
stack.push(ConstantNumber.get(x));
break;
}
case 18: {
Token s = getConstant(readByte());
op = "ldc " + s;
stack.push(s);
break;
}
case 19: {
Token s = getConstant(readShort());
op = "ldc_w " + s;
stack.push(s);
break;
}
case 20: {
Token s = getConstant(readShort());
op = "ldc2_w " + s;
stack.push(s);
break;
}
case 21: {
int x = readByte();
op = "iload " + x;
stack.push(getVariable(x));
break;
}
case 22: {
int x = readByte();
op = "lload " + x;
stack.push(getVariable(x));
break;
}
case 23: {
int x = readByte();
op = "fload " + x;
stack.push(getVariable(x));
break;
}
case 24: {
int x = readByte();
op = "dload " + x;
stack.push(getVariable(x));
break;
}
case 25: {
int x = readByte();
op = "aload " + x;
stack.push(getVariable(x));
break;
}
case 26:
op = "iload_0";
stack.push(getVariable(0));
break;
case 27:
op = "iload_1";
stack.push(getVariable(1));
break;
case 28:
op = "iload_2";
stack.push(getVariable(2));
break;
case 29:
op = "iload_3";
stack.push(getVariable(3));
break;
case 30:
op = "lload_0";
stack.push(getVariable(0));
break;
case 31:
op = "lload_1";
stack.push(getVariable(1));
break;
case 32:
op = "lload_2";
stack.push(getVariable(2));
break;
case 33:
op = "lload_3";
stack.push(getVariable(3));
break;
case 34:
op = "fload_0";
stack.push(getVariable(0));
break;
case 35:
op = "fload_1";
stack.push(getVariable(1));
break;
case 36:
op = "fload_2";
stack.push(getVariable(2));
break;
case 37:
op = "fload_3";
stack.push(getVariable(3));
break;
case 38:
op = "dload_0";
stack.push(getVariable(0));
break;
case 39:
op = "dload_1";
stack.push(getVariable(1));
break;
case 40:
op = "dload_2";
stack.push(getVariable(2));
break;
case 41:
op = "dload_3";
stack.push(getVariable(3));
break;
case 42:
op = "aload_0";
stack.push(getVariable(0));
break;
case 43:
op = "aload_1";
stack.push(getVariable(1));
break;
case 44:
op = "aload_2";
stack.push(getVariable(2));
break;
case 45:
op = "aload_3";
stack.push(getVariable(3));
break;
case 46: {
Token index = stack.pop();
Token ref = stack.pop();
op = "iaload";
stack.push(ArrayGet.get(ref, index));
break;
}
case 47: {
Token index = stack.pop();
Token ref = stack.pop();
op = "laload";
stack.push(ArrayGet.get(ref, index));
break;
}
case 48: {
Token index = stack.pop();
Token ref = stack.pop();
op = "faload";
stack.push(ArrayGet.get(ref, index));
break;
}
case 49: {
Token index = stack.pop();
Token ref = stack.pop();
op = "daload";
stack.push(ArrayGet.get(ref, index));
break;
}
case 50: {
Token index = stack.pop();
Token ref = stack.pop();
op = "aaload";
stack.push(ArrayGet.get(ref, index));
break;
}
case 51: {
Token index = stack.pop();
Token ref = stack.pop();
op = "baload";
stack.push(ArrayGet.get(ref, index));
break;
}
case 52: {
Token index = stack.pop();
Token ref = stack.pop();
op = "caload";
stack.push(ArrayGet.get(ref, index));
break;
}
case 53: {
Token index = stack.pop();
Token ref = stack.pop();
op = "saload";
stack.push(ArrayGet.get(ref, index));
break;
}
case 54: {
int var = readByte();
op = "istore " + var;
setVariable(var, stack.pop());
break;
}
case 55: {
int var = readByte();
op = "lstore " + var;
setVariable(var, stack.pop());
break;
}
case 56: {
int var = readByte();
op = "fstore " + var;
setVariable(var, stack.pop());
break;
}
case 57: {
int var = readByte();
op = "dstore " + var;
setVariable(var, stack.pop());
break;
}
case 58: {
int var = readByte();
op = "astore " + var;
setVariable(var, stack.pop());
break;
}
case 59:
op = "istore_0";
setVariable(0, stack.pop());
break;
case 60:
op = "istore_1";
setVariable(1, stack.pop());
break;
case 61:
op = "istore_2";
setVariable(2, stack.pop());
break;
case 62:
op = "istore_3";
setVariable(3, stack.pop());
break;
case 63:
op = "lstore_0";
setVariable(0, stack.pop());
break;
case 64:
op = "lstore_1";
setVariable(1, stack.pop());
break;
case 65:
op = "lstore_2";
setVariable(2, stack.pop());
break;
case 66:
op = "lstore_3";
setVariable(3, stack.pop());
break;
case 67:
op = "fstore_0";
setVariable(0, stack.pop());
break;
case 68:
op = "fstore_1";
setVariable(1, stack.pop());
break;
case 69:
op = "fstore_2";
setVariable(2, stack.pop());
break;
case 70:
op = "fstore_3";
setVariable(3, stack.pop());
break;
case 71:
op = "dstore_0";
setVariable(0, stack.pop());
break;
case 72:
op = "dstore_1";
setVariable(1, stack.pop());
break;
case 73:
op = "dstore_2";
setVariable(2, stack.pop());
break;
case 74:
op = "dstore_3";
setVariable(3, stack.pop());
break;
case 75:
op = "astore_0";
setVariable(0, stack.pop());
break;
case 76:
op = "astore_1";
setVariable(1, stack.pop());
break;
case 77:
op = "astore_2";
setVariable(2, stack.pop());
break;
case 78:
op = "astore_3";
setVariable(3, stack.pop());
break;
case 79: {
// String value = stack.pop();
// String index = stack.pop();
// String ref = stack.pop();
op = "iastore";
// TODO side effect - not supported
break;
}
case 80:
op = "lastore";
// TODO side effect - not supported
break;
case 81:
op = "fastore";
// TODO side effect - not supported
break;
case 82:
op = "dastore";
// TODO side effect - not supported
break;
case 83:
op = "aastore";
// TODO side effect - not supported
break;
case 84:
op = "bastore";
// TODO side effect - not supported
break;
case 85:
op = "castore";
// TODO side effect - not supported
break;
case 86:
op = "sastore";
// TODO side effect - not supported
break;
case 87:
op = "pop";
stack.pop();
break;
case 88:
op = "pop2";
// TODO currently we don't know the stack types
stack.pop();
stack.pop();
break;
case 89: {
op = "dup";
Token x = stack.pop();
stack.push(x);
stack.push(x);
break;
}
case 90: {
op = "dup_x1";
Token a = stack.pop();
Token b = stack.pop();
stack.push(a);
stack.push(b);
stack.push(a);
break;
}
case 91: {
// TODO currently we don't know the stack types
op = "dup_x2";
Token a = stack.pop();
Token b = stack.pop();
Token c = stack.pop();
stack.push(a);
stack.push(c);
stack.push(b);
stack.push(a);
break;
}
case 92: {
// TODO currently we don't know the stack types
op = "dup2";
Token a = stack.pop();
Token b = stack.pop();
stack.push(b);
stack.push(a);
stack.push(b);
stack.push(a);
break;
}
case 93: {
// TODO currently we don't know the stack types
op = "dup2_x1";
Token a = stack.pop();
Token b = stack.pop();
Token c = stack.pop();
stack.push(b);
stack.push(a);
stack.push(c);
stack.push(b);
stack.push(a);
break;
}
case 94: {
// TODO currently we don't know the stack types
op = "dup2_x2";
Token a = stack.pop();
Token b = stack.pop();
Token c = stack.pop();
Token d = stack.pop();
stack.push(b);
stack.push(a);
stack.push(d);
stack.push(c);
stack.push(b);
stack.push(a);
break;
}
case 95: {
op = "swap";
Token a = stack.pop();
Token b = stack.pop();
stack.push(a);
stack.push(b);
break;
}
case 96: {
Token b = stack.pop();
Token a = stack.pop();
op = "iadd";
stack.push(Operation.get(a, Operation.Type.ADD, b));
break;
}
case 97: {
Token b = stack.pop();
Token a = stack.pop();
op = "ladd";
stack.push(Operation.get(a, Operation.Type.ADD, b));
break;
}
case 98: {
Token b = stack.pop();
Token a = stack.pop();
op = "fadd";
stack.push(Operation.get(a, Operation.Type.ADD, b));
break;
}
case 99: {
Token b = stack.pop();
Token a = stack.pop();
op = "dadd";
stack.push(Operation.get(a, Operation.Type.ADD, b));
break;
}
case 100: {
Token b = stack.pop();
Token a = stack.pop();
op = "isub";
stack.push(Operation.get(a, Operation.Type.SUBTRACT, b));
break;
}
case 101: {
Token b = stack.pop();
Token a = stack.pop();
op = "lsub";
stack.push(Operation.get(a, Operation.Type.SUBTRACT, b));
break;
}
case 102: {
Token b = stack.pop();
Token a = stack.pop();
op = "fsub";
stack.push(Operation.get(a, Operation.Type.SUBTRACT, b));
break;
}
case 103: {
Token b = stack.pop();
Token a = stack.pop();
op = "dsub";
stack.push(Operation.get(a, Operation.Type.SUBTRACT, b));
break;
}
case 104: {
Token b = stack.pop();
Token a = stack.pop();
op = "imul";
stack.push(Operation.get(a, Operation.Type.MULTIPLY, b));
break;
}
case 105: {
Token b = stack.pop();
Token a = stack.pop();
op = "lmul";
stack.push(Operation.get(a, Operation.Type.MULTIPLY, b));
break;
}
case 106: {
Token b = stack.pop();
Token a = stack.pop();
op = "fmul";
stack.push(Operation.get(a, Operation.Type.MULTIPLY, b));
break;
}
case 107: {
Token b = stack.pop();
Token a = stack.pop();
op = "dmul";
stack.push(Operation.get(a, Operation.Type.MULTIPLY, b));
break;
}
case 108: {
Token b = stack.pop();
Token a = stack.pop();
op = "idiv";
stack.push(Operation.get(a, Operation.Type.DIVIDE, b));
break;
}
case 109: {
Token b = stack.pop();
Token a = stack.pop();
op = "ldiv";
stack.push(Operation.get(a, Operation.Type.DIVIDE, b));
break;
}
case 110: {
Token b = stack.pop();
Token a = stack.pop();
op = "fdiv";
stack.push(Operation.get(a, Operation.Type.DIVIDE, b));
break;
}
case 111: {
Token b = stack.pop();
Token a = stack.pop();
op = "ddiv";
stack.push(Operation.get(a, Operation.Type.DIVIDE, b));
break;
}
case 112: {
Token b = stack.pop();
Token a = stack.pop();
op = "irem";
stack.push(Operation.get(a, Operation.Type.MOD, b));
break;
}
case 113: {
Token b = stack.pop();
Token a = stack.pop();
op = "lrem";
stack.push(Operation.get(a, Operation.Type.MOD, b));
break;
}
case 114: {
Token b = stack.pop();
Token a = stack.pop();
op = "frem";
stack.push(Operation.get(a, Operation.Type.MOD, b));
break;
}
case 115: {
Token b = stack.pop();
Token a = stack.pop();
op = "drem";
stack.push(Operation.get(a, Operation.Type.MOD, b));
break;
}
// case 116:
// op = "ineg";
// break;
// case 117:
// op = "lneg";
// break;
// case 118:
// op = "fneg";
// break;
// case 119:
// op = "dneg";
// break;
// case 120:
// op = "ishl";
// break;
// case 121:
// op = "lshl";
// break;
// case 122:
// op = "ishr";
// break;
// case 123:
// op = "lshr";
// break;
// case 124:
// op = "iushr";
// break;
// case 125:
// op = "lushr";
// break;
// case 126:
// op = "iand";
// break;
// case 127:
// op = "land";
// break;
// case 128:
// op = "ior";
// break;
// case 129:
// op = "lor";
// break;
// case 130:
// op = "ixor";
// break;
// case 131:
// op = "lxor";
// break;
// case 132: {
// int var = readByte();
// int off = (byte) readByte();
// op = "iinc " + var + " " + off;
// break;
// }
// case 133:
// op = "i2l";
// break;
// case 134:
// op = "i2f";
// break;
// case 135:
// op = "i2d";
// break;
// case 136:
// op = "l2i";
// break;
// case 137:
// op = "l2f";
// break;
// case 138:
// op = "l2d";
// break;
// case 139:
// op = "f2i";
// break;
// case 140:
// op = "f2l";
// break;
// case 141:
// op = "f2d";
// break;
// case 142:
// op = "d2i";
// break;
// case 143:
// op = "d2l";
// break;
// case 144:
// op = "d2f";
// break;
// case 145:
// op = "i2b";
// break;
// case 146:
// op = "i2c";
// break;
// case 147:
// op = "i2s";
// break;
case 148: {
Token b = stack.pop(), a = stack.pop();
stack.push(new Function("SIGN", Operation.get(a, Operation.Type.SUBTRACT, b)));
op = "lcmp";
break;
}
// case 149:
// op = "fcmpl";
// break;
// case 150:
// op = "fcmpg";
// break;
// case 151:
// op = "dcmpl";
// break;
// case 152:
// op = "dcmpg";
// break;
case 153:
condition = true;
nextPc = getAbsolutePos(pos, readShort());
stack.push(Operation.get(stack.pop(), Operation.Type.EQUALS, ConstantNumber.get(0)));
op = "ifeq " + nextPc;
break;
case 154:
condition = true;
nextPc = getAbsolutePos(pos, readShort());
stack.push(Operation.get(stack.pop(), Operation.Type.NOT_EQUALS, ConstantNumber.get(0)));
op = "ifne " + nextPc;
break;
case 155:
condition = true;
nextPc = getAbsolutePos(pos, readShort());
stack.push(Operation.get(stack.pop(), Operation.Type.SMALLER, ConstantNumber.get(0)));
op = "iflt " + nextPc;
break;
case 156:
condition = true;
nextPc = getAbsolutePos(pos, readShort());
stack.push(Operation.get(stack.pop(), Operation.Type.BIGGER_EQUALS, ConstantNumber.get(0)));
op = "ifge " + nextPc;
break;
case 157:
condition = true;
nextPc = getAbsolutePos(pos, readShort());
stack.push(Operation.get(stack.pop(), Operation.Type.BIGGER, ConstantNumber.get(0)));
op = "ifgt " + nextPc;
break;
case 158:
condition = true;
nextPc = getAbsolutePos(pos, readShort());
stack.push(Operation.get(stack.pop(), Operation.Type.SMALLER_EQUALS, ConstantNumber.get(0)));
op = "ifle " + nextPc;
break;
case 159: {
condition = true;
nextPc = getAbsolutePos(pos, readShort());
Token b = stack.pop(), a = stack.pop();
stack.push(Operation.get(a, Operation.Type.EQUALS, b));
op = "if_icmpeq " + nextPc;
break;
}
case 160: {
condition = true;
nextPc = getAbsolutePos(pos, readShort());
Token b = stack.pop(), a = stack.pop();
stack.push(Operation.get(a, Operation.Type.NOT_EQUALS, b));
op = "if_icmpne " + nextPc;
break;
}
case 161: {
condition = true;
nextPc = getAbsolutePos(pos, readShort());
Token b = stack.pop(), a = stack.pop();
stack.push(Operation.get(a, Operation.Type.SMALLER, b));
op = "if_icmplt " + nextPc;
break;
}
case 162: {
condition = true;
nextPc = getAbsolutePos(pos, readShort());
Token b = stack.pop(), a = stack.pop();
stack.push(Operation.get(a, Operation.Type.BIGGER_EQUALS, b));
op = "if_icmpge " + nextPc;
break;
}
case 163: {
condition = true;
nextPc = getAbsolutePos(pos, readShort());
Token b = stack.pop(), a = stack.pop();
stack.push(Operation.get(a, Operation.Type.BIGGER, b));
op = "if_icmpgt " + nextPc;
break;
}
case 164: {
condition = true;
nextPc = getAbsolutePos(pos, readShort());
Token b = stack.pop(), a = stack.pop();
stack.push(Operation.get(a, Operation.Type.SMALLER_EQUALS, b));
op = "if_icmple " + nextPc;
break;
}
case 165: {
condition = true;
nextPc = getAbsolutePos(pos, readShort());
Token b = stack.pop(), a = stack.pop();
stack.push(Operation.get(a, Operation.Type.EQUALS, b));
op = "if_acmpeq " + nextPc;
break;
}
case 166: {
condition = true;
nextPc = getAbsolutePos(pos, readShort());
Token b = stack.pop(), a = stack.pop();
stack.push(Operation.get(a, Operation.Type.NOT_EQUALS, b));
op = "if_acmpne " + nextPc;
break;
}
case 167:
nextPc = getAbsolutePos(pos, readShort());
op = "goto " + nextPc;
break;
// case 168:
// // TODO not supported yet
// op = "jsr " + getAbsolutePos(pos, readShort());
// break;
// case 169:
// // TODO not supported yet
// op = "ret " + readByte();
// break;
// case 170: {
// int start = pos;
// pos += 4 - ((pos - startByteCode) & 3);
// int def = readInt();
// int low = readInt(), high = readInt();
// int n = high - low + 1;
// op = "tableswitch default:" + getAbsolutePos(start, def);
// StringBuilder buff = new StringBuilder();
// for (int i = 0; i < n; i++) {
// buff.append(' ').append(low++).
// append(":").
// append(getAbsolutePos(start, readInt()));
// }
// op += buff.toString();
// // pos += n * 4;
// break;
// }
// case 171: {
// int start = pos;
// pos += 4 - ((pos - startByteCode) & 3);
// int def = readInt();
// int n = readInt();
// op = "lookupswitch default:" + getAbsolutePos(start, def);
// StringBuilder buff = new StringBuilder();
// for (int i = 0; i < n; i++) {
// buff.append(' ').
// append(readInt()).
// append(":").
// append(getAbsolutePos(start, readInt()));
// }
// op += buff.toString();
// // pos += n * 8;
// break;
// }
case 172:
op = "ireturn";
endOfMethod = true;
break;
case 173:
op = "lreturn";
endOfMethod = true;
break;
case 174:
op = "freturn";
endOfMethod = true;
break;
case 175:
op = "dreturn";
endOfMethod = true;
break;
case 176:
op = "areturn";
endOfMethod = true;
break;
case 177:
op = "return";
// no value returned
stack.push(null);
endOfMethod = true;
break;
// case 178:
// op = "getstatic " + getField(readShort());
// break;
// case 179:
// op = "putstatic " + getField(readShort());
// break;
case 180: {
String field = getField(readShort());
Token p = stack.pop();
String s = p + "." + field.substring(field.lastIndexOf('.') + 1, field.indexOf(' '));
if (s.startsWith("this.")) {
s = s.substring(5);
}
stack.push(Variable.get(s, fieldMap.get(s)));
op = "getfield " + field;
break;
}
// case 181:
// op = "putfield " + getField(readShort());
// break;
case 182: {
String method = getMethod(readShort());
op = "invokevirtual " + method;
if (method.equals("java/lang/String.equals (Ljava/lang/Object;)Z")) {
Token a = stack.pop();
Token b = stack.pop();
stack.push(Operation.get(a, Operation.Type.EQUALS, b));
} else if (method.equals("java/lang/Integer.intValue ()I")) {
// ignore
} else if (method.equals("java/lang/Long.longValue ()J")) {
// ignore