case OPCODE_DUP: { // dup
evalMachine.push(evalMachine.peek());
break;
}
case OPCODE_DUP_X1: { // dup_x1
Expression op1 = evalMachine.pop();
Expression op2 = evalMachine.pop();
evalMachine.push(op1);
evalMachine.push(op2);
evalMachine.push((Expression) op1.clone());
break;
}
case OPCODE_DUP_X2: { // dup_x2
Expression op1 = evalMachine.pop();
Expression op2 = evalMachine.pop();
if (op2.isCategory1()) {
// Cat.1
Expression op3 = evalMachine.pop();
evalMachine.push((Expression) op1.clone());
evalMachine.push(op3);
} else {
// Cat.2
evalMachine.push((Expression) op1.clone());
}
evalMachine.push(op2);
evalMachine.push(op1);
break;
}
case OPCODE_DUP2: { // dup2
Expression op1 = evalMachine.pop();
if (op1.isCategory1()) {
// Cat.1
Expression op2 = evalMachine.pop();
evalMachine.push(op2);
evalMachine.push(op1);
evalMachine.push((Expression) op2.clone());
} else {
// Cat.2
evalMachine.push(op1);
}
evalMachine.push(op1);
break;
}
case OPCODE_DUP2_X1: { // dup2_x1
Expression op1 = evalMachine.pop();
Expression op2 = evalMachine.pop();
if (op1.isCategory1()) {
// Cat.1
Expression op3 = evalMachine.pop();
evalMachine.push(op2);
evalMachine.push(op1);
evalMachine.push(op3);
evalMachine.push((Expression) op2.clone());
} else {
// Cat.2
evalMachine.push(op1);
evalMachine.push(op2);
}
evalMachine.push((Expression) op1.clone());
break;
}
case OPCODE_DUP2_X2: { // dup2_x2
Expression op1 = evalMachine.pop();
Expression op2 = evalMachine.pop();
if (op1.isCategory1()) {
// value1-Cat1
Expression op3 = evalMachine.pop();
if (op2.isCategory1()) {
// value2-Cat1
Expression op4 = evalMachine.pop();
evalMachine.push(op2);
evalMachine.push(op1);
evalMachine.push(op4);
// Form 1.
} else {
// value2-Cat2
evalMachine.push(op2);
evalMachine.push(op1);
// Form. 3
}
evalMachine.push(op3);
} else {
// value1-Cat2
if (op2.isCategory1()) {
// value2-Cat1
Expression op3 = evalMachine.pop();
evalMachine.push(op1);
evalMachine.push(op3);
// Form. 2
} else {
// value2-Cat2
evalMachine.push(op1);
// Form 4.
}
}
evalMachine.push(op2);
evalMachine.push(op1);
break;
}
case OPCODE_SWAP: { // swap
Expression op1 = evalMachine.pop();
Expression op2 = evalMachine.pop();
evalMachine.push(op1);
evalMachine.push(op2);
break;
}
}