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 3 // found in the LICENSE file. 4 5 #include "src/v8.h" 6 7 #include "src/api.h" 8 #include "src/ast.h" 9 #include "src/bailout-reason.h" 10 #include "src/base/platform/platform.h" 11 #include "src/bootstrapper.h" 12 #include "src/char-predicates-inl.h" 13 #include "src/codegen.h" 14 #include "src/compiler.h" 15 #include "src/messages.h" 16 #include "src/parser.h" 17 #include "src/preparser.h" 18 #include "src/runtime.h" 19 #include "src/scanner-character-streams.h" 20 #include "src/scopeinfo.h" 21 #include "src/string-stream.h" 22 23 namespace v8 { 24 namespace internal { 25 26 RegExpBuilder::RegExpBuilder(Zone* zone) 27 : zone_(zone), 28 pending_empty_(false), 29 characters_(NULL), 30 terms_(), 31 alternatives_() 32 #ifdef DEBUG 33 , last_added_(ADD_NONE) 34 #endif 35 {} 36 37 38 void RegExpBuilder::FlushCharacters() { 39 pending_empty_ = false; 40 if (characters_ != NULL) { 41 RegExpTree* atom = new(zone()) RegExpAtom(characters_->ToConstVector()); 42 characters_ = NULL; 43 text_.Add(atom, zone()); 44 LAST(ADD_ATOM); 45 } 46 } 47 48 49 void RegExpBuilder::FlushText() { 50 FlushCharacters(); 51 int num_text = text_.length(); 52 if (num_text == 0) { 53 return; 54 } else if (num_text == 1) { 55 terms_.Add(text_.last(), zone()); 56 } else { 57 RegExpText* text = new(zone()) RegExpText(zone()); 58 for (int i = 0; i < num_text; i++) 59 text_.Get(i)->AppendToText(text, zone()); 60 terms_.Add(text, zone()); 61 } 62 text_.Clear(); 63 } 64 65 66 void RegExpBuilder::AddCharacter(uc16 c) { 67 pending_empty_ = false; 68 if (characters_ == NULL) { 69 characters_ = new(zone()) ZoneList<uc16>(4, zone()); 70 } 71 characters_->Add(c, zone()); 72 LAST(ADD_CHAR); 73 } 74 75 76 void RegExpBuilder::AddEmpty() { 77 pending_empty_ = true; 78 } 79 80 81 void RegExpBuilder::AddAtom(RegExpTree* term) { 82 if (term->IsEmpty()) { 83 AddEmpty(); 84 return; 85 } 86 if (term->IsTextElement()) { 87 FlushCharacters(); 88 text_.Add(term, zone()); 89 } else { 90 FlushText(); 91 terms_.Add(term, zone()); 92 } 93 LAST(ADD_ATOM); 94 } 95 96 97 void RegExpBuilder::AddAssertion(RegExpTree* assert) { 98 FlushText(); 99 terms_.Add(assert, zone()); 100 LAST(ADD_ASSERT); 101 } 102 103 104 void RegExpBuilder::NewAlternative() { 105 FlushTerms(); 106 } 107 108 109 void RegExpBuilder::FlushTerms() { 110 FlushText(); 111 int num_terms = terms_.length(); 112 RegExpTree* alternative; 113 if (num_terms == 0) { 114 alternative = RegExpEmpty::GetInstance(); 115 } else if (num_terms == 1) { 116 alternative = terms_.last(); 117 } else { 118 alternative = new(zone()) RegExpAlternative(terms_.GetList(zone())); 119 } 120 alternatives_.Add(alternative, zone()); 121 terms_.Clear(); 122 LAST(ADD_NONE); 123 } 124 125 126 RegExpTree* RegExpBuilder::ToRegExp() { 127 FlushTerms(); 128 int num_alternatives = alternatives_.length(); 129 if (num_alternatives == 0) { 130 return RegExpEmpty::GetInstance(); 131 } 132 if (num_alternatives == 1) { 133 return alternatives_.last(); 134 } 135 return new(zone()) RegExpDisjunction(alternatives_.GetList(zone())); 136 } 137 138 139 void RegExpBuilder::AddQuantifierToAtom( 140 int min, int max, RegExpQuantifier::QuantifierType quantifier_type) { 141 if (pending_empty_) { 142 pending_empty_ = false; 143 return; 144 } 145 RegExpTree* atom; 146 if (characters_ != NULL) { 147 DCHECK(last_added_ == ADD_CHAR); 148 // Last atom was character. 149 Vector<const uc16> char_vector = characters_->ToConstVector(); 150 int num_chars = char_vector.length(); 151 if (num_chars > 1) { 152 Vector<const uc16> prefix = char_vector.SubVector(0, num_chars - 1); 153 text_.Add(new(zone()) RegExpAtom(prefix), zone()); 154 char_vector = char_vector.SubVector(num_chars - 1, num_chars); 155 } 156 characters_ = NULL; 157 atom = new(zone()) RegExpAtom(char_vector); 158 FlushText(); 159 } else if (text_.length() > 0) { 160 DCHECK(last_added_ == ADD_ATOM); 161 atom = text_.RemoveLast(); 162 FlushText(); 163 } else if (terms_.length() > 0) { 164 DCHECK(last_added_ == ADD_ATOM); 165 atom = terms_.RemoveLast(); 166 if (atom->max_match() == 0) { 167 // Guaranteed to only match an empty string. 168 LAST(ADD_TERM); 169 if (min == 0) { 170 return; 171 } 172 terms_.Add(atom, zone()); 173 return; 174 } 175 } else { 176 // Only call immediately after adding an atom or character! 177 UNREACHABLE(); 178 return; 179 } 180 terms_.Add( 181 new(zone()) RegExpQuantifier(min, max, quantifier_type, atom), zone()); 182 LAST(ADD_TERM); 183 } 184 185 186 FunctionEntry ParseData::GetFunctionEntry(int start) { 187 // The current pre-data entry must be a FunctionEntry with the given 188 // start position. 189 if ((function_index_ + FunctionEntry::kSize <= Length()) && 190 (static_cast<int>(Data()[function_index_]) == start)) { 191 int index = function_index_; 192 function_index_ += FunctionEntry::kSize; 193 Vector<unsigned> subvector(&(Data()[index]), FunctionEntry::kSize); 194 return FunctionEntry(subvector); 195 } 196 return FunctionEntry(); 197 } 198 199 200 int ParseData::FunctionCount() { 201 int functions_size = FunctionsSize(); 202 if (functions_size < 0) return 0; 203 if (functions_size % FunctionEntry::kSize != 0) return 0; 204 return functions_size / FunctionEntry::kSize; 205 } 206 207 208 bool ParseData::IsSane() { 209 // Check that the header data is valid and doesn't specify 210 // point to positions outside the store. 211 int data_length = Length(); 212 if (data_length < PreparseDataConstants::kHeaderSize) return false; 213 if (Magic() != PreparseDataConstants::kMagicNumber) return false; 214 if (Version() != PreparseDataConstants::kCurrentVersion) return false; 215 if (HasError()) return false; 216 // Check that the space allocated for function entries is sane. 217 int functions_size = FunctionsSize(); 218 if (functions_size < 0) return false; 219 if (functions_size % FunctionEntry::kSize != 0) return false; 220 // Check that the total size has room for header and function entries. 221 int minimum_size = 222 PreparseDataConstants::kHeaderSize + functions_size; 223 if (data_length < minimum_size) return false; 224 return true; 225 } 226 227 228 void ParseData::Initialize() { 229 // Prepares state for use. 230 int data_length = Length(); 231 if (data_length >= PreparseDataConstants::kHeaderSize) { 232 function_index_ = PreparseDataConstants::kHeaderSize; 233 } 234 } 235 236 237 bool ParseData::HasError() { 238 return Data()[PreparseDataConstants::kHasErrorOffset]; 239 } 240 241 242 unsigned ParseData::Magic() { 243 return Data()[PreparseDataConstants::kMagicOffset]; 244 } 245 246 247 unsigned ParseData::Version() { 248 return Data()[PreparseDataConstants::kVersionOffset]; 249 } 250 251 252 int ParseData::FunctionsSize() { 253 return static_cast<int>(Data()[PreparseDataConstants::kFunctionsSizeOffset]); 254 } 255 256 257 void Parser::SetCachedData() { 258 if (compile_options() == ScriptCompiler::kNoCompileOptions) { 259 cached_parse_data_ = NULL; 260 } else { 261 DCHECK(info_->cached_data() != NULL); 262 if (compile_options() == ScriptCompiler::kConsumeParserCache) { 263 cached_parse_data_ = new ParseData(*info_->cached_data()); 264 } 265 } 266 } 267 268 269 Scope* Parser::NewScope(Scope* parent, ScopeType scope_type) { 270 DCHECK(ast_value_factory()); 271 Scope* result = 272 new (zone()) Scope(parent, scope_type, ast_value_factory(), zone()); 273 result->Initialize(); 274 return result; 275 } 276 277 278 // ---------------------------------------------------------------------------- 279 // Target is a support class to facilitate manipulation of the 280 // Parser's target_stack_ (the stack of potential 'break' and 281 // 'continue' statement targets). Upon construction, a new target is 282 // added; it is removed upon destruction. 283 284 class Target BASE_EMBEDDED { 285 public: 286 Target(Target** variable, AstNode* node) 287 : variable_(variable), node_(node), previous_(*variable) { 288 *variable = this; 289 } 290 291 ~Target() { 292 *variable_ = previous_; 293 } 294 295 Target* previous() { return previous_; } 296 AstNode* node() { return node_; } 297 298 private: 299 Target** variable_; 300 AstNode* node_; 301 Target* previous_; 302 }; 303 304 305 class TargetScope BASE_EMBEDDED { 306 public: 307 explicit TargetScope(Target** variable) 308 : variable_(variable), previous_(*variable) { 309 *variable = NULL; 310 } 311 312 ~TargetScope() { 313 *variable_ = previous_; 314 } 315 316 private: 317 Target** variable_; 318 Target* previous_; 319 }; 320 321 322 // ---------------------------------------------------------------------------- 323 // The CHECK_OK macro is a convenient macro to enforce error 324 // handling for functions that may fail (by returning !*ok). 325 // 326 // CAUTION: This macro appends extra statements after a call, 327 // thus it must never be used where only a single statement 328 // is correct (e.g. an if statement branch w/o braces)! 329 330 #define CHECK_OK ok); \ 331 if (!*ok) return NULL; \ 332 ((void)0 333 #define DUMMY ) // to make indentation work 334 #undef DUMMY 335 336 #define CHECK_FAILED /**/); \ 337 if (failed_) return NULL; \ 338 ((void)0 339 #define DUMMY ) // to make indentation work 340 #undef DUMMY 341 342 // ---------------------------------------------------------------------------- 343 // Implementation of Parser 344 345 class ParserTraits::Checkpoint 346 : public ParserBase<ParserTraits>::CheckpointBase { 347 public: 348 explicit Checkpoint(ParserBase<ParserTraits>* parser) 349 : CheckpointBase(parser), parser_(parser) { 350 saved_ast_node_id_gen_ = *parser_->ast_node_id_gen_; 351 } 352 353 void Restore() { 354 CheckpointBase::Restore(); 355 *parser_->ast_node_id_gen_ = saved_ast_node_id_gen_; 356 } 357 358 private: 359 ParserBase<ParserTraits>* parser_; 360 AstNode::IdGen saved_ast_node_id_gen_; 361 }; 362 363 364 bool ParserTraits::IsEvalOrArguments(const AstRawString* identifier) const { 365 return identifier == parser_->ast_value_factory()->eval_string() || 366 identifier == parser_->ast_value_factory()->arguments_string(); 367 } 368 369 370 bool ParserTraits::IsPrototype(const AstRawString* identifier) const { 371 return identifier == parser_->ast_value_factory()->prototype_string(); 372 } 373 374 375 bool ParserTraits::IsConstructor(const AstRawString* identifier) const { 376 return identifier == parser_->ast_value_factory()->constructor_string(); 377 } 378 379 380 bool ParserTraits::IsThisProperty(Expression* expression) { 381 DCHECK(expression != NULL); 382 Property* property = expression->AsProperty(); 383 return property != NULL && 384 property->obj()->AsVariableProxy() != NULL && 385 property->obj()->AsVariableProxy()->is_this(); 386 } 387 388 389 bool ParserTraits::IsIdentifier(Expression* expression) { 390 VariableProxy* operand = expression->AsVariableProxy(); 391 return operand != NULL && !operand->is_this(); 392 } 393 394 395 void ParserTraits::PushPropertyName(FuncNameInferrer* fni, 396 Expression* expression) { 397 if (expression->IsPropertyName()) { 398 fni->PushLiteralName(expression->AsLiteral()->AsRawPropertyName()); 399 } else { 400 fni->PushLiteralName( 401 parser_->ast_value_factory()->anonymous_function_string()); 402 } 403 } 404 405 406 void ParserTraits::CheckAssigningFunctionLiteralToProperty(Expression* left, 407 Expression* right) { 408 DCHECK(left != NULL); 409 if (left->AsProperty() != NULL && 410 right->AsFunctionLiteral() != NULL) { 411 right->AsFunctionLiteral()->set_pretenure(); 412 } 413 } 414 415 416 void ParserTraits::CheckPossibleEvalCall(Expression* expression, 417 Scope* scope) { 418 VariableProxy* callee = expression->AsVariableProxy(); 419 if (callee != NULL && 420 callee->raw_name() == parser_->ast_value_factory()->eval_string()) { 421 scope->DeclarationScope()->RecordEvalCall(); 422 } 423 } 424 425 426 Expression* ParserTraits::MarkExpressionAsAssigned(Expression* expression) { 427 VariableProxy* proxy = 428 expression != NULL ? expression->AsVariableProxy() : NULL; 429 if (proxy != NULL) proxy->set_is_assigned(); 430 return expression; 431 } 432 433 434 bool ParserTraits::ShortcutNumericLiteralBinaryExpression( 435 Expression** x, Expression* y, Token::Value op, int pos, 436 AstNodeFactory<AstConstructionVisitor>* factory) { 437 if ((*x)->AsLiteral() && (*x)->AsLiteral()->raw_value()->IsNumber() && 438 y->AsLiteral() && y->AsLiteral()->raw_value()->IsNumber()) { 439 double x_val = (*x)->AsLiteral()->raw_value()->AsNumber(); 440 double y_val = y->AsLiteral()->raw_value()->AsNumber(); 441 switch (op) { 442 case Token::ADD: 443 *x = factory->NewNumberLiteral(x_val + y_val, pos); 444 return true; 445 case Token::SUB: 446 *x = factory->NewNumberLiteral(x_val - y_val, pos); 447 return true; 448 case Token::MUL: 449 *x = factory->NewNumberLiteral(x_val * y_val, pos); 450 return true; 451 case Token::DIV: 452 *x = factory->NewNumberLiteral(x_val / y_val, pos); 453 return true; 454 case Token::BIT_OR: { 455 int value = DoubleToInt32(x_val) | DoubleToInt32(y_val); 456 *x = factory->NewNumberLiteral(value, pos); 457 return true; 458 } 459 case Token::BIT_AND: { 460 int value = DoubleToInt32(x_val) & DoubleToInt32(y_val); 461 *x = factory->NewNumberLiteral(value, pos); 462 return true; 463 } 464 case Token::BIT_XOR: { 465 int value = DoubleToInt32(x_val) ^ DoubleToInt32(y_val); 466 *x = factory->NewNumberLiteral(value, pos); 467 return true; 468 } 469 case Token::SHL: { 470 int value = DoubleToInt32(x_val) << (DoubleToInt32(y_val) & 0x1f); 471 *x = factory->NewNumberLiteral(value, pos); 472 return true; 473 } 474 case Token::SHR: { 475 uint32_t shift = DoubleToInt32(y_val) & 0x1f; 476 uint32_t value = DoubleToUint32(x_val) >> shift; 477 *x = factory->NewNumberLiteral(value, pos); 478 return true; 479 } 480 case Token::SAR: { 481 uint32_t shift = DoubleToInt32(y_val) & 0x1f; 482 int value = ArithmeticShiftRight(DoubleToInt32(x_val), shift); 483 *x = factory->NewNumberLiteral(value, pos); 484 return true; 485 } 486 default: 487 break; 488 } 489 } 490 return false; 491 } 492 493 494 Expression* ParserTraits::BuildUnaryExpression( 495 Expression* expression, Token::Value op, int pos, 496 AstNodeFactory<AstConstructionVisitor>* factory) { 497 DCHECK(expression != NULL); 498 if (expression->IsLiteral()) { 499 const AstValue* literal = expression->AsLiteral()->raw_value(); 500 if (op == Token::NOT) { 501 // Convert the literal to a boolean condition and negate it. 502 bool condition = literal->BooleanValue(); 503 return factory->NewBooleanLiteral(!condition, pos); 504 } else if (literal->IsNumber()) { 505 // Compute some expressions involving only number literals. 506 double value = literal->AsNumber(); 507 switch (op) { 508 case Token::ADD: 509 return expression; 510 case Token::SUB: 511 return factory->NewNumberLiteral(-value, pos); 512 case Token::BIT_NOT: 513 return factory->NewNumberLiteral(~DoubleToInt32(value), pos); 514 default: 515 break; 516 } 517 } 518 } 519 // Desugar '+foo' => 'foo*1' 520 if (op == Token::ADD) { 521 return factory->NewBinaryOperation( 522 Token::MUL, expression, factory->NewNumberLiteral(1, pos), pos); 523 } 524 // The same idea for '-foo' => 'foo*(-1)'. 525 if (op == Token::SUB) { 526 return factory->NewBinaryOperation( 527 Token::MUL, expression, factory->NewNumberLiteral(-1, pos), pos); 528 } 529 // ...and one more time for '~foo' => 'foo^(~0)'. 530 if (op == Token::BIT_NOT) { 531 return factory->NewBinaryOperation( 532 Token::BIT_XOR, expression, factory->NewNumberLiteral(~0, pos), pos); 533 } 534 return factory->NewUnaryOperation(op, expression, pos); 535 } 536 537 538 Expression* ParserTraits::NewThrowReferenceError(const char* message, int pos) { 539 return NewThrowError( 540 parser_->ast_value_factory()->make_reference_error_string(), message, 541 NULL, pos); 542 } 543 544 545 Expression* ParserTraits::NewThrowSyntaxError( 546 const char* message, const AstRawString* arg, int pos) { 547 return NewThrowError(parser_->ast_value_factory()->make_syntax_error_string(), 548 message, arg, pos); 549 } 550 551 552 Expression* ParserTraits::NewThrowTypeError( 553 const char* message, const AstRawString* arg, int pos) { 554 return NewThrowError(parser_->ast_value_factory()->make_type_error_string(), 555 message, arg, pos); 556 } 557 558 559 Expression* ParserTraits::NewThrowError( 560 const AstRawString* constructor, const char* message, 561 const AstRawString* arg, int pos) { 562 Zone* zone = parser_->zone(); 563 int argc = arg != NULL ? 1 : 0; 564 const AstRawString* type = 565 parser_->ast_value_factory()->GetOneByteString(message); 566 ZoneList<const AstRawString*>* array = 567 new (zone) ZoneList<const AstRawString*>(argc, zone); 568 if (arg != NULL) { 569 array->Add(arg, zone); 570 } 571 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(2, zone); 572 args->Add(parser_->factory()->NewStringLiteral(type, pos), zone); 573 args->Add(parser_->factory()->NewStringListLiteral(array, pos), zone); 574 CallRuntime* call_constructor = 575 parser_->factory()->NewCallRuntime(constructor, NULL, args, pos); 576 return parser_->factory()->NewThrow(call_constructor, pos); 577 } 578 579 580 void ParserTraits::ReportMessageAt(Scanner::Location source_location, 581 const char* message, 582 const char* arg, 583 bool is_reference_error) { 584 if (parser_->stack_overflow()) { 585 // Suppress the error message (syntax error or such) in the presence of a 586 // stack overflow. The isolate allows only one pending exception at at time 587 // and we want to report the stack overflow later. 588 return; 589 } 590 parser_->has_pending_error_ = true; 591 parser_->pending_error_location_ = source_location; 592 parser_->pending_error_message_ = message; 593 parser_->pending_error_char_arg_ = arg; 594 parser_->pending_error_arg_ = NULL; 595 parser_->pending_error_is_reference_error_ = is_reference_error; 596 } 597 598 599 void ParserTraits::ReportMessage(const char* message, 600 const char* arg, 601 bool is_reference_error) { 602 Scanner::Location source_location = parser_->scanner()->location(); 603 ReportMessageAt(source_location, message, arg, is_reference_error); 604 } 605 606 607 void ParserTraits::ReportMessage(const char* message, 608 const AstRawString* arg, 609 bool is_reference_error) { 610 Scanner::Location source_location = parser_->scanner()->location(); 611 ReportMessageAt(source_location, message, arg, is_reference_error); 612 } 613 614 615 void ParserTraits::ReportMessageAt(Scanner::Location source_location, 616 const char* message, 617 const AstRawString* arg, 618 bool is_reference_error) { 619 if (parser_->stack_overflow()) { 620 // Suppress the error message (syntax error or such) in the presence of a 621 // stack overflow. The isolate allows only one pending exception at at time 622 // and we want to report the stack overflow later. 623 return; 624 } 625 parser_->has_pending_error_ = true; 626 parser_->pending_error_location_ = source_location; 627 parser_->pending_error_message_ = message; 628 parser_->pending_error_char_arg_ = NULL; 629 parser_->pending_error_arg_ = arg; 630 parser_->pending_error_is_reference_error_ = is_reference_error; 631 } 632 633 634 const AstRawString* ParserTraits::GetSymbol(Scanner* scanner) { 635 const AstRawString* result = 636 parser_->scanner()->CurrentSymbol(parser_->ast_value_factory()); 637 DCHECK(result != NULL); 638 return result; 639 } 640 641 642 const AstRawString* ParserTraits::GetNumberAsSymbol(Scanner* scanner) { 643 double double_value = parser_->scanner()->DoubleValue(); 644 char array[100]; 645 const char* string = 646 DoubleToCString(double_value, Vector<char>(array, arraysize(array))); 647 return ast_value_factory()->GetOneByteString(string); 648 } 649 650 651 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) { 652 return parser_->scanner()->NextSymbol(parser_->ast_value_factory()); 653 } 654 655 656 Expression* ParserTraits::ThisExpression( 657 Scope* scope, AstNodeFactory<AstConstructionVisitor>* factory, int pos) { 658 return factory->NewVariableProxy(scope->receiver(), pos); 659 } 660 661 Expression* ParserTraits::SuperReference( 662 Scope* scope, AstNodeFactory<AstConstructionVisitor>* factory, int pos) { 663 return factory->NewSuperReference( 664 ThisExpression(scope, factory, pos)->AsVariableProxy(), 665 pos); 666 } 667 668 Expression* ParserTraits::ClassLiteral( 669 const AstRawString* name, Expression* extends, Expression* constructor, 670 ZoneList<ObjectLiteral::Property*>* properties, int pos, 671 AstNodeFactory<AstConstructionVisitor>* factory) { 672 return factory->NewClassLiteral(name, extends, constructor, properties, pos); 673 } 674 675 Literal* ParserTraits::ExpressionFromLiteral( 676 Token::Value token, int pos, 677 Scanner* scanner, 678 AstNodeFactory<AstConstructionVisitor>* factory) { 679 switch (token) { 680 case Token::NULL_LITERAL: 681 return factory->NewNullLiteral(pos); 682 case Token::TRUE_LITERAL: 683 return factory->NewBooleanLiteral(true, pos); 684 case Token::FALSE_LITERAL: 685 return factory->NewBooleanLiteral(false, pos); 686 case Token::NUMBER: { 687 double value = scanner->DoubleValue(); 688 return factory->NewNumberLiteral(value, pos); 689 } 690 default: 691 DCHECK(false); 692 } 693 return NULL; 694 } 695 696 697 Expression* ParserTraits::ExpressionFromIdentifier( 698 const AstRawString* name, int pos, Scope* scope, 699 AstNodeFactory<AstConstructionVisitor>* factory) { 700 if (parser_->fni_ != NULL) parser_->fni_->PushVariableName(name); 701 // The name may refer to a module instance object, so its type is unknown. 702 #ifdef DEBUG 703 if (FLAG_print_interface_details) 704 PrintF("# Variable %.*s ", name->length(), name->raw_data()); 705 #endif 706 Interface* interface = Interface::NewUnknown(parser_->zone()); 707 return scope->NewUnresolved(factory, name, interface, pos); 708 } 709 710 711 Expression* ParserTraits::ExpressionFromString( 712 int pos, Scanner* scanner, 713 AstNodeFactory<AstConstructionVisitor>* factory) { 714 const AstRawString* symbol = GetSymbol(scanner); 715 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); 716 return factory->NewStringLiteral(symbol, pos); 717 } 718 719 720 Expression* ParserTraits::GetIterator( 721 Expression* iterable, AstNodeFactory<AstConstructionVisitor>* factory) { 722 Expression* iterator_symbol_literal = 723 factory->NewSymbolLiteral("symbolIterator", RelocInfo::kNoPosition); 724 int pos = iterable->position(); 725 Expression* prop = 726 factory->NewProperty(iterable, iterator_symbol_literal, pos); 727 Zone* zone = parser_->zone(); 728 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(0, zone); 729 return factory->NewCall(prop, args, pos); 730 } 731 732 733 Literal* ParserTraits::GetLiteralTheHole( 734 int position, AstNodeFactory<AstConstructionVisitor>* factory) { 735 return factory->NewTheHoleLiteral(RelocInfo::kNoPosition); 736 } 737 738 739 Expression* ParserTraits::ParseV8Intrinsic(bool* ok) { 740 return parser_->ParseV8Intrinsic(ok); 741 } 742 743 744 FunctionLiteral* ParserTraits::ParseFunctionLiteral( 745 const AstRawString* name, Scanner::Location function_name_location, 746 bool name_is_strict_reserved, FunctionKind kind, 747 int function_token_position, FunctionLiteral::FunctionType type, 748 FunctionLiteral::ArityRestriction arity_restriction, bool* ok) { 749 return parser_->ParseFunctionLiteral( 750 name, function_name_location, name_is_strict_reserved, kind, 751 function_token_position, type, arity_restriction, ok); 752 } 753 754 755 Parser::Parser(CompilationInfo* info, ParseInfo* parse_info) 756 : ParserBase<ParserTraits>(&scanner_, parse_info->stack_limit, 757 info->extension(), NULL, info->zone(), 758 info->ast_node_id_gen(), this), 759 scanner_(parse_info->unicode_cache), 760 reusable_preparser_(NULL), 761 original_scope_(NULL), 762 target_stack_(NULL), 763 cached_parse_data_(NULL), 764 info_(info), 765 has_pending_error_(false), 766 pending_error_message_(NULL), 767 pending_error_arg_(NULL), 768 pending_error_char_arg_(NULL), 769 total_preparse_skipped_(0), 770 pre_parse_timer_(NULL) { 771 DCHECK(!script().is_null() || info->source_stream() != NULL); 772 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping); 773 set_allow_modules(!info->is_native() && FLAG_harmony_modules); 774 set_allow_natives_syntax(FLAG_allow_natives_syntax || info->is_native()); 775 set_allow_lazy(false); // Must be explicitly enabled. 776 set_allow_arrow_functions(FLAG_harmony_arrow_functions); 777 set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals); 778 set_allow_classes(FLAG_harmony_classes); 779 set_allow_harmony_object_literals(FLAG_harmony_object_literals); 780 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; 781 ++feature) { 782 use_counts_[feature] = 0; 783 } 784 if (info->ast_value_factory() == NULL) { 785 // info takes ownership of AstValueFactory. 786 info->SetAstValueFactory( 787 new AstValueFactory(zone(), parse_info->hash_seed)); 788 } 789 } 790 791 792 FunctionLiteral* Parser::ParseProgram() { 793 // TODO(bmeurer): We temporarily need to pass allow_nesting = true here, 794 // see comment for HistogramTimerScope class. 795 796 // It's OK to use the counters here, since this function is only called in 797 // the main thread. 798 HistogramTimerScope timer_scope(isolate()->counters()->parse(), true); 799 Handle<String> source(String::cast(script()->source())); 800 isolate()->counters()->total_parse_size()->Increment(source->length()); 801 base::ElapsedTimer timer; 802 if (FLAG_trace_parse) { 803 timer.Start(); 804 } 805 fni_ = new (zone()) FuncNameInferrer(ast_value_factory(), zone()); 806 807 // Initialize parser state. 808 CompleteParserRecorder recorder; 809 810 if (compile_options() == ScriptCompiler::kProduceParserCache) { 811 log_ = &recorder; 812 } else if (compile_options() == ScriptCompiler::kConsumeParserCache) { 813 cached_parse_data_->Initialize(); 814 } 815 816 source = String::Flatten(source); 817 FunctionLiteral* result; 818 819 Scope* top_scope = NULL; 820 Scope* eval_scope = NULL; 821 if (source->IsExternalTwoByteString()) { 822 // Notice that the stream is destroyed at the end of the branch block. 823 // The last line of the blocks can't be moved outside, even though they're 824 // identical calls. 825 ExternalTwoByteStringUtf16CharacterStream stream( 826 Handle<ExternalTwoByteString>::cast(source), 0, source->length()); 827 scanner_.Initialize(&stream); 828 result = DoParseProgram(info(), &top_scope, &eval_scope); 829 } else { 830 GenericStringUtf16CharacterStream stream(source, 0, source->length()); 831 scanner_.Initialize(&stream); 832 result = DoParseProgram(info(), &top_scope, &eval_scope); 833 } 834 top_scope->set_end_position(source->length()); 835 if (eval_scope != NULL) { 836 eval_scope->set_end_position(source->length()); 837 } 838 HandleSourceURLComments(); 839 840 if (FLAG_trace_parse && result != NULL) { 841 double ms = timer.Elapsed().InMillisecondsF(); 842 if (info()->is_eval()) { 843 PrintF("[parsing eval"); 844 } else if (info()->script()->name()->IsString()) { 845 String* name = String::cast(info()->script()->name()); 846 SmartArrayPointer<char> name_chars = name->ToCString(); 847 PrintF("[parsing script: %s", name_chars.get()); 848 } else { 849 PrintF("[parsing script"); 850 } 851 PrintF(" - took %0.3f ms]\n", ms); 852 } 853 if (compile_options() == ScriptCompiler::kProduceParserCache) { 854 if (result != NULL) *info_->cached_data() = recorder.GetScriptData(); 855 log_ = NULL; 856 } 857 return result; 858 } 859 860 861 FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info, Scope** scope, 862 Scope** eval_scope) { 863 DCHECK(scope_ == NULL); 864 DCHECK(target_stack_ == NULL); 865 866 FunctionLiteral* result = NULL; 867 { 868 *scope = NewScope(scope_, GLOBAL_SCOPE); 869 info->SetGlobalScope(*scope); 870 if (!info->context().is_null() && !info->context()->IsNativeContext()) { 871 *scope = Scope::DeserializeScopeChain(*info->context(), *scope, zone()); 872 // The Scope is backed up by ScopeInfo (which is in the V8 heap); this 873 // means the Parser cannot operate independent of the V8 heap. Tell the 874 // string table to internalize strings and values right after they're 875 // created. 876 ast_value_factory()->Internalize(isolate()); 877 } 878 original_scope_ = *scope; 879 if (info->is_eval()) { 880 if (!(*scope)->is_global_scope() || info->strict_mode() == STRICT) { 881 *scope = NewScope(*scope, EVAL_SCOPE); 882 } 883 } else if (info->is_global()) { 884 *scope = NewScope(*scope, GLOBAL_SCOPE); 885 } 886 (*scope)->set_start_position(0); 887 // End position will be set by the caller. 888 889 // Compute the parsing mode. 890 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY; 891 if (allow_natives_syntax() || extension_ != NULL || 892 (*scope)->is_eval_scope()) { 893 mode = PARSE_EAGERLY; 894 } 895 ParsingModeScope parsing_mode(this, mode); 896 897 // Enters 'scope'. 898 FunctionState function_state(&function_state_, &scope_, *scope, zone(), 899 ast_value_factory(), info->ast_node_id_gen()); 900 901 scope_->SetStrictMode(info->strict_mode()); 902 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); 903 bool ok = true; 904 int beg_pos = scanner()->location().beg_pos; 905 ParseSourceElements(body, Token::EOS, info->is_eval(), true, eval_scope, 906 &ok); 907 908 if (ok && strict_mode() == STRICT) { 909 CheckOctalLiteral(beg_pos, scanner()->location().end_pos, &ok); 910 } 911 912 if (ok && allow_harmony_scoping() && strict_mode() == STRICT) { 913 CheckConflictingVarDeclarations(scope_, &ok); 914 } 915 916 if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) { 917 if (body->length() != 1 || 918 !body->at(0)->IsExpressionStatement() || 919 !body->at(0)->AsExpressionStatement()-> 920 expression()->IsFunctionLiteral()) { 921 ReportMessage("single_function_literal"); 922 ok = false; 923 } 924 } 925 926 if (ok) { 927 result = factory()->NewFunctionLiteral( 928 ast_value_factory()->empty_string(), ast_value_factory(), scope_, 929 body, function_state.materialized_literal_count(), 930 function_state.expected_property_count(), 931 function_state.handler_count(), 0, 932 FunctionLiteral::kNoDuplicateParameters, 933 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kGlobalOrEval, 934 FunctionLiteral::kNotParenthesized, FunctionKind::kNormalFunction, 0); 935 result->set_ast_properties(factory()->visitor()->ast_properties()); 936 result->set_dont_optimize_reason( 937 factory()->visitor()->dont_optimize_reason()); 938 } 939 } 940 941 // Make sure the target stack is empty. 942 DCHECK(target_stack_ == NULL); 943 944 return result; 945 } 946 947 948 FunctionLiteral* Parser::ParseLazy() { 949 // It's OK to use the counters here, since this function is only called in 950 // the main thread. 951 HistogramTimerScope timer_scope(isolate()->counters()->parse_lazy()); 952 Handle<String> source(String::cast(script()->source())); 953 isolate()->counters()->total_parse_size()->Increment(source->length()); 954 base::ElapsedTimer timer; 955 if (FLAG_trace_parse) { 956 timer.Start(); 957 } 958 Handle<SharedFunctionInfo> shared_info = info()->shared_info(); 959 960 // Initialize parser state. 961 source = String::Flatten(source); 962 FunctionLiteral* result; 963 if (source->IsExternalTwoByteString()) { 964 ExternalTwoByteStringUtf16CharacterStream stream( 965 Handle<ExternalTwoByteString>::cast(source), 966 shared_info->start_position(), 967 shared_info->end_position()); 968 result = ParseLazy(&stream); 969 } else { 970 GenericStringUtf16CharacterStream stream(source, 971 shared_info->start_position(), 972 shared_info->end_position()); 973 result = ParseLazy(&stream); 974 } 975 976 if (FLAG_trace_parse && result != NULL) { 977 double ms = timer.Elapsed().InMillisecondsF(); 978 SmartArrayPointer<char> name_chars = result->debug_name()->ToCString(); 979 PrintF("[parsing function: %s - took %0.3f ms]\n", name_chars.get(), ms); 980 } 981 return result; 982 } 983 984 985 FunctionLiteral* Parser::ParseLazy(Utf16CharacterStream* source) { 986 Handle<SharedFunctionInfo> shared_info = info()->shared_info(); 987 scanner_.Initialize(source); 988 DCHECK(scope_ == NULL); 989 DCHECK(target_stack_ == NULL); 990 991 Handle<String> name(String::cast(shared_info->name())); 992 DCHECK(ast_value_factory()); 993 fni_ = new (zone()) FuncNameInferrer(ast_value_factory(), zone()); 994 const AstRawString* raw_name = ast_value_factory()->GetString(name); 995 fni_->PushEnclosingName(raw_name); 996 997 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); 998 999 // Place holder for the result. 1000 FunctionLiteral* result = NULL; 1001 1002 { 1003 // Parse the function literal. 1004 Scope* scope = NewScope(scope_, GLOBAL_SCOPE); 1005 info()->SetGlobalScope(scope); 1006 if (!info()->closure().is_null()) { 1007 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope, 1008 zone()); 1009 } 1010 original_scope_ = scope; 1011 FunctionState function_state(&function_state_, &scope_, scope, zone(), 1012 ast_value_factory(), 1013 info()->ast_node_id_gen()); 1014 DCHECK(scope->strict_mode() == SLOPPY || info()->strict_mode() == STRICT); 1015 DCHECK(info()->strict_mode() == shared_info->strict_mode()); 1016 scope->SetStrictMode(shared_info->strict_mode()); 1017 FunctionLiteral::FunctionType function_type = shared_info->is_expression() 1018 ? (shared_info->is_anonymous() 1019 ? FunctionLiteral::ANONYMOUS_EXPRESSION 1020 : FunctionLiteral::NAMED_EXPRESSION) 1021 : FunctionLiteral::DECLARATION; 1022 bool ok = true; 1023 1024 if (shared_info->is_arrow()) { 1025 Expression* expression = ParseExpression(false, &ok); 1026 DCHECK(expression->IsFunctionLiteral()); 1027 result = expression->AsFunctionLiteral(); 1028 } else { 1029 result = ParseFunctionLiteral(raw_name, Scanner::Location::invalid(), 1030 false, // Strict mode name already checked. 1031 shared_info->kind(), RelocInfo::kNoPosition, 1032 function_type, 1033 FunctionLiteral::NORMAL_ARITY, &ok); 1034 } 1035 // Make sure the results agree. 1036 DCHECK(ok == (result != NULL)); 1037 } 1038 1039 // Make sure the target stack is empty. 1040 DCHECK(target_stack_ == NULL); 1041 1042 if (result != NULL) { 1043 Handle<String> inferred_name(shared_info->inferred_name()); 1044 result->set_inferred_name(inferred_name); 1045 } 1046 return result; 1047 } 1048 1049 1050 void* Parser::ParseSourceElements(ZoneList<Statement*>* processor, 1051 int end_token, bool is_eval, bool is_global, 1052 Scope** eval_scope, bool* ok) { 1053 // SourceElements :: 1054 // (ModuleElement)* <end_token> 1055 1056 // Allocate a target stack to use for this set of source 1057 // elements. This way, all scripts and functions get their own 1058 // target stack thus avoiding illegal breaks and continues across 1059 // functions. 1060 TargetScope scope(&this->target_stack_); 1061 1062 DCHECK(processor != NULL); 1063 bool directive_prologue = true; // Parsing directive prologue. 1064 1065 while (peek() != end_token) { 1066 if (directive_prologue && peek() != Token::STRING) { 1067 directive_prologue = false; 1068 } 1069 1070 Scanner::Location token_loc = scanner()->peek_location(); 1071 Statement* stat; 1072 if (is_global && !is_eval) { 1073 stat = ParseModuleElement(NULL, CHECK_OK); 1074 } else { 1075 stat = ParseBlockElement(NULL, CHECK_OK); 1076 } 1077 if (stat == NULL || stat->IsEmpty()) { 1078 directive_prologue = false; // End of directive prologue. 1079 continue; 1080 } 1081 1082 if (directive_prologue) { 1083 // A shot at a directive. 1084 ExpressionStatement* e_stat; 1085 Literal* literal; 1086 // Still processing directive prologue? 1087 if ((e_stat = stat->AsExpressionStatement()) != NULL && 1088 (literal = e_stat->expression()->AsLiteral()) != NULL && 1089 literal->raw_value()->IsString()) { 1090 // Check "use strict" directive (ES5 14.1) and "use asm" directive. Only 1091 // one can be present. 1092 if (strict_mode() == SLOPPY && 1093 literal->raw_value()->AsString() == 1094 ast_value_factory()->use_strict_string() && 1095 token_loc.end_pos - token_loc.beg_pos == 1096 ast_value_factory()->use_strict_string()->length() + 2) { 1097 // TODO(mstarzinger): Global strict eval calls, need their own scope 1098 // as specified in ES5 10.4.2(3). The correct fix would be to always 1099 // add this scope in DoParseProgram(), but that requires adaptations 1100 // all over the code base, so we go with a quick-fix for now. 1101 // In the same manner, we have to patch the parsing mode. 1102 if (is_eval && !scope_->is_eval_scope()) { 1103 DCHECK(scope_->is_global_scope()); 1104 Scope* scope = NewScope(scope_, EVAL_SCOPE); 1105 scope->set_start_position(scope_->start_position()); 1106 scope->set_end_position(scope_->end_position()); 1107 scope_ = scope; 1108 if (eval_scope != NULL) { 1109 // Caller will correct the positions of the ad hoc eval scope. 1110 *eval_scope = scope; 1111 } 1112 mode_ = PARSE_EAGERLY; 1113 } 1114 scope_->SetStrictMode(STRICT); 1115 // "use strict" is the only directive for now. 1116 directive_prologue = false; 1117 } else if (literal->raw_value()->AsString() == 1118 ast_value_factory()->use_asm_string() && 1119 token_loc.end_pos - token_loc.beg_pos == 1120 ast_value_factory()->use_asm_string()->length() + 2) { 1121 // Store the usage count; The actual use counter on the isolate is 1122 // incremented after parsing is done. 1123 ++use_counts_[v8::Isolate::kUseAsm]; 1124 scope_->SetAsmModule(); 1125 } 1126 } else { 1127 // End of the directive prologue. 1128 directive_prologue = false; 1129 } 1130 } 1131 1132 processor->Add(stat, zone()); 1133 } 1134 1135 return 0; 1136 } 1137 1138 1139 Statement* Parser::ParseModuleElement(ZoneList<const AstRawString*>* labels, 1140 bool* ok) { 1141 // (Ecma 262 5th Edition, clause 14): 1142 // SourceElement: 1143 // Statement 1144 // FunctionDeclaration 1145 // 1146 // In harmony mode we allow additionally the following productions 1147 // ModuleElement: 1148 // LetDeclaration 1149 // ConstDeclaration 1150 // ModuleDeclaration 1151 // ImportDeclaration 1152 // ExportDeclaration 1153 // GeneratorDeclaration 1154 1155 switch (peek()) { 1156 case Token::FUNCTION: 1157 return ParseFunctionDeclaration(NULL, ok); 1158 case Token::CLASS: 1159 return ParseClassDeclaration(NULL, ok); 1160 case Token::IMPORT: 1161 return ParseImportDeclaration(ok); 1162 case Token::EXPORT: 1163 return ParseExportDeclaration(ok); 1164 case Token::CONST: 1165 return ParseVariableStatement(kModuleElement, NULL, ok); 1166 case Token::LET: 1167 DCHECK(allow_harmony_scoping()); 1168 if (strict_mode() == STRICT) { 1169 return ParseVariableStatement(kModuleElement, NULL, ok); 1170 } 1171 // Fall through. 1172 default: { 1173 Statement* stmt = ParseStatement(labels, CHECK_OK); 1174 // Handle 'module' as a context-sensitive keyword. 1175 if (FLAG_harmony_modules && 1176 peek() == Token::IDENTIFIER && 1177 !scanner()->HasAnyLineTerminatorBeforeNext() && 1178 stmt != NULL) { 1179 ExpressionStatement* estmt = stmt->AsExpressionStatement(); 1180 if (estmt != NULL && estmt->expression()->AsVariableProxy() != NULL && 1181 estmt->expression()->AsVariableProxy()->raw_name() == 1182 ast_value_factory()->module_string() && 1183 !scanner()->literal_contains_escapes()) { 1184 return ParseModuleDeclaration(NULL, ok); 1185 } 1186 } 1187 return stmt; 1188 } 1189 } 1190 } 1191 1192 1193 Statement* Parser::ParseModuleDeclaration(ZoneList<const AstRawString*>* names, 1194 bool* ok) { 1195 // ModuleDeclaration: 1196 // 'module' Identifier Module 1197 1198 int pos = peek_position(); 1199 const AstRawString* name = 1200 ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); 1201 1202 #ifdef DEBUG 1203 if (FLAG_print_interface_details) 1204 PrintF("# Module %.*s ", name->length(), name->raw_data()); 1205 #endif 1206 1207 Module* module = ParseModule(CHECK_OK); 1208 VariableProxy* proxy = NewUnresolved(name, MODULE, module->interface()); 1209 Declaration* declaration = 1210 factory()->NewModuleDeclaration(proxy, module, scope_, pos); 1211 Declare(declaration, true, CHECK_OK); 1212 1213 #ifdef DEBUG 1214 if (FLAG_print_interface_details) 1215 PrintF("# Module %.*s ", name->length(), name->raw_data()); 1216 if (FLAG_print_interfaces) { 1217 PrintF("module %.*s: ", name->length(), name->raw_data()); 1218 module->interface()->Print(); 1219 } 1220 #endif 1221 1222 if (names) names->Add(name, zone()); 1223 if (module->body() == NULL) 1224 return factory()->NewEmptyStatement(pos); 1225 else 1226 return factory()->NewModuleStatement(proxy, module->body(), pos); 1227 } 1228 1229 1230 Module* Parser::ParseModule(bool* ok) { 1231 // Module: 1232 // '{' ModuleElement '}' 1233 // '=' ModulePath ';' 1234 // 'at' String ';' 1235 1236 switch (peek()) { 1237 case Token::LBRACE: 1238 return ParseModuleLiteral(ok); 1239 1240 case Token::ASSIGN: { 1241 Expect(Token::ASSIGN, CHECK_OK); 1242 Module* result = ParseModulePath(CHECK_OK); 1243 ExpectSemicolon(CHECK_OK); 1244 return result; 1245 } 1246 1247 default: { 1248 ExpectContextualKeyword(CStrVector("at"), CHECK_OK); 1249 Module* result = ParseModuleUrl(CHECK_OK); 1250 ExpectSemicolon(CHECK_OK); 1251 return result; 1252 } 1253 } 1254 } 1255 1256 1257 Module* Parser::ParseModuleLiteral(bool* ok) { 1258 // Module: 1259 // '{' ModuleElement '}' 1260 1261 int pos = peek_position(); 1262 // Construct block expecting 16 statements. 1263 Block* body = factory()->NewBlock(NULL, 16, false, RelocInfo::kNoPosition); 1264 #ifdef DEBUG 1265 if (FLAG_print_interface_details) PrintF("# Literal "); 1266 #endif 1267 Scope* scope = NewScope(scope_, MODULE_SCOPE); 1268 1269 Expect(Token::LBRACE, CHECK_OK); 1270 scope->set_start_position(scanner()->location().beg_pos); 1271 scope->SetStrictMode(STRICT); 1272 1273 { 1274 BlockState block_state(&scope_, scope); 1275 TargetCollector collector(zone()); 1276 Target target(&this->target_stack_, &collector); 1277 Target target_body(&this->target_stack_, body); 1278 1279 while (peek() != Token::RBRACE) { 1280 Statement* stat = ParseModuleElement(NULL, CHECK_OK); 1281 if (stat && !stat->IsEmpty()) { 1282 body->AddStatement(stat, zone()); 1283 } 1284 } 1285 } 1286 1287 Expect(Token::RBRACE, CHECK_OK); 1288 scope->set_end_position(scanner()->location().end_pos); 1289 body->set_scope(scope); 1290 1291 // Check that all exports are bound. 1292 Interface* interface = scope->interface(); 1293 for (Interface::Iterator it = interface->iterator(); 1294 !it.done(); it.Advance()) { 1295 if (scope->LookupLocal(it.name()) == NULL) { 1296 ParserTraits::ReportMessage("module_export_undefined", it.name()); 1297 *ok = false; 1298 return NULL; 1299 } 1300 } 1301 1302 interface->MakeModule(ok); 1303 DCHECK(*ok); 1304 interface->Freeze(ok); 1305 DCHECK(*ok); 1306 return factory()->NewModuleLiteral(body, interface, pos); 1307 } 1308 1309 1310 Module* Parser::ParseModulePath(bool* ok) { 1311 // ModulePath: 1312 // Identifier 1313 // ModulePath '.' Identifier 1314 1315 int pos = peek_position(); 1316 Module* result = ParseModuleVariable(CHECK_OK); 1317 while (Check(Token::PERIOD)) { 1318 const AstRawString* name = ParseIdentifierName(CHECK_OK); 1319 #ifdef DEBUG 1320 if (FLAG_print_interface_details) 1321 PrintF("# Path .%.*s ", name->length(), name->raw_data()); 1322 #endif 1323 Module* member = factory()->NewModulePath(result, name, pos); 1324 result->interface()->Add(name, member->interface(), zone(), ok); 1325 if (!*ok) { 1326 #ifdef DEBUG 1327 if (FLAG_print_interfaces) { 1328 PrintF("PATH TYPE ERROR at '%.*s'\n", name->length(), name->raw_data()); 1329 PrintF("result: "); 1330 result->interface()->Print(); 1331 PrintF("member: "); 1332 member->interface()->Print(); 1333 } 1334 #endif 1335 ParserTraits::ReportMessage("invalid_module_path", name); 1336 return NULL; 1337 } 1338 result = member; 1339 } 1340 1341 return result; 1342 } 1343 1344 1345 Module* Parser::ParseModuleVariable(bool* ok) { 1346 // ModulePath: 1347 // Identifier 1348 1349 int pos = peek_position(); 1350 const AstRawString* name = 1351 ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); 1352 #ifdef DEBUG 1353 if (FLAG_print_interface_details) 1354 PrintF("# Module variable %.*s ", name->length(), name->raw_data()); 1355 #endif 1356 VariableProxy* proxy = scope_->NewUnresolved( 1357 factory(), name, Interface::NewModule(zone()), 1358 scanner()->location().beg_pos); 1359 1360 return factory()->NewModuleVariable(proxy, pos); 1361 } 1362 1363 1364 Module* Parser::ParseModuleUrl(bool* ok) { 1365 // Module: 1366 // String 1367 1368 int pos = peek_position(); 1369 Expect(Token::STRING, CHECK_OK); 1370 const AstRawString* symbol = GetSymbol(scanner()); 1371 1372 // TODO(ES6): Request JS resource from environment... 1373 1374 #ifdef DEBUG 1375 if (FLAG_print_interface_details) PrintF("# Url "); 1376 #endif 1377 1378 // Create an empty literal as long as the feature isn't finished. 1379 USE(symbol); 1380 Scope* scope = NewScope(scope_, MODULE_SCOPE); 1381 Block* body = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition); 1382 body->set_scope(scope); 1383 Interface* interface = scope->interface(); 1384 Module* result = factory()->NewModuleLiteral(body, interface, pos); 1385 interface->Freeze(ok); 1386 DCHECK(*ok); 1387 interface->Unify(scope->interface(), zone(), ok); 1388 DCHECK(*ok); 1389 return result; 1390 } 1391 1392 1393 Module* Parser::ParseModuleSpecifier(bool* ok) { 1394 // ModuleSpecifier: 1395 // String 1396 // ModulePath 1397 1398 if (peek() == Token::STRING) { 1399 return ParseModuleUrl(ok); 1400 } else { 1401 return ParseModulePath(ok); 1402 } 1403 } 1404 1405 1406 Block* Parser::ParseImportDeclaration(bool* ok) { 1407 // ImportDeclaration: 1408 // 'import' IdentifierName (',' IdentifierName)* 'from' ModuleSpecifier ';' 1409 // 1410 // TODO(ES6): implement destructuring ImportSpecifiers 1411 1412 int pos = peek_position(); 1413 Expect(Token::IMPORT, CHECK_OK); 1414 ZoneList<const AstRawString*> names(1, zone()); 1415 1416 const AstRawString* name = ParseIdentifierName(CHECK_OK); 1417 names.Add(name, zone()); 1418 while (peek() == Token::COMMA) { 1419 Consume(Token::COMMA); 1420 name = ParseIdentifierName(CHECK_OK); 1421 names.Add(name, zone()); 1422 } 1423 1424 ExpectContextualKeyword(CStrVector("from"), CHECK_OK); 1425 Module* module = ParseModuleSpecifier(CHECK_OK); 1426 ExpectSemicolon(CHECK_OK); 1427 1428 // Generate a separate declaration for each identifier. 1429 // TODO(ES6): once we implement destructuring, make that one declaration. 1430 Block* block = factory()->NewBlock(NULL, 1, true, RelocInfo::kNoPosition); 1431 for (int i = 0; i < names.length(); ++i) { 1432 #ifdef DEBUG 1433 if (FLAG_print_interface_details) 1434 PrintF("# Import %.*s ", name->length(), name->raw_data()); 1435 #endif 1436 Interface* interface = Interface::NewUnknown(zone()); 1437 module->interface()->Add(names[i], interface, zone(), ok); 1438 if (!*ok) { 1439 #ifdef DEBUG 1440 if (FLAG_print_interfaces) { 1441 PrintF("IMPORT TYPE ERROR at '%.*s'\n", name->length(), 1442 name->raw_data()); 1443 PrintF("module: "); 1444 module->interface()->Print(); 1445 } 1446 #endif 1447 ParserTraits::ReportMessage("invalid_module_path", name); 1448 return NULL; 1449 } 1450 VariableProxy* proxy = NewUnresolved(names[i], LET, interface); 1451 Declaration* declaration = 1452 factory()->NewImportDeclaration(proxy, module, scope_, pos); 1453 Declare(declaration, true, CHECK_OK); 1454 } 1455 1456 return block; 1457 } 1458 1459 1460 Statement* Parser::ParseExportDeclaration(bool* ok) { 1461 // ExportDeclaration: 1462 // 'export' Identifier (',' Identifier)* ';' 1463 // 'export' VariableDeclaration 1464 // 'export' FunctionDeclaration 1465 // 'export' GeneratorDeclaration 1466 // 'export' ModuleDeclaration 1467 // 1468 // TODO(ES6): implement structuring ExportSpecifiers 1469 1470 Expect(Token::EXPORT, CHECK_OK); 1471 1472 Statement* result = NULL; 1473 ZoneList<const AstRawString*> names(1, zone()); 1474 switch (peek()) { 1475 case Token::IDENTIFIER: { 1476 int pos = position(); 1477 const AstRawString* name = 1478 ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); 1479 // Handle 'module' as a context-sensitive keyword. 1480 if (name != ast_value_factory()->module_string()) { 1481 names.Add(name, zone()); 1482 while (peek() == Token::COMMA) { 1483 Consume(Token::COMMA); 1484 name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); 1485 names.Add(name, zone()); 1486 } 1487 ExpectSemicolon(CHECK_OK); 1488 result = factory()->NewEmptyStatement(pos); 1489 } else { 1490 result = ParseModuleDeclaration(&names, CHECK_OK); 1491 } 1492 break; 1493 } 1494 1495 case Token::FUNCTION: 1496 result = ParseFunctionDeclaration(&names, CHECK_OK); 1497 break; 1498 1499 case Token::CLASS: 1500 result = ParseClassDeclaration(&names, CHECK_OK); 1501 break; 1502 1503 case Token::VAR: 1504 case Token::LET: 1505 case Token::CONST: 1506 result = ParseVariableStatement(kModuleElement, &names, CHECK_OK); 1507 break; 1508 1509 default: 1510 *ok = false; 1511 ReportUnexpectedToken(scanner()->current_token()); 1512 return NULL; 1513 } 1514 1515 // Every export of a module may be assigned. 1516 for (int i = 0; i < names.length(); ++i) { 1517 Variable* var = scope_->Lookup(names[i]); 1518 if (var == NULL) { 1519 // TODO(sigurds) This is an export that has no definition yet, 1520 // not clear what to do in this case. 1521 continue; 1522 } 1523 if (!IsImmutableVariableMode(var->mode())) { 1524 var->set_maybe_assigned(); 1525 } 1526 } 1527 1528 // Extract declared names into export declarations and interface. 1529 Interface* interface = scope_->interface(); 1530 for (int i = 0; i < names.length(); ++i) { 1531 #ifdef DEBUG 1532 if (FLAG_print_interface_details) 1533 PrintF("# Export %.*s ", names[i]->length(), names[i]->raw_data()); 1534 #endif 1535 Interface* inner = Interface::NewUnknown(zone()); 1536 interface->Add(names[i], inner, zone(), CHECK_OK); 1537 if (!*ok) 1538 return NULL; 1539 VariableProxy* proxy = NewUnresolved(names[i], LET, inner); 1540 USE(proxy); 1541 // TODO(rossberg): Rethink whether we actually need to store export 1542 // declarations (for compilation?). 1543 // ExportDeclaration* declaration = 1544 // factory()->NewExportDeclaration(proxy, scope_, position); 1545 // scope_->AddDeclaration(declaration); 1546 } 1547 1548 DCHECK(result != NULL); 1549 return result; 1550 } 1551 1552 1553 Statement* Parser::ParseBlockElement(ZoneList<const AstRawString*>* labels, 1554 bool* ok) { 1555 // (Ecma 262 5th Edition, clause 14): 1556 // SourceElement: 1557 // Statement 1558 // FunctionDeclaration 1559 // 1560 // In harmony mode we allow additionally the following productions 1561 // BlockElement (aka SourceElement): 1562 // LetDeclaration 1563 // ConstDeclaration 1564 // GeneratorDeclaration 1565 // ClassDeclaration 1566 1567 switch (peek()) { 1568 case Token::FUNCTION: 1569 return ParseFunctionDeclaration(NULL, ok); 1570 case Token::CLASS: 1571 return ParseClassDeclaration(NULL, ok); 1572 case Token::CONST: 1573 return ParseVariableStatement(kModuleElement, NULL, ok); 1574 case Token::LET: 1575 DCHECK(allow_harmony_scoping()); 1576 if (strict_mode() == STRICT) { 1577 return ParseVariableStatement(kModuleElement, NULL, ok); 1578 } 1579 // Fall through. 1580 default: 1581 return ParseStatement(labels, ok); 1582 } 1583 } 1584 1585 1586 Statement* Parser::ParseStatement(ZoneList<const AstRawString*>* labels, 1587 bool* ok) { 1588 // Statement :: 1589 // Block 1590 // VariableStatement 1591 // EmptyStatement 1592 // ExpressionStatement 1593 // IfStatement 1594 // IterationStatement 1595 // ContinueStatement 1596 // BreakStatement 1597 // ReturnStatement 1598 // WithStatement 1599 // LabelledStatement 1600 // SwitchStatement 1601 // ThrowStatement 1602 // TryStatement 1603 // DebuggerStatement 1604 1605 // Note: Since labels can only be used by 'break' and 'continue' 1606 // statements, which themselves are only valid within blocks, 1607 // iterations or 'switch' statements (i.e., BreakableStatements), 1608 // labels can be simply ignored in all other cases; except for 1609 // trivial labeled break statements 'label: break label' which is 1610 // parsed into an empty statement. 1611 switch (peek()) { 1612 case Token::LBRACE: 1613 return ParseBlock(labels, ok); 1614 1615 case Token::SEMICOLON: 1616 Next(); 1617 return factory()->NewEmptyStatement(RelocInfo::kNoPosition); 1618 1619 case Token::IF: 1620 return ParseIfStatement(labels, ok); 1621 1622 case Token::DO: 1623 return ParseDoWhileStatement(labels, ok); 1624 1625 case Token::WHILE: 1626 return ParseWhileStatement(labels, ok); 1627 1628 case Token::FOR: 1629 return ParseForStatement(labels, ok); 1630 1631 case Token::CONTINUE: 1632 return ParseContinueStatement(ok); 1633 1634 case Token::BREAK: 1635 return ParseBreakStatement(labels, ok); 1636 1637 case Token::RETURN: 1638 return ParseReturnStatement(ok); 1639 1640 case Token::WITH: 1641 return ParseWithStatement(labels, ok); 1642 1643 case Token::SWITCH: 1644 return ParseSwitchStatement(labels, ok); 1645 1646 case Token::THROW: 1647 return ParseThrowStatement(ok); 1648 1649 case Token::TRY: { 1650 // NOTE: It is somewhat complicated to have labels on 1651 // try-statements. When breaking out of a try-finally statement, 1652 // one must take great care not to treat it as a 1653 // fall-through. It is much easier just to wrap the entire 1654 // try-statement in a statement block and put the labels there 1655 Block* result = 1656 factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition); 1657 Target target(&this->target_stack_, result); 1658 TryStatement* statement = ParseTryStatement(CHECK_OK); 1659 if (result) result->AddStatement(statement, zone()); 1660 return result; 1661 } 1662 1663 case Token::FUNCTION: { 1664 // FunctionDeclaration is only allowed in the context of SourceElements 1665 // (Ecma 262 5th Edition, clause 14): 1666 // SourceElement: 1667 // Statement 1668 // FunctionDeclaration 1669 // Common language extension is to allow function declaration in place 1670 // of any statement. This language extension is disabled in strict mode. 1671 // 1672 // In Harmony mode, this case also handles the extension: 1673 // Statement: 1674 // GeneratorDeclaration 1675 if (strict_mode() == STRICT) { 1676 ReportMessageAt(scanner()->peek_location(), "strict_function"); 1677 *ok = false; 1678 return NULL; 1679 } 1680 return ParseFunctionDeclaration(NULL, ok); 1681 } 1682 1683 case Token::CLASS: 1684 return ParseClassDeclaration(NULL, ok); 1685 1686 case Token::DEBUGGER: 1687 return ParseDebuggerStatement(ok); 1688 1689 case Token::VAR: 1690 case Token::CONST: 1691 return ParseVariableStatement(kStatement, NULL, ok); 1692 1693 case Token::LET: 1694 DCHECK(allow_harmony_scoping()); 1695 if (strict_mode() == STRICT) { 1696 return ParseVariableStatement(kStatement, NULL, ok); 1697 } 1698 // Fall through. 1699 default: 1700 return ParseExpressionOrLabelledStatement(labels, ok); 1701 } 1702 } 1703 1704 1705 VariableProxy* Parser::NewUnresolved(const AstRawString* name, 1706 VariableMode mode, Interface* interface) { 1707 // If we are inside a function, a declaration of a var/const variable is a 1708 // truly local variable, and the scope of the variable is always the function 1709 // scope. 1710 // Let/const variables in harmony mode are always added to the immediately 1711 // enclosing scope. 1712 return DeclarationScope(mode)->NewUnresolved( 1713 factory(), name, interface, position()); 1714 } 1715 1716 1717 void Parser::Declare(Declaration* declaration, bool resolve, bool* ok) { 1718 VariableProxy* proxy = declaration->proxy(); 1719 DCHECK(proxy->raw_name() != NULL); 1720 const AstRawString* name = proxy->raw_name(); 1721 VariableMode mode = declaration->mode(); 1722 Scope* declaration_scope = DeclarationScope(mode); 1723 Variable* var = NULL; 1724 1725 // If a suitable scope exists, then we can statically declare this 1726 // variable and also set its mode. In any case, a Declaration node 1727 // will be added to the scope so that the declaration can be added 1728 // to the corresponding activation frame at runtime if necessary. 1729 // For instance declarations inside an eval scope need to be added 1730 // to the calling function context. 1731 // Similarly, strict mode eval scope does not leak variable declarations to 1732 // the caller's scope so we declare all locals, too. 1733 if (declaration_scope->is_function_scope() || 1734 declaration_scope->is_strict_eval_scope() || 1735 declaration_scope->is_block_scope() || 1736 declaration_scope->is_module_scope() || 1737 declaration_scope->is_global_scope()) { 1738 // Declare the variable in the declaration scope. 1739 // For the global scope, we have to check for collisions with earlier 1740 // (i.e., enclosing) global scopes, to maintain the illusion of a single 1741 // global scope. 1742 var = declaration_scope->is_global_scope() 1743 ? declaration_scope->Lookup(name) 1744 : declaration_scope->LookupLocal(name); 1745 if (var == NULL) { 1746 // Declare the name. 1747 var = declaration_scope->DeclareLocal(name, mode, 1748 declaration->initialization(), 1749 kNotAssigned, proxy->interface()); 1750 } else if (IsLexicalVariableMode(mode) || IsLexicalVariableMode(var->mode()) 1751 || ((mode == CONST_LEGACY || var->mode() == CONST_LEGACY) && 1752 !declaration_scope->is_global_scope())) { 1753 // The name was declared in this scope before; check for conflicting 1754 // re-declarations. We have a conflict if either of the declarations is 1755 // not a var (in the global scope, we also have to ignore legacy const for 1756 // compatibility). There is similar code in runtime.cc in the Declare 1757 // functions. The function CheckConflictingVarDeclarations checks for 1758 // var and let bindings from different scopes whereas this is a check for 1759 // conflicting declarations within the same scope. This check also covers 1760 // the special case 1761 // 1762 // function () { let x; { var x; } } 1763 // 1764 // because the var declaration is hoisted to the function scope where 'x' 1765 // is already bound. 1766 DCHECK(IsDeclaredVariableMode(var->mode())); 1767 if (allow_harmony_scoping() && strict_mode() == STRICT) { 1768 // In harmony we treat re-declarations as early errors. See 1769 // ES5 16 for a definition of early errors. 1770 ParserTraits::ReportMessage("var_redeclaration", name); 1771 *ok = false; 1772 return; 1773 } 1774 Expression* expression = NewThrowTypeError( 1775 "var_redeclaration", name, declaration->position()); 1776 declaration_scope->SetIllegalRedeclaration(expression); 1777 } else if (mode == VAR) { 1778 var->set_maybe_assigned(); 1779 } 1780 } 1781 1782 // We add a declaration node for every declaration. The compiler 1783 // will only generate code if necessary. In particular, declarations 1784 // for inner local variables that do not represent functions won't 1785 // result in any generated code. 1786 // 1787 // Note that we always add an unresolved proxy even if it's not 1788 // used, simply because we don't know in this method (w/o extra 1789 // parameters) if the proxy is needed or not. The proxy will be 1790 // bound during variable resolution time unless it was pre-bound 1791 // below. 1792 // 1793 // WARNING: This will lead to multiple declaration nodes for the 1794 // same variable if it is declared several times. This is not a 1795 // semantic issue as long as we keep the source order, but it may be 1796 // a performance issue since it may lead to repeated 1797 // RuntimeHidden_DeclareLookupSlot calls. 1798 declaration_scope->AddDeclaration(declaration); 1799 1800 if (mode == CONST_LEGACY && declaration_scope->is_global_scope()) { 1801 // For global const variables we bind the proxy to a variable. 1802 DCHECK(resolve); // should be set by all callers 1803 Variable::Kind kind = Variable::NORMAL; 1804 var = new (zone()) 1805 Variable(declaration_scope, name, mode, true, kind, 1806 kNeedsInitialization, kNotAssigned, proxy->interface()); 1807 } else if (declaration_scope->is_eval_scope() && 1808 declaration_scope->strict_mode() == SLOPPY) { 1809 // For variable declarations in a sloppy eval scope the proxy is bound 1810 // to a lookup variable to force a dynamic declaration using the 1811 // DeclareLookupSlot runtime function. 1812 Variable::Kind kind = Variable::NORMAL; 1813 // TODO(sigurds) figure out if kNotAssigned is OK here 1814 var = new (zone()) Variable(declaration_scope, name, mode, true, kind, 1815 declaration->initialization(), kNotAssigned, 1816 proxy->interface()); 1817 var->AllocateTo(Variable::LOOKUP, -1); 1818 resolve = true; 1819 } 1820 1821 // If requested and we have a local variable, bind the proxy to the variable 1822 // at parse-time. This is used for functions (and consts) declared inside 1823 // statements: the corresponding function (or const) variable must be in the 1824 // function scope and not a statement-local scope, e.g. as provided with a 1825 // 'with' statement: 1826 // 1827 // with (obj) { 1828 // function f() {} 1829 // } 1830 // 1831 // which is translated into: 1832 // 1833 // with (obj) { 1834 // // in this case this is not: 'var f; f = function () {};' 1835 // var f = function () {}; 1836 // } 1837 // 1838 // Note that if 'f' is accessed from inside the 'with' statement, it 1839 // will be allocated in the context (because we must be able to look 1840 // it up dynamically) but it will also be accessed statically, i.e., 1841 // with a context slot index and a context chain length for this 1842 // initialization code. Thus, inside the 'with' statement, we need 1843 // both access to the static and the dynamic context chain; the 1844 // runtime needs to provide both. 1845 if (resolve && var != NULL) { 1846 proxy->BindTo(var); 1847 1848 if (FLAG_harmony_modules) { 1849 bool ok; 1850 #ifdef DEBUG 1851 if (FLAG_print_interface_details) { 1852 PrintF("# Declare %.*s ", var->raw_name()->length(), 1853 var->raw_name()->raw_data()); 1854 } 1855 #endif 1856 proxy->interface()->Unify(var->interface(), zone(), &ok); 1857 if (!ok) { 1858 #ifdef DEBUG 1859 if (FLAG_print_interfaces) { 1860 PrintF("DECLARE TYPE ERROR\n"); 1861 PrintF("proxy: "); 1862 proxy->interface()->Print(); 1863 PrintF("var: "); 1864 var->interface()->Print(); 1865 } 1866 #endif 1867 ParserTraits::ReportMessage("module_type_error", name); 1868 } 1869 } 1870 } 1871 } 1872 1873 1874 // Language extension which is only enabled for source files loaded 1875 // through the API's extension mechanism. A native function 1876 // declaration is resolved by looking up the function through a 1877 // callback provided by the extension. 1878 Statement* Parser::ParseNativeDeclaration(bool* ok) { 1879 int pos = peek_position(); 1880 Expect(Token::FUNCTION, CHECK_OK); 1881 // Allow "eval" or "arguments" for backward compatibility. 1882 const AstRawString* name = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); 1883 Expect(Token::LPAREN, CHECK_OK); 1884 bool done = (peek() == Token::RPAREN); 1885 while (!done) { 1886 ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); 1887 done = (peek() == Token::RPAREN); 1888 if (!done) { 1889 Expect(Token::COMMA, CHECK_OK); 1890 } 1891 } 1892 Expect(Token::RPAREN, CHECK_OK); 1893 Expect(Token::SEMICOLON, CHECK_OK); 1894 1895 // Make sure that the function containing the native declaration 1896 // isn't lazily compiled. The extension structures are only 1897 // accessible while parsing the first time not when reparsing 1898 // because of lazy compilation. 1899 DeclarationScope(VAR)->ForceEagerCompilation(); 1900 1901 // TODO(1240846): It's weird that native function declarations are 1902 // introduced dynamically when we meet their declarations, whereas 1903 // other functions are set up when entering the surrounding scope. 1904 VariableProxy* proxy = NewUnresolved(name, VAR, Interface::NewValue()); 1905 Declaration* declaration = 1906 factory()->NewVariableDeclaration(proxy, VAR, scope_, pos); 1907 Declare(declaration, true, CHECK_OK); 1908 NativeFunctionLiteral* lit = factory()->NewNativeFunctionLiteral( 1909 name, extension_, RelocInfo::kNoPosition); 1910 return factory()->NewExpressionStatement( 1911 factory()->NewAssignment( 1912 Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition), 1913 pos); 1914 } 1915 1916 1917 Statement* Parser::ParseFunctionDeclaration( 1918 ZoneList<const AstRawString*>* names, bool* ok) { 1919 // FunctionDeclaration :: 1920 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' 1921 // GeneratorDeclaration :: 1922 // 'function' '*' Identifier '(' FormalParameterListopt ')' 1923 // '{' FunctionBody '}' 1924 Expect(Token::FUNCTION, CHECK_OK); 1925 int pos = position(); 1926 bool is_generator = Check(Token::MUL); 1927 bool is_strict_reserved = false; 1928 const AstRawString* name = ParseIdentifierOrStrictReservedWord( 1929 &is_strict_reserved, CHECK_OK); 1930 FunctionLiteral* fun = 1931 ParseFunctionLiteral(name, scanner()->location(), is_strict_reserved, 1932 is_generator ? FunctionKind::kGeneratorFunction 1933 : FunctionKind::kNormalFunction, 1934 pos, FunctionLiteral::DECLARATION, 1935 FunctionLiteral::NORMAL_ARITY, CHECK_OK); 1936 // Even if we're not at the top-level of the global or a function 1937 // scope, we treat it as such and introduce the function with its 1938 // initial value upon entering the corresponding scope. 1939 // In ES6, a function behaves as a lexical binding, except in the 1940 // global scope, or the initial scope of eval or another function. 1941 VariableMode mode = 1942 allow_harmony_scoping() && strict_mode() == STRICT && 1943 !(scope_->is_global_scope() || scope_->is_eval_scope() || 1944 scope_->is_function_scope()) ? LET : VAR; 1945 VariableProxy* proxy = NewUnresolved(name, mode, Interface::NewValue()); 1946 Declaration* declaration = 1947 factory()->NewFunctionDeclaration(proxy, mode, fun, scope_, pos); 1948 Declare(declaration, true, CHECK_OK); 1949 if (names) names->Add(name, zone()); 1950 return factory()->NewEmptyStatement(RelocInfo::kNoPosition); 1951 } 1952 1953 1954 Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names, 1955 bool* ok) { 1956 // ClassDeclaration :: 1957 // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}' 1958 // 1959 // A ClassDeclaration 1960 // 1961 // class C { ... } 1962 // 1963 // has the same semantics as: 1964 // 1965 // let C = class C { ... }; 1966 // 1967 // so rewrite it as such. 1968 1969 Expect(Token::CLASS, CHECK_OK); 1970 int pos = position(); 1971 bool is_strict_reserved = false; 1972 const AstRawString* name = 1973 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); 1974 Expression* value = ParseClassLiteral(name, scanner()->location(), 1975 is_strict_reserved, pos, CHECK_OK); 1976 1977 Block* block = factory()->NewBlock(NULL, 1, true, pos); 1978 VariableMode mode = LET; 1979 VariableProxy* proxy = NewUnresolved(name, mode, Interface::NewValue()); 1980 Declaration* declaration = 1981 factory()->NewVariableDeclaration(proxy, mode, scope_, pos); 1982 Declare(declaration, true, CHECK_OK); 1983 1984 Token::Value init_op = Token::INIT_LET; 1985 Assignment* assignment = factory()->NewAssignment(init_op, proxy, value, pos); 1986 block->AddStatement( 1987 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), 1988 zone()); 1989 1990 if (names) names->Add(name, zone()); 1991 return block; 1992 } 1993 1994 1995 Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok) { 1996 if (allow_harmony_scoping() && strict_mode() == STRICT) { 1997 return ParseScopedBlock(labels, ok); 1998 } 1999 2000 // Block :: 2001 // '{' Statement* '}' 2002 2003 // Note that a Block does not introduce a new execution scope! 2004 // (ECMA-262, 3rd, 12.2) 2005 // 2006 // Construct block expecting 16 statements. 2007 Block* result = 2008 factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition); 2009 Target target(&this->target_stack_, result); 2010 Expect(Token::LBRACE, CHECK_OK); 2011 while (peek() != Token::RBRACE) { 2012 Statement* stat = ParseStatement(NULL, CHECK_OK); 2013 if (stat && !stat->IsEmpty()) { 2014 result->AddStatement(stat, zone()); 2015 } 2016 } 2017 Expect(Token::RBRACE, CHECK_OK); 2018 return result; 2019 } 2020 2021 2022 Block* Parser::ParseScopedBlock(ZoneList<const AstRawString*>* labels, 2023 bool* ok) { 2024 // The harmony mode uses block elements instead of statements. 2025 // 2026 // Block :: 2027 // '{' BlockElement* '}' 2028 2029 // Construct block expecting 16 statements. 2030 Block* body = 2031 factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition); 2032 Scope* block_scope = NewScope(scope_, BLOCK_SCOPE); 2033 2034 // Parse the statements and collect escaping labels. 2035 Expect(Token::LBRACE, CHECK_OK); 2036 block_scope->set_start_position(scanner()->location().beg_pos); 2037 { BlockState block_state(&scope_, block_scope); 2038 TargetCollector collector(zone()); 2039 Target target(&this->target_stack_, &collector); 2040 Target target_body(&this->target_stack_, body); 2041 2042 while (peek() != Token::RBRACE) { 2043 Statement* stat = ParseBlockElement(NULL, CHECK_OK); 2044 if (stat && !stat->IsEmpty()) { 2045 body->AddStatement(stat, zone()); 2046 } 2047 } 2048 } 2049 Expect(Token::RBRACE, CHECK_OK); 2050 block_scope->set_end_position(scanner()->location().end_pos); 2051 block_scope = block_scope->FinalizeBlockScope(); 2052 body->set_scope(block_scope); 2053 return body; 2054 } 2055 2056 2057 Block* Parser::ParseVariableStatement(VariableDeclarationContext var_context, 2058 ZoneList<const AstRawString*>* names, 2059 bool* ok) { 2060 // VariableStatement :: 2061 // VariableDeclarations ';' 2062 2063 const AstRawString* ignore; 2064 Block* result = 2065 ParseVariableDeclarations(var_context, NULL, names, &ignore, CHECK_OK); 2066 ExpectSemicolon(CHECK_OK); 2067 return result; 2068 } 2069 2070 2071 // If the variable declaration declares exactly one non-const 2072 // variable, then *out is set to that variable. In all other cases, 2073 // *out is untouched; in particular, it is the caller's responsibility 2074 // to initialize it properly. This mechanism is used for the parsing 2075 // of 'for-in' loops. 2076 Block* Parser::ParseVariableDeclarations( 2077 VariableDeclarationContext var_context, 2078 VariableDeclarationProperties* decl_props, 2079 ZoneList<const AstRawString*>* names, 2080 const AstRawString** out, 2081 bool* ok) { 2082 // VariableDeclarations :: 2083 // ('var' | 'const' | 'let') (Identifier ('=' AssignmentExpression)?)+[','] 2084 // 2085 // The ES6 Draft Rev3 specifies the following grammar for const declarations 2086 // 2087 // ConstDeclaration :: 2088 // const ConstBinding (',' ConstBinding)* ';' 2089 // ConstBinding :: 2090 // Identifier '=' AssignmentExpression 2091 // 2092 // TODO(ES6): 2093 // ConstBinding :: 2094 // BindingPattern '=' AssignmentExpression 2095 2096 int pos = peek_position(); 2097 VariableMode mode = VAR; 2098 // True if the binding needs initialization. 'let' and 'const' declared 2099 // bindings are created uninitialized by their declaration nodes and 2100 // need initialization. 'var' declared bindings are always initialized 2101 // immediately by their declaration nodes. 2102 bool needs_init = false; 2103 bool is_const = false; 2104 Token::Value init_op = Token::INIT_VAR; 2105 if (peek() == Token::VAR) { 2106 Consume(Token::VAR); 2107 } else if (peek() == Token::CONST) { 2108 // TODO(ES6): The ES6 Draft Rev4 section 12.2.2 reads: 2109 // 2110 // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';' 2111 // 2112 // * It is a Syntax Error if the code that matches this production is not 2113 // contained in extended code. 2114 // 2115 // However disallowing const in sloppy mode will break compatibility with 2116 // existing pages. Therefore we keep allowing const with the old 2117 // non-harmony semantics in sloppy mode. 2118 Consume(Token::CONST); 2119 switch (strict_mode()) { 2120 case SLOPPY: 2121 mode = CONST_LEGACY; 2122 init_op = Token::INIT_CONST_LEGACY; 2123 break; 2124 case STRICT: 2125 if (allow_harmony_scoping()) { 2126 if (var_context == kStatement) { 2127 // In strict mode 'const' declarations are only allowed in source 2128 // element positions. 2129 ReportMessage("unprotected_const"); 2130 *ok = false; 2131 return NULL; 2132 } 2133 mode = CONST; 2134 init_op = Token::INIT_CONST; 2135 } else { 2136 ReportMessage("strict_const"); 2137 *ok = false; 2138 return NULL; 2139 } 2140 } 2141 is_const = true; 2142 needs_init = true; 2143 } else if (peek() == Token::LET && strict_mode() == STRICT) { 2144 DCHECK(allow_harmony_scoping()); 2145 Consume(Token::LET); 2146 if (var_context == kStatement) { 2147 // Let declarations are only allowed in source element positions. 2148 ReportMessage("unprotected_let"); 2149 *ok = false; 2150 return NULL; 2151 } 2152 mode = LET; 2153 needs_init = true; 2154 init_op = Token::INIT_LET; 2155 } else { 2156 UNREACHABLE(); // by current callers 2157 } 2158 2159 Scope* declaration_scope = DeclarationScope(mode); 2160 2161 // The scope of a var/const declared variable anywhere inside a function 2162 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). Thus we can 2163 // transform a source-level var/const declaration into a (Function) 2164 // Scope declaration, and rewrite the source-level initialization into an 2165 // assignment statement. We use a block to collect multiple assignments. 2166 // 2167 // We mark the block as initializer block because we don't want the 2168 // rewriter to add a '.result' assignment to such a block (to get compliant 2169 // behavior for code such as print(eval('var x = 7')), and for cosmetic 2170 // reasons when pretty-printing. Also, unless an assignment (initialization) 2171 // is inside an initializer block, it is ignored. 2172 // 2173 // Create new block with one expected declaration. 2174 Block* block = factory()->NewBlock(NULL, 1, true, pos); 2175 int nvars = 0; // the number of variables declared 2176 const AstRawString* name = NULL; 2177 do { 2178 if (fni_ != NULL) fni_->Enter(); 2179 2180 // Parse variable name. 2181 if (nvars > 0) Consume(Token::COMMA); 2182 name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); 2183 if (fni_ != NULL) fni_->PushVariableName(name); 2184 2185 // Declare variable. 2186 // Note that we *always* must treat the initial value via a separate init 2187 // assignment for variables and constants because the value must be assigned 2188 // when the variable is encountered in the source. But the variable/constant 2189 // is declared (and set to 'undefined') upon entering the function within 2190 // which the variable or constant is declared. Only function variables have 2191 // an initial value in the declaration (because they are initialized upon 2192 // entering the function). 2193 // 2194 // If we have a const declaration, in an inner scope, the proxy is always 2195 // bound to the declared variable (independent of possibly surrounding with 2196 // statements). 2197 // For let/const declarations in harmony mode, we can also immediately 2198 // pre-resolve the proxy because it resides in the same scope as the 2199 // declaration. 2200 Interface* interface = 2201 is_const ? Interface::NewConst() : Interface::NewValue(); 2202 VariableProxy* proxy = NewUnresolved(name, mode, interface); 2203 Declaration* declaration = 2204 factory()->NewVariableDeclaration(proxy, mode, scope_, pos); 2205 Declare(declaration, mode != VAR, CHECK_OK); 2206 nvars++; 2207 if (declaration_scope->num_var_or_const() > kMaxNumFunctionLocals) { 2208 ReportMessage("too_many_variables"); 2209 *ok = false; 2210 return NULL; 2211 } 2212 if (names) names->Add(name, zone()); 2213 2214 // Parse initialization expression if present and/or needed. A 2215 // declaration of the form: 2216 // 2217 // var v = x; 2218 // 2219 // is syntactic sugar for: 2220 // 2221 // var v; v = x; 2222 // 2223 // In particular, we need to re-lookup 'v' (in scope_, not 2224 // declaration_scope) as it may be a different 'v' than the 'v' in the 2225 // declaration (e.g., if we are inside a 'with' statement or 'catch' 2226 // block). 2227 // 2228 // However, note that const declarations are different! A const 2229 // declaration of the form: 2230 // 2231 // const c = x; 2232 // 2233 // is *not* syntactic sugar for: 2234 // 2235 // const c; c = x; 2236 // 2237 // The "variable" c initialized to x is the same as the declared 2238 // one - there is no re-lookup (see the last parameter of the 2239 // Declare() call above). 2240 2241 Scope* initialization_scope = is_const ? declaration_scope : scope_; 2242 Expression* value = NULL; 2243 int pos = -1; 2244 // Harmony consts have non-optional initializers. 2245 if (peek() == Token::ASSIGN || mode == CONST) { 2246 Expect(Token::ASSIGN, CHECK_OK); 2247 pos = position(); 2248 value = ParseAssignmentExpression(var_context != kForStatement, CHECK_OK); 2249 // Don't infer if it is "a = function(){...}();"-like expression. 2250 if (fni_ != NULL && 2251 value->AsCall() == NULL && 2252 value->AsCallNew() == NULL) { 2253 fni_->Infer(); 2254 } else { 2255 fni_->RemoveLastFunction(); 2256 } 2257 if (decl_props != NULL) *decl_props = kHasInitializers; 2258 } 2259 2260 // Record the end position of the initializer. 2261 if (proxy->var() != NULL) { 2262 proxy->var()->set_initializer_position(position()); 2263 } 2264 2265 // Make sure that 'const x' and 'let x' initialize 'x' to undefined. 2266 if (value == NULL && needs_init) { 2267 value = GetLiteralUndefined(position()); 2268 } 2269 2270 // Global variable declarations must be compiled in a specific 2271 // way. When the script containing the global variable declaration 2272 // is entered, the global variable must be declared, so that if it 2273 // doesn't exist (on the global object itself, see ES5 errata) it 2274 // gets created with an initial undefined value. This is handled 2275 // by the declarations part of the function representing the 2276 // top-level global code; see Runtime::DeclareGlobalVariable. If 2277 // it already exists (in the object or in a prototype), it is 2278 // *not* touched until the variable declaration statement is 2279 // executed. 2280 // 2281 // Executing the variable declaration statement will always 2282 // guarantee to give the global object an own property. 2283 // This way, global variable declarations can shadow 2284 // properties in the prototype chain, but only after the variable 2285 // declaration statement has been executed. This is important in 2286 // browsers where the global object (window) has lots of 2287 // properties defined in prototype objects. 2288 if (initialization_scope->is_global_scope() && 2289 !IsLexicalVariableMode(mode)) { 2290 // Compute the arguments for the runtime call. 2291 ZoneList<Expression*>* arguments = 2292 new(zone()) ZoneList<Expression*>(3, zone()); 2293 // We have at least 1 parameter. 2294 arguments->Add(factory()->NewStringLiteral(name, pos), zone()); 2295 CallRuntime* initialize; 2296 2297 if (is_const) { 2298 arguments->Add(value, zone()); 2299 value = NULL; // zap the value to avoid the unnecessary assignment 2300 2301 // Construct the call to Runtime_InitializeConstGlobal 2302 // and add it to the initialization statement block. 2303 // Note that the function does different things depending on 2304 // the number of arguments (1 or 2). 2305 initialize = factory()->NewCallRuntime( 2306 ast_value_factory()->initialize_const_global_string(), 2307 Runtime::FunctionForId(Runtime::kInitializeConstGlobal), arguments, 2308 pos); 2309 } else { 2310 // Add strict mode. 2311 // We may want to pass singleton to avoid Literal allocations. 2312 StrictMode strict_mode = initialization_scope->strict_mode(); 2313 arguments->Add(factory()->NewNumberLiteral(strict_mode, pos), zone()); 2314 2315 // Be careful not to assign a value to the global variable if 2316 // we're in a with. The initialization value should not 2317 // necessarily be stored in the global object in that case, 2318 // which is why we need to generate a separate assignment node. 2319 if (value != NULL && !inside_with()) { 2320 arguments->Add(value, zone()); 2321 value = NULL; // zap the value to avoid the unnecessary assignment 2322 // Construct the call to Runtime_InitializeVarGlobal 2323 // and add it to the initialization statement block. 2324 initialize = factory()->NewCallRuntime( 2325 ast_value_factory()->initialize_var_global_string(), 2326 Runtime::FunctionForId(Runtime::kInitializeVarGlobal), arguments, 2327 pos); 2328 } else { 2329 initialize = NULL; 2330 } 2331 } 2332 2333 if (initialize != NULL) { 2334 block->AddStatement(factory()->NewExpressionStatement( 2335 initialize, RelocInfo::kNoPosition), 2336 zone()); 2337 } 2338 } else if (needs_init) { 2339 // Constant initializations always assign to the declared constant which 2340 // is always at the function scope level. This is only relevant for 2341 // dynamically looked-up variables and constants (the start context for 2342 // constant lookups is always the function context, while it is the top 2343 // context for var declared variables). Sigh... 2344 // For 'let' and 'const' declared variables in harmony mode the 2345 // initialization also always assigns to the declared variable. 2346 DCHECK(proxy != NULL); 2347 DCHECK(proxy->var() != NULL); 2348 DCHECK(value != NULL); 2349 Assignment* assignment = 2350 factory()->NewAssignment(init_op, proxy, value, pos); 2351 block->AddStatement( 2352 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), 2353 zone()); 2354 value = NULL; 2355 } 2356 2357 // Add an assignment node to the initialization statement block if we still 2358 // have a pending initialization value. 2359 if (value != NULL) { 2360 DCHECK(mode == VAR); 2361 // 'var' initializations are simply assignments (with all the consequences 2362 // if they are inside a 'with' statement - they may change a 'with' object 2363 // property). 2364 VariableProxy* proxy = 2365 initialization_scope->NewUnresolved(factory(), name, interface); 2366 Assignment* assignment = 2367 factory()->NewAssignment(init_op, proxy, value, pos); 2368 block->AddStatement( 2369 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), 2370 zone()); 2371 } 2372 2373 if (fni_ != NULL) fni_->Leave(); 2374 } while (peek() == Token::COMMA); 2375 2376 // If there was a single non-const declaration, return it in the output 2377 // parameter for possible use by for/in. 2378 if (nvars == 1 && !is_const) { 2379 *out = name; 2380 } 2381 2382 return block; 2383 } 2384 2385 2386 static bool ContainsLabel(ZoneList<const AstRawString*>* labels, 2387 const AstRawString* label) { 2388 DCHECK(label != NULL); 2389 if (labels != NULL) { 2390 for (int i = labels->length(); i-- > 0; ) { 2391 if (labels->at(i) == label) { 2392 return true; 2393 } 2394 } 2395 } 2396 return false; 2397 } 2398 2399 2400 Statement* Parser::ParseExpressionOrLabelledStatement( 2401 ZoneList<const AstRawString*>* labels, bool* ok) { 2402 // ExpressionStatement | LabelledStatement :: 2403 // Expression ';' 2404 // Identifier ':' Statement 2405 int pos = peek_position(); 2406 bool starts_with_idenfifier = peek_any_identifier(); 2407 Expression* expr = ParseExpression(true, CHECK_OK); 2408 if (peek() == Token::COLON && starts_with_idenfifier && expr != NULL && 2409 expr->AsVariableProxy() != NULL && 2410 !expr->AsVariableProxy()->is_this()) { 2411 // Expression is a single identifier, and not, e.g., a parenthesized 2412 // identifier. 2413 VariableProxy* var = expr->AsVariableProxy(); 2414 const AstRawString* label = var->raw_name(); 2415 // TODO(1240780): We don't check for redeclaration of labels 2416 // during preparsing since keeping track of the set of active 2417 // labels requires nontrivial changes to the way scopes are 2418 // structured. However, these are probably changes we want to 2419 // make later anyway so we should go back and fix this then. 2420 if (ContainsLabel(labels, label) || TargetStackContainsLabel(label)) { 2421 ParserTraits::ReportMessage("label_redeclaration", label); 2422 *ok = false; 2423 return NULL; 2424 } 2425 if (labels == NULL) { 2426 labels = new(zone()) ZoneList<const AstRawString*>(4, zone()); 2427 } 2428 labels->Add(label, zone()); 2429 // Remove the "ghost" variable that turned out to be a label 2430 // from the top scope. This way, we don't try to resolve it 2431 // during the scope processing. 2432 scope_->RemoveUnresolved(var); 2433 Expect(Token::COLON, CHECK_OK); 2434 return ParseStatement(labels, ok); 2435 } 2436 2437 // If we have an extension, we allow a native function declaration. 2438 // A native function declaration starts with "native function" with 2439 // no line-terminator between the two words. 2440 if (extension_ != NULL && peek() == Token::FUNCTION && 2441 !scanner()->HasAnyLineTerminatorBeforeNext() && expr != NULL && 2442 expr->AsVariableProxy() != NULL && 2443 expr->AsVariableProxy()->raw_name() == 2444 ast_value_factory()->native_string() && 2445 !scanner()->literal_contains_escapes()) { 2446 return ParseNativeDeclaration(ok); 2447 } 2448 2449 // Parsed expression statement, or the context-sensitive 'module' keyword. 2450 // Only expect semicolon in the former case. 2451 if (!FLAG_harmony_modules || peek() != Token::IDENTIFIER || 2452 scanner()->HasAnyLineTerminatorBeforeNext() || 2453 expr->AsVariableProxy() == NULL || 2454 expr->AsVariableProxy()->raw_name() != 2455 ast_value_factory()->module_string() || 2456 scanner()->literal_contains_escapes()) { 2457 ExpectSemicolon(CHECK_OK); 2458 } 2459 return factory()->NewExpressionStatement(expr, pos); 2460 } 2461 2462 2463 IfStatement* Parser::ParseIfStatement(ZoneList<const AstRawString*>* labels, 2464 bool* ok) { 2465 // IfStatement :: 2466 // 'if' '(' Expression ')' Statement ('else' Statement)? 2467 2468 int pos = peek_position(); 2469 Expect(Token::IF, CHECK_OK); 2470 Expect(Token::LPAREN, CHECK_OK); 2471 Expression* condition = ParseExpression(true, CHECK_OK); 2472 Expect(Token::RPAREN, CHECK_OK); 2473 Statement* then_statement = ParseStatement(labels, CHECK_OK); 2474 Statement* else_statement = NULL; 2475 if (peek() == Token::ELSE) { 2476 Next(); 2477 else_statement = ParseStatement(labels, CHECK_OK); 2478 } else { 2479 else_statement = factory()->NewEmptyStatement(RelocInfo::kNoPosition); 2480 } 2481 return factory()->NewIfStatement( 2482 condition, then_statement, else_statement, pos); 2483 } 2484 2485 2486 Statement* Parser::ParseContinueStatement(bool* ok) { 2487 // ContinueStatement :: 2488 // 'continue' Identifier? ';' 2489 2490 int pos = peek_position(); 2491 Expect(Token::CONTINUE, CHECK_OK); 2492 const AstRawString* label = NULL; 2493 Token::Value tok = peek(); 2494 if (!scanner()->HasAnyLineTerminatorBeforeNext() && 2495 tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) { 2496 // ECMA allows "eval" or "arguments" as labels even in strict mode. 2497 label = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); 2498 } 2499 IterationStatement* target = LookupContinueTarget(label, CHECK_OK); 2500 if (target == NULL) { 2501 // Illegal continue statement. 2502 const char* message = "illegal_continue"; 2503 if (label != NULL) { 2504 message = "unknown_label"; 2505 } 2506 ParserTraits::ReportMessage(message, label); 2507 *ok = false; 2508 return NULL; 2509 } 2510 ExpectSemicolon(CHECK_OK); 2511 return factory()->NewContinueStatement(target, pos); 2512 } 2513 2514 2515 Statement* Parser::ParseBreakStatement(ZoneList<const AstRawString*>* labels, 2516 bool* ok) { 2517 // BreakStatement :: 2518 // 'break' Identifier? ';' 2519 2520 int pos = peek_position(); 2521 Expect(Token::BREAK, CHECK_OK); 2522 const AstRawString* label = NULL; 2523 Token::Value tok = peek(); 2524 if (!scanner()->HasAnyLineTerminatorBeforeNext() && 2525 tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) { 2526 // ECMA allows "eval" or "arguments" as labels even in strict mode. 2527 label = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); 2528 } 2529 // Parse labeled break statements that target themselves into 2530 // empty statements, e.g. 'l1: l2: l3: break l2;' 2531 if (label != NULL && ContainsLabel(labels, label)) { 2532 ExpectSemicolon(CHECK_OK); 2533 return factory()->NewEmptyStatement(pos); 2534 } 2535 BreakableStatement* target = NULL; 2536 target = LookupBreakTarget(label, CHECK_OK); 2537 if (target == NULL) { 2538 // Illegal break statement. 2539 const char* message = "illegal_break"; 2540 if (label != NULL) { 2541 message = "unknown_label"; 2542 } 2543 ParserTraits::ReportMessage(message, label); 2544 *ok = false; 2545 return NULL; 2546 } 2547 ExpectSemicolon(CHECK_OK); 2548 return factory()->NewBreakStatement(target, pos); 2549 } 2550 2551 2552 Statement* Parser::ParseReturnStatement(bool* ok) { 2553 // ReturnStatement :: 2554 // 'return' Expression? ';' 2555 2556 // Consume the return token. It is necessary to do that before 2557 // reporting any errors on it, because of the way errors are 2558 // reported (underlining). 2559 Expect(Token::RETURN, CHECK_OK); 2560 Scanner::Location loc = scanner()->location(); 2561 2562 Token::Value tok = peek(); 2563 Statement* result; 2564 Expression* return_value; 2565 if (scanner()->HasAnyLineTerminatorBeforeNext() || 2566 tok == Token::SEMICOLON || 2567 tok == Token::RBRACE || 2568 tok == Token::EOS) { 2569 return_value = GetLiteralUndefined(position()); 2570 } else { 2571 return_value = ParseExpression(true, CHECK_OK); 2572 } 2573 ExpectSemicolon(CHECK_OK); 2574 if (is_generator()) { 2575 Expression* generator = factory()->NewVariableProxy( 2576 function_state_->generator_object_variable()); 2577 Expression* yield = factory()->NewYield( 2578 generator, return_value, Yield::kFinal, loc.beg_pos); 2579 result = factory()->NewExpressionStatement(yield, loc.beg_pos); 2580 } else { 2581 result = factory()->NewReturnStatement(return_value, loc.beg_pos); 2582 } 2583 2584 Scope* decl_scope = scope_->DeclarationScope(); 2585 if (decl_scope->is_global_scope() || decl_scope->is_eval_scope()) { 2586 ReportMessageAt(loc, "illegal_return"); 2587 *ok = false; 2588 return NULL; 2589 } 2590 return result; 2591 } 2592 2593 2594 Statement* Parser::ParseWithStatement(ZoneList<const AstRawString*>* labels, 2595 bool* ok) { 2596 // WithStatement :: 2597 // 'with' '(' Expression ')' Statement 2598 2599 Expect(Token::WITH, CHECK_OK); 2600 int pos = position(); 2601 2602 if (strict_mode() == STRICT) { 2603 ReportMessage("strict_mode_with"); 2604 *ok = false; 2605 return NULL; 2606 } 2607 2608 Expect(Token::LPAREN, CHECK_OK); 2609 Expression* expr = ParseExpression(true, CHECK_OK); 2610 Expect(Token::RPAREN, CHECK_OK); 2611 2612 scope_->DeclarationScope()->RecordWithStatement(); 2613 Scope* with_scope = NewScope(scope_, WITH_SCOPE); 2614 Statement* stmt; 2615 { BlockState block_state(&scope_, with_scope); 2616 with_scope->set_start_position(scanner()->peek_location().beg_pos); 2617 stmt = ParseStatement(labels, CHECK_OK); 2618 with_scope->set_end_position(scanner()->location().end_pos); 2619 } 2620 return factory()->NewWithStatement(with_scope, expr, stmt, pos); 2621 } 2622 2623 2624 CaseClause* Parser::ParseCaseClause(bool* default_seen_ptr, bool* ok) { 2625 // CaseClause :: 2626 // 'case' Expression ':' Statement* 2627 // 'default' ':' Statement* 2628 2629 Expression* label = NULL; // NULL expression indicates default case 2630 if (peek() == Token::CASE) { 2631 Expect(Token::CASE, CHECK_OK); 2632 label = ParseExpression(true, CHECK_OK); 2633 } else { 2634 Expect(Token::DEFAULT, CHECK_OK); 2635 if (*default_seen_ptr) { 2636 ReportMessage("multiple_defaults_in_switch"); 2637 *ok = false; 2638 return NULL; 2639 } 2640 *default_seen_ptr = true; 2641 } 2642 Expect(Token::COLON, CHECK_OK); 2643 int pos = position(); 2644 ZoneList<Statement*>* statements = 2645 new(zone()) ZoneList<Statement*>(5, zone()); 2646 while (peek() != Token::CASE && 2647 peek() != Token::DEFAULT && 2648 peek() != Token::RBRACE) { 2649 Statement* stat = ParseStatement(NULL, CHECK_OK); 2650 statements->Add(stat, zone()); 2651 } 2652 2653 return factory()->NewCaseClause(label, statements, pos); 2654 } 2655 2656 2657 SwitchStatement* Parser::ParseSwitchStatement( 2658 ZoneList<const AstRawString*>* labels, bool* ok) { 2659 // SwitchStatement :: 2660 // 'switch' '(' Expression ')' '{' CaseClause* '}' 2661 2662 SwitchStatement* statement = 2663 factory()->NewSwitchStatement(labels, peek_position()); 2664 Target target(&this->target_stack_, statement); 2665 2666 Expect(Token::SWITCH, CHECK_OK); 2667 Expect(Token::LPAREN, CHECK_OK); 2668 Expression* tag = ParseExpression(true, CHECK_OK); 2669 Expect(Token::RPAREN, CHECK_OK); 2670 2671 bool default_seen = false; 2672 ZoneList<CaseClause*>* cases = new(zone()) ZoneList<CaseClause*>(4, zone()); 2673 Expect(Token::LBRACE, CHECK_OK); 2674 while (peek() != Token::RBRACE) { 2675 CaseClause* clause = ParseCaseClause(&default_seen, CHECK_OK); 2676 cases->Add(clause, zone()); 2677 } 2678 Expect(Token::RBRACE, CHECK_OK); 2679 2680 if (statement) statement->Initialize(tag, cases); 2681 return statement; 2682 } 2683 2684 2685 Statement* Parser::ParseThrowStatement(bool* ok) { 2686 // ThrowStatement :: 2687 // 'throw' Expression ';' 2688 2689 Expect(Token::THROW, CHECK_OK); 2690 int pos = position(); 2691 if (scanner()->HasAnyLineTerminatorBeforeNext()) { 2692 ReportMessage("newline_after_throw"); 2693 *ok = false; 2694 return NULL; 2695 } 2696 Expression* exception = ParseExpression(true, CHECK_OK); 2697 ExpectSemicolon(CHECK_OK); 2698 2699 return factory()->NewExpressionStatement( 2700 factory()->NewThrow(exception, pos), pos); 2701 } 2702 2703 2704 TryStatement* Parser::ParseTryStatement(bool* ok) { 2705 // TryStatement :: 2706 // 'try' Block Catch 2707 // 'try' Block Finally 2708 // 'try' Block Catch Finally 2709 // 2710 // Catch :: 2711 // 'catch' '(' Identifier ')' Block 2712 // 2713 // Finally :: 2714 // 'finally' Block 2715 2716 Expect(Token::TRY, CHECK_OK); 2717 int pos = position(); 2718 2719 TargetCollector try_collector(zone()); 2720 Block* try_block; 2721 2722 { Target target(&this->target_stack_, &try_collector); 2723 try_block = ParseBlock(NULL, CHECK_OK); 2724 } 2725 2726 Token::Value tok = peek(); 2727 if (tok != Token::CATCH && tok != Token::FINALLY) { 2728 ReportMessage("no_catch_or_finally"); 2729 *ok = false; 2730 return NULL; 2731 } 2732 2733 // If we can break out from the catch block and there is a finally block, 2734 // then we will need to collect escaping targets from the catch 2735 // block. Since we don't know yet if there will be a finally block, we 2736 // always collect the targets. 2737 TargetCollector catch_collector(zone()); 2738 Scope* catch_scope = NULL; 2739 Variable* catch_variable = NULL; 2740 Block* catch_block = NULL; 2741 const AstRawString* name = NULL; 2742 if (tok == Token::CATCH) { 2743 Consume(Token::CATCH); 2744 2745 Expect(Token::LPAREN, CHECK_OK); 2746 catch_scope = NewScope(scope_, CATCH_SCOPE); 2747 catch_scope->set_start_position(scanner()->location().beg_pos); 2748 name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); 2749 2750 Expect(Token::RPAREN, CHECK_OK); 2751 2752 Target target(&this->target_stack_, &catch_collector); 2753 VariableMode mode = 2754 allow_harmony_scoping() && strict_mode() == STRICT ? LET : VAR; 2755 catch_variable = catch_scope->DeclareLocal(name, mode, kCreatedInitialized); 2756 BlockState block_state(&scope_, catch_scope); 2757 catch_block = ParseBlock(NULL, CHECK_OK); 2758 2759 catch_scope->set_end_position(scanner()->location().end_pos); 2760 tok = peek(); 2761 } 2762 2763 Block* finally_block = NULL; 2764 DCHECK(tok == Token::FINALLY || catch_block != NULL); 2765 if (tok == Token::FINALLY) { 2766 Consume(Token::FINALLY); 2767 finally_block = ParseBlock(NULL, CHECK_OK); 2768 } 2769 2770 // Simplify the AST nodes by converting: 2771 // 'try B0 catch B1 finally B2' 2772 // to: 2773 // 'try { try B0 catch B1 } finally B2' 2774 2775 if (catch_block != NULL && finally_block != NULL) { 2776 // If we have both, create an inner try/catch. 2777 DCHECK(catch_scope != NULL && catch_variable != NULL); 2778 int index = function_state_->NextHandlerIndex(); 2779 TryCatchStatement* statement = factory()->NewTryCatchStatement( 2780 index, try_block, catch_scope, catch_variable, catch_block, 2781 RelocInfo::kNoPosition); 2782 statement->set_escaping_targets(try_collector.targets()); 2783 try_block = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition); 2784 try_block->AddStatement(statement, zone()); 2785 catch_block = NULL; // Clear to indicate it's been handled. 2786 } 2787 2788 TryStatement* result = NULL; 2789 if (catch_block != NULL) { 2790 DCHECK(finally_block == NULL); 2791 DCHECK(catch_scope != NULL && catch_variable != NULL); 2792 int index = function_state_->NextHandlerIndex(); 2793 result = factory()->NewTryCatchStatement( 2794 index, try_block, catch_scope, catch_variable, catch_block, pos); 2795 } else { 2796 DCHECK(finally_block != NULL); 2797 int index = function_state_->NextHandlerIndex(); 2798 result = factory()->NewTryFinallyStatement( 2799 index, try_block, finally_block, pos); 2800 // Combine the jump targets of the try block and the possible catch block. 2801 try_collector.targets()->AddAll(*catch_collector.targets(), zone()); 2802 } 2803 2804 result->set_escaping_targets(try_collector.targets()); 2805 return result; 2806 } 2807 2808 2809 DoWhileStatement* Parser::ParseDoWhileStatement( 2810 ZoneList<const AstRawString*>* labels, bool* ok) { 2811 // DoStatement :: 2812 // 'do' Statement 'while' '(' Expression ')' ';' 2813 2814 DoWhileStatement* loop = 2815 factory()->NewDoWhileStatement(labels, peek_position()); 2816 Target target(&this->target_stack_, loop); 2817 2818 Expect(Token::DO, CHECK_OK); 2819 Statement* body = ParseStatement(NULL, CHECK_OK); 2820 Expect(Token::WHILE, CHECK_OK); 2821 Expect(Token::LPAREN, CHECK_OK); 2822 2823 Expression* cond = ParseExpression(true, CHECK_OK); 2824 Expect(Token::RPAREN, CHECK_OK); 2825 2826 // Allow do-statements to be terminated with and without 2827 // semi-colons. This allows code such as 'do;while(0)return' to 2828 // parse, which would not be the case if we had used the 2829 // ExpectSemicolon() functionality here. 2830 if (peek() == Token::SEMICOLON) Consume(Token::SEMICOLON); 2831 2832 if (loop != NULL) loop->Initialize(cond, body); 2833 return loop; 2834 } 2835 2836 2837 WhileStatement* Parser::ParseWhileStatement( 2838 ZoneList<const AstRawString*>* labels, bool* ok) { 2839 // WhileStatement :: 2840 // 'while' '(' Expression ')' Statement 2841 2842 WhileStatement* loop = factory()->NewWhileStatement(labels, peek_position()); 2843 Target target(&this->target_stack_, loop); 2844 2845 Expect(Token::WHILE, CHECK_OK); 2846 Expect(Token::LPAREN, CHECK_OK); 2847 Expression* cond = ParseExpression(true, CHECK_OK); 2848 Expect(Token::RPAREN, CHECK_OK); 2849 Statement* body = ParseStatement(NULL, CHECK_OK); 2850 2851 if (loop != NULL) loop->Initialize(cond, body); 2852 return loop; 2853 } 2854 2855 2856 bool Parser::CheckInOrOf(bool accept_OF, 2857 ForEachStatement::VisitMode* visit_mode) { 2858 if (Check(Token::IN)) { 2859 *visit_mode = ForEachStatement::ENUMERATE; 2860 return true; 2861 } else if (accept_OF && CheckContextualKeyword(CStrVector("of"))) { 2862 *visit_mode = ForEachStatement::ITERATE; 2863 return true; 2864 } 2865 return false; 2866 } 2867 2868 2869 void Parser::InitializeForEachStatement(ForEachStatement* stmt, 2870 Expression* each, 2871 Expression* subject, 2872 Statement* body) { 2873 ForOfStatement* for_of = stmt->AsForOfStatement(); 2874 2875 if (for_of != NULL) { 2876 Variable* iterator = scope_->DeclarationScope()->NewTemporary( 2877 ast_value_factory()->dot_iterator_string()); 2878 Variable* result = scope_->DeclarationScope()->NewTemporary( 2879 ast_value_factory()->dot_result_string()); 2880 2881 Expression* assign_iterator; 2882 Expression* next_result; 2883 Expression* result_done; 2884 Expression* assign_each; 2885 2886 // var iterator = subject[Symbol.iterator](); 2887 assign_iterator = factory()->NewAssignment( 2888 Token::ASSIGN, factory()->NewVariableProxy(iterator), 2889 GetIterator(subject, factory()), RelocInfo::kNoPosition); 2890 2891 // var result = iterator.next(); 2892 { 2893 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); 2894 Expression* next_literal = factory()->NewStringLiteral( 2895 ast_value_factory()->next_string(), RelocInfo::kNoPosition); 2896 Expression* next_property = factory()->NewProperty( 2897 iterator_proxy, next_literal, RelocInfo::kNoPosition); 2898 ZoneList<Expression*>* next_arguments = 2899 new(zone()) ZoneList<Expression*>(0, zone()); 2900 Expression* next_call = factory()->NewCall( 2901 next_property, next_arguments, RelocInfo::kNoPosition); 2902 Expression* result_proxy = factory()->NewVariableProxy(result); 2903 next_result = factory()->NewAssignment( 2904 Token::ASSIGN, result_proxy, next_call, RelocInfo::kNoPosition); 2905 } 2906 2907 // result.done 2908 { 2909 Expression* done_literal = factory()->NewStringLiteral( 2910 ast_value_factory()->done_string(), RelocInfo::kNoPosition); 2911 Expression* result_proxy = factory()->NewVariableProxy(result); 2912 result_done = factory()->NewProperty( 2913 result_proxy, done_literal, RelocInfo::kNoPosition); 2914 } 2915 2916 // each = result.value 2917 { 2918 Expression* value_literal = factory()->NewStringLiteral( 2919 ast_value_factory()->value_string(), RelocInfo::kNoPosition); 2920 Expression* result_proxy = factory()->NewVariableProxy(result); 2921 Expression* result_value = factory()->NewProperty( 2922 result_proxy, value_literal, RelocInfo::kNoPosition); 2923 assign_each = factory()->NewAssignment( 2924 Token::ASSIGN, each, result_value, RelocInfo::kNoPosition); 2925 } 2926 2927 for_of->Initialize(each, subject, body, 2928 assign_iterator, 2929 next_result, 2930 result_done, 2931 assign_each); 2932 } else { 2933 stmt->Initialize(each, subject, body); 2934 } 2935 } 2936 2937 2938 Statement* Parser::DesugarLetBindingsInForStatement( 2939 Scope* inner_scope, ZoneList<const AstRawString*>* names, 2940 ForStatement* loop, Statement* init, Expression* cond, Statement* next, 2941 Statement* body, bool* ok) { 2942 // ES6 13.6.3.4 specifies that on each loop iteration the let variables are 2943 // copied into a new environment. After copying, the "next" statement of the 2944 // loop is executed to update the loop variables. The loop condition is 2945 // checked and the loop body is executed. 2946 // 2947 // We rewrite a for statement of the form 2948 // 2949 // for (let x = i; cond; next) body 2950 // 2951 // into 2952 // 2953 // { 2954 // let x = i; 2955 // temp_x = x; 2956 // flag = 1; 2957 // for (;;) { 2958 // let x = temp_x; 2959 // if (flag == 1) { 2960 // flag = 0; 2961 // } else { 2962 // next; 2963 // } 2964 // if (cond) { 2965 // <empty> 2966 // } else { 2967 // break; 2968 // } 2969 // b 2970 // temp_x = x; 2971 // } 2972 // } 2973 2974 DCHECK(names->length() > 0); 2975 Scope* for_scope = scope_; 2976 ZoneList<Variable*> temps(names->length(), zone()); 2977 2978 Block* outer_block = factory()->NewBlock(NULL, names->length() + 3, false, 2979 RelocInfo::kNoPosition); 2980 outer_block->AddStatement(init, zone()); 2981 2982 const AstRawString* temp_name = ast_value_factory()->dot_for_string(); 2983 2984 // For each let variable x: 2985 // make statement: temp_x = x. 2986 for (int i = 0; i < names->length(); i++) { 2987 VariableProxy* proxy = 2988 NewUnresolved(names->at(i), LET, Interface::NewValue()); 2989 Variable* temp = scope_->DeclarationScope()->NewTemporary(temp_name); 2990 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); 2991 Assignment* assignment = factory()->NewAssignment( 2992 Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition); 2993 Statement* assignment_statement = factory()->NewExpressionStatement( 2994 assignment, RelocInfo::kNoPosition); 2995 outer_block->AddStatement(assignment_statement, zone()); 2996 temps.Add(temp, zone()); 2997 } 2998 2999 Variable* flag = scope_->DeclarationScope()->NewTemporary(temp_name); 3000 // Make statement: flag = 1. 3001 { 3002 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); 3003 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); 3004 Assignment* assignment = factory()->NewAssignment( 3005 Token::ASSIGN, flag_proxy, const1, RelocInfo::kNoPosition); 3006 Statement* assignment_statement = factory()->NewExpressionStatement( 3007 assignment, RelocInfo::kNoPosition); 3008 outer_block->AddStatement(assignment_statement, zone()); 3009 } 3010 3011 outer_block->AddStatement(loop, zone()); 3012 outer_block->set_scope(for_scope); 3013 scope_ = inner_scope; 3014 3015 Block* inner_block = factory()->NewBlock(NULL, 2 * names->length() + 3, 3016 false, RelocInfo::kNoPosition); 3017 int pos = scanner()->location().beg_pos; 3018 ZoneList<Variable*> inner_vars(names->length(), zone()); 3019 3020 // For each let variable x: 3021 // make statement: let x = temp_x. 3022 for (int i = 0; i < names->length(); i++) { 3023 VariableProxy* proxy = 3024 NewUnresolved(names->at(i), LET, Interface::NewValue()); 3025 Declaration* declaration = 3026 factory()->NewVariableDeclaration(proxy, LET, scope_, pos); 3027 Declare(declaration, true, CHECK_OK); 3028 inner_vars.Add(declaration->proxy()->var(), zone()); 3029 VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i)); 3030 Assignment* assignment = factory()->NewAssignment( 3031 Token::INIT_LET, proxy, temp_proxy, pos); 3032 Statement* assignment_statement = factory()->NewExpressionStatement( 3033 assignment, pos); 3034 proxy->var()->set_initializer_position(pos); 3035 inner_block->AddStatement(assignment_statement, zone()); 3036 } 3037 3038 // Make statement: if (flag == 1) { flag = 0; } else { next; }. 3039 if (next) { 3040 Expression* compare = NULL; 3041 // Make compare expresion: flag == 1. 3042 { 3043 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); 3044 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); 3045 compare = factory()->NewCompareOperation( 3046 Token::EQ, flag_proxy, const1, pos); 3047 } 3048 Statement* clear_flag = NULL; 3049 // Make statement: flag = 0. 3050 { 3051 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); 3052 Expression* const0 = factory()->NewSmiLiteral(0, RelocInfo::kNoPosition); 3053 Assignment* assignment = factory()->NewAssignment( 3054 Token::ASSIGN, flag_proxy, const0, RelocInfo::kNoPosition); 3055 clear_flag = factory()->NewExpressionStatement(assignment, pos); 3056 } 3057 Statement* clear_flag_or_next = factory()->NewIfStatement( 3058 compare, clear_flag, next, RelocInfo::kNoPosition); 3059 inner_block->AddStatement(clear_flag_or_next, zone()); 3060 } 3061 3062 3063 // Make statement: if (cond) { } else { break; }. 3064 if (cond) { 3065 Statement* empty = factory()->NewEmptyStatement(RelocInfo::kNoPosition); 3066 BreakableStatement* t = LookupBreakTarget(NULL, CHECK_OK); 3067 Statement* stop = factory()->NewBreakStatement(t, RelocInfo::kNoPosition); 3068 Statement* if_not_cond_break = factory()->NewIfStatement( 3069 cond, empty, stop, cond->position()); 3070 inner_block->AddStatement(if_not_cond_break, zone()); 3071 } 3072 3073 inner_block->AddStatement(body, zone()); 3074 3075 // For each let variable x: 3076 // make statement: temp_x = x; 3077 for (int i = 0; i < names->length(); i++) { 3078 VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i)); 3079 int pos = scanner()->location().end_pos; 3080 VariableProxy* proxy = factory()->NewVariableProxy(inner_vars.at(i), pos); 3081 Assignment* assignment = factory()->NewAssignment( 3082 Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition); 3083 Statement* assignment_statement = factory()->NewExpressionStatement( 3084 assignment, RelocInfo::kNoPosition); 3085 inner_block->AddStatement(assignment_statement, zone()); 3086 } 3087 3088 inner_scope->set_end_position(scanner()->location().end_pos); 3089 inner_block->set_scope(inner_scope); 3090 scope_ = for_scope; 3091 3092 loop->Initialize(NULL, NULL, NULL, inner_block); 3093 return outer_block; 3094 } 3095 3096 3097 Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, 3098 bool* ok) { 3099 // ForStatement :: 3100 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement 3101 3102 int pos = peek_position(); 3103 Statement* init = NULL; 3104 ZoneList<const AstRawString*> let_bindings(1, zone()); 3105 3106 // Create an in-between scope for let-bound iteration variables. 3107 Scope* saved_scope = scope_; 3108 Scope* for_scope = NewScope(scope_, BLOCK_SCOPE); 3109 scope_ = for_scope; 3110 3111 Expect(Token::FOR, CHECK_OK); 3112 Expect(Token::LPAREN, CHECK_OK); 3113 for_scope->set_start_position(scanner()->location().beg_pos); 3114 if (peek() != Token::SEMICOLON) { 3115 if (peek() == Token::VAR || peek() == Token::CONST) { 3116 bool is_const = peek() == Token::CONST; 3117 const AstRawString* name = NULL; 3118 VariableDeclarationProperties decl_props = kHasNoInitializers; 3119 Block* variable_statement = 3120 ParseVariableDeclarations(kForStatement, &decl_props, NULL, &name, 3121 CHECK_OK); 3122 bool accept_OF = decl_props == kHasNoInitializers; 3123 ForEachStatement::VisitMode mode; 3124 3125 if (name != NULL && CheckInOrOf(accept_OF, &mode)) { 3126 Interface* interface = 3127 is_const ? Interface::NewConst() : Interface::NewValue(); 3128 ForEachStatement* loop = 3129 factory()->NewForEachStatement(mode, labels, pos); 3130 Target target(&this->target_stack_, loop); 3131 3132 Expression* enumerable = ParseExpression(true, CHECK_OK); 3133 Expect(Token::RPAREN, CHECK_OK); 3134 3135 VariableProxy* each = 3136 scope_->NewUnresolved(factory(), name, interface); 3137 Statement* body = ParseStatement(NULL, CHECK_OK); 3138 InitializeForEachStatement(loop, each, enumerable, body); 3139 Block* result = 3140 factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition); 3141 result->AddStatement(variable_statement, zone()); 3142 result->AddStatement(loop, zone()); 3143 scope_ = saved_scope; 3144 for_scope->set_end_position(scanner()->location().end_pos); 3145 for_scope = for_scope->FinalizeBlockScope(); 3146 DCHECK(for_scope == NULL); 3147 // Parsed for-in loop w/ variable/const declaration. 3148 return result; 3149 } else { 3150 init = variable_statement; 3151 } 3152 } else if (peek() == Token::LET && strict_mode() == STRICT) { 3153 DCHECK(allow_harmony_scoping()); 3154 const AstRawString* name = NULL; 3155 VariableDeclarationProperties decl_props = kHasNoInitializers; 3156 Block* variable_statement = 3157 ParseVariableDeclarations(kForStatement, &decl_props, &let_bindings, 3158 &name, CHECK_OK); 3159 bool accept_IN = name != NULL && decl_props != kHasInitializers; 3160 bool accept_OF = decl_props == kHasNoInitializers; 3161 ForEachStatement::VisitMode mode; 3162 3163 if (accept_IN && CheckInOrOf(accept_OF, &mode)) { 3164 // Rewrite a for-in statement of the form 3165 // 3166 // for (let x in e) b 3167 // 3168 // into 3169 // 3170 // <let x' be a temporary variable> 3171 // for (x' in e) { 3172 // let x; 3173 // x = x'; 3174 // b; 3175 // } 3176 3177 // TODO(keuchel): Move the temporary variable to the block scope, after 3178 // implementing stack allocated block scoped variables. 3179 Variable* temp = scope_->DeclarationScope()->NewTemporary( 3180 ast_value_factory()->dot_for_string()); 3181 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); 3182 ForEachStatement* loop = 3183 factory()->NewForEachStatement(mode, labels, pos); 3184 Target target(&this->target_stack_, loop); 3185 3186 // The expression does not see the loop variable. 3187 scope_ = saved_scope; 3188 Expression* enumerable = ParseExpression(true, CHECK_OK); 3189 scope_ = for_scope; 3190 Expect(Token::RPAREN, CHECK_OK); 3191 3192 VariableProxy* each = 3193 scope_->NewUnresolved(factory(), name, Interface::NewValue()); 3194 Statement* body = ParseStatement(NULL, CHECK_OK); 3195 Block* body_block = 3196 factory()->NewBlock(NULL, 3, false, RelocInfo::kNoPosition); 3197 Assignment* assignment = factory()->NewAssignment( 3198 Token::ASSIGN, each, temp_proxy, RelocInfo::kNoPosition); 3199 Statement* assignment_statement = factory()->NewExpressionStatement( 3200 assignment, RelocInfo::kNoPosition); 3201 body_block->AddStatement(variable_statement, zone()); 3202 body_block->AddStatement(assignment_statement, zone()); 3203 body_block->AddStatement(body, zone()); 3204 InitializeForEachStatement(loop, temp_proxy, enumerable, body_block); 3205 scope_ = saved_scope; 3206 for_scope->set_end_position(scanner()->location().end_pos); 3207 for_scope = for_scope->FinalizeBlockScope(); 3208 body_block->set_scope(for_scope); 3209 // Parsed for-in loop w/ let declaration. 3210 return loop; 3211 3212 } else { 3213 init = variable_statement; 3214 } 3215 } else { 3216 Scanner::Location lhs_location = scanner()->peek_location(); 3217 Expression* expression = ParseExpression(false, CHECK_OK); 3218 ForEachStatement::VisitMode mode; 3219 bool accept_OF = expression->AsVariableProxy(); 3220 3221 if (CheckInOrOf(accept_OF, &mode)) { 3222 expression = this->CheckAndRewriteReferenceExpression( 3223 expression, lhs_location, "invalid_lhs_in_for", CHECK_OK); 3224 3225 ForEachStatement* loop = 3226 factory()->NewForEachStatement(mode, labels, pos); 3227 Target target(&this->target_stack_, loop); 3228 3229 Expression* enumerable = ParseExpression(true, CHECK_OK); 3230 Expect(Token::RPAREN, CHECK_OK); 3231 3232 Statement* body = ParseStatement(NULL, CHECK_OK); 3233 InitializeForEachStatement(loop, expression, enumerable, body); 3234 scope_ = saved_scope; 3235 for_scope->set_end_position(scanner()->location().end_pos); 3236 for_scope = for_scope->FinalizeBlockScope(); 3237 DCHECK(for_scope == NULL); 3238 // Parsed for-in loop. 3239 return loop; 3240 3241 } else { 3242 init = factory()->NewExpressionStatement( 3243 expression, RelocInfo::kNoPosition); 3244 } 3245 } 3246 } 3247 3248 // Standard 'for' loop 3249 ForStatement* loop = factory()->NewForStatement(labels, pos); 3250 Target target(&this->target_stack_, loop); 3251 3252 // Parsed initializer at this point. 3253 Expect(Token::SEMICOLON, CHECK_OK); 3254 3255 // If there are let bindings, then condition and the next statement of the 3256 // for loop must be parsed in a new scope. 3257 Scope* inner_scope = NULL; 3258 if (let_bindings.length() > 0) { 3259 inner_scope = NewScope(for_scope, BLOCK_SCOPE); 3260 inner_scope->set_start_position(scanner()->location().beg_pos); 3261 scope_ = inner_scope; 3262 } 3263 3264 Expression* cond = NULL; 3265 if (peek() != Token::SEMICOLON) { 3266 cond = ParseExpression(true, CHECK_OK); 3267 } 3268 Expect(Token::SEMICOLON, CHECK_OK); 3269 3270 Statement* next = NULL; 3271 if (peek() != Token::RPAREN) { 3272 Expression* exp = ParseExpression(true, CHECK_OK); 3273 next = factory()->NewExpressionStatement(exp, RelocInfo::kNoPosition); 3274 } 3275 Expect(Token::RPAREN, CHECK_OK); 3276 3277 Statement* body = ParseStatement(NULL, CHECK_OK); 3278 3279 Statement* result = NULL; 3280 if (let_bindings.length() > 0) { 3281 scope_ = for_scope; 3282 result = DesugarLetBindingsInForStatement(inner_scope, &let_bindings, loop, 3283 init, cond, next, body, CHECK_OK); 3284 scope_ = saved_scope; 3285 for_scope->set_end_position(scanner()->location().end_pos); 3286 } else { 3287 scope_ = saved_scope; 3288 for_scope->set_end_position(scanner()->location().end_pos); 3289 for_scope = for_scope->FinalizeBlockScope(); 3290 if (for_scope) { 3291 // Rewrite a for statement of the form 3292 // for (const x = i; c; n) b 3293 // 3294 // into 3295 // 3296 // { 3297 // const x = i; 3298 // for (; c; n) b 3299 // } 3300 DCHECK(init != NULL); 3301 Block* block = 3302 factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition); 3303 block->AddStatement(init, zone()); 3304 block->AddStatement(loop, zone()); 3305 block->set_scope(for_scope); 3306 loop->Initialize(NULL, cond, next, body); 3307 result = block; 3308 } else { 3309 loop->Initialize(init, cond, next, body); 3310 result = loop; 3311 } 3312 } 3313 return result; 3314 } 3315 3316 3317 DebuggerStatement* Parser::ParseDebuggerStatement(bool* ok) { 3318 // In ECMA-262 'debugger' is defined as a reserved keyword. In some browser 3319 // contexts this is used as a statement which invokes the debugger as i a 3320 // break point is present. 3321 // DebuggerStatement :: 3322 // 'debugger' ';' 3323 3324 int pos = peek_position(); 3325 Expect(Token::DEBUGGER, CHECK_OK); 3326 ExpectSemicolon(CHECK_OK); 3327 return factory()->NewDebuggerStatement(pos); 3328 } 3329 3330 3331 bool CompileTimeValue::IsCompileTimeValue(Expression* expression) { 3332 if (expression->IsLiteral()) return true; 3333 MaterializedLiteral* lit = expression->AsMaterializedLiteral(); 3334 return lit != NULL && lit->is_simple(); 3335 } 3336 3337 3338 Handle<FixedArray> CompileTimeValue::GetValue(Isolate* isolate, 3339 Expression* expression) { 3340 Factory* factory = isolate->factory(); 3341 DCHECK(IsCompileTimeValue(expression)); 3342 Handle<FixedArray> result = factory->NewFixedArray(2, TENURED); 3343 ObjectLiteral* object_literal = expression->AsObjectLiteral(); 3344 if (object_literal != NULL) { 3345 DCHECK(object_literal->is_simple()); 3346 if (object_literal->fast_elements()) { 3347 result->set(kLiteralTypeSlot, Smi::FromInt(OBJECT_LITERAL_FAST_ELEMENTS)); 3348 } else { 3349 result->set(kLiteralTypeSlot, Smi::FromInt(OBJECT_LITERAL_SLOW_ELEMENTS)); 3350 } 3351 result->set(kElementsSlot, *object_literal->constant_properties()); 3352 } else { 3353 ArrayLiteral* array_literal = expression->AsArrayLiteral(); 3354 DCHECK(array_literal != NULL && array_literal->is_simple()); 3355 result->set(kLiteralTypeSlot, Smi::FromInt(ARRAY_LITERAL)); 3356 result->set(kElementsSlot, *array_literal->constant_elements()); 3357 } 3358 return result; 3359 } 3360 3361 3362 CompileTimeValue::LiteralType CompileTimeValue::GetLiteralType( 3363 Handle<FixedArray> value) { 3364 Smi* literal_type = Smi::cast(value->get(kLiteralTypeSlot)); 3365 return static_cast<LiteralType>(literal_type->value()); 3366 } 3367 3368 3369 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { 3370 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); 3371 } 3372 3373 3374 bool CheckAndDeclareArrowParameter(ParserTraits* traits, Expression* expression, 3375 Scope* scope, int* num_params, 3376 Scanner::Location* dupe_loc) { 3377 // Case for empty parameter lists: 3378 // () => ... 3379 if (expression == NULL) return true; 3380 3381 // Too many parentheses around expression: 3382 // (( ... )) => ... 3383 if (expression->parenthesization_level() > 1) return false; 3384 3385 // Case for a single parameter: 3386 // (foo) => ... 3387 // foo => ... 3388 if (expression->IsVariableProxy()) { 3389 if (expression->AsVariableProxy()->is_this()) return false; 3390 3391 const AstRawString* raw_name = expression->AsVariableProxy()->raw_name(); 3392 if (traits->IsEvalOrArguments(raw_name) || 3393 traits->IsFutureStrictReserved(raw_name)) 3394 return false; 3395 3396 if (scope->IsDeclared(raw_name)) { 3397 *dupe_loc = Scanner::Location( 3398 expression->position(), expression->position() + raw_name->length()); 3399 return false; 3400 } 3401 3402 scope->DeclareParameter(raw_name, VAR); 3403 ++(*num_params); 3404 return true; 3405 } 3406 3407 // Case for more than one parameter: 3408 // (foo, bar [, ...]) => ... 3409 if (expression->IsBinaryOperation()) { 3410 BinaryOperation* binop = expression->AsBinaryOperation(); 3411 if (binop->op() != Token::COMMA || binop->left()->is_parenthesized() || 3412 binop->right()->is_parenthesized()) 3413 return false; 3414 3415 return CheckAndDeclareArrowParameter(traits, binop->left(), scope, 3416 num_params, dupe_loc) && 3417 CheckAndDeclareArrowParameter(traits, binop->right(), scope, 3418 num_params, dupe_loc); 3419 } 3420 3421 // Any other kind of expression is not a valid parameter list. 3422 return false; 3423 } 3424 3425 3426 int ParserTraits::DeclareArrowParametersFromExpression( 3427 Expression* expression, Scope* scope, Scanner::Location* dupe_loc, 3428 bool* ok) { 3429 int num_params = 0; 3430 *ok = CheckAndDeclareArrowParameter(this, expression, scope, &num_params, 3431 dupe_loc); 3432 return num_params; 3433 } 3434 3435 3436 FunctionLiteral* Parser::ParseFunctionLiteral( 3437 const AstRawString* function_name, Scanner::Location function_name_location, 3438 bool name_is_strict_reserved, FunctionKind kind, int function_token_pos, 3439 FunctionLiteral::FunctionType function_type, 3440 FunctionLiteral::ArityRestriction arity_restriction, bool* ok) { 3441 // Function :: 3442 // '(' FormalParameterList? ')' '{' FunctionBody '}' 3443 // 3444 // Getter :: 3445 // '(' ')' '{' FunctionBody '}' 3446 // 3447 // Setter :: 3448 // '(' PropertySetParameterList ')' '{' FunctionBody '}' 3449 3450 int pos = function_token_pos == RelocInfo::kNoPosition 3451 ? peek_position() : function_token_pos; 3452 3453 bool is_generator = IsGeneratorFunction(kind); 3454 3455 // Anonymous functions were passed either the empty symbol or a null 3456 // handle as the function name. Remember if we were passed a non-empty 3457 // handle to decide whether to invoke function name inference. 3458 bool should_infer_name = function_name == NULL; 3459 3460 // We want a non-null handle as the function name. 3461 if (should_infer_name) { 3462 function_name = ast_value_factory()->empty_string(); 3463 } 3464 3465 int num_parameters = 0; 3466 // Function declarations are function scoped in normal mode, so they are 3467 // hoisted. In harmony block scoping mode they are block scoped, so they 3468 // are not hoisted. 3469 // 3470 // One tricky case are function declarations in a local sloppy-mode eval: 3471 // their declaration is hoisted, but they still see the local scope. E.g., 3472 // 3473 // function() { 3474 // var x = 0 3475 // try { throw 1 } catch (x) { eval("function g() { return x }") } 3476 // return g() 3477 // } 3478 // 3479 // needs to return 1. To distinguish such cases, we need to detect 3480 // (1) whether a function stems from a sloppy eval, and 3481 // (2) whether it actually hoists across the eval. 3482 // Unfortunately, we do not represent sloppy eval scopes, so we do not have 3483 // either information available directly, especially not when lazily compiling 3484 // a function like 'g'. We hence rely on the following invariants: 3485 // - (1) is the case iff the innermost scope of the deserialized scope chain 3486 // under which we compile is _not_ a declaration scope. This holds because 3487 // in all normal cases, function declarations are fully hoisted to a 3488 // declaration scope and compiled relative to that. 3489 // - (2) is the case iff the current declaration scope is still the original 3490 // one relative to the deserialized scope chain. Otherwise we must be 3491 // compiling a function in an inner declaration scope in the eval, e.g. a 3492 // nested function, and hoisting works normally relative to that. 3493 Scope* declaration_scope = scope_->DeclarationScope(); 3494 Scope* original_declaration_scope = original_scope_->DeclarationScope(); 3495 Scope* scope = 3496 function_type == FunctionLiteral::DECLARATION && 3497 (!allow_harmony_scoping() || strict_mode() == SLOPPY) && 3498 (original_scope_ == original_declaration_scope || 3499 declaration_scope != original_declaration_scope) 3500 ? NewScope(declaration_scope, FUNCTION_SCOPE) 3501 : NewScope(scope_, FUNCTION_SCOPE); 3502 ZoneList<Statement*>* body = NULL; 3503 int materialized_literal_count = -1; 3504 int expected_property_count = -1; 3505 int handler_count = 0; 3506 FunctionLiteral::ParameterFlag duplicate_parameters = 3507 FunctionLiteral::kNoDuplicateParameters; 3508 FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_ 3509 ? FunctionLiteral::kIsParenthesized 3510 : FunctionLiteral::kNotParenthesized; 3511 AstProperties ast_properties; 3512 BailoutReason dont_optimize_reason = kNoReason; 3513 // Parse function body. 3514 { 3515 FunctionState function_state(&function_state_, &scope_, scope, zone(), 3516 ast_value_factory(), 3517 info()->ast_node_id_gen()); 3518 scope_->SetScopeName(function_name); 3519 3520 if (is_generator) { 3521 // For generators, allocating variables in contexts is currently a win 3522 // because it minimizes the work needed to suspend and resume an 3523 // activation. 3524 scope_->ForceContextAllocation(); 3525 3526 // Calling a generator returns a generator object. That object is stored 3527 // in a temporary variable, a definition that is used by "yield" 3528 // expressions. This also marks the FunctionState as a generator. 3529 Variable* temp = scope_->DeclarationScope()->NewTemporary( 3530 ast_value_factory()->dot_generator_object_string()); 3531 function_state.set_generator_object_variable(temp); 3532 } 3533 3534 // FormalParameterList :: 3535 // '(' (Identifier)*[','] ')' 3536 Expect(Token::LPAREN, CHECK_OK); 3537 scope->set_start_position(scanner()->location().beg_pos); 3538 3539 // We don't yet know if the function will be strict, so we cannot yet 3540 // produce errors for parameter names or duplicates. However, we remember 3541 // the locations of these errors if they occur and produce the errors later. 3542 Scanner::Location eval_args_error_log = Scanner::Location::invalid(); 3543 Scanner::Location dupe_error_loc = Scanner::Location::invalid(); 3544 Scanner::Location reserved_loc = Scanner::Location::invalid(); 3545 3546 bool done = arity_restriction == FunctionLiteral::GETTER_ARITY || 3547 (peek() == Token::RPAREN && 3548 arity_restriction != FunctionLiteral::SETTER_ARITY); 3549 while (!done) { 3550 bool is_strict_reserved = false; 3551 const AstRawString* param_name = 3552 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); 3553 3554 // Store locations for possible future error reports. 3555 if (!eval_args_error_log.IsValid() && IsEvalOrArguments(param_name)) { 3556 eval_args_error_log = scanner()->location(); 3557 } 3558 if (!reserved_loc.IsValid() && is_strict_reserved) { 3559 reserved_loc = scanner()->location(); 3560 } 3561 if (!dupe_error_loc.IsValid() && scope_->IsDeclared(param_name)) { 3562 duplicate_parameters = FunctionLiteral::kHasDuplicateParameters; 3563 dupe_error_loc = scanner()->location(); 3564 } 3565 3566 Variable* var = scope_->DeclareParameter(param_name, VAR); 3567 if (scope->strict_mode() == SLOPPY) { 3568 // TODO(sigurds) Mark every parameter as maybe assigned. This is a 3569 // conservative approximation necessary to account for parameters 3570 // that are assigned via the arguments array. 3571 var->set_maybe_assigned(); 3572 } 3573 3574 num_parameters++; 3575 if (num_parameters > Code::kMaxArguments) { 3576 ReportMessage("too_many_parameters"); 3577 *ok = false; 3578 return NULL; 3579 } 3580 if (arity_restriction == FunctionLiteral::SETTER_ARITY) break; 3581 done = (peek() == Token::RPAREN); 3582 if (!done) Expect(Token::COMMA, CHECK_OK); 3583 } 3584 Expect(Token::RPAREN, CHECK_OK); 3585 3586 Expect(Token::LBRACE, CHECK_OK); 3587 3588 // If we have a named function expression, we add a local variable 3589 // declaration to the body of the function with the name of the 3590 // function and let it refer to the function itself (closure). 3591 // NOTE: We create a proxy and resolve it here so that in the 3592 // future we can change the AST to only refer to VariableProxies 3593 // instead of Variables and Proxis as is the case now. 3594 Variable* fvar = NULL; 3595 Token::Value fvar_init_op = Token::INIT_CONST_LEGACY; 3596 if (function_type == FunctionLiteral::NAMED_EXPRESSION) { 3597 if (allow_harmony_scoping() && strict_mode() == STRICT) { 3598 fvar_init_op = Token::INIT_CONST; 3599 } 3600 VariableMode fvar_mode = 3601 allow_harmony_scoping() && strict_mode() == STRICT 3602 ? CONST : CONST_LEGACY; 3603 DCHECK(function_name != NULL); 3604 fvar = new (zone()) 3605 Variable(scope_, function_name, fvar_mode, true /* is valid LHS */, 3606 Variable::NORMAL, kCreatedInitialized, kNotAssigned, 3607 Interface::NewConst()); 3608 VariableProxy* proxy = factory()->NewVariableProxy(fvar); 3609 VariableDeclaration* fvar_declaration = factory()->NewVariableDeclaration( 3610 proxy, fvar_mode, scope_, RelocInfo::kNoPosition); 3611 scope_->DeclareFunctionVar(fvar_declaration); 3612 } 3613 3614 // Determine if the function can be parsed lazily. Lazy parsing is different 3615 // from lazy compilation; we need to parse more eagerly than we compile. 3616 3617 // We can only parse lazily if we also compile lazily. The heuristics for 3618 // lazy compilation are: 3619 // - It must not have been prohibited by the caller to Parse (some callers 3620 // need a full AST). 3621 // - The outer scope must allow lazy compilation of inner functions. 3622 // - The function mustn't be a function expression with an open parenthesis 3623 // before; we consider that a hint that the function will be called 3624 // immediately, and it would be a waste of time to make it lazily 3625 // compiled. 3626 // These are all things we can know at this point, without looking at the 3627 // function itself. 3628 3629 // In addition, we need to distinguish between these cases: 3630 // (function foo() { 3631 // bar = function() { return 1; } 3632 // })(); 3633 // and 3634 // (function foo() { 3635 // var a = 1; 3636 // bar = function() { return a; } 3637 // })(); 3638 3639 // Now foo will be parsed eagerly and compiled eagerly (optimization: assume 3640 // parenthesis before the function means that it will be called 3641 // immediately). The inner function *must* be parsed eagerly to resolve the 3642 // possible reference to the variable in foo's scope. However, it's possible 3643 // that it will be compiled lazily. 3644 3645 // To make this additional case work, both Parser and PreParser implement a 3646 // logic where only top-level functions will be parsed lazily. 3647 bool is_lazily_parsed = (mode() == PARSE_LAZILY && 3648 scope_->AllowsLazyCompilation() && 3649 !parenthesized_function_); 3650 parenthesized_function_ = false; // The bit was set for this function only. 3651 3652 if (is_lazily_parsed) { 3653 SkipLazyFunctionBody(function_name, &materialized_literal_count, 3654 &expected_property_count, CHECK_OK); 3655 } else { 3656 body = ParseEagerFunctionBody(function_name, pos, fvar, fvar_init_op, 3657 is_generator, CHECK_OK); 3658 materialized_literal_count = function_state.materialized_literal_count(); 3659 expected_property_count = function_state.expected_property_count(); 3660 handler_count = function_state.handler_count(); 3661 } 3662 3663 // Validate strict mode. 3664 // Concise methods use StrictFormalParameters. 3665 if (strict_mode() == STRICT || IsConciseMethod(kind)) { 3666 CheckStrictFunctionNameAndParameters(function_name, 3667 name_is_strict_reserved, 3668 function_name_location, 3669 eval_args_error_log, 3670 dupe_error_loc, 3671 reserved_loc, 3672 CHECK_OK); 3673 } 3674 if (strict_mode() == STRICT) { 3675 CheckOctalLiteral(scope->start_position(), 3676 scope->end_position(), 3677 CHECK_OK); 3678 } 3679 ast_properties = *factory()->visitor()->ast_properties(); 3680 dont_optimize_reason = factory()->visitor()->dont_optimize_reason(); 3681 3682 if (allow_harmony_scoping() && strict_mode() == STRICT) { 3683 CheckConflictingVarDeclarations(scope, CHECK_OK); 3684 } 3685 } 3686 3687 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( 3688 function_name, ast_value_factory(), scope, body, 3689 materialized_literal_count, expected_property_count, handler_count, 3690 num_parameters, duplicate_parameters, function_type, 3691 FunctionLiteral::kIsFunction, parenthesized, kind, pos); 3692 function_literal->set_function_token_position(function_token_pos); 3693 function_literal->set_ast_properties(&ast_properties); 3694 function_literal->set_dont_optimize_reason(dont_optimize_reason); 3695 3696 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); 3697 return function_literal; 3698 } 3699 3700 3701 void Parser::SkipLazyFunctionBody(const AstRawString* function_name, 3702 int* materialized_literal_count, 3703 int* expected_property_count, 3704 bool* ok) { 3705 int function_block_pos = position(); 3706 if (compile_options() == ScriptCompiler::kConsumeParserCache) { 3707 // If we have cached data, we use it to skip parsing the function body. The 3708 // data contains the information we need to construct the lazy function. 3709 FunctionEntry entry = 3710 cached_parse_data_->GetFunctionEntry(function_block_pos); 3711 // Check that cached data is valid. 3712 CHECK(entry.is_valid()); 3713 // End position greater than end of stream is safe, and hard to check. 3714 CHECK(entry.end_pos() > function_block_pos); 3715 scanner()->SeekForward(entry.end_pos() - 1); 3716 3717 scope_->set_end_position(entry.end_pos()); 3718 Expect(Token::RBRACE, ok); 3719 if (!*ok) { 3720 return; 3721 } 3722 total_preparse_skipped_ += scope_->end_position() - function_block_pos; 3723 *materialized_literal_count = entry.literal_count(); 3724 *expected_property_count = entry.property_count(); 3725 scope_->SetStrictMode(entry.strict_mode()); 3726 } else { 3727 // With no cached data, we partially parse the function, without building an 3728 // AST. This gathers the data needed to build a lazy function. 3729 SingletonLogger logger; 3730 PreParser::PreParseResult result = 3731 ParseLazyFunctionBodyWithPreParser(&logger); 3732 if (result == PreParser::kPreParseStackOverflow) { 3733 // Propagate stack overflow. 3734 set_stack_overflow(); 3735 *ok = false; 3736 return; 3737 } 3738 if (logger.has_error()) { 3739 ParserTraits::ReportMessageAt( 3740 Scanner::Location(logger.start(), logger.end()), 3741 logger.message(), logger.argument_opt(), logger.is_reference_error()); 3742 *ok = false; 3743 return; 3744 } 3745 scope_->set_end_position(logger.end()); 3746 Expect(Token::RBRACE, ok); 3747 if (!*ok) { 3748 return; 3749 } 3750 total_preparse_skipped_ += scope_->end_position() - function_block_pos; 3751 *materialized_literal_count = logger.literals(); 3752 *expected_property_count = logger.properties(); 3753 scope_->SetStrictMode(logger.strict_mode()); 3754 if (compile_options() == ScriptCompiler::kProduceParserCache) { 3755 DCHECK(log_); 3756 // Position right after terminal '}'. 3757 int body_end = scanner()->location().end_pos; 3758 log_->LogFunction(function_block_pos, body_end, 3759 *materialized_literal_count, 3760 *expected_property_count, 3761 scope_->strict_mode()); 3762 } 3763 } 3764 } 3765 3766 3767 ZoneList<Statement*>* Parser::ParseEagerFunctionBody( 3768 const AstRawString* function_name, int pos, Variable* fvar, 3769 Token::Value fvar_init_op, bool is_generator, bool* ok) { 3770 // Everything inside an eagerly parsed function will be parsed eagerly 3771 // (see comment above). 3772 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); 3773 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(8, zone()); 3774 if (fvar != NULL) { 3775 VariableProxy* fproxy = scope_->NewUnresolved( 3776 factory(), function_name, Interface::NewConst()); 3777 fproxy->BindTo(fvar); 3778 body->Add(factory()->NewExpressionStatement( 3779 factory()->NewAssignment(fvar_init_op, 3780 fproxy, 3781 factory()->NewThisFunction(pos), 3782 RelocInfo::kNoPosition), 3783 RelocInfo::kNoPosition), zone()); 3784 } 3785 3786 // For generators, allocate and yield an iterator on function entry. 3787 if (is_generator) { 3788 ZoneList<Expression*>* arguments = 3789 new(zone()) ZoneList<Expression*>(0, zone()); 3790 CallRuntime* allocation = factory()->NewCallRuntime( 3791 ast_value_factory()->empty_string(), 3792 Runtime::FunctionForId(Runtime::kCreateJSGeneratorObject), arguments, 3793 pos); 3794 VariableProxy* init_proxy = factory()->NewVariableProxy( 3795 function_state_->generator_object_variable()); 3796 Assignment* assignment = factory()->NewAssignment( 3797 Token::INIT_VAR, init_proxy, allocation, RelocInfo::kNoPosition); 3798 VariableProxy* get_proxy = factory()->NewVariableProxy( 3799 function_state_->generator_object_variable()); 3800 Yield* yield = factory()->NewYield( 3801 get_proxy, assignment, Yield::kInitial, RelocInfo::kNoPosition); 3802 body->Add(factory()->NewExpressionStatement( 3803 yield, RelocInfo::kNoPosition), zone()); 3804 } 3805 3806 ParseSourceElements(body, Token::RBRACE, false, false, NULL, CHECK_OK); 3807 3808 if (is_generator) { 3809 VariableProxy* get_proxy = factory()->NewVariableProxy( 3810 function_state_->generator_object_variable()); 3811 Expression* undefined = 3812 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition); 3813 Yield* yield = factory()->NewYield(get_proxy, undefined, Yield::kFinal, 3814 RelocInfo::kNoPosition); 3815 body->Add(factory()->NewExpressionStatement( 3816 yield, RelocInfo::kNoPosition), zone()); 3817 } 3818 3819 Expect(Token::RBRACE, CHECK_OK); 3820 scope_->set_end_position(scanner()->location().end_pos); 3821 3822 return body; 3823 } 3824 3825 3826 PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser( 3827 SingletonLogger* logger) { 3828 // This function may be called on a background thread too; record only the 3829 // main thread preparse times. 3830 if (pre_parse_timer_ != NULL) { 3831 pre_parse_timer_->Start(); 3832 } 3833 DCHECK_EQ(Token::LBRACE, scanner()->current_token()); 3834 3835 if (reusable_preparser_ == NULL) { 3836 reusable_preparser_ = new PreParser(&scanner_, NULL, stack_limit_); 3837 reusable_preparser_->set_allow_harmony_scoping(allow_harmony_scoping()); 3838 reusable_preparser_->set_allow_modules(allow_modules()); 3839 reusable_preparser_->set_allow_natives_syntax(allow_natives_syntax()); 3840 reusable_preparser_->set_allow_lazy(true); 3841 reusable_preparser_->set_allow_arrow_functions(allow_arrow_functions()); 3842 reusable_preparser_->set_allow_harmony_numeric_literals( 3843 allow_harmony_numeric_literals()); 3844 reusable_preparser_->set_allow_classes(allow_classes()); 3845 reusable_preparser_->set_allow_harmony_object_literals( 3846 allow_harmony_object_literals()); 3847 } 3848 PreParser::PreParseResult result = 3849 reusable_preparser_->PreParseLazyFunction(strict_mode(), 3850 is_generator(), 3851 logger); 3852 if (pre_parse_timer_ != NULL) { 3853 pre_parse_timer_->Stop(); 3854 } 3855 return result; 3856 } 3857 3858 3859 Expression* Parser::ParseV8Intrinsic(bool* ok) { 3860 // CallRuntime :: 3861 // '%' Identifier Arguments 3862 3863 int pos = peek_position(); 3864 Expect(Token::MOD, CHECK_OK); 3865 // Allow "eval" or "arguments" for backward compatibility. 3866 const AstRawString* name = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); 3867 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); 3868 3869 if (extension_ != NULL) { 3870 // The extension structures are only accessible while parsing the 3871 // very first time not when reparsing because of lazy compilation. 3872 scope_->DeclarationScope()->ForceEagerCompilation(); 3873 } 3874 3875 const Runtime::Function* function = Runtime::FunctionForName(name->string()); 3876 3877 // Check for built-in IS_VAR macro. 3878 if (function != NULL && 3879 function->intrinsic_type == Runtime::RUNTIME && 3880 function->function_id == Runtime::kIS_VAR) { 3881 // %IS_VAR(x) evaluates to x if x is a variable, 3882 // leads to a parse error otherwise. Could be implemented as an 3883 // inline function %_IS_VAR(x) to eliminate this special case. 3884 if (args->length() == 1 && args->at(0)->AsVariableProxy() != NULL) { 3885 return args->at(0); 3886 } else { 3887 ReportMessage("not_isvar"); 3888 *ok = false; 3889 return NULL; 3890 } 3891 } 3892 3893 // Check that the expected number of arguments are being passed. 3894 if (function != NULL && 3895 function->nargs != -1 && 3896 function->nargs != args->length()) { 3897 ReportMessage("illegal_access"); 3898 *ok = false; 3899 return NULL; 3900 } 3901 3902 // Check that the function is defined if it's an inline runtime call. 3903 if (function == NULL && name->FirstCharacter() == '_') { 3904 ParserTraits::ReportMessage("not_defined", name); 3905 *ok = false; 3906 return NULL; 3907 } 3908 3909 // We have a valid intrinsics call or a call to a builtin. 3910 return factory()->NewCallRuntime(name, function, args, pos); 3911 } 3912 3913 3914 Literal* Parser::GetLiteralUndefined(int position) { 3915 return factory()->NewUndefinedLiteral(position); 3916 } 3917 3918 3919 void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) { 3920 Declaration* decl = scope->CheckConflictingVarDeclarations(); 3921 if (decl != NULL) { 3922 // In harmony mode we treat conflicting variable bindinds as early 3923 // errors. See ES5 16 for a definition of early errors. 3924 const AstRawString* name = decl->proxy()->raw_name(); 3925 int position = decl->proxy()->position(); 3926 Scanner::Location location = position == RelocInfo::kNoPosition 3927 ? Scanner::Location::invalid() 3928 : Scanner::Location(position, position + 1); 3929 ParserTraits::ReportMessageAt(location, "var_redeclaration", name); 3930 *ok = false; 3931 } 3932 } 3933 3934 3935 // ---------------------------------------------------------------------------- 3936 // Parser support 3937 3938 3939 bool Parser::TargetStackContainsLabel(const AstRawString* label) { 3940 for (Target* t = target_stack_; t != NULL; t = t->previous()) { 3941 BreakableStatement* stat = t->node()->AsBreakableStatement(); 3942 if (stat != NULL && ContainsLabel(stat->labels(), label)) 3943 return true; 3944 } 3945 return false; 3946 } 3947 3948 3949 BreakableStatement* Parser::LookupBreakTarget(const AstRawString* label, 3950 bool* ok) { 3951 bool anonymous = label == NULL; 3952 for (Target* t = target_stack_; t != NULL; t = t->previous()) { 3953 BreakableStatement* stat = t->node()->AsBreakableStatement(); 3954 if (stat == NULL) continue; 3955 if ((anonymous && stat->is_target_for_anonymous()) || 3956 (!anonymous && ContainsLabel(stat->labels(), label))) { 3957 RegisterTargetUse(stat->break_target(), t->previous()); 3958 return stat; 3959 } 3960 } 3961 return NULL; 3962 } 3963 3964 3965 IterationStatement* Parser::LookupContinueTarget(const AstRawString* label, 3966 bool* ok) { 3967 bool anonymous = label == NULL; 3968 for (Target* t = target_stack_; t != NULL; t = t->previous()) { 3969 IterationStatement* stat = t->node()->AsIterationStatement(); 3970 if (stat == NULL) continue; 3971 3972 DCHECK(stat->is_target_for_anonymous()); 3973 if (anonymous || ContainsLabel(stat->labels(), label)) { 3974 RegisterTargetUse(stat->continue_target(), t->previous()); 3975 return stat; 3976 } 3977 } 3978 return NULL; 3979 } 3980 3981 3982 void Parser::RegisterTargetUse(Label* target, Target* stop) { 3983 // Register that a break target found at the given stop in the 3984 // target stack has been used from the top of the target stack. Add 3985 // the break target to any TargetCollectors passed on the stack. 3986 for (Target* t = target_stack_; t != stop; t = t->previous()) { 3987 TargetCollector* collector = t->node()->AsTargetCollector(); 3988 if (collector != NULL) collector->AddTarget(target, zone()); 3989 } 3990 } 3991 3992 3993 void Parser::HandleSourceURLComments() { 3994 if (scanner_.source_url()->length() > 0) { 3995 Handle<String> source_url = scanner_.source_url()->Internalize(isolate()); 3996 info_->script()->set_source_url(*source_url); 3997 } 3998 if (scanner_.source_mapping_url()->length() > 0) { 3999 Handle<String> source_mapping_url = 4000 scanner_.source_mapping_url()->Internalize(isolate()); 4001 info_->script()->set_source_mapping_url(*source_mapping_url); 4002 } 4003 } 4004 4005 4006 void Parser::ThrowPendingError() { 4007 DCHECK(ast_value_factory()->IsInternalized()); 4008 if (has_pending_error_) { 4009 MessageLocation location(script(), pending_error_location_.beg_pos, 4010 pending_error_location_.end_pos); 4011 Factory* factory = isolate()->factory(); 4012 bool has_arg = 4013 pending_error_arg_ != NULL || pending_error_char_arg_ != NULL; 4014 Handle<FixedArray> elements = factory->NewFixedArray(has_arg ? 1 : 0); 4015 if (pending_error_arg_ != NULL) { 4016 Handle<String> arg_string = pending_error_arg_->string(); 4017 elements->set(0, *arg_string); 4018 } else if (pending_error_char_arg_ != NULL) { 4019 Handle<String> arg_string = 4020 factory->NewStringFromUtf8(CStrVector(pending_error_char_arg_)) 4021 .ToHandleChecked(); 4022 elements->set(0, *arg_string); 4023 } 4024 isolate()->debug()->OnCompileError(script()); 4025 4026 Handle<JSArray> array = factory->NewJSArrayWithElements(elements); 4027 Handle<Object> error; 4028 MaybeHandle<Object> maybe_error = 4029 pending_error_is_reference_error_ 4030 ? factory->NewReferenceError(pending_error_message_, array) 4031 : factory->NewSyntaxError(pending_error_message_, array); 4032 if (maybe_error.ToHandle(&error)) isolate()->Throw(*error, &location); 4033 } 4034 } 4035 4036 4037 void Parser::Internalize() { 4038 // Internalize strings. 4039 ast_value_factory()->Internalize(isolate()); 4040 4041 // Error processing. 4042 if (info()->function() == NULL) { 4043 if (stack_overflow()) { 4044 isolate()->StackOverflow(); 4045 } else { 4046 ThrowPendingError(); 4047 } 4048 } 4049 4050 // Move statistics to Isolate. 4051 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; 4052 ++feature) { 4053 for (int i = 0; i < use_counts_[feature]; ++i) { 4054 isolate()->CountUsage(v8::Isolate::UseCounterFeature(feature)); 4055 } 4056 } 4057 isolate()->counters()->total_preparse_skipped()->Increment( 4058 total_preparse_skipped_); 4059 } 4060 4061 4062 // ---------------------------------------------------------------------------- 4063 // Regular expressions 4064 4065 4066 RegExpParser::RegExpParser(FlatStringReader* in, 4067 Handle<String>* error, 4068 bool multiline, 4069 Zone* zone) 4070 : isolate_(zone->isolate()), 4071 zone_(zone), 4072 error_(error), 4073 captures_(NULL), 4074 in_(in), 4075 current_(kEndMarker), 4076 next_pos_(0), 4077 capture_count_(0), 4078 has_more_(true), 4079 multiline_(multiline), 4080 simple_(false), 4081 contains_anchor_(false), 4082 is_scanned_for_captures_(false), 4083 failed_(false) { 4084 Advance(); 4085 } 4086 4087 4088 uc32 RegExpParser::Next() { 4089 if (has_next()) { 4090 return in()->Get(next_pos_); 4091 } else { 4092 return kEndMarker; 4093 } 4094 } 4095 4096 4097 void RegExpParser::Advance() { 4098 if (next_pos_ < in()->length()) { 4099 StackLimitCheck check(isolate()); 4100 if (check.HasOverflowed()) { 4101 ReportError(CStrVector(Isolate::kStackOverflowMessage)); 4102 } else if (zone()->excess_allocation()) { 4103 ReportError(CStrVector("Regular expression too large")); 4104 } else { 4105 current_ = in()->Get(next_pos_); 4106 next_pos_++; 4107 } 4108 } else { 4109 current_ = kEndMarker; 4110 has_more_ = false; 4111 } 4112 } 4113 4114 4115 void RegExpParser::Reset(int pos) { 4116 next_pos_ = pos; 4117 has_more_ = (pos < in()->length()); 4118 Advance(); 4119 } 4120 4121 4122 void RegExpParser::Advance(int dist) { 4123 next_pos_ += dist - 1; 4124 Advance(); 4125 } 4126 4127 4128 bool RegExpParser::simple() { 4129 return simple_; 4130 } 4131 4132 4133 RegExpTree* RegExpParser::ReportError(Vector<const char> message) { 4134 failed_ = true; 4135 *error_ = isolate()->factory()->NewStringFromAscii(message).ToHandleChecked(); 4136 // Zip to the end to make sure the no more input is read. 4137 current_ = kEndMarker; 4138 next_pos_ = in()->length(); 4139 return NULL; 4140 } 4141 4142 4143 // Pattern :: 4144 // Disjunction 4145 RegExpTree* RegExpParser::ParsePattern() { 4146 RegExpTree* result = ParseDisjunction(CHECK_FAILED); 4147 DCHECK(!has_more()); 4148 // If the result of parsing is a literal string atom, and it has the 4149 // same length as the input, then the atom is identical to the input. 4150 if (result->IsAtom() && result->AsAtom()->length() == in()->length()) { 4151 simple_ = true; 4152 } 4153 return result; 4154 } 4155 4156 4157 // Disjunction :: 4158 // Alternative 4159 // Alternative | Disjunction 4160 // Alternative :: 4161 // [empty] 4162 // Term Alternative 4163 // Term :: 4164 // Assertion 4165 // Atom 4166 // Atom Quantifier 4167 RegExpTree* RegExpParser::ParseDisjunction() { 4168 // Used to store current state while parsing subexpressions. 4169 RegExpParserState initial_state(NULL, INITIAL, 0, zone()); 4170 RegExpParserState* stored_state = &initial_state; 4171 // Cache the builder in a local variable for quick access. 4172 RegExpBuilder* builder = initial_state.builder(); 4173 while (true) { 4174 switch (current()) { 4175 case kEndMarker: 4176 if (stored_state->IsSubexpression()) { 4177 // Inside a parenthesized group when hitting end of input. 4178 ReportError(CStrVector("Unterminated group") CHECK_FAILED); 4179 } 4180 DCHECK_EQ(INITIAL, stored_state->group_type()); 4181 // Parsing completed successfully. 4182 return builder->ToRegExp(); 4183 case ')': { 4184 if (!stored_state->IsSubexpression()) { 4185 ReportError(CStrVector("Unmatched ')'") CHECK_FAILED); 4186 } 4187 DCHECK_NE(INITIAL, stored_state->group_type()); 4188 4189 Advance(); 4190 // End disjunction parsing and convert builder content to new single 4191 // regexp atom. 4192 RegExpTree* body = builder->ToRegExp(); 4193 4194 int end_capture_index = captures_started(); 4195 4196 int capture_index = stored_state->capture_index(); 4197 SubexpressionType group_type = stored_state->group_type(); 4198 4199 // Restore previous state. 4200 stored_state = stored_state->previous_state(); 4201 builder = stored_state->builder(); 4202 4203 // Build result of subexpression. 4204 if (group_type == CAPTURE) { 4205 RegExpCapture* capture = new(zone()) RegExpCapture(body, capture_index); 4206 captures_->at(capture_index - 1) = capture; 4207 body = capture; 4208 } else if (group_type != GROUPING) { 4209 DCHECK(group_type == POSITIVE_LOOKAHEAD || 4210 group_type == NEGATIVE_LOOKAHEAD); 4211 bool is_positive = (group_type == POSITIVE_LOOKAHEAD); 4212 body = new(zone()) RegExpLookahead(body, 4213 is_positive, 4214 end_capture_index - capture_index, 4215 capture_index); 4216 } 4217 builder->AddAtom(body); 4218 // For compatability with JSC and ES3, we allow quantifiers after 4219 // lookaheads, and break in all cases. 4220 break; 4221 } 4222 case '|': { 4223 Advance(); 4224 builder->NewAlternative(); 4225 continue; 4226 } 4227 case '*': 4228 case '+': 4229 case '?': 4230 return ReportError(CStrVector("Nothing to repeat")); 4231 case '^': { 4232 Advance(); 4233 if (multiline_) { 4234 builder->AddAssertion( 4235 new(zone()) RegExpAssertion(RegExpAssertion::START_OF_LINE)); 4236 } else { 4237 builder->AddAssertion( 4238 new(zone()) RegExpAssertion(RegExpAssertion::START_OF_INPUT)); 4239 set_contains_anchor(); 4240 } 4241 continue; 4242 } 4243 case '$': { 4244 Advance(); 4245 RegExpAssertion::AssertionType assertion_type = 4246 multiline_ ? RegExpAssertion::END_OF_LINE : 4247 RegExpAssertion::END_OF_INPUT; 4248 builder->AddAssertion(new(zone()) RegExpAssertion(assertion_type)); 4249 continue; 4250 } 4251 case '.': { 4252 Advance(); 4253 // everything except \x0a, \x0d, \u2028 and \u2029 4254 ZoneList<CharacterRange>* ranges = 4255 new(zone()) ZoneList<CharacterRange>(2, zone()); 4256 CharacterRange::AddClassEscape('.', ranges, zone()); 4257 RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false); 4258 builder->AddAtom(atom); 4259 break; 4260 } 4261 case '(': { 4262 SubexpressionType subexpr_type = CAPTURE; 4263 Advance(); 4264 if (current() == '?') { 4265 switch (Next()) { 4266 case ':': 4267 subexpr_type = GROUPING; 4268 break; 4269 case '=': 4270 subexpr_type = POSITIVE_LOOKAHEAD; 4271 break; 4272 case '!': 4273 subexpr_type = NEGATIVE_LOOKAHEAD; 4274 break; 4275 default: 4276 ReportError(CStrVector("Invalid group") CHECK_FAILED); 4277 break; 4278 } 4279 Advance(2); 4280 } else { 4281 if (captures_ == NULL) { 4282 captures_ = new(zone()) ZoneList<RegExpCapture*>(2, zone()); 4283 } 4284 if (captures_started() >= kMaxCaptures) { 4285 ReportError(CStrVector("Too many captures") CHECK_FAILED); 4286 } 4287 captures_->Add(NULL, zone()); 4288 } 4289 // Store current state and begin new disjunction parsing. 4290 stored_state = new(zone()) RegExpParserState(stored_state, subexpr_type, 4291 captures_started(), zone()); 4292 builder = stored_state->builder(); 4293 continue; 4294 } 4295 case '[': { 4296 RegExpTree* atom = ParseCharacterClass(CHECK_FAILED); 4297 builder->AddAtom(atom); 4298 break; 4299 } 4300 // Atom :: 4301 // \ AtomEscape 4302 case '\\': 4303 switch (Next()) { 4304 case kEndMarker: 4305 return ReportError(CStrVector("\\ at end of pattern")); 4306 case 'b': 4307 Advance(2); 4308 builder->AddAssertion( 4309 new(zone()) RegExpAssertion(RegExpAssertion::BOUNDARY)); 4310 continue; 4311 case 'B': 4312 Advance(2); 4313 builder->AddAssertion( 4314 new(zone()) RegExpAssertion(RegExpAssertion::NON_BOUNDARY)); 4315 continue; 4316 // AtomEscape :: 4317 // CharacterClassEscape 4318 // 4319 // CharacterClassEscape :: one of 4320 // d D s S w W 4321 case 'd': case 'D': case 's': case 'S': case 'w': case 'W': { 4322 uc32 c = Next(); 4323 Advance(2); 4324 ZoneList<CharacterRange>* ranges = 4325 new(zone()) ZoneList<CharacterRange>(2, zone()); 4326 CharacterRange::AddClassEscape(c, ranges, zone()); 4327 RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false); 4328 builder->AddAtom(atom); 4329 break; 4330 } 4331 case '1': case '2': case '3': case '4': case '5': case '6': 4332 case '7': case '8': case '9': { 4333 int index = 0; 4334 if (ParseBackReferenceIndex(&index)) { 4335 RegExpCapture* capture = NULL; 4336 if (captures_ != NULL && index <= captures_->length()) { 4337 capture = captures_->at(index - 1); 4338 } 4339 if (capture == NULL) { 4340 builder->AddEmpty(); 4341 break; 4342 } 4343 RegExpTree* atom = new(zone()) RegExpBackReference(capture); 4344 builder->AddAtom(atom); 4345 break; 4346 } 4347 uc32 first_digit = Next(); 4348 if (first_digit == '8' || first_digit == '9') { 4349 // Treat as identity escape 4350 builder->AddCharacter(first_digit); 4351 Advance(2); 4352 break; 4353 } 4354 } 4355 // FALLTHROUGH 4356 case '0': { 4357 Advance(); 4358 uc32 octal = ParseOctalLiteral(); 4359 builder->AddCharacter(octal); 4360 break; 4361 } 4362 // ControlEscape :: one of 4363 // f n r t v 4364 case 'f': 4365 Advance(2); 4366 builder->AddCharacter('\f'); 4367 break; 4368 case 'n': 4369 Advance(2); 4370 builder->AddCharacter('\n'); 4371 break; 4372 case 'r': 4373 Advance(2); 4374 builder->AddCharacter('\r'); 4375 break; 4376 case 't': 4377 Advance(2); 4378 builder->AddCharacter('\t'); 4379 break; 4380 case 'v': 4381 Advance(2); 4382 builder->AddCharacter('\v'); 4383 break; 4384 case 'c': { 4385 Advance(); 4386 uc32 controlLetter = Next(); 4387 // Special case if it is an ASCII letter. 4388 // Convert lower case letters to uppercase. 4389 uc32 letter = controlLetter & ~('a' ^ 'A'); 4390 if (letter < 'A' || 'Z' < letter) { 4391 // controlLetter is not in range 'A'-'Z' or 'a'-'z'. 4392 // This is outside the specification. We match JSC in 4393 // reading the backslash as a literal character instead 4394 // of as starting an escape. 4395 builder->AddCharacter('\\'); 4396 } else { 4397 Advance(2); 4398 builder->AddCharacter(controlLetter & 0x1f); 4399 } 4400 break; 4401 } 4402 case 'x': { 4403 Advance(2); 4404 uc32 value; 4405 if (ParseHexEscape(2, &value)) { 4406 builder->AddCharacter(value); 4407 } else { 4408 builder->AddCharacter('x'); 4409 } 4410 break; 4411 } 4412 case 'u': { 4413 Advance(2); 4414 uc32 value; 4415 if (ParseHexEscape(4, &value)) { 4416 builder->AddCharacter(value); 4417 } else { 4418 builder->AddCharacter('u'); 4419 } 4420 break; 4421 } 4422 default: 4423 // Identity escape. 4424 builder->AddCharacter(Next()); 4425 Advance(2); 4426 break; 4427 } 4428 break; 4429 case '{': { 4430 int dummy; 4431 if (ParseIntervalQuantifier(&dummy, &dummy)) { 4432 ReportError(CStrVector("Nothing to repeat") CHECK_FAILED); 4433 } 4434 // fallthrough 4435 } 4436 default: 4437 builder->AddCharacter(current()); 4438 Advance(); 4439 break; 4440 } // end switch(current()) 4441 4442 int min; 4443 int max; 4444 switch (current()) { 4445 // QuantifierPrefix :: 4446 // * 4447 // + 4448 // ? 4449 // { 4450 case '*': 4451 min = 0; 4452 max = RegExpTree::kInfinity; 4453 Advance(); 4454 break; 4455 case '+': 4456 min = 1; 4457 max = RegExpTree::kInfinity; 4458 Advance(); 4459 break; 4460 case '?': 4461 min = 0; 4462 max = 1; 4463 Advance(); 4464 break; 4465 case '{': 4466 if (ParseIntervalQuantifier(&min, &max)) { 4467 if (max < min) { 4468 ReportError(CStrVector("numbers out of order in {} quantifier.") 4469 CHECK_FAILED); 4470 } 4471 break; 4472 } else { 4473 continue; 4474 } 4475 default: 4476 continue; 4477 } 4478 RegExpQuantifier::QuantifierType quantifier_type = RegExpQuantifier::GREEDY; 4479 if (current() == '?') { 4480 quantifier_type = RegExpQuantifier::NON_GREEDY; 4481 Advance(); 4482 } else if (FLAG_regexp_possessive_quantifier && current() == '+') { 4483 // FLAG_regexp_possessive_quantifier is a debug-only flag. 4484 quantifier_type = RegExpQuantifier::POSSESSIVE; 4485 Advance(); 4486 } 4487 builder->AddQuantifierToAtom(min, max, quantifier_type); 4488 } 4489 } 4490 4491 4492 #ifdef DEBUG 4493 // Currently only used in an DCHECK. 4494 static bool IsSpecialClassEscape(uc32 c) { 4495 switch (c) { 4496 case 'd': case 'D': 4497 case 's': case 'S': 4498 case 'w': case 'W': 4499 return true; 4500 default: 4501 return false; 4502 } 4503 } 4504 #endif 4505 4506 4507 // In order to know whether an escape is a backreference or not we have to scan 4508 // the entire regexp and find the number of capturing parentheses. However we 4509 // don't want to scan the regexp twice unless it is necessary. This mini-parser 4510 // is called when needed. It can see the difference between capturing and 4511 // noncapturing parentheses and can skip character classes and backslash-escaped 4512 // characters. 4513 void RegExpParser::ScanForCaptures() { 4514 // Start with captures started previous to current position 4515 int capture_count = captures_started(); 4516 // Add count of captures after this position. 4517 int n; 4518 while ((n = current()) != kEndMarker) { 4519 Advance(); 4520 switch (n) { 4521 case '\\': 4522 Advance(); 4523 break; 4524 case '[': { 4525 int c; 4526 while ((c = current()) != kEndMarker) { 4527 Advance(); 4528 if (c == '\\') { 4529 Advance(); 4530 } else { 4531 if (c == ']') break; 4532 } 4533 } 4534 break; 4535 } 4536 case '(': 4537 if (current() != '?') capture_count++; 4538 break; 4539 } 4540 } 4541 capture_count_ = capture_count; 4542 is_scanned_for_captures_ = true; 4543 } 4544 4545 4546 bool RegExpParser::ParseBackReferenceIndex(int* index_out) { 4547 DCHECK_EQ('\\', current()); 4548 DCHECK('1' <= Next() && Next() <= '9'); 4549 // Try to parse a decimal literal that is no greater than the total number 4550 // of left capturing parentheses in the input. 4551 int start = position(); 4552 int value = Next() - '0'; 4553 Advance(2); 4554 while (true) { 4555 uc32 c = current(); 4556 if (IsDecimalDigit(c)) { 4557 value = 10 * value + (c - '0'); 4558 if (value > kMaxCaptures) { 4559 Reset(start); 4560 return false; 4561 } 4562 Advance(); 4563 } else { 4564 break; 4565 } 4566 } 4567 if (value > captures_started()) { 4568 if (!is_scanned_for_captures_) { 4569 int saved_position = position(); 4570 ScanForCaptures(); 4571 Reset(saved_position); 4572 } 4573 if (value > capture_count_) { 4574 Reset(start); 4575 return false; 4576 } 4577 } 4578 *index_out = value; 4579 return true; 4580 } 4581 4582 4583 // QuantifierPrefix :: 4584 // { DecimalDigits } 4585 // { DecimalDigits , } 4586 // { DecimalDigits , DecimalDigits } 4587 // 4588 // Returns true if parsing succeeds, and set the min_out and max_out 4589 // values. Values are truncated to RegExpTree::kInfinity if they overflow. 4590 bool RegExpParser::ParseIntervalQuantifier(int* min_out, int* max_out) { 4591 DCHECK_EQ(current(), '{'); 4592 int start = position(); 4593 Advance(); 4594 int min = 0; 4595 if (!IsDecimalDigit(current())) { 4596 Reset(start); 4597 return false; 4598 } 4599 while (IsDecimalDigit(current())) { 4600 int next = current() - '0'; 4601 if (min > (RegExpTree::kInfinity - next) / 10) { 4602 // Overflow. Skip past remaining decimal digits and return -1. 4603 do { 4604 Advance(); 4605 } while (IsDecimalDigit(current())); 4606 min = RegExpTree::kInfinity; 4607 break; 4608 } 4609 min = 10 * min + next; 4610 Advance(); 4611 } 4612 int max = 0; 4613 if (current() == '}') { 4614 max = min; 4615 Advance(); 4616 } else if (current() == ',') { 4617 Advance(); 4618 if (current() == '}') { 4619 max = RegExpTree::kInfinity; 4620 Advance(); 4621 } else { 4622 while (IsDecimalDigit(current())) { 4623 int next = current() - '0'; 4624 if (max > (RegExpTree::kInfinity - next) / 10) { 4625 do { 4626 Advance(); 4627 } while (IsDecimalDigit(current())); 4628 max = RegExpTree::kInfinity; 4629 break; 4630 } 4631 max = 10 * max + next; 4632 Advance(); 4633 } 4634 if (current() != '}') { 4635 Reset(start); 4636 return false; 4637 } 4638 Advance(); 4639 } 4640 } else { 4641 Reset(start); 4642 return false; 4643 } 4644 *min_out = min; 4645 *max_out = max; 4646 return true; 4647 } 4648 4649 4650 uc32 RegExpParser::ParseOctalLiteral() { 4651 DCHECK(('0' <= current() && current() <= '7') || current() == kEndMarker); 4652 // For compatibility with some other browsers (not all), we parse 4653 // up to three octal digits with a value below 256. 4654 uc32 value = current() - '0'; 4655 Advance(); 4656 if ('0' <= current() && current() <= '7') { 4657 value = value * 8 + current() - '0'; 4658 Advance(); 4659 if (value < 32 && '0' <= current() && current() <= '7') { 4660 value = value * 8 + current() - '0'; 4661 Advance(); 4662 } 4663 } 4664 return value; 4665 } 4666 4667 4668 bool RegExpParser::ParseHexEscape(int length, uc32 *value) { 4669 int start = position(); 4670 uc32 val = 0; 4671 bool done = false; 4672 for (int i = 0; !done; i++) { 4673 uc32 c = current(); 4674 int d = HexValue(c); 4675 if (d < 0) { 4676 Reset(start); 4677 return false; 4678 } 4679 val = val * 16 + d; 4680 Advance(); 4681 if (i == length - 1) { 4682 done = true; 4683 } 4684 } 4685 *value = val; 4686 return true; 4687 } 4688 4689 4690 uc32 RegExpParser::ParseClassCharacterEscape() { 4691 DCHECK(current() == '\\'); 4692 DCHECK(has_next() && !IsSpecialClassEscape(Next())); 4693 Advance(); 4694 switch (current()) { 4695 case 'b': 4696 Advance(); 4697 return '\b'; 4698 // ControlEscape :: one of 4699 // f n r t v 4700 case 'f': 4701 Advance(); 4702 return '\f'; 4703 case 'n': 4704 Advance(); 4705 return '\n'; 4706 case 'r': 4707 Advance(); 4708 return '\r'; 4709 case 't': 4710 Advance(); 4711 return '\t'; 4712 case 'v': 4713 Advance(); 4714 return '\v'; 4715 case 'c': { 4716 uc32 controlLetter = Next(); 4717 uc32 letter = controlLetter & ~('A' ^ 'a'); 4718 // For compatibility with JSC, inside a character class 4719 // we also accept digits and underscore as control characters. 4720 if ((controlLetter >= '0' && controlLetter <= '9') || 4721 controlLetter == '_' || 4722 (letter >= 'A' && letter <= 'Z')) { 4723 Advance(2); 4724 // Control letters mapped to ASCII control characters in the range 4725 // 0x00-0x1f. 4726 return controlLetter & 0x1f; 4727 } 4728 // We match JSC in reading the backslash as a literal 4729 // character instead of as starting an escape. 4730 return '\\'; 4731 } 4732 case '0': case '1': case '2': case '3': case '4': case '5': 4733 case '6': case '7': 4734 // For compatibility, we interpret a decimal escape that isn't 4735 // a back reference (and therefore either \0 or not valid according 4736 // to the specification) as a 1..3 digit octal character code. 4737 return ParseOctalLiteral(); 4738 case 'x': { 4739 Advance(); 4740 uc32 value; 4741 if (ParseHexEscape(2, &value)) { 4742 return value; 4743 } 4744 // If \x is not followed by a two-digit hexadecimal, treat it 4745 // as an identity escape. 4746 return 'x'; 4747 } 4748 case 'u': { 4749 Advance(); 4750 uc32 value; 4751 if (ParseHexEscape(4, &value)) { 4752 return value; 4753 } 4754 // If \u is not followed by a four-digit hexadecimal, treat it 4755 // as an identity escape. 4756 return 'u'; 4757 } 4758 default: { 4759 // Extended identity escape. We accept any character that hasn't 4760 // been matched by a more specific case, not just the subset required 4761 // by the ECMAScript specification. 4762 uc32 result = current(); 4763 Advance(); 4764 return result; 4765 } 4766 } 4767 return 0; 4768 } 4769 4770 4771 CharacterRange RegExpParser::ParseClassAtom(uc16* char_class) { 4772 DCHECK_EQ(0, *char_class); 4773 uc32 first = current(); 4774 if (first == '\\') { 4775 switch (Next()) { 4776 case 'w': case 'W': case 'd': case 'D': case 's': case 'S': { 4777 *char_class = Next(); 4778 Advance(2); 4779 return CharacterRange::Singleton(0); // Return dummy value. 4780 } 4781 case kEndMarker: 4782 return ReportError(CStrVector("\\ at end of pattern")); 4783 default: 4784 uc32 c = ParseClassCharacterEscape(CHECK_FAILED); 4785 return CharacterRange::Singleton(c); 4786 } 4787 } else { 4788 Advance(); 4789 return CharacterRange::Singleton(first); 4790 } 4791 } 4792 4793 4794 static const uc16 kNoCharClass = 0; 4795 4796 // Adds range or pre-defined character class to character ranges. 4797 // If char_class is not kInvalidClass, it's interpreted as a class 4798 // escape (i.e., 's' means whitespace, from '\s'). 4799 static inline void AddRangeOrEscape(ZoneList<CharacterRange>* ranges, 4800 uc16 char_class, 4801 CharacterRange range, 4802 Zone* zone) { 4803 if (char_class != kNoCharClass) { 4804 CharacterRange::AddClassEscape(char_class, ranges, zone); 4805 } else { 4806 ranges->Add(range, zone); 4807 } 4808 } 4809 4810 4811 RegExpTree* RegExpParser::ParseCharacterClass() { 4812 static const char* kUnterminated = "Unterminated character class"; 4813 static const char* kRangeOutOfOrder = "Range out of order in character class"; 4814 4815 DCHECK_EQ(current(), '['); 4816 Advance(); 4817 bool is_negated = false; 4818 if (current() == '^') { 4819 is_negated = true; 4820 Advance(); 4821 } 4822 ZoneList<CharacterRange>* ranges = 4823 new(zone()) ZoneList<CharacterRange>(2, zone()); 4824 while (has_more() && current() != ']') { 4825 uc16 char_class = kNoCharClass; 4826 CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED); 4827 if (current() == '-') { 4828 Advance(); 4829 if (current() == kEndMarker) { 4830 // If we reach the end we break out of the loop and let the 4831 // following code report an error. 4832 break; 4833 } else if (current() == ']') { 4834 AddRangeOrEscape(ranges, char_class, first, zone()); 4835 ranges->Add(CharacterRange::Singleton('-'), zone()); 4836 break; 4837 } 4838 uc16 char_class_2 = kNoCharClass; 4839 CharacterRange next = ParseClassAtom(&char_class_2 CHECK_FAILED); 4840 if (char_class != kNoCharClass || char_class_2 != kNoCharClass) { 4841 // Either end is an escaped character class. Treat the '-' verbatim. 4842 AddRangeOrEscape(ranges, char_class, first, zone()); 4843 ranges->Add(CharacterRange::Singleton('-'), zone()); 4844 AddRangeOrEscape(ranges, char_class_2, next, zone()); 4845 continue; 4846 } 4847 if (first.from() > next.to()) { 4848 return ReportError(CStrVector(kRangeOutOfOrder) CHECK_FAILED); 4849 } 4850 ranges->Add(CharacterRange::Range(first.from(), next.to()), zone()); 4851 } else { 4852 AddRangeOrEscape(ranges, char_class, first, zone()); 4853 } 4854 } 4855 if (!has_more()) { 4856 return ReportError(CStrVector(kUnterminated) CHECK_FAILED); 4857 } 4858 Advance(); 4859 if (ranges->length() == 0) { 4860 ranges->Add(CharacterRange::Everything(), zone()); 4861 is_negated = !is_negated; 4862 } 4863 return new(zone()) RegExpCharacterClass(ranges, is_negated); 4864 } 4865 4866 4867 // ---------------------------------------------------------------------------- 4868 // The Parser interface. 4869 4870 bool RegExpParser::ParseRegExp(FlatStringReader* input, 4871 bool multiline, 4872 RegExpCompileData* result, 4873 Zone* zone) { 4874 DCHECK(result != NULL); 4875 RegExpParser parser(input, &result->error, multiline, zone); 4876 RegExpTree* tree = parser.ParsePattern(); 4877 if (parser.failed()) { 4878 DCHECK(tree == NULL); 4879 DCHECK(!result->error.is_null()); 4880 } else { 4881 DCHECK(tree != NULL); 4882 DCHECK(result->error.is_null()); 4883 result->tree = tree; 4884 int capture_count = parser.captures_started(); 4885 result->simple = tree->IsAtom() && parser.simple() && capture_count == 0; 4886 result->contains_anchor = parser.contains_anchor(); 4887 result->capture_count = capture_count; 4888 } 4889 return !parser.failed(); 4890 } 4891 4892 4893 bool Parser::Parse() { 4894 DCHECK(info()->function() == NULL); 4895 FunctionLiteral* result = NULL; 4896 pre_parse_timer_ = isolate()->counters()->pre_parse(); 4897 if (FLAG_trace_parse || allow_natives_syntax() || extension_ != NULL) { 4898 // If intrinsics are allowed, the Parser cannot operate independent of the 4899 // V8 heap because of Runtime. Tell the string table to internalize strings 4900 // and values right after they're created. 4901 ast_value_factory()->Internalize(isolate()); 4902 } 4903 4904 if (info()->is_lazy()) { 4905 DCHECK(!info()->is_eval()); 4906 if (info()->shared_info()->is_function()) { 4907 result = ParseLazy(); 4908 } else { 4909 result = ParseProgram(); 4910 } 4911 } else { 4912 SetCachedData(); 4913 result = ParseProgram(); 4914 } 4915 info()->SetFunction(result); 4916 4917 Internalize(); 4918 DCHECK(ast_value_factory()->IsInternalized()); 4919 return (result != NULL); 4920 } 4921 4922 4923 void Parser::ParseOnBackground() { 4924 DCHECK(info()->function() == NULL); 4925 FunctionLiteral* result = NULL; 4926 fni_ = new (zone()) FuncNameInferrer(ast_value_factory(), zone()); 4927 4928 CompleteParserRecorder recorder; 4929 if (compile_options() == ScriptCompiler::kProduceParserCache) { 4930 log_ = &recorder; 4931 } 4932 4933 DCHECK(info()->source_stream() != NULL); 4934 ExternalStreamingStream stream(info()->source_stream(), 4935 info()->source_stream_encoding()); 4936 scanner_.Initialize(&stream); 4937 DCHECK(info()->context().is_null() || info()->context()->IsNativeContext()); 4938 4939 // When streaming, we don't know the length of the source until we have parsed 4940 // it. The raw data can be UTF-8, so we wouldn't know the source length until 4941 // we have decoded it anyway even if we knew the raw data length (which we 4942 // don't). We work around this by storing all the scopes which need their end 4943 // position set at the end of the script (the top scope and possible eval 4944 // scopes) and set their end position after we know the script length. 4945 Scope* top_scope = NULL; 4946 Scope* eval_scope = NULL; 4947 result = DoParseProgram(info(), &top_scope, &eval_scope); 4948 4949 top_scope->set_end_position(scanner()->location().end_pos); 4950 if (eval_scope != NULL) { 4951 eval_scope->set_end_position(scanner()->location().end_pos); 4952 } 4953 4954 info()->SetFunction(result); 4955 4956 // We cannot internalize on a background thread; a foreground task will take 4957 // care of calling Parser::Internalize just before compilation. 4958 4959 if (compile_options() == ScriptCompiler::kProduceParserCache) { 4960 if (result != NULL) *info_->cached_data() = recorder.GetScriptData(); 4961 log_ = NULL; 4962 } 4963 } 4964 } } // namespace v8::internal 4965