+ case op_ldc2_w:
+ {
+ int index = get2u (pc);
+ pc += 2;
+ SET_DATUM (&pool_data[index]);
+ }
+ break;
+
+ case op_sipush:
+ SET_INT (get2s (pc));
+ pc += 2;
+ break;
+
+ case op_new:
+ case op_getstatic:
+ case op_getfield:
+ case op_putfield:
+ case op_putstatic:
+ case op_anewarray:
+ case op_instanceof:
+ case op_checkcast:
+ case op_invokespecial:
+ case op_invokestatic:
+ case op_invokevirtual:
+ SET_INT (get2u (pc));
+ pc += 2;
+ break;
+
+ case op_multianewarray:
+ SET_INT (get2u (pc));
+ SET_INT (get1u (pc + 2));
+ pc += 3;
+ break;
+
+ case op_jsr:
+ case op_ifeq:
+ case op_ifne:
+ case op_iflt:
+ case op_ifge:
+ case op_ifgt:
+ case op_ifle:
+ case op_if_icmpeq:
+ case op_if_icmpne:
+ case op_if_icmplt:
+ case op_if_icmpge:
+ case op_if_icmpgt:
+ case op_if_icmple:
+ case op_if_acmpeq:
+ case op_if_acmpne:
+ case op_ifnull:
+ case op_ifnonnull:
+ case op_goto:
+ {
+ int offset = get2s (pc);
+ pc += 2;
+
+ int new_pc = base_pc_val + offset;
+
+ bool orig_was_goto = opcode == op_goto;
+
+ // Thread jumps. We limit the loop count; this lets
+ // us avoid infinite loops if the bytecode contains
+ // such. `10' is arbitrary.
+ int count = 10;
+ while (codestart[new_pc] == op_goto && count-- > 0)
+ new_pc += get2s (&codestart[new_pc + 1]);
+
+ // If the jump takes us to a `return' instruction and
+ // the original branch was an unconditional goto, then
+ // we hoist the return.
+ opcode = (java_opcode) codestart[new_pc];
+ if (orig_was_goto
+ && (opcode == op_ireturn || opcode == op_lreturn
+ || opcode == op_freturn || opcode == op_dreturn
+ || opcode == op_areturn || opcode == op_return))
+ {
+ --next;
+ SET_INSN (insn_targets[opcode]);
+ }
+ else
+ SET_DATUM (&insns[pc_mapping[new_pc]]);
+ }
+ break;