Skip to content
This repository was archived by the owner on Feb 23, 2018. It is now read-only.

Commit 4a7bb6a

Browse files
lrytzCarsten Varming
authored and
Carsten Varming
committed
[asm-cherry-pick] Call interpreter.copyInstruction consistently for all copied values
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 4bddf8b commit 4a7bb6a

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
@@ -351,7 +351,7 @@ public void execute(final AbstractInsnNode insn,
351351
if (value1.getSize() != 1) {
352352
throw new AnalyzerException(insn, "Illegal use of DUP");
353353
}
354-
push(value1);
354+
push(interpreter.copyOperation(insn, value1));
355355
push(interpreter.copyOperation(insn, value1));
356356
break;
357357
case Opcodes.DUP_X1:
@@ -361,8 +361,8 @@ public void execute(final AbstractInsnNode insn,
361361
throw new AnalyzerException(insn, "Illegal use of DUP_X1");
362362
}
363363
push(interpreter.copyOperation(insn, value1));
364-
push(value2);
365-
push(value1);
364+
push(interpreter.copyOperation(insn, value2));
365+
push(interpreter.copyOperation(insn, value1));
366366
break;
367367
case Opcodes.DUP_X2:
368368
value1 = pop();
@@ -372,15 +372,15 @@ public void execute(final AbstractInsnNode insn,
372372
value3 = pop();
373373
if (value3.getSize() == 1) {
374374
push(interpreter.copyOperation(insn, value1));
375-
push(value3);
376-
push(value2);
377-
push(value1);
375+
push(interpreter.copyOperation(insn, value3));
376+
push(interpreter.copyOperation(insn, value2));
377+
push(interpreter.copyOperation(insn, value1));
378378
break;
379379
}
380380
} else {
381381
push(interpreter.copyOperation(insn, value1));
382-
push(value2);
383-
push(value1);
382+
push(interpreter.copyOperation(insn, value2));
383+
push(interpreter.copyOperation(insn, value1));
384384
break;
385385
}
386386
}
@@ -390,14 +390,14 @@ public void execute(final AbstractInsnNode insn,
390390
if (value1.getSize() == 1) {
391391
value2 = pop();
392392
if (value2.getSize() == 1) {
393-
push(value2);
394-
push(value1);
393+
push(interpreter.copyOperation(insn, value2));
394+
push(interpreter.copyOperation(insn, value1));
395395
push(interpreter.copyOperation(insn, value2));
396396
push(interpreter.copyOperation(insn, value1));
397397
break;
398398
}
399399
} else {
400-
push(value1);
400+
push(interpreter.copyOperation(insn, value1));
401401
push(interpreter.copyOperation(insn, value1));
402402
break;
403403
}
@@ -411,18 +411,18 @@ public void execute(final AbstractInsnNode insn,
411411
if (value3.getSize() == 1) {
412412
push(interpreter.copyOperation(insn, value2));
413413
push(interpreter.copyOperation(insn, value1));
414-
push(value3);
415-
push(value2);
416-
push(value1);
414+
push(interpreter.copyOperation(insn, value3));
415+
push(interpreter.copyOperation(insn, value2));
416+
push(interpreter.copyOperation(insn, value1));
417417
break;
418418
}
419419
}
420420
} else {
421421
value2 = pop();
422422
if (value2.getSize() == 1) {
423423
push(interpreter.copyOperation(insn, value1));
424-
push(value2);
425-
push(value1);
424+
push(interpreter.copyOperation(insn, value2));
425+
push(interpreter.copyOperation(insn, value1));
426426
break;
427427
}
428428
}
@@ -438,18 +438,18 @@ public void execute(final AbstractInsnNode insn,
438438
if (value4.getSize() == 1) {
439439
push(interpreter.copyOperation(insn, value2));
440440
push(interpreter.copyOperation(insn, value1));
441-
push(value4);
442-
push(value3);
443-
push(value2);
444-
push(value1);
441+
push(interpreter.copyOperation(insn, value4));
442+
push(interpreter.copyOperation(insn, value3));
443+
push(interpreter.copyOperation(insn, value2));
444+
push(interpreter.copyOperation(insn, value1));
445445
break;
446446
}
447447
} else {
448448
push(interpreter.copyOperation(insn, value2));
449449
push(interpreter.copyOperation(insn, value1));
450-
push(value3);
451-
push(value2);
452-
push(value1);
450+
push(interpreter.copyOperation(insn, value3));
451+
push(interpreter.copyOperation(insn, value2));
452+
push(interpreter.copyOperation(insn, value1));
453453
break;
454454
}
455455
}
@@ -459,15 +459,15 @@ public void execute(final AbstractInsnNode insn,
459459
value3 = pop();
460460
if (value3.getSize() == 1) {
461461
push(interpreter.copyOperation(insn, value1));
462-
push(value3);
463-
push(value2);
464-
push(value1);
462+
push(interpreter.copyOperation(insn, value3));
463+
push(interpreter.copyOperation(insn, value2));
464+
push(interpreter.copyOperation(insn, value1));
465465
break;
466466
}
467467
} else {
468468
push(interpreter.copyOperation(insn, value1));
469-
push(value2);
470-
push(value1);
469+
push(interpreter.copyOperation(insn, value2));
470+
push(interpreter.copyOperation(insn, value1));
471471
break;
472472
}
473473
}

0 commit comments

Comments
 (0)