Skip to content

Commit f61826b

Browse files
committed
update
1 parent 9ecef10 commit f61826b

File tree

2 files changed

+92
-55
lines changed

2 files changed

+92
-55
lines changed

hasnaer/java/bytecode/Opcode.java

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14,117 +14,100 @@ public class Opcode {
1414
public static final int ICONST_3 = 0x06;
1515
public static final int ICONST_4 = 0x07;
1616
public static final int ICONST_5 = 0x08;
17-
1817
public static final int LCONST_0 = 0x09;
1918
public static final int LCONST_1 = 0x0a;
20-
2119
public static final int BIPUSH = 0x10;
22-
20+
public static final int SIPUSH = 0x11;
2321
public static final int LDC = 0x12;
2422
public static final int LDC_W = 0x13;
2523
public static final int LDC2_W = 0x14;
26-
2724
public static final int ILOAD = 0x15;
2825
public static final int LLOAD = 0x16;
2926
public static final int FLOAD = 0x17;
3027
public static final int DLOAD = 0x18;
3128
public static final int ALOAD = 0x19;
32-
33-
3429
public static final int ILOAD_0 = 0x1a;
3530
public static final int ILOAD_1 = 0x1b;
3631
public static final int ILOAD_2 = 0x1c;
3732
public static final int ILOAD_3 = 0x1d;
38-
3933
public static final int LLOAD_0 = 0x1e;
4034
public static final int LLOAD_1 = 0x1f;
4135
public static final int LLOAD_2 = 0x20;
4236
public static final int LLOAD_3 = 0x21;
43-
4437
public static final int FLOAD_0 = 0x22;
4538
public static final int FLOAD_1 = 0x23;
4639
public static final int FLOAD_2 = 0x24;
4740
public static final int FLOAD_3 = 0x25;
48-
4941
public static final int DLOAD_0 = 0x26;
5042
public static final int DLOAD_1 = 0x27;
5143
public static final int DLOAD_2 = 0x28;
5244
public static final int DLOAD_3 = 0x29;
53-
5445
public static final int ALOAD_0 = 0x2a;
5546
public static final int ALOAD_1 = 0x2b;
5647
public static final int ALOAD_2 = 0x2c;
5748
public static final int ALOAD_3 = 0x2d;
58-
5949
public static final int ISTORE = 0x36;
6050
public static final int LSTORE = 0x37;
6151
public static final int FSTORE = 0x38;
6252
public static final int DSTORE = 0x39;
6353
public static final int ASTORE = 0x3a;
64-
6554
public static final int ISTORE_0 = 0x3b;
6655
public static final int ISTORE_1 = 0x3c;
6756
public static final int ISTORE_2 = 0x3d;
6857
public static final int ISTORE_3 = 0x3e;
69-
7058
public static final int LSTORE_0 = 0x3f;
7159
public static final int LSTORE_1 = 0x40;
7260
public static final int LSTORE_2 = 0x41;
7361
public static final int LSTORE_3 = 0x42;
74-
7562
public static final int FSTORE_0 = 0x43;
7663
public static final int FSTORE_1 = 0x44;
7764
public static final int FSTORE_2 = 0x45;
7865
public static final int FSTORE_3 = 0x46;
79-
8066
public static final int DSTORE_0 = 0x47;
8167
public static final int DSTORE_1 = 0x48;
8268
public static final int DSTORE_2 = 0x49;
8369
public static final int DSTORE_3 = 0x4a;
84-
8570
public static final int ASTORE_0 = 0x4b;
8671
public static final int ASTORE_1 = 0x4c;
8772
public static final int ASTORE_2 = 0x4d;
8873
public static final int ASTORE_3 = 0x4e;
89-
90-
74+
public static final int POP = 0x57;
9175
public static final int DUP = 0x59;
92-
9376
public static final int IADD = 0x60;
9477
public static final int LADD = 0x61;
9578
public static final int FADD = 0x62;
9679
public static final int DADD = 0x63;
97-
9880
public static final int ISUB = 0x64;
9981
public static final int LSUB = 0x65;
10082
public static final int FSUB = 0x66;
10183
public static final int DSUB = 0x67;
102-
10384
public static final int IMUL = 0x68;
10485
public static final int LMUL = 0x69;
10586
public static final int FMUL = 0x6a;
10687
public static final int DMUL = 0x6b;
107-
10888
public static final int IDIV = 0x6c;
10989
public static final int LDIV = 0x6d;
11090
public static final int FDIV = 0x6e;
11191
public static final int DDIV = 0x6f;
112-
11392
public static final int IREM = 0x70;
11493
public static final int LREM = 0x71;
11594
public static final int FREM = 0x72;
11695
public static final int DREM = 0x73;
117-
118-
96+
public static final int ISHL = 0x78;
97+
public static final int LSHL = 0x79;
98+
public static final int ISHR = 0x7a;
99+
public static final int LSHR = 0x7b;
100+
public static final int IAND = 0x7e;
101+
public static final int LAND = 0x7f;
102+
public static final int IOR = 0x80;
103+
public static final int LOR = 0x81;
104+
public static final int IXOR = 0x82;
105+
public static final int LXOR = 0x83;
119106
public static final int RETURN = 0xb1;
120107
public static final int GETSTATIC = 0xb2;
121-
122108
public static final int GETFIELD = 0xb4;
123109
public static final int PUTFIELD = 0xb5;
124-
125110
public static final int INVOKEVIRTUAL = 0xb6;
126111
public static final int INVOKESPECIAL = 0xb7;
127112
public static final int NEW = 0xbb;
128-
129-
130113
}

