| 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 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 471 VariableProxy* new_target_proxy = | 471 VariableProxy* new_target_proxy = |
| 472 NewUnresolved(ast_value_factory()->new_target_string(), pos); | 472 NewUnresolved(ast_value_factory()->new_target_string(), pos); |
| 473 VariableProxy* this_function_proxy = | 473 VariableProxy* this_function_proxy = |
| 474 NewUnresolved(ast_value_factory()->this_function_string(), pos); | 474 NewUnresolved(ast_value_factory()->this_function_string(), pos); |
| 475 return factory()->NewSuperCallReference( | 475 return factory()->NewSuperCallReference( |
| 476 ThisExpression(pos)->AsVariableProxy(), new_target_proxy, | 476 ThisExpression(pos)->AsVariableProxy(), new_target_proxy, |
| 477 this_function_proxy, pos); | 477 this_function_proxy, pos); |
| 478 } | 478 } |
| 479 | 479 |
| 480 Expression* Parser::NewTargetExpression(int pos) { | 480 Expression* Parser::NewTargetExpression(int pos) { |
| 481 static const int kNewTargetStringLength = 10; | 481 auto proxy = NewUnresolved(ast_value_factory()->new_target_string(), pos); |
| 482 auto proxy = NewUnresolved(ast_value_factory()->new_target_string(), pos, | |
| 483 pos + kNewTargetStringLength); | |
| 484 proxy->set_is_new_target(); | 482 proxy->set_is_new_target(); |
| 485 return proxy; | 483 return proxy; |
| 486 } | 484 } |
| 487 | 485 |
| 488 Expression* Parser::FunctionSentExpression(int pos) { | 486 Expression* Parser::FunctionSentExpression(int pos) { |
| 489 // We desugar function.sent into %_GeneratorGetInputOrDebugPos(generator). | 487 // We desugar function.sent into %_GeneratorGetInputOrDebugPos(generator). |
| 490 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone()); | 488 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone()); |
| 491 VariableProxy* generator = | 489 VariableProxy* generator = |
| 492 factory()->NewVariableProxy(function_state_->generator_object_variable()); | 490 factory()->NewVariableProxy(function_state_->generator_object_variable()); |
| 493 args->Add(generator, zone()); | 491 args->Add(generator, zone()); |
| (...skipping 947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1441 for (int i = 0; i < names.length(); ++i) { | 1439 for (int i = 0; i < names.length(); ++i) { |
| 1442 // TODO(neis): Provide better location. | 1440 // TODO(neis): Provide better location. |
| 1443 descriptor->AddExport(names[i], names[i], scanner()->location(), zone()); | 1441 descriptor->AddExport(names[i], names[i], scanner()->location(), zone()); |
| 1444 } | 1442 } |
| 1445 | 1443 |
| 1446 DCHECK_NOT_NULL(result); | 1444 DCHECK_NOT_NULL(result); |
| 1447 return result; | 1445 return result; |
| 1448 } | 1446 } |
| 1449 | 1447 |
| 1450 VariableProxy* Parser::NewUnresolved(const AstRawString* name, int begin_pos, | 1448 VariableProxy* Parser::NewUnresolved(const AstRawString* name, int begin_pos, |
| 1451 int end_pos, VariableKind kind) { | 1449 VariableKind kind) { |
| 1452 return scope()->NewUnresolved(factory(), name, begin_pos, end_pos, kind); | 1450 return scope()->NewUnresolved(factory(), name, begin_pos, kind); |
| 1453 } | 1451 } |
| 1454 | 1452 |
| 1455 VariableProxy* Parser::NewUnresolved(const AstRawString* name) { | 1453 VariableProxy* Parser::NewUnresolved(const AstRawString* name) { |
| 1456 return scope()->NewUnresolved(factory(), name, scanner()->location().beg_pos, | 1454 return scope()->NewUnresolved(factory(), name, scanner()->location().beg_pos); |
| 1457 scanner()->location().end_pos); | |
| 1458 } | 1455 } |
| 1459 | 1456 |
| 1460 Declaration* Parser::DeclareVariable(const AstRawString* name, | 1457 Declaration* Parser::DeclareVariable(const AstRawString* name, |
| 1461 VariableMode mode, int pos, bool* ok) { | 1458 VariableMode mode, int pos, bool* ok) { |
| 1462 return DeclareVariable(name, mode, Variable::DefaultInitializationFlag(mode), | 1459 return DeclareVariable(name, mode, Variable::DefaultInitializationFlag(mode), |
| 1463 pos, ok); | 1460 pos, ok); |
| 1464 } | 1461 } |
| 1465 | 1462 |
| 1466 Declaration* Parser::DeclareVariable(const AstRawString* name, | 1463 Declaration* Parser::DeclareVariable(const AstRawString* name, |
| 1467 VariableMode mode, InitializationFlag init, | 1464 VariableMode mode, InitializationFlag init, |
| 1468 int pos, bool* ok) { | 1465 int pos, bool* ok) { |
| 1469 DCHECK_NOT_NULL(name); | 1466 DCHECK_NOT_NULL(name); |
| 1470 VariableProxy* proxy = factory()->NewVariableProxy( | 1467 VariableProxy* proxy = factory()->NewVariableProxy( |
| 1471 name, NORMAL_VARIABLE, scanner()->location().beg_pos, | 1468 name, NORMAL_VARIABLE, scanner()->location().beg_pos); |
| 1472 scanner()->location().end_pos); | |
| 1473 Declaration* declaration = | 1469 Declaration* declaration = |
| 1474 factory()->NewVariableDeclaration(proxy, this->scope(), pos); | 1470 factory()->NewVariableDeclaration(proxy, this->scope(), pos); |
| 1475 Declare(declaration, DeclarationDescriptor::NORMAL, mode, init, CHECK_OK); | 1471 Declare(declaration, DeclarationDescriptor::NORMAL, mode, init, CHECK_OK); |
| 1476 return declaration; | 1472 return declaration; |
| 1477 } | 1473 } |
| 1478 | 1474 |
| 1479 Declaration* Parser::DeclareModuleImport(const AstRawString* name, int pos, | 1475 Declaration* Parser::DeclareModuleImport(const AstRawString* name, int pos, |
| 1480 bool* ok) { | 1476 bool* ok) { |
| 1481 DCHECK_EQ(MODULE_SCOPE, scope()->scope_type()); | 1477 DCHECK_EQ(MODULE_SCOPE, scope()->scope_type()); |
| 1482 Declaration* decl = | 1478 Declaration* decl = |
| (...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2005 return; | 2001 return; |
| 2006 } | 2002 } |
| 2007 } | 2003 } |
| 2008 catch_scope = catch_scope->outer_scope(); | 2004 catch_scope = catch_scope->outer_scope(); |
| 2009 } | 2005 } |
| 2010 } | 2006 } |
| 2011 } | 2007 } |
| 2012 | 2008 |
| 2013 *body_block = factory()->NewBlock(nullptr, 3, false, kNoSourcePosition); | 2009 *body_block = factory()->NewBlock(nullptr, 3, false, kNoSourcePosition); |
| 2014 (*body_block)->statements()->Add(each_initialization_block, zone()); | 2010 (*body_block)->statements()->Add(each_initialization_block, zone()); |
| 2015 *each_variable = factory()->NewVariableProxy(temp, for_info->each_loc.beg_pos, | 2011 *each_variable = factory()->NewVariableProxy(temp, for_info->position); |
| 2016 for_info->each_loc.end_pos); | |
| 2017 } | 2012 } |
| 2018 | 2013 |
| 2019 // Create a TDZ for any lexically-bound names in for in/of statements. | 2014 // Create a TDZ for any lexically-bound names in for in/of statements. |
| 2020 Block* Parser::CreateForEachStatementTDZ(Block* init_block, | 2015 Block* Parser::CreateForEachStatementTDZ(Block* init_block, |
| 2021 const ForInfo& for_info, bool* ok) { | 2016 const ForInfo& for_info, bool* ok) { |
| 2022 if (IsLexicalVariableMode(for_info.parsing_result.descriptor.mode)) { | 2017 if (IsLexicalVariableMode(for_info.parsing_result.descriptor.mode)) { |
| 2023 DCHECK_NULL(init_block); | 2018 DCHECK_NULL(init_block); |
| 2024 | 2019 |
| 2025 init_block = factory()->NewBlock(nullptr, 1, false, kNoSourcePosition); | 2020 init_block = factory()->NewBlock(nullptr, 1, false, kNoSourcePosition); |
| 2026 | 2021 |
| (...skipping 1381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3408 return function_literal; | 3403 return function_literal; |
| 3409 } | 3404 } |
| 3410 | 3405 |
| 3411 FunctionLiteral* Parser::InsertClassFieldInitializer( | 3406 FunctionLiteral* Parser::InsertClassFieldInitializer( |
| 3412 FunctionLiteral* constructor) { | 3407 FunctionLiteral* constructor) { |
| 3413 Statement* call_initializer = factory()->NewExpressionStatement( | 3408 Statement* call_initializer = factory()->NewExpressionStatement( |
| 3414 CallClassFieldInitializer( | 3409 CallClassFieldInitializer( |
| 3415 constructor->scope(), | 3410 constructor->scope(), |
| 3416 constructor->scope()->NewUnresolved( | 3411 constructor->scope()->NewUnresolved( |
| 3417 factory(), ast_value_factory()->this_string(), kNoSourcePosition, | 3412 factory(), ast_value_factory()->this_string(), kNoSourcePosition, |
| 3418 kNoSourcePosition + 4, THIS_VARIABLE)), | 3413 THIS_VARIABLE)), |
| 3419 kNoSourcePosition); | 3414 kNoSourcePosition); |
| 3420 constructor->body()->InsertAt(0, call_initializer, zone()); | 3415 constructor->body()->InsertAt(0, call_initializer, zone()); |
| 3421 return constructor; | 3416 return constructor; |
| 3422 } | 3417 } |
| 3423 | 3418 |
| 3424 // If a class name is specified, this method declares the class variable | 3419 // If a class name is specified, this method declares the class variable |
| 3425 // and sets class_info->proxy to point to that name. | 3420 // and sets class_info->proxy to point to that name. |
| 3426 void Parser::DeclareClassVariable(const AstRawString* name, Scope* block_scope, | 3421 void Parser::DeclareClassVariable(const AstRawString* name, Scope* block_scope, |
| 3427 ClassInfo* class_info, int class_token_pos, | 3422 ClassInfo* class_info, int class_token_pos, |
| 3428 bool* ok) { | 3423 bool* ok) { |
| (...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4295 } | 4290 } |
| 4296 | 4291 |
| 4297 Expression* Parser::RewriteAssignExponentiation(Expression* left, | 4292 Expression* Parser::RewriteAssignExponentiation(Expression* left, |
| 4298 Expression* right, int pos) { | 4293 Expression* right, int pos) { |
| 4299 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); | 4294 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); |
| 4300 if (left->IsVariableProxy()) { | 4295 if (left->IsVariableProxy()) { |
| 4301 VariableProxy* lhs = left->AsVariableProxy(); | 4296 VariableProxy* lhs = left->AsVariableProxy(); |
| 4302 | 4297 |
| 4303 Expression* result; | 4298 Expression* result; |
| 4304 DCHECK_NOT_NULL(lhs->raw_name()); | 4299 DCHECK_NOT_NULL(lhs->raw_name()); |
| 4305 result = ExpressionFromIdentifier(lhs->raw_name(), lhs->position(), | 4300 result = ExpressionFromIdentifier(lhs->raw_name(), lhs->position()); |
| 4306 lhs->end_position()); | |
| 4307 args->Add(left, zone()); | 4301 args->Add(left, zone()); |
| 4308 args->Add(right, zone()); | 4302 args->Add(right, zone()); |
| 4309 Expression* call = | 4303 Expression* call = |
| 4310 factory()->NewCallRuntime(Context::MATH_POW_INDEX, args, pos); | 4304 factory()->NewCallRuntime(Context::MATH_POW_INDEX, args, pos); |
| 4311 return factory()->NewAssignment(Token::ASSIGN, result, call, pos); | 4305 return factory()->NewAssignment(Token::ASSIGN, result, call, pos); |
| 4312 } else if (left->IsProperty()) { | 4306 } else if (left->IsProperty()) { |
| 4313 Property* prop = left->AsProperty(); | 4307 Property* prop = left->AsProperty(); |
| 4314 auto temp_obj = NewTemporary(ast_value_factory()->empty_string()); | 4308 auto temp_obj = NewTemporary(ast_value_factory()->empty_string()); |
| 4315 auto temp_key = NewTemporary(ast_value_factory()->empty_string()); | 4309 auto temp_key = NewTemporary(ast_value_factory()->empty_string()); |
| 4316 Expression* assign_obj = factory()->NewAssignment( | 4310 Expression* assign_obj = factory()->NewAssignment( |
| (...skipping 1092 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5409 | 5403 |
| 5410 return final_loop; | 5404 return final_loop; |
| 5411 } | 5405 } |
| 5412 | 5406 |
| 5413 #undef CHECK_OK | 5407 #undef CHECK_OK |
| 5414 #undef CHECK_OK_VOID | 5408 #undef CHECK_OK_VOID |
| 5415 #undef CHECK_FAILED | 5409 #undef CHECK_FAILED |
| 5416 | 5410 |
| 5417 } // namespace internal | 5411 } // namespace internal |
| 5418 } // namespace v8 | 5412 } // namespace v8 |
| OLD | NEW |