summaryrefslogtreecommitdiff
path: root/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/code/interpreter/Util.java
blob: bf1e5eb8d9d486737a1fe139187e8c15400cb54c (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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
/*
 * 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.interpreter;

import org.jetbrains.java.decompiler.code.Instruction;
import org.jetbrains.java.decompiler.struct.StructClass;
import org.jetbrains.java.decompiler.struct.StructContext;


// FIXME: move to StructContext
public class Util {

  private static final String[][] runtime_exceptions = {

    null,                        //		public final static int		opc_nop = 0;
    null,                        //		public final static int		opc_aconst_null = 1;
    null,                        //		public final static int		opc_iconst_m1 = 2;
    null,                        //		public final static int		opc_iconst_0 = 3;
    null,                        //		public final static int		opc_iconst_1 = 4;
    null,                        //		public final static int		opc_iconst_2 = 5;
    null,                        //		public final static int		opc_iconst_3 = 6;
    null,                        //		public final static int		opc_iconst_4 = 7;
    null,                        //		public final static int		opc_iconst_5 = 8;
    null,                        //		public final static int		opc_lconst_0 = 9;
    null,                        //		public final static int		opc_lconst_1 = 10;
    null,                        //		public final static int		opc_fconst_0 = 11;
    null,                        //		public final static int		opc_fconst_1 = 12;
    null,                        //		public final static int		opc_fconst_2 = 13;
    null,                        //		public final static int		opc_dconst_0 = 14;
    null,                        //		public final static int		opc_dconst_1 = 15;
    null,                        //		public final static int		opc_bipush = 16;
    null,                        //		public final static int		opc_sipush = 17;
    null,                        //		public final static int		opc_ldc = 18;
    null,                        //		public final static int		opc_ldc_w = 19;
    null,                        //		public final static int		opc_ldc2_w = 20;
    null,                        //		public final static int		opc_iload = 21;
    null,                        //		public final static int		opc_lload = 22;
    null,                        //		public final static int		opc_fload = 23;
    null,                        //		public final static int		opc_dload = 24;
    null,                        //		public final static int		opc_aload = 25;
    null,                        //		public final static int		opc_iload_0 = 26;
    null,                        //		public final static int		opc_iload_1 = 27;
    null,                        //		public final static int		opc_iload_2 = 28;
    null,                        //		public final static int		opc_iload_3 = 29;
    null,                        //		public final static int		opc_lload_0 = 30;
    null,                        //		public final static int		opc_lload_1 = 31;
    null,                        //		public final static int		opc_lload_2 = 32;
    null,                        //		public final static int		opc_lload_3 = 33;
    null,                        //		public final static int		opc_fload_0 = 34;
    null,                        //		public final static int		opc_fload_1 = 35;
    null,                        //		public final static int		opc_fload_2 = 36;
    null,                        //		public final static int		opc_fload_3 = 37;
    null,                        //		public final static int		opc_dload_0 = 38;
    null,                        //		public final static int		opc_dload_1 = 39;
    null,                        //		public final static int		opc_dload_2 = 40;
    null,                        //		public final static int		opc_dload_3 = 41;
    null,                        //		public final static int		opc_aload_0 = 42;
    null,                        //		public final static int		opc_aload_1 = 43;
    null,                        //		public final static int		opc_aload_2 = 44;
    null,                        //		public final static int		opc_aload_3 = 45;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_iaload = 46;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_laload = 47;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_faload = 48;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_daload = 49;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_aaload = 50;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_baload = 51;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_caload = 52;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_saload = 53;
    null,                        //		public final static int		opc_istore = 54;
    null,                        //		public final static int		opc_lstore = 55;
    null,                        //		public final static int		opc_fstore = 56;
    null,                        //		public final static int		opc_dstore = 57;
    null,                        //		public final static int		opc_astore = 58;
    null,                        //		public final static int		opc_istore_0 = 59;
    null,                        //		public final static int		opc_istore_1 = 60;
    null,                        //		public final static int		opc_istore_2 = 61;
    null,                        //		public final static int		opc_istore_3 = 62;
    null,                        //		public final static int		opc_lstore_0 = 63;
    null,                        //		public final static int		opc_lstore_1 = 64;
    null,                        //		public final static int		opc_lstore_2 = 65;
    null,                        //		public final static int		opc_lstore_3 = 66;
    null,                        //		public final static int		opc_fstore_0 = 67;
    null,                        //		public final static int		opc_fstore_1 = 68;
    null,                        //		public final static int		opc_fstore_2 = 69;
    null,                        //		public final static int		opc_fstore_3 = 70;
    null,                        //		public final static int		opc_dstore_0 = 71;
    null,                        //		public final static int		opc_dstore_1 = 72;
    null,                        //		public final static int		opc_dstore_2 = 73;
    null,                        //		public final static int		opc_dstore_3 = 74;
    null,                        //		public final static int		opc_astore_0 = 75;
    null,                        //		public final static int		opc_astore_1 = 76;
    null,                        //		public final static int		opc_astore_2 = 77;
    null,                        //		public final static int		opc_astore_3 = 78;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_iastore = 79;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_lastore = 80;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_fastore = 81;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_dastore = 82;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException", "java/lang/ArrayStoreException"},
    //		public final static int		opc_aastore = 83;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_bastore = 84;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_castore = 85;
    {"java/lang/NullPointerException", "java/lang/ArrayIndexOutOfBoundsException"},
    //		public final static int		opc_sastore = 86;
    null,                        //		public final static int		opc_pop = 87;
    null,                        //		public final static int		opc_pop2 = 88;
    null,                        //		public final static int		opc_dup = 89;
    null,                        //		public final static int		opc_dup_x1 = 90;
    null,                        //		public final static int		opc_dup_x2 = 91;
    null,                        //		public final static int		opc_dup2 = 92;
    null,                        //		public final static int		opc_dup2_x1 = 93;
    null,                        //		public final static int		opc_dup2_x2 = 94;
    null,                        //		public final static int		opc_swap = 95;
    null,                        //		public final static int		opc_iadd = 96;
    null,                        //		public final static int		opc_ladd = 97;
    null,                        //		public final static int		opc_fadd = 98;
    null,                        //		public final static int		opc_dadd = 99;
    null,                        //		public final static int		opc_isub = 100;
    null,                        //		public final static int		opc_lsub = 101;
    null,                        //		public final static int		opc_fsub = 102;
    null,                        //		public final static int		opc_dsub = 103;
    null,                        //		public final static int		opc_imul = 104;
    null,                        //		public final static int		opc_lmul = 105;
    null,                        //		public final static int		opc_fmul = 106;
    null,                        //		public final static int		opc_dmul = 107;
    {"java/lang/ArithmeticException"},                        //		public final static int		opc_idiv = 108;
    {"java/lang/ArithmeticException"},                        //		public final static int		opc_ldiv = 109;
    null,                        //		public final static int		opc_fdiv = 110;
    null,                        //		public final static int		opc_ddiv = 111;
    {"java/lang/ArithmeticException"},                        //		public final static int		opc_irem = 112;
    {"java/lang/ArithmeticException"},                        //		public final static int		opc_lrem = 113;
    null,                        //		public final static int		opc_frem = 114;
    null,                        //		public final static int		opc_drem = 115;
    null,                        //		public final static int		opc_ineg = 116;
    null,                        //		public final static int		opc_lneg = 117;
    null,                        //		public final static int		opc_fneg = 118;
    null,                        //		public final static int		opc_dneg = 119;
    null,                        //		public final static int		opc_ishl = 120;
    null,                        //		public final static int		opc_lshl = 121;
    null,                        //		public final static int		opc_ishr = 122;
    null,                        //		public final static int		opc_lshr = 123;
    null,                        //		public final static int		opc_iushr = 124;
    null,                        //		public final static int		opc_lushr = 125;
    null,                        //		public final static int		opc_iand = 126;
    null,                        //		public final static int		opc_land = 127;
    null,                        //		public final static int		opc_ior = 128;
    null,                        //		public final static int		opc_lor = 129;
    null,                        //		public final static int		opc_ixor = 130;
    null,                        //		public final static int		opc_lxor = 131;
    null,                        //		public final static int		opc_iinc = 132;
    null,                        //		public final static int		opc_i2l = 133;
    null,                        //		public final static int		opc_i2f = 134;
    null,                        //		public final static int		opc_i2d = 135;
    null,                        //		public final static int		opc_l2i = 136;
    null,                        //		public final static int		opc_l2f = 137;
    null,                        //		public final static int		opc_l2d = 138;
    null,                        //		public final static int		opc_f2i = 139;
    null,                        //		public final static int		opc_f2l = 140;
    null,                        //		public final static int		opc_f2d = 141;
    null,                        //		public final static int		opc_d2i = 142;
    null,                        //		public final static int		opc_d2l = 143;
    null,                        //		public final static int		opc_d2f = 144;
    null,                        //		public final static int		opc_i2b = 145;
    null,                        //		public final static int		opc_i2c = 146;
    null,                        //		public final static int		opc_i2s = 147;
    null,                        //		public final static int		opc_lcmp = 148;
    null,                        //		public final static int		opc_fcmpl = 149;
    null,                        //		public final static int		opc_fcmpg = 150;
    null,                        //		public final static int		opc_dcmpl = 151;
    null,                        //		public final static int		opc_dcmpg = 152;
    null,                        //		public final static int		opc_ifeq = 153;
    null,                        //		public final static int		opc_ifne = 154;
    null,                        //		public final static int		opc_iflt = 155;
    null,                        //		public final static int		opc_ifge = 156;
    null,                        //		public final static int		opc_ifgt = 157;
    null,                        //		public final static int		opc_ifle = 158;
    null,                        //		public final static int		opc_if_icmpeq = 159;
    null,                        //		public final static int		opc_if_icmpne = 160;
    null,                        //		public final static int		opc_if_icmplt = 161;
    null,                        //		public final static int		opc_if_icmpge = 162;
    null,                        //		public final static int		opc_if_icmpgt = 163;
    null,                        //		public final static int		opc_if_icmple = 164;
    null,                        //		public final static int		opc_if_acmpeq = 165;
    null,                        //		public final static int		opc_if_acmpne = 166;
    null,                        //		public final static int		opc_goto = 167;
    null,                        //		public final static int		opc_jsr = 168;
    null,                        //		public final static int		opc_ret = 169;
    null,                        //		public final static int		opc_tableswitch = 170;
    null,                        //		public final static int		opc_lookupswitch = 171;
    {"java/lang/IllegalMonitorStateException"},                        //		public final static int		opc_ireturn = 172;
    {"java/lang/IllegalMonitorStateException"},                        //		public final static int		opc_lreturn = 173;
    {"java/lang/IllegalMonitorStateException"},                        //		public final static int		opc_freturn = 174;
    {"java/lang/IllegalMonitorStateException"},                        //		public final static int		opc_dreturn = 175;
    {"java/lang/IllegalMonitorStateException"},                        //		public final static int		opc_areturn = 176;
    {"java/lang/IllegalMonitorStateException"},                        //		public final static int		opc_return = 177;
    null,                        //		public final static int		opc_getstatic = 178;
    null,                        //		public final static int		opc_putstatic = 179;
    {"java/lang/NullPointerException"},                        //		public final static int		opc_getfield = 180;
    {"java/lang/NullPointerException"},                        //		public final static int		opc_putfield = 181;
    {"java/lang/NullPointerException", "java/lang/AbstractMethodError", "java/lang/UnsatisfiedLinkError"},
    //		public final static int		opc_invokevirtual = 182;
    {"java/lang/NullPointerException", "java/lang/UnsatisfiedLinkError"},
    //		public final static int		opc_invokespecial = 183;
    {"java/lang/UnsatisfiedLinkError"},                        //		public final static int		opc_invokestatic = 184;
    {"java/lang/NullPointerException", "java/lang/IncompatibleClassChangeError", "java/lang/IllegalAccessError",
      "java/lang/java/lang/AbstractMethodError", "java/lang/UnsatisfiedLinkError"},
    //		public final static int		opc_invokeinterface = 185;
    null,                        //		public final static int		opc_xxxunusedxxx = 186;
    null,                        //		public final static int		opc_new = 187;
    {"java/lang/NegativeArraySizeException"},                        //		public final static int		opc_newarray = 188;
    {"java/lang/NegativeArraySizeException"},                        //		public final static int		opc_anewarray = 189;
    {"java/lang/NullPointerException"},                        //		public final static int		opc_arraylength = 190;
    {"java/lang/NullPointerException", "java/lang/IllegalMonitorStateException"},
    //		public final static int		opc_athrow = 191;
    {"java/lang/ClassCastException"},                        //		public final static int		opc_checkcast = 192;
    null,                        //		public final static int		opc_instanceof = 193;
    {"java/lang/NullPointerException"},                        //		public final static int		opc_monitorenter = 194;
    {"java/lang/NullPointerException", "java/lang/IllegalMonitorStateException"},
    //		public final static int		opc_monitorexit = 195;
    null,                        //		public final static int		opc_wide = 196;
    {"java/lang/NegativeArraySizeException"},                        //		public final static int		opc_multianewarray = 197;
    null,                        //		public final static int		opc_ifnull = 198;
    null,                        //		public final static int		opc_ifnonnull = 199;
    null,                        //		public final static int		opc_goto_w = 200;
    null,                        //		public final static int		opc_jsr_w = 201;
  };


  public static boolean instanceOf(StructContext context, String valclass, String refclass) {

    if (valclass.equals(refclass)) {
      return true;
    }

    StructClass cl = context.getClass(valclass);
    if (cl == null) {
      return false;
    }

    if (cl.superClass != null && instanceOf(context, cl.superClass.getString(), refclass)) {
      return true;
    }

    int[] interfaces = cl.getInterfaces();
    for (int i = 0; i < interfaces.length; i++) {
      String intfc = cl.getPool().getPrimitiveConstant(interfaces[i]).getString();

      if (instanceOf(context, intfc, refclass)) {
        return true;
      }
    }

    return false;
  }


  public static String[] getRuntimeExceptions(Instruction instr) {
    return runtime_exceptions[instr.opcode];
  }
}