diff options
Diffstat (limited to 'plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/SwitchInstruction.java')
-rw-r--r-- | plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/SwitchInstruction.java | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/SwitchInstruction.java b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/SwitchInstruction.java new file mode 100644 index 000000000000..6aa6a7f7eb34 --- /dev/null +++ b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/SwitchInstruction.java @@ -0,0 +1,97 @@ +/* + * 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; + } +} |