private Code readBinaryOp( int opcode, boolean wideBase, boolean wideRest, int offset, HashMap<Integer, Code.Label> labels) throws IOException { int leftOperand = readBase(wideBase); int rightOperand = readBase(wideBase); int typeIdx = readRest(wideRest); Type type = typePool[typeIdx]; switch (opcode) { case Code.OPCODE_asserteq: case Code.OPCODE_assertne: case Code.OPCODE_assertlt: case Code.OPCODE_assertle: case Code.OPCODE_assertgt: case Code.OPCODE_assertge: case Code.OPCODE_assertel: case Code.OPCODE_assertss: case Code.OPCODE_assertse: { int msgIdx = readRest(wideRest); String msg = stringPool[msgIdx]; Code.Comparator cop = Code.Comparator.values()[opcode - Code.OPCODE_asserteq]; return Code.Assert(type, leftOperand, rightOperand, cop, msg); } case Code.OPCODE_assumeeq: case Code.OPCODE_assumene: case Code.OPCODE_assumelt: case Code.OPCODE_assumele: case Code.OPCODE_assumegt: case Code.OPCODE_assumege: case Code.OPCODE_assumeel: case Code.OPCODE_assumess: case Code.OPCODE_assumese: { int msgIdx = readRest(wideRest); String msg = stringPool[msgIdx]; Code.Comparator cop = Code.Comparator.values()[opcode - Code.OPCODE_assumeeq]; return Code.Assume(type, leftOperand, rightOperand, cop, msg); } case Code.OPCODE_ifeq: case Code.OPCODE_ifne: case Code.OPCODE_iflt: case Code.OPCODE_ifle: case Code.OPCODE_ifgt: case Code.OPCODE_ifge: case Code.OPCODE_ifel: case Code.OPCODE_ifss: case Code.OPCODE_ifse: { int target = readTarget(wideRest, offset); Code.Label l = findLabel(target, labels); Code.Comparator cop = Code.Comparator.values()[opcode - Code.OPCODE_ifeq]; return Code.If(type, leftOperand, rightOperand, cop, l.label); } } throw new RuntimeException("unknown opcode encountered (" + opcode + ")"); }