| OLD | NEW |
| 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 <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/ast/ast-expression-rewriter.h" | 10 #include "src/ast/ast-expression-rewriter.h" |
| (...skipping 1390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1401 for (int i = 0; i < names.length(); ++i) { | 1401 for (int i = 0; i < names.length(); ++i) { |
| 1402 // TODO(neis): Provide better location. | 1402 // TODO(neis): Provide better location. |
| 1403 descriptor->AddExport(names[i], names[i], scanner()->location(), zone()); | 1403 descriptor->AddExport(names[i], names[i], scanner()->location(), zone()); |
| 1404 } | 1404 } |
| 1405 | 1405 |
| 1406 DCHECK_NOT_NULL(result); | 1406 DCHECK_NOT_NULL(result); |
| 1407 return result; | 1407 return result; |
| 1408 } | 1408 } |
| 1409 | 1409 |
| 1410 VariableProxy* Parser::NewUnresolved(const AstRawString* name, int begin_pos, | 1410 VariableProxy* Parser::NewUnresolved(const AstRawString* name, int begin_pos, |
| 1411 int end_pos, Variable::Kind kind) { | 1411 int end_pos, VariableKind kind) { |
| 1412 return scope()->NewUnresolved(factory(), name, begin_pos, end_pos, kind); | 1412 return scope()->NewUnresolved(factory(), name, begin_pos, end_pos, kind); |
| 1413 } | 1413 } |
| 1414 | 1414 |
| 1415 VariableProxy* Parser::NewUnresolved(const AstRawString* name) { | 1415 VariableProxy* Parser::NewUnresolved(const AstRawString* name) { |
| 1416 return scope()->NewUnresolved(factory(), name, scanner()->location().beg_pos, | 1416 return scope()->NewUnresolved(factory(), name, scanner()->location().beg_pos, |
| 1417 scanner()->location().end_pos); | 1417 scanner()->location().end_pos); |
| 1418 } | 1418 } |
| 1419 | 1419 |
| 1420 Declaration* Parser::DeclareVariable(const AstRawString* name, | 1420 Declaration* Parser::DeclareVariable(const AstRawString* name, |
| 1421 VariableMode mode, int pos, bool* ok) { | 1421 VariableMode mode, int pos, bool* ok) { |
| (...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2140 const AstRawString* name = ast_value_factory()->dot_catch_string(); | 2140 const AstRawString* name = ast_value_factory()->dot_catch_string(); |
| 2141 Expression* pattern = nullptr; | 2141 Expression* pattern = nullptr; |
| 2142 if (peek_any_identifier()) { | 2142 if (peek_any_identifier()) { |
| 2143 name = ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); | 2143 name = ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); |
| 2144 } else { | 2144 } else { |
| 2145 ExpressionClassifier pattern_classifier(this); | 2145 ExpressionClassifier pattern_classifier(this); |
| 2146 pattern = ParsePrimaryExpression(CHECK_OK); | 2146 pattern = ParsePrimaryExpression(CHECK_OK); |
| 2147 ValidateBindingPattern(CHECK_OK); | 2147 ValidateBindingPattern(CHECK_OK); |
| 2148 } | 2148 } |
| 2149 catch_variable = catch_scope->DeclareLocal( | 2149 catch_variable = catch_scope->DeclareLocal( |
| 2150 name, VAR, kCreatedInitialized, Variable::NORMAL); | 2150 name, VAR, kCreatedInitialized, NORMAL_VARIABLE); |
| 2151 | 2151 |
| 2152 Expect(Token::RPAREN, CHECK_OK); | 2152 Expect(Token::RPAREN, CHECK_OK); |
| 2153 | 2153 |
| 2154 ZoneList<const AstRawString*> bound_names(1, zone()); | 2154 ZoneList<const AstRawString*> bound_names(1, zone()); |
| 2155 if (pattern != nullptr) { | 2155 if (pattern != nullptr) { |
| 2156 DeclarationDescriptor descriptor; | 2156 DeclarationDescriptor descriptor; |
| 2157 descriptor.declaration_kind = DeclarationDescriptor::NORMAL; | 2157 descriptor.declaration_kind = DeclarationDescriptor::NORMAL; |
| 2158 descriptor.scope = scope(); | 2158 descriptor.scope = scope(); |
| 2159 descriptor.hoist_scope = nullptr; | 2159 descriptor.hoist_scope = nullptr; |
| 2160 descriptor.mode = LET; | 2160 descriptor.mode = LET; |
| (...skipping 1648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3809 BuildDotDebugIsActive(), debug_push_promise, | 3809 BuildDotDebugIsActive(), debug_push_promise, |
| 3810 factory()->NewEmptyStatement(kNoSourcePosition), kNoSourcePosition); | 3810 factory()->NewEmptyStatement(kNoSourcePosition), kNoSourcePosition); |
| 3811 } | 3811 } |
| 3812 result->statements()->Add(conditionally_debug_push_promise, zone()); | 3812 result->statements()->Add(conditionally_debug_push_promise, zone()); |
| 3813 | 3813 |
| 3814 // catch (.catch) { return %RejectPromise(.promise, .catch), .promise } | 3814 // catch (.catch) { return %RejectPromise(.promise, .catch), .promise } |
| 3815 Scope* catch_scope = NewScope(CATCH_SCOPE); | 3815 Scope* catch_scope = NewScope(CATCH_SCOPE); |
| 3816 catch_scope->set_is_hidden(); | 3816 catch_scope->set_is_hidden(); |
| 3817 Variable* catch_variable = | 3817 Variable* catch_variable = |
| 3818 catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR, | 3818 catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR, |
| 3819 kCreatedInitialized, Variable::NORMAL); | 3819 kCreatedInitialized, NORMAL_VARIABLE); |
| 3820 Block* catch_block = factory()->NewBlock(nullptr, 1, true, kNoSourcePosition); | 3820 Block* catch_block = factory()->NewBlock(nullptr, 1, true, kNoSourcePosition); |
| 3821 | 3821 |
| 3822 Expression* promise_reject = BuildRejectPromise( | 3822 Expression* promise_reject = BuildRejectPromise( |
| 3823 factory()->NewVariableProxy(catch_variable), kNoSourcePosition); | 3823 factory()->NewVariableProxy(catch_variable), kNoSourcePosition); |
| 3824 ReturnStatement* return_promise_reject = | 3824 ReturnStatement* return_promise_reject = |
| 3825 factory()->NewReturnStatement(promise_reject, kNoSourcePosition); | 3825 factory()->NewReturnStatement(promise_reject, kNoSourcePosition); |
| 3826 catch_block->statements()->Add(return_promise_reject, zone()); | 3826 catch_block->statements()->Add(return_promise_reject, zone()); |
| 3827 | 3827 |
| 3828 TryStatement* try_catch_statement = factory()->NewTryCatchStatement( | 3828 TryStatement* try_catch_statement = factory()->NewTryCatchStatement( |
| 3829 inner_block, catch_scope, catch_variable, catch_block, kNoSourcePosition); | 3829 inner_block, catch_scope, catch_variable, catch_block, kNoSourcePosition); |
| (...skipping 1596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5426 Block* try_block = factory()->NewBlock(nullptr, 2, false, nopos); | 5426 Block* try_block = factory()->NewBlock(nullptr, 2, false, nopos); |
| 5427 try_block->statements()->Add(yield_output, zone()); | 5427 try_block->statements()->Add(yield_output, zone()); |
| 5428 try_block->statements()->Add(set_mode_next, zone()); | 5428 try_block->statements()->Add(set_mode_next, zone()); |
| 5429 | 5429 |
| 5430 Block* catch_block = factory()->NewBlock(nullptr, 1, false, nopos); | 5430 Block* catch_block = factory()->NewBlock(nullptr, 1, false, nopos); |
| 5431 catch_block->statements()->Add(set_mode_throw, zone()); | 5431 catch_block->statements()->Add(set_mode_throw, zone()); |
| 5432 | 5432 |
| 5433 Scope* catch_scope = NewScope(CATCH_SCOPE); | 5433 Scope* catch_scope = NewScope(CATCH_SCOPE); |
| 5434 catch_scope->set_is_hidden(); | 5434 catch_scope->set_is_hidden(); |
| 5435 const AstRawString* name = ast_value_factory()->dot_catch_string(); | 5435 const AstRawString* name = ast_value_factory()->dot_catch_string(); |
| 5436 Variable* catch_variable = | 5436 Variable* catch_variable = catch_scope->DeclareLocal( |
| 5437 catch_scope->DeclareLocal(name, VAR, kCreatedInitialized, | 5437 name, VAR, kCreatedInitialized, NORMAL_VARIABLE); |
| 5438 Variable::NORMAL); | |
| 5439 | 5438 |
| 5440 try_catch = factory()->NewTryCatchStatementForDesugaring( | 5439 try_catch = factory()->NewTryCatchStatementForDesugaring( |
| 5441 try_block, catch_scope, catch_variable, catch_block, nopos); | 5440 try_block, catch_scope, catch_variable, catch_block, nopos); |
| 5442 } | 5441 } |
| 5443 | 5442 |
| 5444 // try { ... } finally { ... } | 5443 // try { ... } finally { ... } |
| 5445 Statement* try_finally; | 5444 Statement* try_finally; |
| 5446 { | 5445 { |
| 5447 Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos); | 5446 Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos); |
| 5448 try_block->statements()->Add(try_catch, zone()); | 5447 try_block->statements()->Add(try_catch, zone()); |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5715 // try { #try_block } | 5714 // try { #try_block } |
| 5716 // catch(e) { | 5715 // catch(e) { |
| 5717 // #set_completion_throw; | 5716 // #set_completion_throw; |
| 5718 // %ReThrow(e); | 5717 // %ReThrow(e); |
| 5719 // } | 5718 // } |
| 5720 Statement* try_catch; | 5719 Statement* try_catch; |
| 5721 { | 5720 { |
| 5722 Scope* catch_scope = NewScopeWithParent(scope(), CATCH_SCOPE); | 5721 Scope* catch_scope = NewScopeWithParent(scope(), CATCH_SCOPE); |
| 5723 Variable* catch_variable = | 5722 Variable* catch_variable = |
| 5724 catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR, | 5723 catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR, |
| 5725 kCreatedInitialized, Variable::NORMAL); | 5724 kCreatedInitialized, NORMAL_VARIABLE); |
| 5726 catch_scope->set_is_hidden(); | 5725 catch_scope->set_is_hidden(); |
| 5727 | 5726 |
| 5728 Statement* rethrow; | 5727 Statement* rethrow; |
| 5729 // We use %ReThrow rather than the ordinary throw because we want to | 5728 // We use %ReThrow rather than the ordinary throw because we want to |
| 5730 // preserve the original exception message. This is also why we create a | 5729 // preserve the original exception message. This is also why we create a |
| 5731 // TryCatchStatementForReThrow below (which does not clear the pending | 5730 // TryCatchStatementForReThrow below (which does not clear the pending |
| 5732 // message), rather than a TryCatchStatement. | 5731 // message), rather than a TryCatchStatement. |
| 5733 { | 5732 { |
| 5734 auto args = new (zone()) ZoneList<Expression*>(1, zone()); | 5733 auto args = new (zone()) ZoneList<Expression*>(1, zone()); |
| 5735 args->Add(factory()->NewVariableProxy(catch_variable), zone()); | 5734 args->Add(factory()->NewVariableProxy(catch_variable), zone()); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5821 | 5820 |
| 5822 Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos); | 5821 Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos); |
| 5823 try_block->statements()->Add(factory()->NewExpressionStatement(call, nopos), | 5822 try_block->statements()->Add(factory()->NewExpressionStatement(call, nopos), |
| 5824 zone()); | 5823 zone()); |
| 5825 | 5824 |
| 5826 Block* catch_block = factory()->NewBlock(nullptr, 0, false, nopos); | 5825 Block* catch_block = factory()->NewBlock(nullptr, 0, false, nopos); |
| 5827 | 5826 |
| 5828 Scope* catch_scope = NewScope(CATCH_SCOPE); | 5827 Scope* catch_scope = NewScope(CATCH_SCOPE); |
| 5829 Variable* catch_variable = | 5828 Variable* catch_variable = |
| 5830 catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR, | 5829 catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR, |
| 5831 kCreatedInitialized, Variable::NORMAL); | 5830 kCreatedInitialized, NORMAL_VARIABLE); |
| 5832 catch_scope->set_is_hidden(); | 5831 catch_scope->set_is_hidden(); |
| 5833 | 5832 |
| 5834 try_call_return = factory()->NewTryCatchStatement( | 5833 try_call_return = factory()->NewTryCatchStatement( |
| 5835 try_block, catch_scope, catch_variable, catch_block, nopos); | 5834 try_block, catch_scope, catch_variable, catch_block, nopos); |
| 5836 } | 5835 } |
| 5837 | 5836 |
| 5838 // let output = %_Call(iteratorReturn, iterator); | 5837 // let output = %_Call(iteratorReturn, iterator); |
| 5839 // if (!IS_RECEIVER(output)) { | 5838 // if (!IS_RECEIVER(output)) { |
| 5840 // %ThrowIteratorResultNotAnObject(output); | 5839 // %ThrowIteratorResultNotAnObject(output); |
| 5841 // } | 5840 // } |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5975 node->Print(Isolate::Current()); | 5974 node->Print(Isolate::Current()); |
| 5976 } | 5975 } |
| 5977 #endif // DEBUG | 5976 #endif // DEBUG |
| 5978 | 5977 |
| 5979 #undef CHECK_OK | 5978 #undef CHECK_OK |
| 5980 #undef CHECK_OK_VOID | 5979 #undef CHECK_OK_VOID |
| 5981 #undef CHECK_FAILED | 5980 #undef CHECK_FAILED |
| 5982 | 5981 |
| 5983 } // namespace internal | 5982 } // namespace internal |
| 5984 } // namespace v8 | 5983 } // namespace v8 |
| OLD | NEW |