diff --git a/rhino/src/main/java/org/mozilla/javascript/Icode.java b/rhino/src/main/java/org/mozilla/javascript/Icode.java index 8e87db775f..ed8bc8f188 100644 --- a/rhino/src/main/java/org/mozilla/javascript/Icode.java +++ b/rhino/src/main/java/org/mozilla/javascript/Icode.java @@ -20,8 +20,11 @@ abstract class Icode { // Stack: ... value2 value1 -> ... value2 value1 value2 value1 Icode_DUP2 = Icode_DUP - 1, + // Stack: ... value2 value1 -> ... value1 value2 + Icode_SWAP = Icode_DUP2 - 1, + // Stack: ... value1 -> ... - Icode_POP = Icode_DUP2 - 1, + Icode_POP = Icode_SWAP - 1, // Store stack top into return register and then pop it Icode_POP_RESULT = Icode_POP - 1, @@ -179,6 +182,8 @@ static String bytecodeName(int bytecode) { return "DUP"; case Icode_DUP2: return "DUP2"; + case Icode_SWAP: + return "SWAP"; case Icode_POP: return "POP"; case Icode_POP_RESULT: diff --git a/rhino/src/main/java/org/mozilla/javascript/Interpreter.java b/rhino/src/main/java/org/mozilla/javascript/Interpreter.java index 25ac7db4d8..cbd6dd8ced 100644 --- a/rhino/src/main/java/org/mozilla/javascript/Interpreter.java +++ b/rhino/src/main/java/org/mozilla/javascript/Interpreter.java @@ -1539,6 +1539,16 @@ private static Object interpretLoop(Context cx, CallFrame frame, Object throwabl sDbl[stackTop + 2] = sDbl[stackTop]; stackTop += 2; continue Loop; + case Icode_SWAP: + { + Object o = stack[stackTop]; + stack[stackTop] = stack[stackTop - 1]; + stack[stackTop - 1] = o; + double d = sDbl[stackTop]; + sDbl[stackTop] = sDbl[stackTop - 1]; + sDbl[stackTop - 1] = d; + continue Loop; + } case Token.RETURN: frame.result = stack[stackTop]; frame.resultDbl = sDbl[stackTop];