diff --git a/js2/src/js2engine.cpp b/js2/src/js2engine.cpp
index 25b33908a6fa..a601a077d557 100644
--- a/js2/src/js2engine.cpp
+++ b/js2/src/js2engine.cpp
@@ -471,7 +471,6 @@ namespace MetaData {
case eBracketDelete:
return -1; // pop base and index, push boolean result
- case eStop:
case eReturnVoid:
case eBranch:
return 0;
diff --git a/js2/src/js2engine.h b/js2/src/js2engine.h
index eeb0efb8d931..fd13a2f5bb49 100644
--- a/js2/src/js2engine.h
+++ b/js2/src/js2engine.h
@@ -111,7 +111,6 @@ enum JS2Op {
eBracketWriteRef,
eBracketDelete,
- eStop,
eReturn,
eReturnVoid,
ePushFrame, //
@@ -280,7 +279,7 @@ public:
};
std::stack mTryStack;
- std::stack mSubStack;
+ std::stack finallyStack;
void pushHandler(uint8 *pc);
void popHandler();
diff --git a/js2/src/js2op_flowcontrol.cpp b/js2/src/js2op_flowcontrol.cpp
index 856ab93dbcd0..c4158c035c9a 100644
--- a/js2/src/js2op_flowcontrol.cpp
+++ b/js2/src/js2op_flowcontrol.cpp
@@ -143,18 +143,18 @@
case eCallFinally:
{
+ int32 finallyOffset = BytecodeContainer::getOffset(pc);
+ uint8 *tgt = pc + finallyOffset;
+ pc += sizeof(int32);
+ finallyStack.push(pc);
+ pc = tgt;
}
break;
case eReturnFinally:
{
- }
- break;
-
- case eStop:
- {
-
- return retval;
+ pc = finallyStack.top();
+ finallyStack.pop();
}
break;
\ No newline at end of file