From b3858c8fdb76b8111b724138ab2c1daa729140a9 Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Fri, 22 May 2015 19:02:40 -0700 Subject: [PATCH] Bug 1167823 - Handle try/catch by kind when checking for side effects. r=shu --HG-- extra : rebase_source : e222ce50ece9f9bbfdfda1f3814fda7549e4934e --- js/src/frontend/BytecodeEmitter.cpp | 35 +++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp index 772baa8f702b..23326f148793 100644 --- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -2187,6 +2187,39 @@ BytecodeEmitter::checkSideEffects(ParseNode* pn, bool* answer) *answer = true; return true; + case PNK_TRY: + MOZ_ASSERT(pn->isArity(PN_TERNARY)); + if (!checkSideEffects(pn->pn_kid1, answer)) + return false; + if (*answer) + return true; + if (ParseNode* catchList = pn->pn_kid2) { + MOZ_ASSERT(catchList->isKind(PNK_CATCHLIST)); + if (!checkSideEffects(catchList, answer)) + return false; + if (*answer) + return true; + } + if (ParseNode* finallyBlock = pn->pn_kid3) { + if (!checkSideEffects(finallyBlock, answer)) + return false; + } + return true; + + case PNK_CATCH: + MOZ_ASSERT(pn->isArity(PN_TERNARY)); + if (!checkSideEffects(pn->pn_kid1, answer)) + return false; + if (*answer) + return true; + if (ParseNode* cond = pn->pn_kid2) { + if (!checkSideEffects(cond, answer)) + return false; + if (*answer) + return true; + } + return checkSideEffects(pn->pn_kid3, answer); + case PNK_EXPORT_BATCH_SPEC: case PNK_FRESHENBLOCK: case PNK_SHORTHAND: @@ -2197,7 +2230,6 @@ BytecodeEmitter::checkSideEffects(ParseNode* pn, bool* answer) case PNK_CLASSNAMES: case PNK_RETURN: case PNK_CLASS: - case PNK_TRY: case PNK_GENEXP: case PNK_STATEMENTLIST: case PNK_ARGSBODY: @@ -2211,7 +2243,6 @@ BytecodeEmitter::checkSideEffects(ParseNode* pn, bool* answer) case PNK_LEXICALSCOPE: case PNK_NAME: case PNK_FUNCTION: - case PNK_CATCH: case PNK_EXPORT_SPEC: case PNK_IMPORT_SPEC: case PNK_CALLSITEOBJ: