private InsnNode decodeSwitch(DecodedInstruction insn, int offset, boolean packed) { int payloadOffset = insn.getTarget(); DecodedInstruction payload = insnArr[payloadOffset]; Object[] keys; int[] targets; if (packed) { PackedSwitchPayloadDecodedInstruction ps = (PackedSwitchPayloadDecodedInstruction) payload; targets = ps.getTargets(); keys = new Object[targets.length]; int k = ps.getFirstKey(); for (int i = 0; i < keys.length; i++) { keys[i] = k++; } } else { SparseSwitchPayloadDecodedInstruction ss = (SparseSwitchPayloadDecodedInstruction) payload; targets = ss.getTargets(); keys = new Object[targets.length]; for (int i = 0; i < keys.length; i++) { keys[i] = ss.getKeys()[i]; } } // convert from relative to absolute offsets for (int i = 0; i < targets.length; i++) { targets[i] = targets[i] - payloadOffset + offset; } int nextOffset = getNextInsnOffset(insnArr, offset); return new SwitchNode(InsnArg.reg(insn, 0, ArgType.NARROW), keys, targets, nextOffset); }
@Override public void encode(DecodedInstruction insn, CodeOutput out) { SparseSwitchPayloadDecodedInstruction payload = (SparseSwitchPayloadDecodedInstruction) insn; int[] keys = payload.getKeys(); int[] targets = payload.getTargets(); int baseAddress = out.baseAddressForCursor(); out.write(payload.getOpcodeUnit()); out.write(asUnsignedUnit(targets.length)); for (int key : keys) { out.writeInt(key); } for (int target : targets) { out.writeInt(target - baseAddress); } } },
@Override public void encode(DecodedInstruction insn, CodeOutput out) { SparseSwitchPayloadDecodedInstruction payload = (SparseSwitchPayloadDecodedInstruction) insn; int[] keys = payload.getKeys(); int[] targets = payload.getTargets(); int baseAddress = out.baseAddressForCursor(); out.write(payload.getOpcodeUnit()); out.write(asUnsignedUnit(targets.length)); for (int key : keys) { out.writeInt(key); } for (int target : targets) { out.writeInt(target - baseAddress); } } },
@Override public void encode(DecodedInstruction insn, CodeOutput out) { SparseSwitchPayloadDecodedInstruction payload = (SparseSwitchPayloadDecodedInstruction) insn; int[] keys = payload.getKeys(); int[] targets = payload.getTargets(); int baseAddress = out.baseAddressForCursor(); out.write(payload.getOpcodeUnit()); out.write(asUnsignedUnit(targets.length)); for (int key : keys) { out.writeInt(key); } for (int target : targets) { out.writeInt(target - baseAddress); } } },
@Override public void encode(DecodedInstruction insn, CodeOutput out) { SparseSwitchPayloadDecodedInstruction payload = (SparseSwitchPayloadDecodedInstruction) insn; int[] keys = payload.getKeys(); int[] targets = payload.getTargets(); int baseAddress = out.baseAddressForCursor(); out.write(payload.getOpcodeUnit()); out.write(asUnsignedUnit(targets.length)); for (int key : keys) { out.writeInt(key); } for (int target : targets) { out.writeInt(target - baseAddress); } } },
@Override public void encode(DecodedInstruction insn, CodeOutput out) { SparseSwitchPayloadDecodedInstruction payload = (SparseSwitchPayloadDecodedInstruction) insn; int[] keys = payload.getKeys(); int[] targets = payload.getTargets(); int baseAddress = out.baseAddressForCursor(); out.write(payload.getOpcodeUnit()); out.write(asUnsignedUnit(targets.length)); for (int key : keys) { out.writeInt(key); } for (int target : targets) { out.writeInt(target - baseAddress); } } },
@Override public void encode(DecodedInstruction insn, CodeOutput out) { SparseSwitchPayloadDecodedInstruction payload = (SparseSwitchPayloadDecodedInstruction) insn; int[] keys = payload.getKeys(); int[] targets = payload.getTargets(); int baseAddress = out.baseAddressForCursor(); out.write(payload.getOpcodeUnit()); out.write(asUnsignedUnit(targets.length)); for (int key : keys) { out.writeInt(key); } for (int target : targets) { out.writeInt(target - baseAddress); } } },
@Override public void encode(DecodedInstruction insn, CodeOutput out) { SparseSwitchPayloadDecodedInstruction payload = (SparseSwitchPayloadDecodedInstruction) insn; int[] keys = payload.getKeys(); int[] targets = payload.getTargets(); int baseAddress = out.baseAddressForCursor(); out.write(payload.getOpcodeUnit()); out.write(asUnsignedUnit(targets.length)); for (int key : keys) { out.writeInt(key); } for (int target : targets) { out.writeInt(target - baseAddress); } } },