|
|
|
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
|
|
|
package org.jetbrains.java.decompiler.code;
|
|
|
|
|
|
|
|
public class SwitchInstruction extends Instruction {
|
|
|
|
private int[] destinations;
|
|
|
|
private int[] values;
|
|
|
|
private int defaultDestination;
|
|
|
|
|
|
|
|
public SwitchInstruction(int opcode, int group, boolean wide, int bytecodeVersion, int[] operands) {
|
|
|
|
super(opcode, group, wide, bytecodeVersion, operands);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void initInstruction(InstructionSequence seq) {
|
|
|
|
defaultDestination = seq.getPointerByRelOffset(operands[0]);
|
|
|
|
|
|
|
|
int prefix = opcode == CodeConstants.opc_tableswitch ? 3 : 2;
|
|
|
|
int len = operands.length - prefix;
|
|
|
|
int low = 0;
|
|
|
|
if (opcode == CodeConstants.opc_lookupswitch) {
|
|
|
|
len /= 2;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
low = operands[1];
|
|
|
|
}
|
|
|
|
|
|
|
|
destinations = new int[len];
|
|
|
|
values = new int[len];
|
|
|
|
for (int i = 0, k = 0; i < len; i++, k++) {
|
|
|
|
if (opcode == CodeConstants.opc_lookupswitch) {
|
|
|
|
values[i] = operands[prefix + k];
|
|
|
|
k++;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
values[i] = low + k;
|
|
|
|
}
|
|
|
|
destinations[i] = seq.getPointerByRelOffset(operands[prefix + k]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public int[] getDestinations() {
|
|
|
|
return destinations;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int[] getValues() {
|
|
|
|
return values;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getDefaultDestination() {
|
|
|
|
return defaultDestination;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public SwitchInstruction clone() {
|
|
|
|
SwitchInstruction copy = (SwitchInstruction)super.clone();
|
|
|
|
copy.defaultDestination = defaultDestination;
|
|
|
|
copy.destinations = destinations.clone();
|
|
|
|
copy.values = values.clone();
|
|
|
|
return copy;
|
|
|
|
}
|
|
|
|
}
|