diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/IRFactory.java b/mozilla/js/rhino/src/org/mozilla/javascript/IRFactory.java index 36dff31db7a..ac82be3190e 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/IRFactory.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/IRFactory.java @@ -530,15 +530,7 @@ public class IRFactory { if (hasFinally) { pn.addChildToBack(finallyTarget); - Node returnTemp = createNewLocal(new Node(Token.EMPTY)); - Node popAndMake = new Node(Token.POP, returnTemp); - pn.addChildToBack(popAndMake); - pn.addChildToBack(finallyNode); - Node ret = createUseLocal(returnTemp); - - // add the magic prop that makes it output a RET - ret.putProp(Node.TARGET_PROP, Boolean.TRUE); - pn.addChildToBack(ret); + pn.addChildToBack(new Node(Token.FINALLY, finallyNode)); } pn.addChildToBack(endTarget); return pn; diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/Interpreter.java b/mozilla/js/rhino/src/org/mozilla/javascript/Interpreter.java index c6839998a44..c51416186cf 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/Interpreter.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/Interpreter.java @@ -368,7 +368,7 @@ public class Interpreter case Token.SWITCH : { iCodeTop = updateLineNumber(node, iCodeTop); iCodeTop = generateICode(child, iCodeTop); - int theLocalSlot = itsData.itsMaxLocals++; + int theLocalSlot = allocateLocal(); iCodeTop = addToken(Token.NEWTEMP, iCodeTop); iCodeTop = addByte(theLocalSlot, iCodeTop); iCodeTop = addToken(Token.POP, iCodeTop); @@ -466,14 +466,10 @@ public class Interpreter } case Token.USELOCAL : { - if (node.getProp(Node.TARGET_PROP) != null) { - iCodeTop = addIcode(Icode_RETSUB, iCodeTop); - } else { - iCodeTop = addToken(Token.USETEMP, iCodeTop); - itsStackDepth++; - if (itsStackDepth > itsData.itsMaxStack) - itsData.itsMaxStack = itsStackDepth; - } + iCodeTop = addToken(Token.USETEMP, iCodeTop); + itsStackDepth++; + if (itsStackDepth > itsData.itsMaxStack) + itsData.itsMaxStack = itsStackDepth; Node temp = (Node) node.getProp(Node.LOCAL_PROP); iCodeTop = addLocalRef(temp, iCodeTop); break; @@ -506,6 +502,22 @@ public class Interpreter break; } + case Token.FINALLY : { + int finallyRegister = allocateLocal(); + iCodeTop = addToken(Token.NEWTEMP, iCodeTop); + iCodeTop = addByte(finallyRegister, iCodeTop); + iCodeTop = addToken(Token.POP, iCodeTop); + itsStackDepth--; + while (child != null) { + iCodeTop = generateICode(child, iCodeTop); + child = child.getNext(); + } + iCodeTop = addIcode(Icode_RETSUB, iCodeTop); + iCodeTop = addByte(finallyRegister, iCodeTop); + releaseLocal(finallyRegister); + break; + } + case Token.AND : { iCodeTop = generateICode(child, iCodeTop); iCodeTop = addIcode(Icode_DUP, iCodeTop); @@ -986,15 +998,22 @@ public class Interpreter { int theLocalSlot = node.getIntProp(Node.LOCAL_PROP, -1); if (theLocalSlot == -1) { - theLocalSlot = itsData.itsMaxLocals++; + theLocalSlot = allocateLocal(); node.putIntProp(Node.LOCAL_PROP, theLocalSlot); } iCodeTop = addByte(theLocalSlot, iCodeTop); - if (theLocalSlot >= itsData.itsMaxLocals) - itsData.itsMaxLocals = theLocalSlot + 1; return iCodeTop; } + private int allocateLocal() + { + return itsData.itsMaxLocals++; + } + + private void releaseLocal(int local) + { + } + private int getTargetLabel(Node target) { int targetLabel = target.getIntProp(Node.LABEL_PROP, -1); if (targetLabel == -1) { diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/optimizer/Codegen.java b/mozilla/js/rhino/src/org/mozilla/javascript/optimizer/Codegen.java index a366875b9ce..b160f14f312 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/optimizer/Codegen.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/optimizer/Codegen.java @@ -1575,6 +1575,10 @@ class BodyCodegen visitGOTO(node, type, child); break; + case Token.FINALLY: + visitFinally(node, child); + break; + case Token.NOT: { int trueTarget = cfw.acquireLabel(); int falseTarget = cfw.acquireLabel(); @@ -2046,6 +2050,19 @@ class BodyCodegen cfw.markLabel(fallThruLabel); } + private void visitFinally(Node node, Node child) + { + //Save return address in a new local where + int finallyRegister = getNewWordLocal(); + cfw.addAStore(finallyRegister); + while (child != null) { + generateCodeFromNode(child, node); + child = child.getNext(); + } + cfw.add(ByteCode.RET, finallyRegister); + releaseWordLocal((short)finallyRegister); + } + private void visitEnumInit(Node node, Node child) { while (child != null) { @@ -3766,13 +3783,7 @@ class BodyCodegen } Node temp = (Node) node.getProp(Node.LOCAL_PROP); short local = getLocalFromNode(temp); - - // if the temp node has a magic TARGET property, - // treat it as a RET to that temp. - if (node.getProp(Node.TARGET_PROP) != null) - cfw.add(ByteCode.RET, local); - else - cfw.addALoad(local); + cfw.addALoad(local); } private void addScriptRuntimeInvoke(String methodName,