Skip to content

Commit 8f724fb

Browse files
lrytzSethTisue
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 92dd58a commit 8f724fb

File tree

1 file changed

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

1 file changed

+23
-23
lines changed

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

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
371371
if (value1.getSize() != 1) {
372372
throw new AnalyzerException(insn, "Illegal use of DUP");
373373
}
374-
push(value1);
374+
push(interpreter.copyOperation(insn, value1));
375375
push(interpreter.copyOperation(insn, value1));
376376
break;
377377
case Opcodes.DUP_X1:
@@ -381,8 +381,8 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
381381
throw new AnalyzerException(insn, "Illegal use of DUP_X1");
382382
}
383383
push(interpreter.copyOperation(insn, value1));
384-
push(value2);
385-
push(value1);
384+
push(interpreter.copyOperation(insn, value2));
385+
push(interpreter.copyOperation(insn, value1));
386386
break;
387387
case Opcodes.DUP_X2:
388388
value1 = pop();
@@ -395,14 +395,14 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
395395
if (value1.getSize() == 1) {
396396
value2 = pop();
397397
if (value2.getSize() == 1) {
398-
push(value2);
399-
push(value1);
398+
push(interpreter.copyOperation(insn, value2));
399+
push(interpreter.copyOperation(insn, value1));
400400
push(interpreter.copyOperation(insn, value2));
401401
push(interpreter.copyOperation(insn, value1));
402402
break;
403403
}
404404
} else {
405-
push(value1);
405+
push(interpreter.copyOperation(insn, value1));
406406
push(interpreter.copyOperation(insn, value1));
407407
break;
408408
}
@@ -416,18 +416,18 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
416416
if (value3.getSize() == 1) {
417417
push(interpreter.copyOperation(insn, value2));
418418
push(interpreter.copyOperation(insn, value1));
419-
push(value3);
420-
push(value2);
421-
push(value1);
419+
push(interpreter.copyOperation(insn, value3));
420+
push(interpreter.copyOperation(insn, value2));
421+
push(interpreter.copyOperation(insn, value1));
422422
break;
423423
}
424424
}
425425
} else {
426426
value2 = pop();
427427
if (value2.getSize() == 1) {
428428
push(interpreter.copyOperation(insn, value1));
429-
push(value2);
430-
push(value1);
429+
push(interpreter.copyOperation(insn, value2));
430+
push(interpreter.copyOperation(insn, value1));
431431
break;
432432
}
433433
}
@@ -443,18 +443,18 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
443443
if (value4.getSize() == 1) {
444444
push(interpreter.copyOperation(insn, value2));
445445
push(interpreter.copyOperation(insn, value1));
446-
push(value4);
447-
push(value3);
448-
push(value2);
449-
push(value1);
446+
push(interpreter.copyOperation(insn, value4));
447+
push(interpreter.copyOperation(insn, value3));
448+
push(interpreter.copyOperation(insn, value2));
449+
push(interpreter.copyOperation(insn, value1));
450450
break;
451451
}
452452
} else {
453453
push(interpreter.copyOperation(insn, value2));
454454
push(interpreter.copyOperation(insn, value1));
455-
push(value3);
456-
push(value2);
457-
push(value1);
455+
push(interpreter.copyOperation(insn, value3));
456+
push(interpreter.copyOperation(insn, value2));
457+
push(interpreter.copyOperation(insn, value1));
458458
break;
459459
}
460460
}
@@ -654,15 +654,15 @@ private boolean executeDupX2(
654654
V value3 = pop();
655655
if (value3.getSize() == 1) {
656656
push(interpreter.copyOperation(insn, value1));
657-
push(value3);
658-
push(value2);
659-
push(value1);
657+
push(interpreter.copyOperation(insn, value3));
658+
push(interpreter.copyOperation(insn, value2));
659+
push(interpreter.copyOperation(insn, value1));
660660
return true;
661661
}
662662
} else {
663663
push(interpreter.copyOperation(insn, value1));
664-
push(value2);
665-
push(value1);
664+
push(interpreter.copyOperation(insn, value2));
665+
push(interpreter.copyOperation(insn, value1));
666666
return true;
667667
}
668668
return false;

0 commit comments

Comments
 (0)