Index: src/parsing/parser.cc |
diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc |
index e3063d8b1fc251ddc5b493391e5fbb858ad097ad..ab19fd202f3373ff178b865501832308c8c8de60 100644 |
--- a/src/parsing/parser.cc |
+++ b/src/parsing/parser.cc |
@@ -3007,9 +3007,9 @@ TryStatement* Parser::ParseTryStatement(bool* ok) { |
if (catch_block != NULL && finally_block != NULL) { |
// If we have both, create an inner try/catch. |
DCHECK(catch_scope != NULL && catch_variable != NULL); |
- TryCatchStatement* statement = |
- factory()->NewTryCatchStatement(try_block, catch_scope, catch_variable, |
- catch_block, RelocInfo::kNoPosition); |
+ TryCatchStatement* statement = factory()->NewTryCatchStatement( |
+ try_block, catch_scope, catch_variable, catch_block, true, |
+ RelocInfo::kNoPosition); |
try_block = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition); |
try_block->statements()->Add(statement, zone()); |
catch_block = NULL; // Clear to indicate it's been handled. |
@@ -3024,8 +3024,8 @@ TryStatement* Parser::ParseTryStatement(bool* ok) { |
DCHECK(finally_block == NULL); |
DCHECK(catch_scope != NULL && catch_variable != NULL); |
- result = factory()->NewTryCatchStatement(try_block, catch_scope, |
- catch_variable, catch_block, pos); |
+ result = factory()->NewTryCatchStatement( |
+ try_block, catch_scope, catch_variable, catch_block, true, pos); |
} else { |
DCHECK(finally_block != NULL); |
result = factory()->NewTryFinallyStatement(try_block, finally_block, pos); |
@@ -6058,7 +6058,7 @@ Expression* ParserTraits::RewriteYieldStar( |
Variable::NORMAL); |
try_catch = factory->NewTryCatchStatement( |
- try_block, catch_scope, catch_variable, catch_block, nopos); |
+ try_block, catch_scope, catch_variable, catch_block, true, nopos); |
} |
@@ -6464,7 +6464,7 @@ void ParserTraits::FinalizeIteratorUse(Variable* completion, |
// iterator_use |
// } catch(e) { |
// if (completion === kAbruptCompletion) completion = kThrowCompletion; |
- // throw e; |
+ // %ReThrow(e); |
// } |
// } finally { |
// if (condition) { |
@@ -6525,7 +6525,7 @@ void ParserTraits::FinalizeIteratorUse(Variable* completion, |
// try { #try_block } |
// catch(e) { |
// #set_completion_throw; |
- // throw e; |
+ // %ReThrow(e); |
// } |
Statement* try_catch; |
{ |
@@ -6535,10 +6535,14 @@ void ParserTraits::FinalizeIteratorUse(Variable* completion, |
kCreatedInitialized, Variable::NORMAL); |
Statement* rethrow; |
+ // We use %ReThrow rather than the ordinary throw because we want to |
+ // keep the original exception message. This is also why we create the |
+ // TryCatchStatement below with clear_pending_message set to false. |
{ |
- Expression* proxy = factory->NewVariableProxy(catch_variable); |
- rethrow = factory->NewExpressionStatement(factory->NewThrow(proxy, nopos), |
- nopos); |
+ auto args = new (zone) ZoneList<Expression*>(1, zone); |
+ args->Add(factory->NewVariableProxy(catch_variable), zone); |
+ rethrow = factory->NewExpressionStatement( |
+ factory->NewCallRuntime(Runtime::kReThrow, args, nopos), nopos); |
} |
Block* catch_block = factory->NewBlock(nullptr, 2, false, nopos); |
@@ -6546,7 +6550,7 @@ void ParserTraits::FinalizeIteratorUse(Variable* completion, |
catch_block->statements()->Add(rethrow, zone); |
try_catch = factory->NewTryCatchStatement( |
- iterator_use, catch_scope, catch_variable, catch_block, nopos); |
+ iterator_use, catch_scope, catch_variable, catch_block, false, nopos); |
} |
// try { #try_catch } finally { #maybe_close } |
@@ -6641,7 +6645,7 @@ void ParserTraits::BuildIteratorCloseForCompletion( |
Variable::NORMAL); |
try_call_return = factory->NewTryCatchStatement( |
- try_block, catch_scope, catch_variable, catch_block, nopos); |
+ try_block, catch_scope, catch_variable, catch_block, true, nopos); |
} |
// let output = %_Call(iteratorReturn, iterator); |
@@ -6741,7 +6745,7 @@ Statement* ParserTraits::FinalizeForOfStatement(ForOfStatement* loop, int pos) { |
// #loop; |
// } catch(e) { |
// if (completion === kAbruptCompletion) completion = kThrowCompletion; |
- // throw e; |
+ // %ReThrow(e); |
// } |
// } finally { |
// if (!(completion === kNormalCompletion || IS_UNDEFINED(#iterator))) { |