hasnaer/java/bytecode/StatementBuilder.java

Lines changed: 80 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public List<JVMNode> build() {
148148
System.err.println("consumeLDC");
149149
i = consumeLDC(i + 1, unsignedShortAt(i + 1));
150150
break;
151-
151+
152152
case Opcode.INVOKESPECIAL:
153153
System.err.println("consumeINVOKESPECIAL");
154154
i = consumeINVOKEMETHOD(i);
@@ -215,7 +215,7 @@ public List<JVMNode> build() {
215215
System.err.println("consumeLOADREFERENCE");
216216
i = consumeLOADREFERENCE(i + 1, code()[i + 1]);
217217
break;
218-
218+
219219
case Opcode.INVOKEVIRTUAL:
220220
System.err.println("consumeINVOKEMETHOD");
221221
i = consumeINVOKEMETHOD(i);
@@ -235,7 +235,7 @@ public List<JVMNode> build() {
235235
System.err.println("consumeGETFIELD");
236236
i = consumeGETFIELD(i);
237237
break;
238-
238+
239239
case Opcode.ICONST_0:
240240
case Opcode.ICONST_1:
241241
case Opcode.ICONST_2:
@@ -246,58 +246,96 @@ public List<JVMNode> build() {
246246
System.err.println("consumeLOADCONST");
247247
i = consumeLOADCONST(i, opcode - Opcode.ICONST_0);
248248
break;
249-
249+
250250
case Opcode.LCONST_0:
251251
case Opcode.LCONST_1:
252252
System.err.println("consumeLOADCONST");
253-
i = consumeLOADCONST(i, (long)(opcode - Opcode.LCONST_0));
253+
i = consumeLOADCONST(i, (long) (opcode - Opcode.LCONST_0));
254254
break;
255-
255+
256256
case Opcode.ACONST_NULL:
257257
System.err.println("consumeLOADNULLCONST");
258258
i = consumeLOADNULLCONST(i);
259259
break;
260-
260+
261261
case Opcode.IADD:
262262
case Opcode.FADD:
263263
case Opcode.DADD:
264264
case Opcode.LADD:
265265
System.err.println("consumeOPERATION");
266266
i = consumeOPERATION(i, OperationNode.Type.ADD);
267267
break;
268-
268+
269269
case Opcode.ISUB:
270270
case Opcode.LSUB:
271271
case Opcode.DSUB:
272272
case Opcode.FSUB:
273273
System.err.println("consumeOPERATION");
274274
i = consumeOPERATION(i, OperationNode.Type.SUB);
275275
break;
276-
276+
277277
case Opcode.IDIV:
278278
case Opcode.LDIV:
279279
case Opcode.DDIV:
280280
case Opcode.FDIV:
281281
System.err.println("consumeOPERATION");
282282
i = consumeOPERATION(i, OperationNode.Type.DIV);
283283
break;
284-
284+
285285
case Opcode.IMUL:
286286
case Opcode.FMUL:
287287
case Opcode.DMUL:
288288
case Opcode.LMUL:
289289
System.err.println("consumeOPERATION");
290290
i = consumeOPERATION(i, OperationNode.Type.MUL);
291291
break;
292-
292+
293293
case Opcode.IREM:
294294
case Opcode.FREM:
295295
case Opcode.DREM:
296296
case Opcode.LREM:
297297
System.err.println("consumeOPERATION");
298298
i = consumeOPERATION(i, OperationNode.Type.REM);
299299
break;
300-
300+
301+
case Opcode.IOR:
302+
case Opcode.LOR:
303+
System.err.println("consumeOPERATION");
304+
i = consumeOPERATION(i, OperationNode.Type.OR);
305+
break;
306+
307+
case Opcode.IXOR:
308+
case Opcode.LXOR:
309+
System.err.println("consumeOPERATION");
310+
i = consumeOPERATION(i, OperationNode.Type.XOR);
311+
break;
312+
313+
case Opcode.IAND:
314+
case Opcode.LAND:
315+
System.err.println("consumeOPERATION");
316+
i = consumeOPERATION(i, OperationNode.Type.AND);
317+
break;
318+
319+
case Opcode.ISHL:
320+
case Opcode.LSHL:
321+
System.err.println("consumeOPERATION");
322+
i = consumeOPERATION(i, OperationNode.Type.LSH);
323+
break;
324+
325+
case Opcode.ISHR:
326+
case Opcode.LSHR:
327+
System.err.println("consumeOPERATION");
328+
i = consumeOPERATION(i, OperationNode.Type.RSH);
329+
break;
330+
331+
case Opcode.SIPUSH:
332+
System.err.println("consumeSIPUSH");
333+
i = consumeSIPUSH(i);
334+
break;
335+
case Opcode.POP:
336+
System.err.println("consumePOP");
337+
i = consumePOP(i);
338+
break;
301339
}
302340
}
303341

@@ -306,27 +344,40 @@ public List<JVMNode> build() {
306344

307345
return statements;
308346
}
347+
348+
private int consumePOP(int pos){
349+
if(!stack.isEmpty()){
350+
statements.add(stack.pop());
351+
}
352+
return pos + 1;
353+
}
309354

310-
private int consumeOPERATION(int pos, OperationNode.Type type){
355+
private int consumeSIPUSH(int pos){
356+
short value = (short) signedShortAt(pos + 1);
357+
stack.push(new PrimitiveNode(PrimitiveNode.Type.SHORT, Short.toString(value)));
358+
return pos + 3;
359+
}
360+
361+
private int consumeOPERATION(int pos, OperationNode.Type type) {
311362
ValueNode right = (ValueNode) stack.pop();
312363
ValueNode left = (ValueNode) stack.pop();
313-
364+
314365
stack.push(new OperationNode(left, right, type));
315-
366+
316367
return pos + 1;
317368
}
318-
319-
private int consumeLOADNULLCONST(int pos){
369+
370+
private int consumeLOADNULLCONST(int pos) {
320371
stack.push(new ReferenceNode("null", "null"));
321372
return pos + 1;
322373
}
323-
324-
private int consumeLOADCONST(int pos, Object value){
374+
375+
private int consumeLOADCONST(int pos, Object value) {
325376
stack.push(new PrimitiveNode(PrimitiveNode.Type.INT, value.toString()));
326377
return pos + 1;
327378
}
328-
329-
private int consumeGETFIELD(int pos){
379+
380+
private int consumeGETFIELD(int pos) {
330381

331382
int index = unsignedShortAt(pos + 1);
332383

@@ -339,14 +390,14 @@ private int consumeGETFIELD(int pos){
339390
JVMNode node = stack.pop();
340391

341392
stack.push(new InvocationNode(node, field));
342-
393+
343394
return pos + 3;
344395
}
345396

346-
private int consumePUTFIELD(int pos){
397+
private int consumePUTFIELD(int pos) {
347398

348399
int index = unsignedShortAt(pos + 1);
349-
400+
350401
String class_name = pool().getFMIref_ClassName(index);
351402
String[] type_name = pool().getFMIref_Name_And_Type(index);
352403

@@ -373,7 +424,7 @@ private int consumeGETSTATIC(int pos) {
373424

374425
stack.push(field);
375426

376-
427+
377428
return pos + 3;
378429
}
379430

@@ -458,9 +509,12 @@ private int consumeDUP(int pos) {
458509
}
459510

460511
private int unsignedShortAt(int pos) {
461-
return (code()[pos] << 8) + code()[pos + 1];
512+
return ((code()[pos] & 0xFF) << 8) + (code()[pos + 1] & 0xFF);
462513
}
463514

515+
private int signedShortAt(int pos){
516+
return (code()[pos] << 8) + (code()[pos + 1] & 0xFF);
517+
}
464518
private int consumeNEW(int pos) {
465519

466520
int index = unsignedShortAt(pos + 1);

0 commit comments

Comments
 (0)