Skip to content

Commit fd115de

Browse files
lrytzretronym
authored andcommitted
Call interpreter.copyOperation 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 c72a86b commit fd115de

File tree

1 file changed

+31
-31
lines changed
  • asm-analysis/src/main/java/org/objectweb/asm/tree/analysis

1 file changed

+31
-31
lines changed

asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/Frame.java

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ public void push(final V value) {
218218
* @throws AnalyzerException if the instruction cannot be executed on this execution frame (e.g. a
219219
* POP on an empty operand stack).
220220
*/
221-
public void execute(final AbstractInsnNode insn, final Interpreter<V> interpreter)
221+
public void execute(final AbstractInsnNode insn, final Interpreter<V> interpreter)
222222
throws AnalyzerException {
223223
V value1;
224224
V value2;
@@ -265,12 +265,12 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
265265
var = ((VarInsnNode) insn).var;
266266
setLocal(var, value1);
267267
if (value1.getSize() == 2) {
268-
setLocal(var + 1, interpreter.newValue(null));
268+
setLocal(var + 1, interpreter.newEmptyValueAfterSize2Local(var + 1));
269269
}
270270
if (var > 0) {
271271
Value local = getLocal(var - 1);
272272
if (local != null && local.getSize() == 2) {
273-
setLocal(var - 1, interpreter.newValue(null));
273+
setLocal(var - 1, interpreter.newEmptyValueForPreviousSize2Local(var - 1));
274274
}
275275
}
276276
break;
@@ -302,7 +302,7 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
302302
if (value1.getSize() != 1) {
303303
throw new AnalyzerException(insn, "Illegal use of DUP");
304304
}
305-
push(value1);
305+
push(interpreter.copyOperation(insn, value1));
306306
push(interpreter.copyOperation(insn, value1));
307307
break;
308308
case Opcodes.DUP_X1:
@@ -312,8 +312,8 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
312312
throw new AnalyzerException(insn, "Illegal use of DUP_X1");
313313
}
314314
push(interpreter.copyOperation(insn, value1));
315-
push(value2);
316-
push(value1);
315+
push(interpreter.copyOperation(insn, value2));
316+
push(interpreter.copyOperation(insn, value1));
317317
break;
318318
case Opcodes.DUP_X2:
319319
value1 = pop();
@@ -323,15 +323,15 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
323323
value3 = pop();
324324
if (value3.getSize() == 1) {
325325
push(interpreter.copyOperation(insn, value1));
326-
push(value3);
327-
push(value2);
328-
push(value1);
326+
push(interpreter.copyOperation(insn, value3));
327+
push(interpreter.copyOperation(insn, value2));
328+
push(interpreter.copyOperation(insn, value1));
329329
break;
330330
}
331331
} else {
332332
push(interpreter.copyOperation(insn, value1));
333-
push(value2);
334-
push(value1);
333+
push(interpreter.copyOperation(insn, value2));
334+
push(interpreter.copyOperation(insn, value1));
335335
break;
336336
}
337337
}
@@ -341,14 +341,14 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
341341
if (value1.getSize() == 1) {
342342
value2 = pop();
343343
if (value2.getSize() == 1) {
344-
push(value2);
345-
push(value1);
344+
push(interpreter.copyOperation(insn, value2));
345+
push(interpreter.copyOperation(insn, value1));
346346
push(interpreter.copyOperation(insn, value2));
347347
push(interpreter.copyOperation(insn, value1));
348348
break;
349349
}
350350
} else {
351-
push(value1);
351+
push(interpreter.copyOperation(insn, value1));
352352
push(interpreter.copyOperation(insn, value1));
353353
break;
354354
}
@@ -362,18 +362,18 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
362362
if (value3.getSize() == 1) {
363363
push(interpreter.copyOperation(insn, value2));
364364
push(interpreter.copyOperation(insn, value1));
365-
push(value3);
366-
push(value2);
367-
push(value1);
365+
push(interpreter.copyOperation(insn, value3));
366+
push(interpreter.copyOperation(insn, value2));
367+
push(interpreter.copyOperation(insn, value1));
368368
break;
369369
}
370370
}
371371
} else {
372372
value2 = pop();
373373
if (value2.getSize() == 1) {
374374
push(interpreter.copyOperation(insn, value1));
375-
push(value2);
376-
push(value1);
375+
push(interpreter.copyOperation(insn, value2));
376+
push(interpreter.copyOperation(insn, value1));
377377
break;
378378
}
379379
}
@@ -389,18 +389,18 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
389389
if (value4.getSize() == 1) {
390390
push(interpreter.copyOperation(insn, value2));
391391
push(interpreter.copyOperation(insn, value1));
392-
push(value4);
393-
push(value3);
394-
push(value2);
395-
push(value1);
392+
push(interpreter.copyOperation(insn, value4));
393+
push(interpreter.copyOperation(insn, value3));
394+
push(interpreter.copyOperation(insn, value2));
395+
push(interpreter.copyOperation(insn, value1));
396396
break;
397397
}
398398
} else {
399399
push(interpreter.copyOperation(insn, value2));
400400
push(interpreter.copyOperation(insn, value1));
401-
push(value3);
402-
push(value2);
403-
push(value1);
401+
push(interpreter.copyOperation(insn, value3));
402+
push(interpreter.copyOperation(insn, value2));
403+
push(interpreter.copyOperation(insn, value1));
404404
break;
405405
}
406406
}
@@ -410,15 +410,15 @@ public void execute(final AbstractInsnNode insn, final Interpreter<V> interprete
410410
value3 = pop();
411411
if (value3.getSize() == 1) {
412412
push(interpreter.copyOperation(insn, value1));
413-
push(value3);
414-
push(value2);
415-
push(value1);
413+
push(interpreter.copyOperation(insn, value3));
414+
push(interpreter.copyOperation(insn, value2));
415+
push(interpreter.copyOperation(insn, value1));
416416
break;
417417
}
418418
} else {
419419
push(interpreter.copyOperation(insn, value1));
420-
push(value2);
421-
push(value1);
420+
push(interpreter.copyOperation(insn, value2));
421+
push(interpreter.copyOperation(insn, value1));
422422
break;
423423
}
424424
}

0 commit comments

Comments
 (0)