Skip to content

Commit a6a43f7

Browse files
lrytzretronym
authored andcommitted
[asm-cherry-pick] Call interpreter.copyInstruction consistently
Before this change, `Frame.execute` did not invoke the interpreter's `copyInstruction` method for all values that are pushed on the frame's when executing some copying instructions. For example, in the case of SWAP, copyInstruction is invoked: value2 = pop(); value1 = pop(); push(interpreter.copyOperation(insn, value2)); push(interpreter.copyOperation(insn, value1)); For DUP on the other hand, the original value is pushed onto the stack without notifying the interpreter: value1 = pop(); push(value1); push(interpreter.copyOperation(insn, value1)); This leads to a problem for the `SourceInterpreter`, which collects for every value a set of potential producer instructions. Given the bytecode sequence NEW java/lang/Object DUP INVOKESPECIAL java/lang/Object.<init> ()V In the frame of the INVOKESPECIAL instruction, the value on the stack lists as its producer the `NEW` operation instead of the `DUP`, which not expected.
1 parent a2791a0 commit a6a43f7

File tree

1 file changed

+28
-28
lines changed
  • src/main/java/scala/tools/asm/tree/analysis

1 file changed

+28
-28
lines changed

src/main/java/scala/tools/asm/tree/analysis/Frame.java

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
316316
if (value1.getSize() != 1) {
317317
throw new AnalyzerException(insn, "Illegal use of DUP");
318318
}
319-
push(value1);
319+
push(interpreter.copyOperation(insn, value1));
320320
push(interpreter.copyOperation(insn, value1));
321321
break;
322322
case Opcodes.DUP_X1:
@@ -326,8 +326,8 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
326326
throw new AnalyzerException(insn, "Illegal use of DUP_X1");
327327
}
328328
push(interpreter.copyOperation(insn, value1));
329-
push(value2);
330-
push(value1);
329+
push(interpreter.copyOperation(insn, value2));
330+
push(interpreter.copyOperation(insn, value1));
331331
break;
332332
case Opcodes.DUP_X2:
333333
value1 = pop();
@@ -337,15 +337,15 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
337337
value3 = pop();
338338
if (value3.getSize() == 1) {
339339
push(interpreter.copyOperation(insn, value1));
340-
push(value3);
341-
push(value2);
342-
push(value1);
340+
push(interpreter.copyOperation(insn, value3));
341+
push(interpreter.copyOperation(insn, value2));
342+
push(interpreter.copyOperation(insn, value1));
343343
break;
344344
}
345345
} else {
346346
push(interpreter.copyOperation(insn, value1));
347-
push(value2);
348-
push(value1);
347+
push(interpreter.copyOperation(insn, value2));
348+
push(interpreter.copyOperation(insn, value1));
349349
break;
350350
}
351351
}
@@ -355,14 +355,14 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
355355
if (value1.getSize() == 1) {
356356
value2 = pop();
357357
if (value2.getSize() == 1) {
358-
push(value2);
359-
push(value1);
358+
push(interpreter.copyOperation(insn, value2));
359+
push(interpreter.copyOperation(insn, value1));
360360
push(interpreter.copyOperation(insn, value2));
361361
push(interpreter.copyOperation(insn, value1));
362362
break;
363363
}
364364
} else {
365-
push(value1);
365+
push(interpreter.copyOperation(insn, value1));
366366
push(interpreter.copyOperation(insn, value1));
367367
break;
368368
}
@@ -376,18 +376,18 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
376376
if (value3.getSize() == 1) {
377377
push(interpreter.copyOperation(insn, value2));
378378
push(interpreter.copyOperation(insn, value1));
379-
push(value3);
380-
push(value2);
381-
push(value1);
379+
push(interpreter.copyOperation(insn, value3));
380+
push(interpreter.copyOperation(insn, value2));
381+
push(interpreter.copyOperation(insn, value1));
382382
break;
383383
}
384384
}
385385
} else {
386386
value2 = pop();
387387
if (value2.getSize() == 1) {
388388
push(interpreter.copyOperation(insn, value1));
389-
push(value2);
390-
push(value1);
389+
push(interpreter.copyOperation(insn, value2));
390+
push(interpreter.copyOperation(insn, value1));
391391
break;
392392
}
393393
}
@@ -403,18 +403,18 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
403403
if (value4.getSize() == 1) {
404404
push(interpreter.copyOperation(insn, value2));
405405
push(interpreter.copyOperation(insn, value1));
406-
push(value4);
407-
push(value3);
408-
push(value2);
409-
push(value1);
406+
push(interpreter.copyOperation(insn, value4));
407+
push(interpreter.copyOperation(insn, value3));
408+
push(interpreter.copyOperation(insn, value2));
409+
push(interpreter.copyOperation(insn, value1));
410410
break;
411411
}
412412
} else {
413413
push(interpreter.copyOperation(insn, value2));
414414
push(interpreter.copyOperation(insn, value1));
415-
push(value3);
416-
push(value2);
417-
push(value1);
415+
push(interpreter.copyOperation(insn, value3));
416+
push(interpreter.copyOperation(insn, value2));
417+
push(interpreter.copyOperation(insn, value1));
418418
break;
419419
}
420420
}
@@ -424,15 +424,15 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
424424
value3 = pop();
425425
if (value3.getSize() == 1) {
426426
push(interpreter.copyOperation(insn, value1));
427-
push(value3);
428-
push(value2);
429-
push(value1);
427+
push(interpreter.copyOperation(insn, value3));
428+
push(interpreter.copyOperation(insn, value2));
429+
push(interpreter.copyOperation(insn, value1));
430430
break;
431431
}
432432
} else {
433433
push(interpreter.copyOperation(insn, value1));
434-
push(value2);
435-
push(value1);
434+
push(interpreter.copyOperation(insn, value2));
435+
push(interpreter.copyOperation(insn, value1));
436436
break;
437437
}
438438
}

0 commit comments

Comments
 (0)