summaryrefslogtreecommitdiff
path: root/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/SwitchInstruction.java
blob: 6aa6a7f7eb34e42c4184af3e14f427d694407f48 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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;
  }
}