01: package net.sf.jdec.jvminstructions.commands;
02:
03: import net.sf.jdec.core.GlobalVariableStore;
04: import net.sf.jdec.core.JvmOpCodes;
05: import net.sf.jdec.core.Operand;
06: import net.sf.jdec.core.OperandStack;
07: import net.sf.jdec.reflection.Behaviour;
08:
09: public class Dup2x2Command extends AbstractInstructionCommand {
10:
11: public Dup2x2Command(Behaviour context) {
12: super (context);
13:
14: }
15:
16: public int getSkipBytes() {
17: return 0;
18: }
19:
20: public void execute() {
21: OperandStack stack = getStack();
22: int currentForIndex = getCurrentInstPosInCode();
23: Operand op1 = (Operand) stack.pop();
24: Operand op2 = (Operand) stack.pop();
25: Operand op3 = (Operand) stack.pop();
26: boolean doNotPop = GlobalVariableStore.isDoNotPop();
27: Operand op4 = null;
28: if (stack.size() > 0) {
29: op4 = stack.getTopOfStack();
30: }
31:
32: int next = currentForIndex + 1;
33: int prev = currentForIndex - 1;
34: byte[] code = getCode();
35: boolean specialCase = false;
36: if (code[next] == JvmOpCodes.DASTORE) {
37: if (code[prev] == JvmOpCodes.DADD
38: || code[prev] == JvmOpCodes.DSUB) {
39: specialCase = true;
40: }
41: }
42: if (!specialCase) {
43: if (code[next] == JvmOpCodes.LASTORE) {
44: if (code[prev] == JvmOpCodes.LADD
45: || code[prev] == JvmOpCodes.LSUB) {
46: specialCase = true;
47: }
48: }
49: }
50:
51: if (!specialCase) {
52: // stack.push(op2);
53: stack.push(op1);
54: if (op4 != null)
55: stack.push(op4);
56: stack.push(op3);
57: stack.push(op2);
58: stack.push(op1);
59: if (doNotPop) {
60: doNotPop = false;
61: }
62:
63: } else {
64:
65: // stack.push(op3);
66: // if(op4!=null)
67: // stack.push(op4);
68: java.lang.String temp = op3.getOperandValue() + "["
69: + op2.getOperandValue() + "]";
70: Operand otemp = new Operand();
71: otemp.setOperandValue(temp);
72: stack.push(otemp);
73: stack.push(op3);
74: stack.push(op2);
75: stack.push(op1);
76: if (doNotPop) {
77: doNotPop = false;
78: }
79: }
80: GlobalVariableStore.setDoNotPop(doNotPop);
81: }
82:
83: }
|