|
|
|
/*
|
|
|
|
* Copyright 2000-2014 JetBrains s.r.o.
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
package org.jetbrains.java.decompiler.code;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* opc_tableswitch, lookupswitch
|
|
|
|
*/
|
|
|
|
|
|
|
|
public class SwitchInstruction extends Instruction {
|
|
|
|
|
|
|
|
private int[] destinations;
|
|
|
|
|
|
|
|
private int[] values;
|
|
|
|
|
|
|
|
private int defaultdest;
|
|
|
|
|
|
|
|
public SwitchInstruction() {
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void initInstruction(InstructionSequence seq) {
|
|
|
|
|
|
|
|
int pref = (opcode == CodeConstants.opc_tableswitch ? 3 : 2);
|
|
|
|
int len = this.getOperands().length - pref;
|
|
|
|
defaultdest = seq.getPointerByRelOffset(this.getOperand(0));
|
|
|
|
|
|
|
|
int low = 0;
|
|
|
|
|
|
|
|
if (opcode == CodeConstants.opc_lookupswitch) {
|
|
|
|
len /= 2;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
low = this.getOperand(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] = this.getOperand(pref + k);
|
|
|
|
k++;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
values[i] = low + k;
|
|
|
|
}
|
|
|
|
destinations[i] = seq.getPointerByRelOffset(this.getOperand(pref + k));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public SwitchInstruction clone() {
|
|
|
|
SwitchInstruction newinstr = (SwitchInstruction)super.clone();
|
|
|
|
|
|
|
|
newinstr.defaultdest = defaultdest;
|
|
|
|
newinstr.destinations = destinations.clone();
|
|
|
|
newinstr.values = values.clone();
|
|
|
|
|
|
|
|
return newinstr;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int[] getDestinations() {
|
|
|
|
return destinations;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setDestinations(int[] destinations) {
|
|
|
|
this.destinations = destinations;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getDefaultdest() {
|
|
|
|
return defaultdest;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setDefaultdest(int defaultdest) {
|
|
|
|
this.defaultdest = defaultdest;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int[] getValues() {
|
|
|
|
return values;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setValues(int[] values) {
|
|
|
|
this.values = values;
|
|
|
|
}
|
|
|
|
}
|