Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(856)

Unified Diff: src/parsing/parser.cc

Issue 1842953003: Preserve exception message in iterator finalization. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Turbofan Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/parsing/parser.cc
diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
index e3063d8b1fc251ddc5b493391e5fbb858ad097ad..2d12d84d97f881bf776313cc49827caf738fd47e 100644
--- a/src/parsing/parser.cc
+++ b/src/parsing/parser.cc
@@ -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,17 +6535,22 @@ void ParserTraits::FinalizeIteratorUse(Variable* completion,
kCreatedInitialized, Variable::NORMAL);
Statement* rethrow;
+ // We use %ReThrow rather than the ordinary throw because we want to
+ // preserve the original exception message. This is also why we create a
+ // TryCatchStatementForReThrow below (which does not clear the pending
+ // message), rather than a TryCatchStatement.
{
- 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);
catch_block->statements()->Add(set_completion_throw, zone);
catch_block->statements()->Add(rethrow, zone);
- try_catch = factory->NewTryCatchStatement(
+ try_catch = factory->NewTryCatchStatementForReThrow(
iterator_use, catch_scope, catch_variable, catch_block, nopos);
}
@@ -6741,7 +6746,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))) {

Powered by Google App Engine
This is Rietveld 408576698