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

Side by Side 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, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/parsing/parser.h" 5 #include "src/parsing/parser.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast/ast.h" 8 #include "src/ast/ast.h"
9 #include "src/ast/ast-expression-rewriter.h" 9 #include "src/ast/ast-expression-rewriter.h"
10 #include "src/ast/ast-expression-visitor.h" 10 #include "src/ast/ast-expression-visitor.h"
(...skipping 6446 matching lines...) Expand 10 before | Expand all | Expand 10 after
6457 // 6457 //
6458 // This function adds two statements to [target], corresponding to the 6458 // This function adds two statements to [target], corresponding to the
6459 // following code: 6459 // following code:
6460 // 6460 //
6461 // completion = kNormalCompletion; 6461 // completion = kNormalCompletion;
6462 // try { 6462 // try {
6463 // try { 6463 // try {
6464 // iterator_use 6464 // iterator_use
6465 // } catch(e) { 6465 // } catch(e) {
6466 // if (completion === kAbruptCompletion) completion = kThrowCompletion; 6466 // if (completion === kAbruptCompletion) completion = kThrowCompletion;
6467 // throw e; 6467 // %ReThrow(e);
6468 // } 6468 // }
6469 // } finally { 6469 // } finally {
6470 // if (condition) { 6470 // if (condition) {
6471 // #BuildIteratorCloseForCompletion(iter, completion) 6471 // #BuildIteratorCloseForCompletion(iter, completion)
6472 // } 6472 // }
6473 // } 6473 // }
6474 // 6474 //
6475 6475
6476 const int nopos = RelocInfo::kNoPosition; 6476 const int nopos = RelocInfo::kNoPosition;
6477 auto factory = parser_->factory(); 6477 auto factory = parser_->factory();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
6518 maybe_close = factory->NewBlock(nullptr, 1, true, nopos); 6518 maybe_close = factory->NewBlock(nullptr, 1, true, nopos);
6519 maybe_close->statements()->Add( 6519 maybe_close->statements()->Add(
6520 factory->NewIfStatement(condition, block, 6520 factory->NewIfStatement(condition, block,
6521 factory->NewEmptyStatement(nopos), nopos), 6521 factory->NewEmptyStatement(nopos), nopos),
6522 zone); 6522 zone);
6523 } 6523 }
6524 6524
6525 // try { #try_block } 6525 // try { #try_block }
6526 // catch(e) { 6526 // catch(e) {
6527 // #set_completion_throw; 6527 // #set_completion_throw;
6528 // throw e; 6528 // %ReThrow(e);
6529 // } 6529 // }
6530 Statement* try_catch; 6530 Statement* try_catch;
6531 { 6531 {
6532 Scope* catch_scope = parser_->NewScope(scope, CATCH_SCOPE); 6532 Scope* catch_scope = parser_->NewScope(scope, CATCH_SCOPE);
6533 Variable* catch_variable = 6533 Variable* catch_variable =
6534 catch_scope->DeclareLocal(avfactory->dot_catch_string(), VAR, 6534 catch_scope->DeclareLocal(avfactory->dot_catch_string(), VAR,
6535 kCreatedInitialized, Variable::NORMAL); 6535 kCreatedInitialized, Variable::NORMAL);
6536 6536
6537 Statement* rethrow; 6537 Statement* rethrow;
6538 // We use %ReThrow rather than the ordinary throw because we want to
6539 // preserve the original exception message. This is also why we create a
6540 // TryCatchStatementForReThrow below (which does not clear the pending
6541 // message), rather than a TryCatchStatement.
6538 { 6542 {
6539 Expression* proxy = factory->NewVariableProxy(catch_variable); 6543 auto args = new (zone) ZoneList<Expression*>(1, zone);
6540 rethrow = factory->NewExpressionStatement(factory->NewThrow(proxy, nopos), 6544 args->Add(factory->NewVariableProxy(catch_variable), zone);
6541 nopos); 6545 rethrow = factory->NewExpressionStatement(
6546 factory->NewCallRuntime(Runtime::kReThrow, args, nopos), nopos);
6542 } 6547 }
6543 6548
6544 Block* catch_block = factory->NewBlock(nullptr, 2, false, nopos); 6549 Block* catch_block = factory->NewBlock(nullptr, 2, false, nopos);
6545 catch_block->statements()->Add(set_completion_throw, zone); 6550 catch_block->statements()->Add(set_completion_throw, zone);
6546 catch_block->statements()->Add(rethrow, zone); 6551 catch_block->statements()->Add(rethrow, zone);
6547 6552
6548 try_catch = factory->NewTryCatchStatement( 6553 try_catch = factory->NewTryCatchStatementForReThrow(
6549 iterator_use, catch_scope, catch_variable, catch_block, nopos); 6554 iterator_use, catch_scope, catch_variable, catch_block, nopos);
6550 } 6555 }
6551 6556
6552 // try { #try_catch } finally { #maybe_close } 6557 // try { #try_catch } finally { #maybe_close }
6553 Statement* try_finally; 6558 Statement* try_finally;
6554 { 6559 {
6555 Block* try_block = factory->NewBlock(nullptr, 1, false, nopos); 6560 Block* try_block = factory->NewBlock(nullptr, 1, false, nopos);
6556 try_block->statements()->Add(try_catch, zone); 6561 try_block->statements()->Add(try_catch, zone);
6557 6562
6558 try_finally = 6563 try_finally =
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
6734 // 6739 //
6735 // This function replaces the loop with the following wrapping: 6740 // This function replaces the loop with the following wrapping:
6736 // 6741 //
6737 // let each; 6742 // let each;
6738 // let completion = kNormalCompletion; 6743 // let completion = kNormalCompletion;
6739 // try { 6744 // try {
6740 // try { 6745 // try {
6741 // #loop; 6746 // #loop;
6742 // } catch(e) { 6747 // } catch(e) {
6743 // if (completion === kAbruptCompletion) completion = kThrowCompletion; 6748 // if (completion === kAbruptCompletion) completion = kThrowCompletion;
6744 // throw e; 6749 // %ReThrow(e);
6745 // } 6750 // }
6746 // } finally { 6751 // } finally {
6747 // if (!(completion === kNormalCompletion || IS_UNDEFINED(#iterator))) { 6752 // if (!(completion === kNormalCompletion || IS_UNDEFINED(#iterator))) {
6748 // #BuildIteratorCloseForCompletion(#iterator, completion) 6753 // #BuildIteratorCloseForCompletion(#iterator, completion)
6749 // } 6754 // }
6750 // } 6755 // }
6751 // 6756 //
6752 // where the loop's body is wrapped as follows: 6757 // where the loop's body is wrapped as follows:
6753 // 6758 //
6754 // { 6759 // {
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
6859 try_block, target); 6864 try_block, target);
6860 final_loop = target; 6865 final_loop = target;
6861 } 6866 }
6862 6867
6863 return final_loop; 6868 return final_loop;
6864 } 6869 }
6865 6870
6866 6871
6867 } // namespace internal 6872 } // namespace internal
6868 } // namespace v8 6873 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698