1 // Copyright 2012 the V8 project authors. All rights reserved. 2 // Redistribution and use in source and binary forms, with or without 3 // modification, are permitted provided that the following conditions are 4 // met: 5 // 6 // * Redistributions of source code must retain the above copyright 7 // notice, this list of conditions and the following disclaimer. 8 // * Redistributions in binary form must reproduce the above 9 // copyright notice, this list of conditions and the following 10 // disclaimer in the documentation and/or other materials provided 11 // with the distribution. 12 // * Neither the name of Google Inc. nor the names of its 13 // contributors may be used to endorse or promote products derived 14 // from this software without specific prior written permission. 15 // 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28 #include "v8.h" 29 30 #include "api.h" 31 #include "ast.h" 32 #include "bootstrapper.h" 33 #include "char-predicates-inl.h" 34 #include "codegen.h" 35 #include "compiler.h" 36 #include "func-name-inferrer.h" 37 #include "messages.h" 38 #include "parser.h" 39 #include "platform.h" 40 #include "preparser.h" 41 #include "runtime.h" 42 #include "scanner-character-streams.h" 43 #include "scopeinfo.h" 44 #include "string-stream.h" 45 46 namespace v8 { 47 namespace internal { 48 49 // PositionStack is used for on-stack allocation of token positions for 50 // new expressions. Please look at ParseNewExpression. 51 52 class PositionStack { 53 public: 54 explicit PositionStack(bool* ok) : top_(NULL), ok_(ok) {} 55 ~PositionStack() { ASSERT(!*ok_ || is_empty()); } 56 57 class Element { 58 public: 59 Element(PositionStack* stack, int value) { 60 previous_ = stack->top(); 61 value_ = value; 62 stack->set_top(this); 63 } 64 65 private: 66 Element* previous() { return previous_; } 67 int value() { return value_; } 68 friend class PositionStack; 69 Element* previous_; 70 int value_; 71 }; 72 73 bool is_empty() { return top_ == NULL; } 74 int pop() { 75 ASSERT(!is_empty()); 76 int result = top_->value(); 77 top_ = top_->previous(); 78 return result; 79 } 80 81 private: 82 Element* top() { return top_; } 83 void set_top(Element* value) { top_ = value; } 84 Element* top_; 85 bool* ok_; 86 }; 87 88 89 RegExpBuilder::RegExpBuilder() 90 : zone_(Isolate::Current()->zone()), 91 pending_empty_(false), 92 characters_(NULL), 93 terms_(), 94 alternatives_() 95 #ifdef DEBUG 96 , last_added_(ADD_NONE) 97 #endif 98 {} 99 100 101 void RegExpBuilder::FlushCharacters() { 102 pending_empty_ = false; 103 if (characters_ != NULL) { 104 RegExpTree* atom = new(zone()) RegExpAtom(characters_->ToConstVector()); 105 characters_ = NULL; 106 text_.Add(atom); 107 LAST(ADD_ATOM); 108 } 109 } 110 111 112 void RegExpBuilder::FlushText() { 113 FlushCharacters(); 114 int num_text = text_.length(); 115 if (num_text == 0) { 116 return; 117 } else if (num_text == 1) { 118 terms_.Add(text_.last()); 119 } else { 120 RegExpText* text = new(zone()) RegExpText(); 121 for (int i = 0; i < num_text; i++) 122 text_.Get(i)->AppendToText(text); 123 terms_.Add(text); 124 } 125 text_.Clear(); 126 } 127 128 129 void RegExpBuilder::AddCharacter(uc16 c) { 130 pending_empty_ = false; 131 if (characters_ == NULL) { 132 characters_ = new(zone()) ZoneList<uc16>(4); 133 } 134 characters_->Add(c); 135 LAST(ADD_CHAR); 136 } 137 138 139 void RegExpBuilder::AddEmpty() { 140 pending_empty_ = true; 141 } 142 143 144 void RegExpBuilder::AddAtom(RegExpTree* term) { 145 if (term->IsEmpty()) { 146 AddEmpty(); 147 return; 148 } 149 if (term->IsTextElement()) { 150 FlushCharacters(); 151 text_.Add(term); 152 } else { 153 FlushText(); 154 terms_.Add(term); 155 } 156 LAST(ADD_ATOM); 157 } 158 159 160 void RegExpBuilder::AddAssertion(RegExpTree* assert) { 161 FlushText(); 162 terms_.Add(assert); 163 LAST(ADD_ASSERT); 164 } 165 166 167 void RegExpBuilder::NewAlternative() { 168 FlushTerms(); 169 } 170 171 172 void RegExpBuilder::FlushTerms() { 173 FlushText(); 174 int num_terms = terms_.length(); 175 RegExpTree* alternative; 176 if (num_terms == 0) { 177 alternative = RegExpEmpty::GetInstance(); 178 } else if (num_terms == 1) { 179 alternative = terms_.last(); 180 } else { 181 alternative = new(zone()) RegExpAlternative(terms_.GetList()); 182 } 183 alternatives_.Add(alternative); 184 terms_.Clear(); 185 LAST(ADD_NONE); 186 } 187 188 189 RegExpTree* RegExpBuilder::ToRegExp() { 190 FlushTerms(); 191 int num_alternatives = alternatives_.length(); 192 if (num_alternatives == 0) { 193 return RegExpEmpty::GetInstance(); 194 } 195 if (num_alternatives == 1) { 196 return alternatives_.last(); 197 } 198 return new(zone()) RegExpDisjunction(alternatives_.GetList()); 199 } 200 201 202 void RegExpBuilder::AddQuantifierToAtom(int min, 203 int max, 204 RegExpQuantifier::Type type) { 205 if (pending_empty_) { 206 pending_empty_ = false; 207 return; 208 } 209 RegExpTree* atom; 210 if (characters_ != NULL) { 211 ASSERT(last_added_ == ADD_CHAR); 212 // Last atom was character. 213 Vector<const uc16> char_vector = characters_->ToConstVector(); 214 int num_chars = char_vector.length(); 215 if (num_chars > 1) { 216 Vector<const uc16> prefix = char_vector.SubVector(0, num_chars - 1); 217 text_.Add(new(zone()) RegExpAtom(prefix)); 218 char_vector = char_vector.SubVector(num_chars - 1, num_chars); 219 } 220 characters_ = NULL; 221 atom = new(zone()) RegExpAtom(char_vector); 222 FlushText(); 223 } else if (text_.length() > 0) { 224 ASSERT(last_added_ == ADD_ATOM); 225 atom = text_.RemoveLast(); 226 FlushText(); 227 } else if (terms_.length() > 0) { 228 ASSERT(last_added_ == ADD_ATOM); 229 atom = terms_.RemoveLast(); 230 if (atom->max_match() == 0) { 231 // Guaranteed to only match an empty string. 232 LAST(ADD_TERM); 233 if (min == 0) { 234 return; 235 } 236 terms_.Add(atom); 237 return; 238 } 239 } else { 240 // Only call immediately after adding an atom or character! 241 UNREACHABLE(); 242 return; 243 } 244 terms_.Add(new(zone()) RegExpQuantifier(min, max, type, atom)); 245 LAST(ADD_TERM); 246 } 247 248 249 Handle<String> Parser::LookupSymbol(int symbol_id) { 250 // Length of symbol cache is the number of identified symbols. 251 // If we are larger than that, or negative, it's not a cached symbol. 252 // This might also happen if there is no preparser symbol data, even 253 // if there is some preparser data. 254 if (static_cast<unsigned>(symbol_id) 255 >= static_cast<unsigned>(symbol_cache_.length())) { 256 if (scanner().is_literal_ascii()) { 257 return isolate()->factory()->LookupAsciiSymbol( 258 scanner().literal_ascii_string()); 259 } else { 260 return isolate()->factory()->LookupTwoByteSymbol( 261 scanner().literal_utf16_string()); 262 } 263 } 264 return LookupCachedSymbol(symbol_id); 265 } 266 267 268 Handle<String> Parser::LookupCachedSymbol(int symbol_id) { 269 // Make sure the cache is large enough to hold the symbol identifier. 270 if (symbol_cache_.length() <= symbol_id) { 271 // Increase length to index + 1. 272 symbol_cache_.AddBlock(Handle<String>::null(), 273 symbol_id + 1 - symbol_cache_.length()); 274 } 275 Handle<String> result = symbol_cache_.at(symbol_id); 276 if (result.is_null()) { 277 if (scanner().is_literal_ascii()) { 278 result = isolate()->factory()->LookupAsciiSymbol( 279 scanner().literal_ascii_string()); 280 } else { 281 result = isolate()->factory()->LookupTwoByteSymbol( 282 scanner().literal_utf16_string()); 283 } 284 symbol_cache_.at(symbol_id) = result; 285 return result; 286 } 287 isolate()->counters()->total_preparse_symbols_skipped()->Increment(); 288 return result; 289 } 290 291 292 FunctionEntry ScriptDataImpl::GetFunctionEntry(int start) { 293 // The current pre-data entry must be a FunctionEntry with the given 294 // start position. 295 if ((function_index_ + FunctionEntry::kSize <= store_.length()) 296 && (static_cast<int>(store_[function_index_]) == start)) { 297 int index = function_index_; 298 function_index_ += FunctionEntry::kSize; 299 return FunctionEntry(store_.SubVector(index, 300 index + FunctionEntry::kSize)); 301 } 302 return FunctionEntry(); 303 } 304 305 306 int ScriptDataImpl::GetSymbolIdentifier() { 307 return ReadNumber(&symbol_data_); 308 } 309 310 311 bool ScriptDataImpl::SanityCheck() { 312 // Check that the header data is valid and doesn't specify 313 // point to positions outside the store. 314 if (store_.length() < PreparseDataConstants::kHeaderSize) return false; 315 if (magic() != PreparseDataConstants::kMagicNumber) return false; 316 if (version() != PreparseDataConstants::kCurrentVersion) return false; 317 if (has_error()) { 318 // Extra sane sanity check for error message encoding. 319 if (store_.length() <= PreparseDataConstants::kHeaderSize 320 + PreparseDataConstants::kMessageTextPos) { 321 return false; 322 } 323 if (Read(PreparseDataConstants::kMessageStartPos) > 324 Read(PreparseDataConstants::kMessageEndPos)) { 325 return false; 326 } 327 unsigned arg_count = Read(PreparseDataConstants::kMessageArgCountPos); 328 int pos = PreparseDataConstants::kMessageTextPos; 329 for (unsigned int i = 0; i <= arg_count; i++) { 330 if (store_.length() <= PreparseDataConstants::kHeaderSize + pos) { 331 return false; 332 } 333 int length = static_cast<int>(Read(pos)); 334 if (length < 0) return false; 335 pos += 1 + length; 336 } 337 if (store_.length() < PreparseDataConstants::kHeaderSize + pos) { 338 return false; 339 } 340 return true; 341 } 342 // Check that the space allocated for function entries is sane. 343 int functions_size = 344 static_cast<int>(store_[PreparseDataConstants::kFunctionsSizeOffset]); 345 if (functions_size < 0) return false; 346 if (functions_size % FunctionEntry::kSize != 0) return false; 347 // Check that the count of symbols is non-negative. 348 int symbol_count = 349 static_cast<int>(store_[PreparseDataConstants::kSymbolCountOffset]); 350 if (symbol_count < 0) return false; 351 // Check that the total size has room for header and function entries. 352 int minimum_size = 353 PreparseDataConstants::kHeaderSize + functions_size; 354 if (store_.length() < minimum_size) return false; 355 return true; 356 } 357 358 359 360 const char* ScriptDataImpl::ReadString(unsigned* start, int* chars) { 361 int length = start[0]; 362 char* result = NewArray<char>(length + 1); 363 for (int i = 0; i < length; i++) { 364 result[i] = start[i + 1]; 365 } 366 result[length] = '\0'; 367 if (chars != NULL) *chars = length; 368 return result; 369 } 370 371 Scanner::Location ScriptDataImpl::MessageLocation() { 372 int beg_pos = Read(PreparseDataConstants::kMessageStartPos); 373 int end_pos = Read(PreparseDataConstants::kMessageEndPos); 374 return Scanner::Location(beg_pos, end_pos); 375 } 376 377 378 const char* ScriptDataImpl::BuildMessage() { 379 unsigned* start = ReadAddress(PreparseDataConstants::kMessageTextPos); 380 return ReadString(start, NULL); 381 } 382 383 384 Vector<const char*> ScriptDataImpl::BuildArgs() { 385 int arg_count = Read(PreparseDataConstants::kMessageArgCountPos); 386 const char** array = NewArray<const char*>(arg_count); 387 // Position after text found by skipping past length field and 388 // length field content words. 389 int pos = PreparseDataConstants::kMessageTextPos + 1 390 + Read(PreparseDataConstants::kMessageTextPos); 391 for (int i = 0; i < arg_count; i++) { 392 int count = 0; 393 array[i] = ReadString(ReadAddress(pos), &count); 394 pos += count + 1; 395 } 396 return Vector<const char*>(array, arg_count); 397 } 398 399 400 unsigned ScriptDataImpl::Read(int position) { 401 return store_[PreparseDataConstants::kHeaderSize + position]; 402 } 403 404 405 unsigned* ScriptDataImpl::ReadAddress(int position) { 406 return &store_[PreparseDataConstants::kHeaderSize + position]; 407 } 408 409 410 Scope* Parser::NewScope(Scope* parent, ScopeType type) { 411 Scope* result = new(zone()) Scope(parent, type); 412 result->Initialize(); 413 return result; 414 } 415 416 417 // ---------------------------------------------------------------------------- 418 // Target is a support class to facilitate manipulation of the 419 // Parser's target_stack_ (the stack of potential 'break' and 420 // 'continue' statement targets). Upon construction, a new target is 421 // added; it is removed upon destruction. 422 423 class Target BASE_EMBEDDED { 424 public: 425 Target(Target** variable, AstNode* node) 426 : variable_(variable), node_(node), previous_(*variable) { 427 *variable = this; 428 } 429 430 ~Target() { 431 *variable_ = previous_; 432 } 433 434 Target* previous() { return previous_; } 435 AstNode* node() { return node_; } 436 437 private: 438 Target** variable_; 439 AstNode* node_; 440 Target* previous_; 441 }; 442 443 444 class TargetScope BASE_EMBEDDED { 445 public: 446 explicit TargetScope(Target** variable) 447 : variable_(variable), previous_(*variable) { 448 *variable = NULL; 449 } 450 451 ~TargetScope() { 452 *variable_ = previous_; 453 } 454 455 private: 456 Target** variable_; 457 Target* previous_; 458 }; 459 460 461 // ---------------------------------------------------------------------------- 462 // FunctionState and BlockState together implement the parser's scope stack. 463 // The parser's current scope is in top_scope_. The BlockState and 464 // FunctionState constructors push on the scope stack and the destructors 465 // pop. They are also used to hold the parser's per-function and per-block 466 // state. 467 468 class Parser::BlockState BASE_EMBEDDED { 469 public: 470 BlockState(Parser* parser, Scope* scope) 471 : parser_(parser), 472 outer_scope_(parser->top_scope_) { 473 parser->top_scope_ = scope; 474 } 475 476 ~BlockState() { parser_->top_scope_ = outer_scope_; } 477 478 private: 479 Parser* parser_; 480 Scope* outer_scope_; 481 }; 482 483 484 Parser::FunctionState::FunctionState(Parser* parser, 485 Scope* scope, 486 Isolate* isolate) 487 : next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize), 488 next_handler_index_(0), 489 expected_property_count_(0), 490 only_simple_this_property_assignments_(false), 491 this_property_assignments_(isolate->factory()->empty_fixed_array()), 492 parser_(parser), 493 outer_function_state_(parser->current_function_state_), 494 outer_scope_(parser->top_scope_), 495 saved_ast_node_id_(isolate->ast_node_id()), 496 factory_(isolate) { 497 parser->top_scope_ = scope; 498 parser->current_function_state_ = this; 499 isolate->set_ast_node_id(AstNode::kDeclarationsId + 1); 500 } 501 502 503 Parser::FunctionState::~FunctionState() { 504 parser_->top_scope_ = outer_scope_; 505 parser_->current_function_state_ = outer_function_state_; 506 if (outer_function_state_ != NULL) { 507 parser_->isolate()->set_ast_node_id(saved_ast_node_id_); 508 } 509 } 510 511 512 // ---------------------------------------------------------------------------- 513 // The CHECK_OK macro is a convenient macro to enforce error 514 // handling for functions that may fail (by returning !*ok). 515 // 516 // CAUTION: This macro appends extra statements after a call, 517 // thus it must never be used where only a single statement 518 // is correct (e.g. an if statement branch w/o braces)! 519 520 #define CHECK_OK ok); \ 521 if (!*ok) return NULL; \ 522 ((void)0 523 #define DUMMY ) // to make indentation work 524 #undef DUMMY 525 526 #define CHECK_FAILED /**/); \ 527 if (failed_) return NULL; \ 528 ((void)0 529 #define DUMMY ) // to make indentation work 530 #undef DUMMY 531 532 // ---------------------------------------------------------------------------- 533 // Implementation of Parser 534 535 Parser::Parser(Handle<Script> script, 536 int parser_flags, 537 v8::Extension* extension, 538 ScriptDataImpl* pre_data) 539 : isolate_(script->GetIsolate()), 540 symbol_cache_(pre_data ? pre_data->symbol_count() : 0), 541 script_(script), 542 scanner_(isolate_->unicode_cache()), 543 reusable_preparser_(NULL), 544 top_scope_(NULL), 545 current_function_state_(NULL), 546 target_stack_(NULL), 547 extension_(extension), 548 pre_data_(pre_data), 549 fni_(NULL), 550 allow_natives_syntax_((parser_flags & kAllowNativesSyntax) != 0), 551 allow_lazy_((parser_flags & kAllowLazy) != 0), 552 allow_modules_((parser_flags & kAllowModules) != 0), 553 stack_overflow_(false), 554 parenthesized_function_(false) { 555 isolate_->set_ast_node_id(0); 556 if ((parser_flags & kLanguageModeMask) == EXTENDED_MODE) { 557 scanner().SetHarmonyScoping(true); 558 } 559 if ((parser_flags & kAllowModules) != 0) { 560 scanner().SetHarmonyModules(true); 561 } 562 } 563 564 565 FunctionLiteral* Parser::ParseProgram(CompilationInfo* info) { 566 ZoneScope zone_scope(isolate(), DONT_DELETE_ON_EXIT); 567 568 HistogramTimerScope timer(isolate()->counters()->parse()); 569 Handle<String> source(String::cast(script_->source())); 570 isolate()->counters()->total_parse_size()->Increment(source->length()); 571 fni_ = new(zone()) FuncNameInferrer(isolate()); 572 573 // Initialize parser state. 574 source->TryFlatten(); 575 if (source->IsExternalTwoByteString()) { 576 // Notice that the stream is destroyed at the end of the branch block. 577 // The last line of the blocks can't be moved outside, even though they're 578 // identical calls. 579 ExternalTwoByteStringUtf16CharacterStream stream( 580 Handle<ExternalTwoByteString>::cast(source), 0, source->length()); 581 scanner_.Initialize(&stream); 582 return DoParseProgram(info, source, &zone_scope); 583 } else { 584 GenericStringUtf16CharacterStream stream(source, 0, source->length()); 585 scanner_.Initialize(&stream); 586 return DoParseProgram(info, source, &zone_scope); 587 } 588 } 589 590 591 FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info, 592 Handle<String> source, 593 ZoneScope* zone_scope) { 594 ASSERT(top_scope_ == NULL); 595 ASSERT(target_stack_ == NULL); 596 if (pre_data_ != NULL) pre_data_->Initialize(); 597 598 // Compute the parsing mode. 599 mode_ = (FLAG_lazy && allow_lazy_) ? PARSE_LAZILY : PARSE_EAGERLY; 600 if (allow_natives_syntax_ || extension_ != NULL) mode_ = PARSE_EAGERLY; 601 602 Handle<String> no_name = isolate()->factory()->empty_symbol(); 603 604 FunctionLiteral* result = NULL; 605 { Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE); 606 info->SetGlobalScope(scope); 607 if (info->is_eval()) { 608 Handle<SharedFunctionInfo> shared = info->shared_info(); 609 if (!info->is_global() && (shared.is_null() || shared->is_function())) { 610 scope = Scope::DeserializeScopeChain(*info->calling_context(), scope); 611 } 612 if (!scope->is_global_scope() || info->language_mode() != CLASSIC_MODE) { 613 scope = NewScope(scope, EVAL_SCOPE); 614 } 615 } 616 scope->set_start_position(0); 617 scope->set_end_position(source->length()); 618 FunctionState function_state(this, scope, isolate()); 619 top_scope_->SetLanguageMode(info->language_mode()); 620 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16); 621 bool ok = true; 622 int beg_loc = scanner().location().beg_pos; 623 ParseSourceElements(body, Token::EOS, info->is_eval(), &ok); 624 if (ok && !top_scope_->is_classic_mode()) { 625 CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok); 626 } 627 628 if (ok && is_extended_mode()) { 629 CheckConflictingVarDeclarations(top_scope_, &ok); 630 } 631 632 if (ok) { 633 result = factory()->NewFunctionLiteral( 634 no_name, 635 top_scope_, 636 body, 637 function_state.materialized_literal_count(), 638 function_state.expected_property_count(), 639 function_state.handler_count(), 640 function_state.only_simple_this_property_assignments(), 641 function_state.this_property_assignments(), 642 0, 643 FunctionLiteral::kNoDuplicateParameters, 644 FunctionLiteral::ANONYMOUS_EXPRESSION, 645 FunctionLiteral::kGlobalOrEval); 646 result->set_ast_properties(factory()->visitor()->ast_properties()); 647 } else if (stack_overflow_) { 648 isolate()->StackOverflow(); 649 } 650 } 651 652 // Make sure the target stack is empty. 653 ASSERT(target_stack_ == NULL); 654 655 // If there was a syntax error we have to get rid of the AST 656 // and it is not safe to do so before the scope has been deleted. 657 if (result == NULL) zone_scope->DeleteOnExit(); 658 return result; 659 } 660 661 662 FunctionLiteral* Parser::ParseLazy(CompilationInfo* info) { 663 ZoneScope zone_scope(isolate(), DONT_DELETE_ON_EXIT); 664 HistogramTimerScope timer(isolate()->counters()->parse_lazy()); 665 Handle<String> source(String::cast(script_->source())); 666 isolate()->counters()->total_parse_size()->Increment(source->length()); 667 668 Handle<SharedFunctionInfo> shared_info = info->shared_info(); 669 // Initialize parser state. 670 source->TryFlatten(); 671 if (source->IsExternalTwoByteString()) { 672 ExternalTwoByteStringUtf16CharacterStream stream( 673 Handle<ExternalTwoByteString>::cast(source), 674 shared_info->start_position(), 675 shared_info->end_position()); 676 FunctionLiteral* result = ParseLazy(info, &stream, &zone_scope); 677 return result; 678 } else { 679 GenericStringUtf16CharacterStream stream(source, 680 shared_info->start_position(), 681 shared_info->end_position()); 682 FunctionLiteral* result = ParseLazy(info, &stream, &zone_scope); 683 return result; 684 } 685 } 686 687 688 FunctionLiteral* Parser::ParseLazy(CompilationInfo* info, 689 Utf16CharacterStream* source, 690 ZoneScope* zone_scope) { 691 Handle<SharedFunctionInfo> shared_info = info->shared_info(); 692 scanner_.Initialize(source); 693 ASSERT(top_scope_ == NULL); 694 ASSERT(target_stack_ == NULL); 695 696 Handle<String> name(String::cast(shared_info->name())); 697 fni_ = new(zone()) FuncNameInferrer(isolate()); 698 fni_->PushEnclosingName(name); 699 700 mode_ = PARSE_EAGERLY; 701 702 // Place holder for the result. 703 FunctionLiteral* result = NULL; 704 705 { 706 // Parse the function literal. 707 Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE); 708 info->SetGlobalScope(scope); 709 if (!info->closure().is_null()) { 710 scope = Scope::DeserializeScopeChain(info->closure()->context(), scope); 711 } 712 FunctionState function_state(this, scope, isolate()); 713 ASSERT(scope->language_mode() != STRICT_MODE || !info->is_classic_mode()); 714 ASSERT(scope->language_mode() != EXTENDED_MODE || 715 info->is_extended_mode()); 716 ASSERT(info->language_mode() == shared_info->language_mode()); 717 scope->SetLanguageMode(shared_info->language_mode()); 718 FunctionLiteral::Type type = shared_info->is_expression() 719 ? (shared_info->is_anonymous() 720 ? FunctionLiteral::ANONYMOUS_EXPRESSION 721 : FunctionLiteral::NAMED_EXPRESSION) 722 : FunctionLiteral::DECLARATION; 723 bool ok = true; 724 result = ParseFunctionLiteral(name, 725 false, // Strict mode name already checked. 726 RelocInfo::kNoPosition, 727 type, 728 &ok); 729 // Make sure the results agree. 730 ASSERT(ok == (result != NULL)); 731 } 732 733 // Make sure the target stack is empty. 734 ASSERT(target_stack_ == NULL); 735 736 // If there was a stack overflow we have to get rid of AST and it is 737 // not safe to do before scope has been deleted. 738 if (result == NULL) { 739 zone_scope->DeleteOnExit(); 740 if (stack_overflow_) isolate()->StackOverflow(); 741 } else { 742 Handle<String> inferred_name(shared_info->inferred_name()); 743 result->set_inferred_name(inferred_name); 744 } 745 return result; 746 } 747 748 749 Handle<String> Parser::GetSymbol(bool* ok) { 750 int symbol_id = -1; 751 if (pre_data() != NULL) { 752 symbol_id = pre_data()->GetSymbolIdentifier(); 753 } 754 return LookupSymbol(symbol_id); 755 } 756 757 758 void Parser::ReportMessage(const char* type, Vector<const char*> args) { 759 Scanner::Location source_location = scanner().location(); 760 ReportMessageAt(source_location, type, args); 761 } 762 763 764 void Parser::ReportMessage(const char* type, Vector<Handle<String> > args) { 765 Scanner::Location source_location = scanner().location(); 766 ReportMessageAt(source_location, type, args); 767 } 768 769 770 void Parser::ReportMessageAt(Scanner::Location source_location, 771 const char* type, 772 Vector<const char*> args) { 773 MessageLocation location(script_, 774 source_location.beg_pos, 775 source_location.end_pos); 776 Factory* factory = isolate()->factory(); 777 Handle<FixedArray> elements = factory->NewFixedArray(args.length()); 778 for (int i = 0; i < args.length(); i++) { 779 Handle<String> arg_string = factory->NewStringFromUtf8(CStrVector(args[i])); 780 elements->set(i, *arg_string); 781 } 782 Handle<JSArray> array = factory->NewJSArrayWithElements(elements); 783 Handle<Object> result = factory->NewSyntaxError(type, array); 784 isolate()->Throw(*result, &location); 785 } 786 787 788 void Parser::ReportMessageAt(Scanner::Location source_location, 789 const char* type, 790 Vector<Handle<String> > args) { 791 MessageLocation location(script_, 792 source_location.beg_pos, 793 source_location.end_pos); 794 Factory* factory = isolate()->factory(); 795 Handle<FixedArray> elements = factory->NewFixedArray(args.length()); 796 for (int i = 0; i < args.length(); i++) { 797 elements->set(i, *args[i]); 798 } 799 Handle<JSArray> array = factory->NewJSArrayWithElements(elements); 800 Handle<Object> result = factory->NewSyntaxError(type, array); 801 isolate()->Throw(*result, &location); 802 } 803 804 805 // Base class containing common code for the different finder classes used by 806 // the parser. 807 class ParserFinder { 808 protected: 809 ParserFinder() {} 810 static Assignment* AsAssignment(Statement* stat) { 811 if (stat == NULL) return NULL; 812 ExpressionStatement* exp_stat = stat->AsExpressionStatement(); 813 if (exp_stat == NULL) return NULL; 814 return exp_stat->expression()->AsAssignment(); 815 } 816 }; 817 818 819 // An InitializationBlockFinder finds and marks sequences of statements of the 820 // form expr.a = ...; expr.b = ...; etc. 821 class InitializationBlockFinder : public ParserFinder { 822 public: 823 // We find and mark the initialization blocks in top level 824 // non-looping code only. This is because the optimization prevents 825 // reuse of the map transitions, so it should be used only for code 826 // that will only be run once. 827 InitializationBlockFinder(Scope* top_scope, Target* target) 828 : enabled_(top_scope->DeclarationScope()->is_global_scope() && 829 !IsLoopTarget(target)), 830 first_in_block_(NULL), 831 last_in_block_(NULL), 832 block_size_(0) {} 833 834 ~InitializationBlockFinder() { 835 if (!enabled_) return; 836 if (InBlock()) EndBlock(); 837 } 838 839 void Update(Statement* stat) { 840 if (!enabled_) return; 841 Assignment* assignment = AsAssignment(stat); 842 if (InBlock()) { 843 if (BlockContinues(assignment)) { 844 UpdateBlock(assignment); 845 } else { 846 EndBlock(); 847 } 848 } 849 if (!InBlock() && (assignment != NULL) && 850 (assignment->op() == Token::ASSIGN)) { 851 StartBlock(assignment); 852 } 853 } 854 855 private: 856 // The minimum number of contiguous assignment that will 857 // be treated as an initialization block. Benchmarks show that 858 // the overhead exceeds the savings below this limit. 859 static const int kMinInitializationBlock = 3; 860 861 static bool IsLoopTarget(Target* target) { 862 while (target != NULL) { 863 if (target->node()->AsIterationStatement() != NULL) return true; 864 target = target->previous(); 865 } 866 return false; 867 } 868 869 // Returns true if the expressions appear to denote the same object. 870 // In the context of initialization blocks, we only consider expressions 871 // of the form 'expr.x' or expr["x"]. 872 static bool SameObject(Expression* e1, Expression* e2) { 873 VariableProxy* v1 = e1->AsVariableProxy(); 874 VariableProxy* v2 = e2->AsVariableProxy(); 875 if (v1 != NULL && v2 != NULL) { 876 return v1->name()->Equals(*v2->name()); 877 } 878 Property* p1 = e1->AsProperty(); 879 Property* p2 = e2->AsProperty(); 880 if ((p1 == NULL) || (p2 == NULL)) return false; 881 Literal* key1 = p1->key()->AsLiteral(); 882 Literal* key2 = p2->key()->AsLiteral(); 883 if ((key1 == NULL) || (key2 == NULL)) return false; 884 if (!key1->handle()->IsString() || !key2->handle()->IsString()) { 885 return false; 886 } 887 String* name1 = String::cast(*key1->handle()); 888 String* name2 = String::cast(*key2->handle()); 889 if (!name1->Equals(name2)) return false; 890 return SameObject(p1->obj(), p2->obj()); 891 } 892 893 // Returns true if the expressions appear to denote different properties 894 // of the same object. 895 static bool PropertyOfSameObject(Expression* e1, Expression* e2) { 896 Property* p1 = e1->AsProperty(); 897 Property* p2 = e2->AsProperty(); 898 if ((p1 == NULL) || (p2 == NULL)) return false; 899 return SameObject(p1->obj(), p2->obj()); 900 } 901 902 bool BlockContinues(Assignment* assignment) { 903 if ((assignment == NULL) || (first_in_block_ == NULL)) return false; 904 if (assignment->op() != Token::ASSIGN) return false; 905 return PropertyOfSameObject(first_in_block_->target(), 906 assignment->target()); 907 } 908 909 void StartBlock(Assignment* assignment) { 910 first_in_block_ = assignment; 911 last_in_block_ = assignment; 912 block_size_ = 1; 913 } 914 915 void UpdateBlock(Assignment* assignment) { 916 last_in_block_ = assignment; 917 ++block_size_; 918 } 919 920 void EndBlock() { 921 if (block_size_ >= kMinInitializationBlock) { 922 first_in_block_->mark_block_start(); 923 last_in_block_->mark_block_end(); 924 } 925 last_in_block_ = first_in_block_ = NULL; 926 block_size_ = 0; 927 } 928 929 bool InBlock() { return first_in_block_ != NULL; } 930 931 const bool enabled_; 932 Assignment* first_in_block_; 933 Assignment* last_in_block_; 934 int block_size_; 935 936 DISALLOW_COPY_AND_ASSIGN(InitializationBlockFinder); 937 }; 938 939 940 // A ThisNamedPropertyAssignmentFinder finds and marks statements of the form 941 // this.x = ...;, where x is a named property. It also determines whether a 942 // function contains only assignments of this type. 943 class ThisNamedPropertyAssignmentFinder : public ParserFinder { 944 public: 945 explicit ThisNamedPropertyAssignmentFinder(Isolate* isolate) 946 : isolate_(isolate), 947 only_simple_this_property_assignments_(true), 948 names_(0), 949 assigned_arguments_(0), 950 assigned_constants_(0) { 951 } 952 953 void Update(Scope* scope, Statement* stat) { 954 // Bail out if function already has property assignment that are 955 // not simple this property assignments. 956 if (!only_simple_this_property_assignments_) { 957 return; 958 } 959 960 // Check whether this statement is of the form this.x = ...; 961 Assignment* assignment = AsAssignment(stat); 962 if (IsThisPropertyAssignment(assignment)) { 963 HandleThisPropertyAssignment(scope, assignment); 964 } else { 965 only_simple_this_property_assignments_ = false; 966 } 967 } 968 969 // Returns whether only statements of the form this.x = y; where y is either a 970 // constant or a function argument was encountered. 971 bool only_simple_this_property_assignments() { 972 return only_simple_this_property_assignments_; 973 } 974 975 // Returns a fixed array containing three elements for each assignment of the 976 // form this.x = y; 977 Handle<FixedArray> GetThisPropertyAssignments() { 978 if (names_.is_empty()) { 979 return isolate_->factory()->empty_fixed_array(); 980 } 981 ASSERT_EQ(names_.length(), assigned_arguments_.length()); 982 ASSERT_EQ(names_.length(), assigned_constants_.length()); 983 Handle<FixedArray> assignments = 984 isolate_->factory()->NewFixedArray(names_.length() * 3); 985 for (int i = 0; i < names_.length(); ++i) { 986 assignments->set(i * 3, *names_[i]); 987 assignments->set(i * 3 + 1, Smi::FromInt(assigned_arguments_[i])); 988 assignments->set(i * 3 + 2, *assigned_constants_[i]); 989 } 990 return assignments; 991 } 992 993 private: 994 bool IsThisPropertyAssignment(Assignment* assignment) { 995 if (assignment != NULL) { 996 Property* property = assignment->target()->AsProperty(); 997 return assignment->op() == Token::ASSIGN 998 && property != NULL 999 && property->obj()->AsVariableProxy() != NULL 1000 && property->obj()->AsVariableProxy()->is_this(); 1001 } 1002 return false; 1003 } 1004 1005 void HandleThisPropertyAssignment(Scope* scope, Assignment* assignment) { 1006 // Check that the property assigned to is a named property, which is not 1007 // __proto__. 1008 Property* property = assignment->target()->AsProperty(); 1009 ASSERT(property != NULL); 1010 Literal* literal = property->key()->AsLiteral(); 1011 uint32_t dummy; 1012 if (literal != NULL && 1013 literal->handle()->IsString() && 1014 !String::cast(*(literal->handle()))->Equals( 1015 isolate_->heap()->Proto_symbol()) && 1016 !String::cast(*(literal->handle()))->AsArrayIndex(&dummy)) { 1017 Handle<String> key = Handle<String>::cast(literal->handle()); 1018 1019 // Check whether the value assigned is either a constant or matches the 1020 // name of one of the arguments to the function. 1021 if (assignment->value()->AsLiteral() != NULL) { 1022 // Constant assigned. 1023 Literal* literal = assignment->value()->AsLiteral(); 1024 AssignmentFromConstant(key, literal->handle()); 1025 return; 1026 } else if (assignment->value()->AsVariableProxy() != NULL) { 1027 // Variable assigned. 1028 Handle<String> name = 1029 assignment->value()->AsVariableProxy()->name(); 1030 // Check whether the variable assigned matches an argument name. 1031 for (int i = 0; i < scope->num_parameters(); i++) { 1032 if (*scope->parameter(i)->name() == *name) { 1033 // Assigned from function argument. 1034 AssignmentFromParameter(key, i); 1035 return; 1036 } 1037 } 1038 } 1039 } 1040 // It is not a simple "this.x = value;" assignment with a constant 1041 // or parameter value. 1042 AssignmentFromSomethingElse(); 1043 } 1044 1045 1046 1047 1048 // We will potentially reorder the property assignments, so they must be 1049 // simple enough that the ordering does not matter. 1050 void AssignmentFromParameter(Handle<String> name, int index) { 1051 EnsureInitialized(); 1052 for (int i = 0; i < names_.length(); ++i) { 1053 if (name->Equals(*names_[i])) { 1054 assigned_arguments_[i] = index; 1055 assigned_constants_[i] = isolate_->factory()->undefined_value(); 1056 return; 1057 } 1058 } 1059 names_.Add(name); 1060 assigned_arguments_.Add(index); 1061 assigned_constants_.Add(isolate_->factory()->undefined_value()); 1062 } 1063 1064 void AssignmentFromConstant(Handle<String> name, Handle<Object> value) { 1065 EnsureInitialized(); 1066 for (int i = 0; i < names_.length(); ++i) { 1067 if (name->Equals(*names_[i])) { 1068 assigned_arguments_[i] = -1; 1069 assigned_constants_[i] = value; 1070 return; 1071 } 1072 } 1073 names_.Add(name); 1074 assigned_arguments_.Add(-1); 1075 assigned_constants_.Add(value); 1076 } 1077 1078 void AssignmentFromSomethingElse() { 1079 // The this assignment is not a simple one. 1080 only_simple_this_property_assignments_ = false; 1081 } 1082 1083 void EnsureInitialized() { 1084 if (names_.capacity() == 0) { 1085 ASSERT(assigned_arguments_.capacity() == 0); 1086 ASSERT(assigned_constants_.capacity() == 0); 1087 names_.Initialize(4); 1088 assigned_arguments_.Initialize(4); 1089 assigned_constants_.Initialize(4); 1090 } 1091 } 1092 1093 Isolate* isolate_; 1094 bool only_simple_this_property_assignments_; 1095 ZoneStringList names_; 1096 ZoneList<int> assigned_arguments_; 1097 ZoneObjectList assigned_constants_; 1098 }; 1099 1100 1101 void* Parser::ParseSourceElements(ZoneList<Statement*>* processor, 1102 int end_token, 1103 bool is_eval, 1104 bool* ok) { 1105 // SourceElements :: 1106 // (ModuleElement)* <end_token> 1107 1108 // Allocate a target stack to use for this set of source 1109 // elements. This way, all scripts and functions get their own 1110 // target stack thus avoiding illegal breaks and continues across 1111 // functions. 1112 TargetScope scope(&this->target_stack_); 1113 1114 ASSERT(processor != NULL); 1115 InitializationBlockFinder block_finder(top_scope_, target_stack_); 1116 ThisNamedPropertyAssignmentFinder this_property_assignment_finder(isolate()); 1117 bool directive_prologue = true; // Parsing directive prologue. 1118 1119 while (peek() != end_token) { 1120 if (directive_prologue && peek() != Token::STRING) { 1121 directive_prologue = false; 1122 } 1123 1124 Scanner::Location token_loc = scanner().peek_location(); 1125 Statement* stat = ParseModuleElement(NULL, CHECK_OK); 1126 if (stat == NULL || stat->IsEmpty()) { 1127 directive_prologue = false; // End of directive prologue. 1128 continue; 1129 } 1130 1131 if (directive_prologue) { 1132 // A shot at a directive. 1133 ExpressionStatement* e_stat; 1134 Literal* literal; 1135 // Still processing directive prologue? 1136 if ((e_stat = stat->AsExpressionStatement()) != NULL && 1137 (literal = e_stat->expression()->AsLiteral()) != NULL && 1138 literal->handle()->IsString()) { 1139 Handle<String> directive = Handle<String>::cast(literal->handle()); 1140 1141 // Check "use strict" directive (ES5 14.1). 1142 if (top_scope_->is_classic_mode() && 1143 directive->Equals(isolate()->heap()->use_strict()) && 1144 token_loc.end_pos - token_loc.beg_pos == 1145 isolate()->heap()->use_strict()->length() + 2) { 1146 // TODO(mstarzinger): Global strict eval calls, need their own scope 1147 // as specified in ES5 10.4.2(3). The correct fix would be to always 1148 // add this scope in DoParseProgram(), but that requires adaptations 1149 // all over the code base, so we go with a quick-fix for now. 1150 if (is_eval && !top_scope_->is_eval_scope()) { 1151 ASSERT(top_scope_->is_global_scope()); 1152 Scope* scope = NewScope(top_scope_, EVAL_SCOPE); 1153 scope->set_start_position(top_scope_->start_position()); 1154 scope->set_end_position(top_scope_->end_position()); 1155 top_scope_ = scope; 1156 } 1157 // TODO(ES6): Fix entering extended mode, once it is specified. 1158 top_scope_->SetLanguageMode(FLAG_harmony_scoping 1159 ? EXTENDED_MODE : STRICT_MODE); 1160 // "use strict" is the only directive for now. 1161 directive_prologue = false; 1162 } 1163 } else { 1164 // End of the directive prologue. 1165 directive_prologue = false; 1166 } 1167 } 1168 1169 block_finder.Update(stat); 1170 // Find and mark all assignments to named properties in this (this.x =) 1171 if (top_scope_->is_function_scope()) { 1172 this_property_assignment_finder.Update(top_scope_, stat); 1173 } 1174 processor->Add(stat); 1175 } 1176 1177 // Propagate the collected information on this property assignments. 1178 if (top_scope_->is_function_scope()) { 1179 bool only_simple_this_property_assignments = 1180 this_property_assignment_finder.only_simple_this_property_assignments() 1181 && top_scope_->declarations()->length() == 0; 1182 if (only_simple_this_property_assignments) { 1183 current_function_state_->SetThisPropertyAssignmentInfo( 1184 only_simple_this_property_assignments, 1185 this_property_assignment_finder.GetThisPropertyAssignments()); 1186 } 1187 } 1188 1189 return 0; 1190 } 1191 1192 1193 Statement* Parser::ParseModuleElement(ZoneStringList* labels, 1194 bool* ok) { 1195 // (Ecma 262 5th Edition, clause 14): 1196 // SourceElement: 1197 // Statement 1198 // FunctionDeclaration 1199 // 1200 // In harmony mode we allow additionally the following productions 1201 // ModuleElement: 1202 // LetDeclaration 1203 // ConstDeclaration 1204 // ModuleDeclaration 1205 // ImportDeclaration 1206 // ExportDeclaration 1207 1208 switch (peek()) { 1209 case Token::FUNCTION: 1210 return ParseFunctionDeclaration(NULL, ok); 1211 case Token::LET: 1212 case Token::CONST: 1213 return ParseVariableStatement(kModuleElement, NULL, ok); 1214 case Token::IMPORT: 1215 return ParseImportDeclaration(ok); 1216 case Token::EXPORT: 1217 return ParseExportDeclaration(ok); 1218 default: { 1219 Statement* stmt = ParseStatement(labels, CHECK_OK); 1220 // Handle 'module' as a context-sensitive keyword. 1221 if (FLAG_harmony_modules && 1222 peek() == Token::IDENTIFIER && 1223 !scanner().HasAnyLineTerminatorBeforeNext() && 1224 stmt != NULL) { 1225 ExpressionStatement* estmt = stmt->AsExpressionStatement(); 1226 if (estmt != NULL && 1227 estmt->expression()->AsVariableProxy() != NULL && 1228 estmt->expression()->AsVariableProxy()->name()->Equals( 1229 isolate()->heap()->module_symbol()) && 1230 !scanner().literal_contains_escapes()) { 1231 return ParseModuleDeclaration(NULL, ok); 1232 } 1233 } 1234 return stmt; 1235 } 1236 } 1237 } 1238 1239 1240 Block* Parser::ParseModuleDeclaration(ZoneStringList* names, bool* ok) { 1241 // ModuleDeclaration: 1242 // 'module' Identifier Module 1243 1244 // Create new block with one expected declaration. 1245 Block* block = factory()->NewBlock(NULL, 1, true); 1246 Handle<String> name = ParseIdentifier(CHECK_OK); 1247 1248 #ifdef DEBUG 1249 if (FLAG_print_interface_details) 1250 PrintF("# Module %s...\n", name->ToAsciiArray()); 1251 #endif 1252 1253 Module* module = ParseModule(CHECK_OK); 1254 VariableProxy* proxy = NewUnresolved(name, LET, module->interface()); 1255 Declaration* declaration = 1256 factory()->NewModuleDeclaration(proxy, module, top_scope_); 1257 Declare(declaration, true, CHECK_OK); 1258 1259 #ifdef DEBUG 1260 if (FLAG_print_interface_details) 1261 PrintF("# Module %s.\n", name->ToAsciiArray()); 1262 1263 if (FLAG_print_interfaces) { 1264 PrintF("module %s : ", name->ToAsciiArray()); 1265 module->interface()->Print(); 1266 } 1267 #endif 1268 1269 // TODO(rossberg): Add initialization statement to block. 1270 1271 if (names) names->Add(name); 1272 return block; 1273 } 1274 1275 1276 Module* Parser::ParseModule(bool* ok) { 1277 // Module: 1278 // '{' ModuleElement '}' 1279 // '=' ModulePath ';' 1280 // 'at' String ';' 1281 1282 switch (peek()) { 1283 case Token::LBRACE: 1284 return ParseModuleLiteral(ok); 1285 1286 case Token::ASSIGN: { 1287 Expect(Token::ASSIGN, CHECK_OK); 1288 Module* result = ParseModulePath(CHECK_OK); 1289 ExpectSemicolon(CHECK_OK); 1290 return result; 1291 } 1292 1293 default: { 1294 ExpectContextualKeyword("at", CHECK_OK); 1295 Module* result = ParseModuleUrl(CHECK_OK); 1296 ExpectSemicolon(CHECK_OK); 1297 return result; 1298 } 1299 } 1300 } 1301 1302 1303 Module* Parser::ParseModuleLiteral(bool* ok) { 1304 // Module: 1305 // '{' ModuleElement '}' 1306 1307 // Construct block expecting 16 statements. 1308 Block* body = factory()->NewBlock(NULL, 16, false); 1309 #ifdef DEBUG 1310 if (FLAG_print_interface_details) PrintF("# Literal "); 1311 #endif 1312 Scope* scope = NewScope(top_scope_, MODULE_SCOPE); 1313 1314 Expect(Token::LBRACE, CHECK_OK); 1315 scope->set_start_position(scanner().location().beg_pos); 1316 scope->SetLanguageMode(EXTENDED_MODE); 1317 1318 { 1319 BlockState block_state(this, scope); 1320 TargetCollector collector; 1321 Target target(&this->target_stack_, &collector); 1322 Target target_body(&this->target_stack_, body); 1323 InitializationBlockFinder block_finder(top_scope_, target_stack_); 1324 1325 while (peek() != Token::RBRACE) { 1326 Statement* stat = ParseModuleElement(NULL, CHECK_OK); 1327 if (stat && !stat->IsEmpty()) { 1328 body->AddStatement(stat); 1329 block_finder.Update(stat); 1330 } 1331 } 1332 } 1333 1334 Expect(Token::RBRACE, CHECK_OK); 1335 scope->set_end_position(scanner().location().end_pos); 1336 body->set_block_scope(scope); 1337 1338 scope->interface()->Freeze(ok); 1339 ASSERT(ok); 1340 return factory()->NewModuleLiteral(body, scope->interface()); 1341 } 1342 1343 1344 Module* Parser::ParseModulePath(bool* ok) { 1345 // ModulePath: 1346 // Identifier 1347 // ModulePath '.' Identifier 1348 1349 Module* result = ParseModuleVariable(CHECK_OK); 1350 while (Check(Token::PERIOD)) { 1351 Handle<String> name = ParseIdentifierName(CHECK_OK); 1352 #ifdef DEBUG 1353 if (FLAG_print_interface_details) 1354 PrintF("# Path .%s ", name->ToAsciiArray()); 1355 #endif 1356 Module* member = factory()->NewModulePath(result, name); 1357 result->interface()->Add(name, member->interface(), ok); 1358 if (!*ok) { 1359 #ifdef DEBUG 1360 if (FLAG_print_interfaces) { 1361 PrintF("PATH TYPE ERROR at '%s'\n", name->ToAsciiArray()); 1362 PrintF("result: "); 1363 result->interface()->Print(); 1364 PrintF("member: "); 1365 member->interface()->Print(); 1366 } 1367 #endif 1368 ReportMessage("invalid_module_path", Vector<Handle<String> >(&name, 1)); 1369 return NULL; 1370 } 1371 result = member; 1372 } 1373 1374 return result; 1375 } 1376 1377 1378 Module* Parser::ParseModuleVariable(bool* ok) { 1379 // ModulePath: 1380 // Identifier 1381 1382 Handle<String> name = ParseIdentifier(CHECK_OK); 1383 #ifdef DEBUG 1384 if (FLAG_print_interface_details) 1385 PrintF("# Module variable %s ", name->ToAsciiArray()); 1386 #endif 1387 VariableProxy* proxy = top_scope_->NewUnresolved( 1388 factory(), name, scanner().location().beg_pos, Interface::NewModule()); 1389 1390 return factory()->NewModuleVariable(proxy); 1391 } 1392 1393 1394 Module* Parser::ParseModuleUrl(bool* ok) { 1395 // Module: 1396 // String 1397 1398 Expect(Token::STRING, CHECK_OK); 1399 Handle<String> symbol = GetSymbol(CHECK_OK); 1400 1401 // TODO(ES6): Request JS resource from environment... 1402 1403 #ifdef DEBUG 1404 if (FLAG_print_interface_details) PrintF("# Url "); 1405 #endif 1406 return factory()->NewModuleUrl(symbol); 1407 } 1408 1409 1410 Module* Parser::ParseModuleSpecifier(bool* ok) { 1411 // ModuleSpecifier: 1412 // String 1413 // ModulePath 1414 1415 if (peek() == Token::STRING) { 1416 return ParseModuleUrl(ok); 1417 } else { 1418 return ParseModulePath(ok); 1419 } 1420 } 1421 1422 1423 Block* Parser::ParseImportDeclaration(bool* ok) { 1424 // ImportDeclaration: 1425 // 'import' IdentifierName (',' IdentifierName)* 'from' ModuleSpecifier ';' 1426 // 1427 // TODO(ES6): implement destructuring ImportSpecifiers 1428 1429 Expect(Token::IMPORT, CHECK_OK); 1430 ZoneStringList names(1); 1431 1432 Handle<String> name = ParseIdentifierName(CHECK_OK); 1433 names.Add(name); 1434 while (peek() == Token::COMMA) { 1435 Consume(Token::COMMA); 1436 name = ParseIdentifierName(CHECK_OK); 1437 names.Add(name); 1438 } 1439 1440 ExpectContextualKeyword("from", CHECK_OK); 1441 Module* module = ParseModuleSpecifier(CHECK_OK); 1442 ExpectSemicolon(CHECK_OK); 1443 1444 // Generate a separate declaration for each identifier. 1445 // TODO(ES6): once we implement destructuring, make that one declaration. 1446 Block* block = factory()->NewBlock(NULL, 1, true); 1447 for (int i = 0; i < names.length(); ++i) { 1448 #ifdef DEBUG 1449 if (FLAG_print_interface_details) 1450 PrintF("# Import %s ", names[i]->ToAsciiArray()); 1451 #endif 1452 Interface* interface = Interface::NewUnknown(); 1453 module->interface()->Add(names[i], interface, ok); 1454 if (!*ok) { 1455 #ifdef DEBUG 1456 if (FLAG_print_interfaces) { 1457 PrintF("IMPORT TYPE ERROR at '%s'\n", names[i]->ToAsciiArray()); 1458 PrintF("module: "); 1459 module->interface()->Print(); 1460 } 1461 #endif 1462 ReportMessage("invalid_module_path", Vector<Handle<String> >(&name, 1)); 1463 return NULL; 1464 } 1465 VariableProxy* proxy = NewUnresolved(names[i], LET, interface); 1466 Declaration* declaration = 1467 factory()->NewImportDeclaration(proxy, module, top_scope_); 1468 Declare(declaration, true, CHECK_OK); 1469 // TODO(rossberg): Add initialization statement to block. 1470 } 1471 1472 return block; 1473 } 1474 1475 1476 Statement* Parser::ParseExportDeclaration(bool* ok) { 1477 // ExportDeclaration: 1478 // 'export' Identifier (',' Identifier)* ';' 1479 // 'export' VariableDeclaration 1480 // 'export' FunctionDeclaration 1481 // 'export' ModuleDeclaration 1482 // 1483 // TODO(ES6): implement structuring ExportSpecifiers 1484 1485 Expect(Token::EXPORT, CHECK_OK); 1486 1487 Statement* result = NULL; 1488 ZoneStringList names(1); 1489 switch (peek()) { 1490 case Token::IDENTIFIER: { 1491 Handle<String> name = ParseIdentifier(CHECK_OK); 1492 // Handle 'module' as a context-sensitive keyword. 1493 if (!name->IsEqualTo(CStrVector("module"))) { 1494 names.Add(name); 1495 while (peek() == Token::COMMA) { 1496 Consume(Token::COMMA); 1497 name = ParseIdentifier(CHECK_OK); 1498 names.Add(name); 1499 } 1500 ExpectSemicolon(CHECK_OK); 1501 result = factory()->NewEmptyStatement(); 1502 } else { 1503 result = ParseModuleDeclaration(&names, CHECK_OK); 1504 } 1505 break; 1506 } 1507 1508 case Token::FUNCTION: 1509 result = ParseFunctionDeclaration(&names, CHECK_OK); 1510 break; 1511 1512 case Token::VAR: 1513 case Token::LET: 1514 case Token::CONST: 1515 result = ParseVariableStatement(kModuleElement, &names, CHECK_OK); 1516 break; 1517 1518 default: 1519 *ok = false; 1520 ReportUnexpectedToken(scanner().current_token()); 1521 return NULL; 1522 } 1523 1524 // Extract declared names into export declarations and interface. 1525 Interface* interface = top_scope_->interface(); 1526 for (int i = 0; i < names.length(); ++i) { 1527 #ifdef DEBUG 1528 if (FLAG_print_interface_details) 1529 PrintF("# Export %s ", names[i]->ToAsciiArray()); 1530 #endif 1531 Interface* inner = Interface::NewUnknown(); 1532 interface->Add(names[i], inner, CHECK_OK); 1533 VariableProxy* proxy = NewUnresolved(names[i], LET, inner); 1534 USE(proxy); 1535 // TODO(rossberg): Rethink whether we actually need to store export 1536 // declarations (for compilation?). 1537 // ExportDeclaration* declaration = 1538 // factory()->NewExportDeclaration(proxy, top_scope_); 1539 // top_scope_->AddDeclaration(declaration); 1540 } 1541 1542 ASSERT(result != NULL); 1543 return result; 1544 } 1545 1546 1547 Statement* Parser::ParseBlockElement(ZoneStringList* labels, 1548 bool* ok) { 1549 // (Ecma 262 5th Edition, clause 14): 1550 // SourceElement: 1551 // Statement 1552 // FunctionDeclaration 1553 // 1554 // In harmony mode we allow additionally the following productions 1555 // BlockElement (aka SourceElement): 1556 // LetDeclaration 1557 // ConstDeclaration 1558 1559 switch (peek()) { 1560 case Token::FUNCTION: 1561 return ParseFunctionDeclaration(NULL, ok); 1562 case Token::LET: 1563 case Token::CONST: 1564 return ParseVariableStatement(kModuleElement, NULL, ok); 1565 default: 1566 return ParseStatement(labels, ok); 1567 } 1568 } 1569 1570 1571 Statement* Parser::ParseStatement(ZoneStringList* labels, bool* ok) { 1572 // Statement :: 1573 // Block 1574 // VariableStatement 1575 // EmptyStatement 1576 // ExpressionStatement 1577 // IfStatement 1578 // IterationStatement 1579 // ContinueStatement 1580 // BreakStatement 1581 // ReturnStatement 1582 // WithStatement 1583 // LabelledStatement 1584 // SwitchStatement 1585 // ThrowStatement 1586 // TryStatement 1587 // DebuggerStatement 1588 1589 // Note: Since labels can only be used by 'break' and 'continue' 1590 // statements, which themselves are only valid within blocks, 1591 // iterations or 'switch' statements (i.e., BreakableStatements), 1592 // labels can be simply ignored in all other cases; except for 1593 // trivial labeled break statements 'label: break label' which is 1594 // parsed into an empty statement. 1595 1596 // Keep the source position of the statement 1597 int statement_pos = scanner().peek_location().beg_pos; 1598 Statement* stmt = NULL; 1599 switch (peek()) { 1600 case Token::LBRACE: 1601 return ParseBlock(labels, ok); 1602 1603 case Token::CONST: // fall through 1604 case Token::LET: 1605 case Token::VAR: 1606 stmt = ParseVariableStatement(kStatement, NULL, ok); 1607 break; 1608 1609 case Token::SEMICOLON: 1610 Next(); 1611 return factory()->NewEmptyStatement(); 1612 1613 case Token::IF: 1614 stmt = ParseIfStatement(labels, ok); 1615 break; 1616 1617 case Token::DO: 1618 stmt = ParseDoWhileStatement(labels, ok); 1619 break; 1620 1621 case Token::WHILE: 1622 stmt = ParseWhileStatement(labels, ok); 1623 break; 1624 1625 case Token::FOR: 1626 stmt = ParseForStatement(labels, ok); 1627 break; 1628 1629 case Token::CONTINUE: 1630 stmt = ParseContinueStatement(ok); 1631 break; 1632 1633 case Token::BREAK: 1634 stmt = ParseBreakStatement(labels, ok); 1635 break; 1636 1637 case Token::RETURN: 1638 stmt = ParseReturnStatement(ok); 1639 break; 1640 1641 case Token::WITH: 1642 stmt = ParseWithStatement(labels, ok); 1643 break; 1644 1645 case Token::SWITCH: 1646 stmt = ParseSwitchStatement(labels, ok); 1647 break; 1648 1649 case Token::THROW: 1650 stmt = ParseThrowStatement(ok); 1651 break; 1652 1653 case Token::TRY: { 1654 // NOTE: It is somewhat complicated to have labels on 1655 // try-statements. When breaking out of a try-finally statement, 1656 // one must take great care not to treat it as a 1657 // fall-through. It is much easier just to wrap the entire 1658 // try-statement in a statement block and put the labels there 1659 Block* result = factory()->NewBlock(labels, 1, false); 1660 Target target(&this->target_stack_, result); 1661 TryStatement* statement = ParseTryStatement(CHECK_OK); 1662 if (statement) { 1663 statement->set_statement_pos(statement_pos); 1664 } 1665 if (result) result->AddStatement(statement); 1666 return result; 1667 } 1668 1669 case Token::FUNCTION: { 1670 // FunctionDeclaration is only allowed in the context of SourceElements 1671 // (Ecma 262 5th Edition, clause 14): 1672 // SourceElement: 1673 // Statement 1674 // FunctionDeclaration 1675 // Common language extension is to allow function declaration in place 1676 // of any statement. This language extension is disabled in strict mode. 1677 if (!top_scope_->is_classic_mode()) { 1678 ReportMessageAt(scanner().peek_location(), "strict_function", 1679 Vector<const char*>::empty()); 1680 *ok = false; 1681 return NULL; 1682 } 1683 return ParseFunctionDeclaration(NULL, ok); 1684 } 1685 1686 case Token::DEBUGGER: 1687 stmt = ParseDebuggerStatement(ok); 1688 break; 1689 1690 default: 1691 stmt = ParseExpressionOrLabelledStatement(labels, ok); 1692 } 1693 1694 // Store the source position of the statement 1695 if (stmt != NULL) stmt->set_statement_pos(statement_pos); 1696 return stmt; 1697 } 1698 1699 1700 VariableProxy* Parser::NewUnresolved( 1701 Handle<String> name, VariableMode mode, Interface* interface) { 1702 // If we are inside a function, a declaration of a var/const variable is a 1703 // truly local variable, and the scope of the variable is always the function 1704 // scope. 1705 // Let/const variables in harmony mode are always added to the immediately 1706 // enclosing scope. 1707 return DeclarationScope(mode)->NewUnresolved( 1708 factory(), name, scanner().location().beg_pos, interface); 1709 } 1710 1711 1712 void Parser::Declare(Declaration* declaration, bool resolve, bool* ok) { 1713 VariableProxy* proxy = declaration->proxy(); 1714 Handle<String> name = proxy->name(); 1715 VariableMode mode = declaration->mode(); 1716 Scope* declaration_scope = DeclarationScope(mode); 1717 Variable* var = NULL; 1718 1719 // If a function scope exists, then we can statically declare this 1720 // variable and also set its mode. In any case, a Declaration node 1721 // will be added to the scope so that the declaration can be added 1722 // to the corresponding activation frame at runtime if necessary. 1723 // For instance declarations inside an eval scope need to be added 1724 // to the calling function context. 1725 // Similarly, strict mode eval scope does not leak variable declarations to 1726 // the caller's scope so we declare all locals, too. 1727 // Also for block scoped let/const bindings the variable can be 1728 // statically declared. 1729 if (declaration_scope->is_function_scope() || 1730 declaration_scope->is_strict_or_extended_eval_scope() || 1731 declaration_scope->is_block_scope() || 1732 declaration_scope->is_module_scope() || 1733 declaration->AsModuleDeclaration() != NULL) { 1734 // Declare the variable in the function scope. 1735 var = declaration_scope->LocalLookup(name); 1736 if (var == NULL) { 1737 // Declare the name. 1738 var = declaration_scope->DeclareLocal( 1739 name, mode, declaration->initialization(), proxy->interface()); 1740 } else { 1741 // The name was declared in this scope before; check for conflicting 1742 // re-declarations. We have a conflict if either of the declarations is 1743 // not a var. There is similar code in runtime.cc in the Declare 1744 // functions. The function CheckNonConflictingScope checks for conflicting 1745 // var and let bindings from different scopes whereas this is a check for 1746 // conflicting declarations within the same scope. This check also covers 1747 // 1748 // function () { let x; { var x; } } 1749 // 1750 // because the var declaration is hoisted to the function scope where 'x' 1751 // is already bound. 1752 if ((mode != VAR) || (var->mode() != VAR)) { 1753 // We only have vars, consts and lets in declarations. 1754 ASSERT(var->mode() == VAR || 1755 var->mode() == CONST || 1756 var->mode() == CONST_HARMONY || 1757 var->mode() == LET); 1758 if (is_extended_mode()) { 1759 // In harmony mode we treat re-declarations as early errors. See 1760 // ES5 16 for a definition of early errors. 1761 SmartArrayPointer<char> c_string = name->ToCString(DISALLOW_NULLS); 1762 const char* elms[2] = { "Variable", *c_string }; 1763 Vector<const char*> args(elms, 2); 1764 ReportMessage("redeclaration", args); 1765 *ok = false; 1766 return; 1767 } 1768 const char* type = (var->mode() == VAR) 1769 ? "var" : var->is_const_mode() ? "const" : "let"; 1770 Handle<String> type_string = 1771 isolate()->factory()->NewStringFromUtf8(CStrVector(type), TENURED); 1772 Expression* expression = 1773 NewThrowTypeError(isolate()->factory()->redeclaration_symbol(), 1774 type_string, name); 1775 declaration_scope->SetIllegalRedeclaration(expression); 1776 } 1777 } 1778 } 1779 1780 // We add a declaration node for every declaration. The compiler 1781 // will only generate code if necessary. In particular, declarations 1782 // for inner local variables that do not represent functions won't 1783 // result in any generated code. 1784 // 1785 // Note that we always add an unresolved proxy even if it's not 1786 // used, simply because we don't know in this method (w/o extra 1787 // parameters) if the proxy is needed or not. The proxy will be 1788 // bound during variable resolution time unless it was pre-bound 1789 // below. 1790 // 1791 // WARNING: This will lead to multiple declaration nodes for the 1792 // same variable if it is declared several times. This is not a 1793 // semantic issue as long as we keep the source order, but it may be 1794 // a performance issue since it may lead to repeated 1795 // Runtime::DeclareContextSlot() calls. 1796 declaration_scope->AddDeclaration(declaration); 1797 1798 if ((mode == CONST || mode == CONST_HARMONY) && 1799 declaration_scope->is_global_scope()) { 1800 // For global const variables we bind the proxy to a variable. 1801 ASSERT(resolve); // should be set by all callers 1802 Variable::Kind kind = Variable::NORMAL; 1803 var = new(zone()) Variable(declaration_scope, 1804 name, 1805 mode, 1806 true, 1807 kind, 1808 kNeedsInitialization); 1809 } else if (declaration_scope->is_eval_scope() && 1810 declaration_scope->is_classic_mode()) { 1811 // For variable declarations in a non-strict eval scope the proxy is bound 1812 // to a lookup variable to force a dynamic declaration using the 1813 // DeclareContextSlot runtime function. 1814 Variable::Kind kind = Variable::NORMAL; 1815 var = new(zone()) Variable(declaration_scope, 1816 name, 1817 mode, 1818 true, 1819 kind, 1820 declaration->initialization()); 1821 var->AllocateTo(Variable::LOOKUP, -1); 1822 resolve = true; 1823 } 1824 1825 // If requested and we have a local variable, bind the proxy to the variable 1826 // at parse-time. This is used for functions (and consts) declared inside 1827 // statements: the corresponding function (or const) variable must be in the 1828 // function scope and not a statement-local scope, e.g. as provided with a 1829 // 'with' statement: 1830 // 1831 // with (obj) { 1832 // function f() {} 1833 // } 1834 // 1835 // which is translated into: 1836 // 1837 // with (obj) { 1838 // // in this case this is not: 'var f; f = function () {};' 1839 // var f = function () {}; 1840 // } 1841 // 1842 // Note that if 'f' is accessed from inside the 'with' statement, it 1843 // will be allocated in the context (because we must be able to look 1844 // it up dynamically) but it will also be accessed statically, i.e., 1845 // with a context slot index and a context chain length for this 1846 // initialization code. Thus, inside the 'with' statement, we need 1847 // both access to the static and the dynamic context chain; the 1848 // runtime needs to provide both. 1849 if (resolve && var != NULL) { 1850 proxy->BindTo(var); 1851 1852 if (FLAG_harmony_modules) { 1853 bool ok; 1854 #ifdef DEBUG 1855 if (FLAG_print_interface_details) 1856 PrintF("# Declare %s\n", var->name()->ToAsciiArray()); 1857 #endif 1858 proxy->interface()->Unify(var->interface(), &ok); 1859 if (!ok) { 1860 #ifdef DEBUG 1861 if (FLAG_print_interfaces) { 1862 PrintF("DECLARE TYPE ERROR\n"); 1863 PrintF("proxy: "); 1864 proxy->interface()->Print(); 1865 PrintF("var: "); 1866 var->interface()->Print(); 1867 } 1868 #endif 1869 ReportMessage("module_type_error", Vector<Handle<String> >(&name, 1)); 1870 } 1871 } 1872 } 1873 } 1874 1875 1876 // Language extension which is only enabled for source files loaded 1877 // through the API's extension mechanism. A native function 1878 // declaration is resolved by looking up the function through a 1879 // callback provided by the extension. 1880 Statement* Parser::ParseNativeDeclaration(bool* ok) { 1881 Expect(Token::FUNCTION, CHECK_OK); 1882 Handle<String> name = ParseIdentifier(CHECK_OK); 1883 Expect(Token::LPAREN, CHECK_OK); 1884 bool done = (peek() == Token::RPAREN); 1885 while (!done) { 1886 ParseIdentifier(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 // Compute the function template for the native function. 1902 v8::Handle<v8::FunctionTemplate> fun_template = 1903 extension_->GetNativeFunction(v8::Utils::ToLocal(name)); 1904 ASSERT(!fun_template.IsEmpty()); 1905 1906 // Instantiate the function and create a shared function info from it. 1907 Handle<JSFunction> fun = Utils::OpenHandle(*fun_template->GetFunction()); 1908 const int literals = fun->NumberOfLiterals(); 1909 Handle<Code> code = Handle<Code>(fun->shared()->code()); 1910 Handle<Code> construct_stub = Handle<Code>(fun->shared()->construct_stub()); 1911 Handle<SharedFunctionInfo> shared = 1912 isolate()->factory()->NewSharedFunctionInfo(name, literals, code, 1913 Handle<ScopeInfo>(fun->shared()->scope_info())); 1914 shared->set_construct_stub(*construct_stub); 1915 1916 // Copy the function data to the shared function info. 1917 shared->set_function_data(fun->shared()->function_data()); 1918 int parameters = fun->shared()->formal_parameter_count(); 1919 shared->set_formal_parameter_count(parameters); 1920 1921 // TODO(1240846): It's weird that native function declarations are 1922 // introduced dynamically when we meet their declarations, whereas 1923 // other functions are set up when entering the surrounding scope. 1924 VariableProxy* proxy = NewUnresolved(name, VAR); 1925 Declaration* declaration = 1926 factory()->NewVariableDeclaration(proxy, VAR, top_scope_); 1927 Declare(declaration, true, CHECK_OK); 1928 SharedFunctionInfoLiteral* lit = 1929 factory()->NewSharedFunctionInfoLiteral(shared); 1930 return factory()->NewExpressionStatement( 1931 factory()->NewAssignment( 1932 Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition)); 1933 } 1934 1935 1936 Statement* Parser::ParseFunctionDeclaration(ZoneStringList* names, bool* ok) { 1937 // FunctionDeclaration :: 1938 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' 1939 Expect(Token::FUNCTION, CHECK_OK); 1940 int function_token_position = scanner().location().beg_pos; 1941 bool is_strict_reserved = false; 1942 Handle<String> name = ParseIdentifierOrStrictReservedWord( 1943 &is_strict_reserved, CHECK_OK); 1944 FunctionLiteral* fun = ParseFunctionLiteral(name, 1945 is_strict_reserved, 1946 function_token_position, 1947 FunctionLiteral::DECLARATION, 1948 CHECK_OK); 1949 // Even if we're not at the top-level of the global or a function 1950 // scope, we treat is as such and introduce the function with it's 1951 // initial value upon entering the corresponding scope. 1952 VariableMode mode = is_extended_mode() ? LET : VAR; 1953 VariableProxy* proxy = NewUnresolved(name, mode); 1954 Declaration* declaration = 1955 factory()->NewFunctionDeclaration(proxy, mode, fun, top_scope_); 1956 Declare(declaration, true, CHECK_OK); 1957 if (names) names->Add(name); 1958 return factory()->NewEmptyStatement(); 1959 } 1960 1961 1962 Block* Parser::ParseBlock(ZoneStringList* labels, bool* ok) { 1963 if (top_scope_->is_extended_mode()) return ParseScopedBlock(labels, ok); 1964 1965 // Block :: 1966 // '{' Statement* '}' 1967 1968 // Note that a Block does not introduce a new execution scope! 1969 // (ECMA-262, 3rd, 12.2) 1970 // 1971 // Construct block expecting 16 statements. 1972 Block* result = factory()->NewBlock(labels, 16, false); 1973 Target target(&this->target_stack_, result); 1974 Expect(Token::LBRACE, CHECK_OK); 1975 InitializationBlockFinder block_finder(top_scope_, target_stack_); 1976 while (peek() != Token::RBRACE) { 1977 Statement* stat = ParseStatement(NULL, CHECK_OK); 1978 if (stat && !stat->IsEmpty()) { 1979 result->AddStatement(stat); 1980 block_finder.Update(stat); 1981 } 1982 } 1983 Expect(Token::RBRACE, CHECK_OK); 1984 return result; 1985 } 1986 1987 1988 Block* Parser::ParseScopedBlock(ZoneStringList* labels, bool* ok) { 1989 // The harmony mode uses block elements instead of statements. 1990 // 1991 // Block :: 1992 // '{' BlockElement* '}' 1993 1994 // Construct block expecting 16 statements. 1995 Block* body = factory()->NewBlock(labels, 16, false); 1996 Scope* block_scope = NewScope(top_scope_, BLOCK_SCOPE); 1997 1998 // Parse the statements and collect escaping labels. 1999 Expect(Token::LBRACE, CHECK_OK); 2000 block_scope->set_start_position(scanner().location().beg_pos); 2001 { BlockState block_state(this, block_scope); 2002 TargetCollector collector; 2003 Target target(&this->target_stack_, &collector); 2004 Target target_body(&this->target_stack_, body); 2005 InitializationBlockFinder block_finder(top_scope_, target_stack_); 2006 2007 while (peek() != Token::RBRACE) { 2008 Statement* stat = ParseBlockElement(NULL, CHECK_OK); 2009 if (stat && !stat->IsEmpty()) { 2010 body->AddStatement(stat); 2011 block_finder.Update(stat); 2012 } 2013 } 2014 } 2015 Expect(Token::RBRACE, CHECK_OK); 2016 block_scope->set_end_position(scanner().location().end_pos); 2017 block_scope = block_scope->FinalizeBlockScope(); 2018 body->set_block_scope(block_scope); 2019 return body; 2020 } 2021 2022 2023 Block* Parser::ParseVariableStatement(VariableDeclarationContext var_context, 2024 ZoneStringList* names, 2025 bool* ok) { 2026 // VariableStatement :: 2027 // VariableDeclarations ';' 2028 2029 Handle<String> ignore; 2030 Block* result = 2031 ParseVariableDeclarations(var_context, NULL, names, &ignore, CHECK_OK); 2032 ExpectSemicolon(CHECK_OK); 2033 return result; 2034 } 2035 2036 2037 bool Parser::IsEvalOrArguments(Handle<String> string) { 2038 return string.is_identical_to(isolate()->factory()->eval_symbol()) || 2039 string.is_identical_to(isolate()->factory()->arguments_symbol()); 2040 } 2041 2042 2043 // If the variable declaration declares exactly one non-const 2044 // variable, then *out is set to that variable. In all other cases, 2045 // *out is untouched; in particular, it is the caller's responsibility 2046 // to initialize it properly. This mechanism is used for the parsing 2047 // of 'for-in' loops. 2048 Block* Parser::ParseVariableDeclarations( 2049 VariableDeclarationContext var_context, 2050 VariableDeclarationProperties* decl_props, 2051 ZoneStringList* names, 2052 Handle<String>* out, 2053 bool* ok) { 2054 // VariableDeclarations :: 2055 // ('var' | 'const' | 'let') (Identifier ('=' AssignmentExpression)?)+[','] 2056 // 2057 // The ES6 Draft Rev3 specifies the following grammar for const declarations 2058 // 2059 // ConstDeclaration :: 2060 // const ConstBinding (',' ConstBinding)* ';' 2061 // ConstBinding :: 2062 // Identifier '=' AssignmentExpression 2063 // 2064 // TODO(ES6): 2065 // ConstBinding :: 2066 // BindingPattern '=' AssignmentExpression 2067 VariableMode mode = VAR; 2068 // True if the binding needs initialization. 'let' and 'const' declared 2069 // bindings are created uninitialized by their declaration nodes and 2070 // need initialization. 'var' declared bindings are always initialized 2071 // immediately by their declaration nodes. 2072 bool needs_init = false; 2073 bool is_const = false; 2074 Token::Value init_op = Token::INIT_VAR; 2075 if (peek() == Token::VAR) { 2076 Consume(Token::VAR); 2077 } else if (peek() == Token::CONST) { 2078 // TODO(ES6): The ES6 Draft Rev4 section 12.2.2 reads: 2079 // 2080 // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';' 2081 // 2082 // * It is a Syntax Error if the code that matches this production is not 2083 // contained in extended code. 2084 // 2085 // However disallowing const in classic mode will break compatibility with 2086 // existing pages. Therefore we keep allowing const with the old 2087 // non-harmony semantics in classic mode. 2088 Consume(Token::CONST); 2089 switch (top_scope_->language_mode()) { 2090 case CLASSIC_MODE: 2091 mode = CONST; 2092 init_op = Token::INIT_CONST; 2093 break; 2094 case STRICT_MODE: 2095 ReportMessage("strict_const", Vector<const char*>::empty()); 2096 *ok = false; 2097 return NULL; 2098 case EXTENDED_MODE: 2099 if (var_context == kStatement) { 2100 // In extended mode 'const' declarations are only allowed in source 2101 // element positions. 2102 ReportMessage("unprotected_const", Vector<const char*>::empty()); 2103 *ok = false; 2104 return NULL; 2105 } 2106 mode = CONST_HARMONY; 2107 init_op = Token::INIT_CONST_HARMONY; 2108 } 2109 is_const = true; 2110 needs_init = true; 2111 } else if (peek() == Token::LET) { 2112 // ES6 Draft Rev4 section 12.2.1: 2113 // 2114 // LetDeclaration : let LetBindingList ; 2115 // 2116 // * It is a Syntax Error if the code that matches this production is not 2117 // contained in extended code. 2118 if (!is_extended_mode()) { 2119 ReportMessage("illegal_let", Vector<const char*>::empty()); 2120 *ok = false; 2121 return NULL; 2122 } 2123 Consume(Token::LET); 2124 if (var_context == kStatement) { 2125 // Let declarations are only allowed in source element positions. 2126 ReportMessage("unprotected_let", Vector<const char*>::empty()); 2127 *ok = false; 2128 return NULL; 2129 } 2130 mode = LET; 2131 needs_init = true; 2132 init_op = Token::INIT_LET; 2133 } else { 2134 UNREACHABLE(); // by current callers 2135 } 2136 2137 Scope* declaration_scope = DeclarationScope(mode); 2138 2139 // The scope of a var/const declared variable anywhere inside a function 2140 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). Thus we can 2141 // transform a source-level var/const declaration into a (Function) 2142 // Scope declaration, and rewrite the source-level initialization into an 2143 // assignment statement. We use a block to collect multiple assignments. 2144 // 2145 // We mark the block as initializer block because we don't want the 2146 // rewriter to add a '.result' assignment to such a block (to get compliant 2147 // behavior for code such as print(eval('var x = 7')), and for cosmetic 2148 // reasons when pretty-printing. Also, unless an assignment (initialization) 2149 // is inside an initializer block, it is ignored. 2150 // 2151 // Create new block with one expected declaration. 2152 Block* block = factory()->NewBlock(NULL, 1, true); 2153 int nvars = 0; // the number of variables declared 2154 Handle<String> name; 2155 do { 2156 if (fni_ != NULL) fni_->Enter(); 2157 2158 // Parse variable name. 2159 if (nvars > 0) Consume(Token::COMMA); 2160 name = ParseIdentifier(CHECK_OK); 2161 if (fni_ != NULL) fni_->PushVariableName(name); 2162 2163 // Strict mode variables may not be named eval or arguments 2164 if (!declaration_scope->is_classic_mode() && IsEvalOrArguments(name)) { 2165 ReportMessage("strict_var_name", Vector<const char*>::empty()); 2166 *ok = false; 2167 return NULL; 2168 } 2169 2170 // Declare variable. 2171 // Note that we *always* must treat the initial value via a separate init 2172 // assignment for variables and constants because the value must be assigned 2173 // when the variable is encountered in the source. But the variable/constant 2174 // is declared (and set to 'undefined') upon entering the function within 2175 // which the variable or constant is declared. Only function variables have 2176 // an initial value in the declaration (because they are initialized upon 2177 // entering the function). 2178 // 2179 // If we have a const declaration, in an inner scope, the proxy is always 2180 // bound to the declared variable (independent of possibly surrounding with 2181 // statements). 2182 // For let/const declarations in harmony mode, we can also immediately 2183 // pre-resolve the proxy because it resides in the same scope as the 2184 // declaration. 2185 VariableProxy* proxy = NewUnresolved(name, mode); 2186 Declaration* declaration = 2187 factory()->NewVariableDeclaration(proxy, mode, top_scope_); 2188 Declare(declaration, mode != VAR, CHECK_OK); 2189 nvars++; 2190 if (declaration_scope->num_var_or_const() > kMaxNumFunctionLocals) { 2191 ReportMessageAt(scanner().location(), "too_many_variables", 2192 Vector<const char*>::empty()); 2193 *ok = false; 2194 return NULL; 2195 } 2196 if (names) names->Add(name); 2197 2198 // Parse initialization expression if present and/or needed. A 2199 // declaration of the form: 2200 // 2201 // var v = x; 2202 // 2203 // is syntactic sugar for: 2204 // 2205 // var v; v = x; 2206 // 2207 // In particular, we need to re-lookup 'v' (in top_scope_, not 2208 // declaration_scope) as it may be a different 'v' than the 'v' in the 2209 // declaration (e.g., if we are inside a 'with' statement or 'catch' 2210 // block). 2211 // 2212 // However, note that const declarations are different! A const 2213 // declaration of the form: 2214 // 2215 // const c = x; 2216 // 2217 // is *not* syntactic sugar for: 2218 // 2219 // const c; c = x; 2220 // 2221 // The "variable" c initialized to x is the same as the declared 2222 // one - there is no re-lookup (see the last parameter of the 2223 // Declare() call above). 2224 2225 Scope* initialization_scope = is_const ? declaration_scope : top_scope_; 2226 Expression* value = NULL; 2227 int position = -1; 2228 // Harmony consts have non-optional initializers. 2229 if (peek() == Token::ASSIGN || mode == CONST_HARMONY) { 2230 Expect(Token::ASSIGN, CHECK_OK); 2231 position = scanner().location().beg_pos; 2232 value = ParseAssignmentExpression(var_context != kForStatement, CHECK_OK); 2233 // Don't infer if it is "a = function(){...}();"-like expression. 2234 if (fni_ != NULL && 2235 value->AsCall() == NULL && 2236 value->AsCallNew() == NULL) { 2237 fni_->Infer(); 2238 } else { 2239 fni_->RemoveLastFunction(); 2240 } 2241 if (decl_props != NULL) *decl_props = kHasInitializers; 2242 } 2243 2244 // Record the end position of the initializer. 2245 if (proxy->var() != NULL) { 2246 proxy->var()->set_initializer_position(scanner().location().end_pos); 2247 } 2248 2249 // Make sure that 'const x' and 'let x' initialize 'x' to undefined. 2250 if (value == NULL && needs_init) { 2251 value = GetLiteralUndefined(); 2252 } 2253 2254 // Global variable declarations must be compiled in a specific 2255 // way. When the script containing the global variable declaration 2256 // is entered, the global variable must be declared, so that if it 2257 // doesn't exist (not even in a prototype of the global object) it 2258 // gets created with an initial undefined value. This is handled 2259 // by the declarations part of the function representing the 2260 // top-level global code; see Runtime::DeclareGlobalVariable. If 2261 // it already exists (in the object or in a prototype), it is 2262 // *not* touched until the variable declaration statement is 2263 // executed. 2264 // 2265 // Executing the variable declaration statement will always 2266 // guarantee to give the global object a "local" variable; a 2267 // variable defined in the global object and not in any 2268 // prototype. This way, global variable declarations can shadow 2269 // properties in the prototype chain, but only after the variable 2270 // declaration statement has been executed. This is important in 2271 // browsers where the global object (window) has lots of 2272 // properties defined in prototype objects. 2273 if (initialization_scope->is_global_scope()) { 2274 // Compute the arguments for the runtime call. 2275 ZoneList<Expression*>* arguments = new(zone()) ZoneList<Expression*>(3); 2276 // We have at least 1 parameter. 2277 arguments->Add(factory()->NewLiteral(name)); 2278 CallRuntime* initialize; 2279 2280 if (is_const) { 2281 arguments->Add(value); 2282 value = NULL; // zap the value to avoid the unnecessary assignment 2283 2284 // Construct the call to Runtime_InitializeConstGlobal 2285 // and add it to the initialization statement block. 2286 // Note that the function does different things depending on 2287 // the number of arguments (1 or 2). 2288 initialize = factory()->NewCallRuntime( 2289 isolate()->factory()->InitializeConstGlobal_symbol(), 2290 Runtime::FunctionForId(Runtime::kInitializeConstGlobal), 2291 arguments); 2292 } else { 2293 // Add strict mode. 2294 // We may want to pass singleton to avoid Literal allocations. 2295 LanguageMode language_mode = initialization_scope->language_mode(); 2296 arguments->Add(factory()->NewNumberLiteral(language_mode)); 2297 2298 // Be careful not to assign a value to the global variable if 2299 // we're in a with. The initialization value should not 2300 // necessarily be stored in the global object in that case, 2301 // which is why we need to generate a separate assignment node. 2302 if (value != NULL && !inside_with()) { 2303 arguments->Add(value); 2304 value = NULL; // zap the value to avoid the unnecessary assignment 2305 } 2306 2307 // Construct the call to Runtime_InitializeVarGlobal 2308 // and add it to the initialization statement block. 2309 // Note that the function does different things depending on 2310 // the number of arguments (2 or 3). 2311 initialize = factory()->NewCallRuntime( 2312 isolate()->factory()->InitializeVarGlobal_symbol(), 2313 Runtime::FunctionForId(Runtime::kInitializeVarGlobal), 2314 arguments); 2315 } 2316 2317 block->AddStatement(factory()->NewExpressionStatement(initialize)); 2318 } else if (needs_init) { 2319 // Constant initializations always assign to the declared constant which 2320 // is always at the function scope level. This is only relevant for 2321 // dynamically looked-up variables and constants (the start context for 2322 // constant lookups is always the function context, while it is the top 2323 // context for var declared variables). Sigh... 2324 // For 'let' and 'const' declared variables in harmony mode the 2325 // initialization also always assigns to the declared variable. 2326 ASSERT(proxy != NULL); 2327 ASSERT(proxy->var() != NULL); 2328 ASSERT(value != NULL); 2329 Assignment* assignment = 2330 factory()->NewAssignment(init_op, proxy, value, position); 2331 block->AddStatement(factory()->NewExpressionStatement(assignment)); 2332 value = NULL; 2333 } 2334 2335 // Add an assignment node to the initialization statement block if we still 2336 // have a pending initialization value. 2337 if (value != NULL) { 2338 ASSERT(mode == VAR); 2339 // 'var' initializations are simply assignments (with all the consequences 2340 // if they are inside a 'with' statement - they may change a 'with' object 2341 // property). 2342 VariableProxy* proxy = 2343 initialization_scope->NewUnresolved(factory(), name); 2344 Assignment* assignment = 2345 factory()->NewAssignment(init_op, proxy, value, position); 2346 block->AddStatement(factory()->NewExpressionStatement(assignment)); 2347 } 2348 2349 if (fni_ != NULL) fni_->Leave(); 2350 } while (peek() == Token::COMMA); 2351 2352 // If there was a single non-const declaration, return it in the output 2353 // parameter for possible use by for/in. 2354 if (nvars == 1 && !is_const) { 2355 *out = name; 2356 } 2357 2358 return block; 2359 } 2360 2361 2362 static bool ContainsLabel(ZoneStringList* labels, Handle<String> label) { 2363 ASSERT(!label.is_null()); 2364 if (labels != NULL) 2365 for (int i = labels->length(); i-- > 0; ) 2366 if (labels->at(i).is_identical_to(label)) 2367 return true; 2368 2369 return false; 2370 } 2371 2372 2373 Statement* Parser::ParseExpressionOrLabelledStatement(ZoneStringList* labels, 2374 bool* ok) { 2375 // ExpressionStatement | LabelledStatement :: 2376 // Expression ';' 2377 // Identifier ':' Statement 2378 bool starts_with_idenfifier = peek_any_identifier(); 2379 Expression* expr = ParseExpression(true, CHECK_OK); 2380 if (peek() == Token::COLON && starts_with_idenfifier && expr != NULL && 2381 expr->AsVariableProxy() != NULL && 2382 !expr->AsVariableProxy()->is_this()) { 2383 // Expression is a single identifier, and not, e.g., a parenthesized 2384 // identifier. 2385 VariableProxy* var = expr->AsVariableProxy(); 2386 Handle<String> label = var->name(); 2387 // TODO(1240780): We don't check for redeclaration of labels 2388 // during preparsing since keeping track of the set of active 2389 // labels requires nontrivial changes to the way scopes are 2390 // structured. However, these are probably changes we want to 2391 // make later anyway so we should go back and fix this then. 2392 if (ContainsLabel(labels, label) || TargetStackContainsLabel(label)) { 2393 SmartArrayPointer<char> c_string = label->ToCString(DISALLOW_NULLS); 2394 const char* elms[2] = { "Label", *c_string }; 2395 Vector<const char*> args(elms, 2); 2396 ReportMessage("redeclaration", args); 2397 *ok = false; 2398 return NULL; 2399 } 2400 if (labels == NULL) labels = new(zone()) ZoneStringList(4); 2401 labels->Add(label); 2402 // Remove the "ghost" variable that turned out to be a label 2403 // from the top scope. This way, we don't try to resolve it 2404 // during the scope processing. 2405 top_scope_->RemoveUnresolved(var); 2406 Expect(Token::COLON, CHECK_OK); 2407 return ParseStatement(labels, ok); 2408 } 2409 2410 // If we have an extension, we allow a native function declaration. 2411 // A native function declaration starts with "native function" with 2412 // no line-terminator between the two words. 2413 if (extension_ != NULL && 2414 peek() == Token::FUNCTION && 2415 !scanner().HasAnyLineTerminatorBeforeNext() && 2416 expr != NULL && 2417 expr->AsVariableProxy() != NULL && 2418 expr->AsVariableProxy()->name()->Equals( 2419 isolate()->heap()->native_symbol()) && 2420 !scanner().literal_contains_escapes()) { 2421 return ParseNativeDeclaration(ok); 2422 } 2423 2424 // Parsed expression statement, or the context-sensitive 'module' keyword. 2425 // Only expect semicolon in the former case. 2426 if (!FLAG_harmony_modules || 2427 peek() != Token::IDENTIFIER || 2428 scanner().HasAnyLineTerminatorBeforeNext() || 2429 expr->AsVariableProxy() == NULL || 2430 !expr->AsVariableProxy()->name()->Equals( 2431 isolate()->heap()->module_symbol()) || 2432 scanner().literal_contains_escapes()) { 2433 ExpectSemicolon(CHECK_OK); 2434 } 2435 return factory()->NewExpressionStatement(expr); 2436 } 2437 2438 2439 IfStatement* Parser::ParseIfStatement(ZoneStringList* labels, bool* ok) { 2440 // IfStatement :: 2441 // 'if' '(' Expression ')' Statement ('else' Statement)? 2442 2443 Expect(Token::IF, CHECK_OK); 2444 Expect(Token::LPAREN, CHECK_OK); 2445 Expression* condition = ParseExpression(true, CHECK_OK); 2446 Expect(Token::RPAREN, CHECK_OK); 2447 Statement* then_statement = ParseStatement(labels, CHECK_OK); 2448 Statement* else_statement = NULL; 2449 if (peek() == Token::ELSE) { 2450 Next(); 2451 else_statement = ParseStatement(labels, CHECK_OK); 2452 } else { 2453 else_statement = factory()->NewEmptyStatement(); 2454 } 2455 return factory()->NewIfStatement(condition, then_statement, else_statement); 2456 } 2457 2458 2459 Statement* Parser::ParseContinueStatement(bool* ok) { 2460 // ContinueStatement :: 2461 // 'continue' Identifier? ';' 2462 2463 Expect(Token::CONTINUE, CHECK_OK); 2464 Handle<String> label = Handle<String>::null(); 2465 Token::Value tok = peek(); 2466 if (!scanner().HasAnyLineTerminatorBeforeNext() && 2467 tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) { 2468 label = ParseIdentifier(CHECK_OK); 2469 } 2470 IterationStatement* target = NULL; 2471 target = LookupContinueTarget(label, CHECK_OK); 2472 if (target == NULL) { 2473 // Illegal continue statement. 2474 const char* message = "illegal_continue"; 2475 Vector<Handle<String> > args; 2476 if (!label.is_null()) { 2477 message = "unknown_label"; 2478 args = Vector<Handle<String> >(&label, 1); 2479 } 2480 ReportMessageAt(scanner().location(), message, args); 2481 *ok = false; 2482 return NULL; 2483 } 2484 ExpectSemicolon(CHECK_OK); 2485 return factory()->NewContinueStatement(target); 2486 } 2487 2488 2489 Statement* Parser::ParseBreakStatement(ZoneStringList* labels, bool* ok) { 2490 // BreakStatement :: 2491 // 'break' Identifier? ';' 2492 2493 Expect(Token::BREAK, CHECK_OK); 2494 Handle<String> label; 2495 Token::Value tok = peek(); 2496 if (!scanner().HasAnyLineTerminatorBeforeNext() && 2497 tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) { 2498 label = ParseIdentifier(CHECK_OK); 2499 } 2500 // Parse labeled break statements that target themselves into 2501 // empty statements, e.g. 'l1: l2: l3: break l2;' 2502 if (!label.is_null() && ContainsLabel(labels, label)) { 2503 ExpectSemicolon(CHECK_OK); 2504 return factory()->NewEmptyStatement(); 2505 } 2506 BreakableStatement* target = NULL; 2507 target = LookupBreakTarget(label, CHECK_OK); 2508 if (target == NULL) { 2509 // Illegal break statement. 2510 const char* message = "illegal_break"; 2511 Vector<Handle<String> > args; 2512 if (!label.is_null()) { 2513 message = "unknown_label"; 2514 args = Vector<Handle<String> >(&label, 1); 2515 } 2516 ReportMessageAt(scanner().location(), message, args); 2517 *ok = false; 2518 return NULL; 2519 } 2520 ExpectSemicolon(CHECK_OK); 2521 return factory()->NewBreakStatement(target); 2522 } 2523 2524 2525 Statement* Parser::ParseReturnStatement(bool* ok) { 2526 // ReturnStatement :: 2527 // 'return' Expression? ';' 2528 2529 // Consume the return token. It is necessary to do the before 2530 // reporting any errors on it, because of the way errors are 2531 // reported (underlining). 2532 Expect(Token::RETURN, CHECK_OK); 2533 2534 Token::Value tok = peek(); 2535 Statement* result; 2536 if (scanner().HasAnyLineTerminatorBeforeNext() || 2537 tok == Token::SEMICOLON || 2538 tok == Token::RBRACE || 2539 tok == Token::EOS) { 2540 ExpectSemicolon(CHECK_OK); 2541 result = factory()->NewReturnStatement(GetLiteralUndefined()); 2542 } else { 2543 Expression* expr = ParseExpression(true, CHECK_OK); 2544 ExpectSemicolon(CHECK_OK); 2545 result = factory()->NewReturnStatement(expr); 2546 } 2547 2548 // An ECMAScript program is considered syntactically incorrect if it 2549 // contains a return statement that is not within the body of a 2550 // function. See ECMA-262, section 12.9, page 67. 2551 // 2552 // To be consistent with KJS we report the syntax error at runtime. 2553 Scope* declaration_scope = top_scope_->DeclarationScope(); 2554 if (declaration_scope->is_global_scope() || 2555 declaration_scope->is_eval_scope()) { 2556 Handle<String> type = isolate()->factory()->illegal_return_symbol(); 2557 Expression* throw_error = NewThrowSyntaxError(type, Handle<Object>::null()); 2558 return factory()->NewExpressionStatement(throw_error); 2559 } 2560 return result; 2561 } 2562 2563 2564 Statement* Parser::ParseWithStatement(ZoneStringList* labels, bool* ok) { 2565 // WithStatement :: 2566 // 'with' '(' Expression ')' Statement 2567 2568 Expect(Token::WITH, CHECK_OK); 2569 2570 if (!top_scope_->is_classic_mode()) { 2571 ReportMessage("strict_mode_with", Vector<const char*>::empty()); 2572 *ok = false; 2573 return NULL; 2574 } 2575 2576 Expect(Token::LPAREN, CHECK_OK); 2577 Expression* expr = ParseExpression(true, CHECK_OK); 2578 Expect(Token::RPAREN, CHECK_OK); 2579 2580 top_scope_->DeclarationScope()->RecordWithStatement(); 2581 Scope* with_scope = NewScope(top_scope_, WITH_SCOPE); 2582 Statement* stmt; 2583 { BlockState block_state(this, with_scope); 2584 with_scope->set_start_position(scanner().peek_location().beg_pos); 2585 stmt = ParseStatement(labels, CHECK_OK); 2586 with_scope->set_end_position(scanner().location().end_pos); 2587 } 2588 return factory()->NewWithStatement(expr, stmt); 2589 } 2590 2591 2592 CaseClause* Parser::ParseCaseClause(bool* default_seen_ptr, bool* ok) { 2593 // CaseClause :: 2594 // 'case' Expression ':' Statement* 2595 // 'default' ':' Statement* 2596 2597 Expression* label = NULL; // NULL expression indicates default case 2598 if (peek() == Token::CASE) { 2599 Expect(Token::CASE, CHECK_OK); 2600 label = ParseExpression(true, CHECK_OK); 2601 } else { 2602 Expect(Token::DEFAULT, CHECK_OK); 2603 if (*default_seen_ptr) { 2604 ReportMessage("multiple_defaults_in_switch", 2605 Vector<const char*>::empty()); 2606 *ok = false; 2607 return NULL; 2608 } 2609 *default_seen_ptr = true; 2610 } 2611 Expect(Token::COLON, CHECK_OK); 2612 int pos = scanner().location().beg_pos; 2613 ZoneList<Statement*>* statements = new(zone()) ZoneList<Statement*>(5); 2614 while (peek() != Token::CASE && 2615 peek() != Token::DEFAULT && 2616 peek() != Token::RBRACE) { 2617 Statement* stat = ParseStatement(NULL, CHECK_OK); 2618 statements->Add(stat); 2619 } 2620 2621 return new(zone()) CaseClause(isolate(), label, statements, pos); 2622 } 2623 2624 2625 SwitchStatement* Parser::ParseSwitchStatement(ZoneStringList* labels, 2626 bool* ok) { 2627 // SwitchStatement :: 2628 // 'switch' '(' Expression ')' '{' CaseClause* '}' 2629 2630 SwitchStatement* statement = factory()->NewSwitchStatement(labels); 2631 Target target(&this->target_stack_, statement); 2632 2633 Expect(Token::SWITCH, CHECK_OK); 2634 Expect(Token::LPAREN, CHECK_OK); 2635 Expression* tag = ParseExpression(true, CHECK_OK); 2636 Expect(Token::RPAREN, CHECK_OK); 2637 2638 bool default_seen = false; 2639 ZoneList<CaseClause*>* cases = new(zone()) ZoneList<CaseClause*>(4); 2640 Expect(Token::LBRACE, CHECK_OK); 2641 while (peek() != Token::RBRACE) { 2642 CaseClause* clause = ParseCaseClause(&default_seen, CHECK_OK); 2643 cases->Add(clause); 2644 } 2645 Expect(Token::RBRACE, CHECK_OK); 2646 2647 if (statement) statement->Initialize(tag, cases); 2648 return statement; 2649 } 2650 2651 2652 Statement* Parser::ParseThrowStatement(bool* ok) { 2653 // ThrowStatement :: 2654 // 'throw' Expression ';' 2655 2656 Expect(Token::THROW, CHECK_OK); 2657 int pos = scanner().location().beg_pos; 2658 if (scanner().HasAnyLineTerminatorBeforeNext()) { 2659 ReportMessage("newline_after_throw", Vector<const char*>::empty()); 2660 *ok = false; 2661 return NULL; 2662 } 2663 Expression* exception = ParseExpression(true, CHECK_OK); 2664 ExpectSemicolon(CHECK_OK); 2665 2666 return factory()->NewExpressionStatement(factory()->NewThrow(exception, pos)); 2667 } 2668 2669 2670 TryStatement* Parser::ParseTryStatement(bool* ok) { 2671 // TryStatement :: 2672 // 'try' Block Catch 2673 // 'try' Block Finally 2674 // 'try' Block Catch Finally 2675 // 2676 // Catch :: 2677 // 'catch' '(' Identifier ')' Block 2678 // 2679 // Finally :: 2680 // 'finally' Block 2681 2682 Expect(Token::TRY, CHECK_OK); 2683 2684 TargetCollector try_collector; 2685 Block* try_block; 2686 2687 { Target target(&this->target_stack_, &try_collector); 2688 try_block = ParseBlock(NULL, CHECK_OK); 2689 } 2690 2691 Token::Value tok = peek(); 2692 if (tok != Token::CATCH && tok != Token::FINALLY) { 2693 ReportMessage("no_catch_or_finally", Vector<const char*>::empty()); 2694 *ok = false; 2695 return NULL; 2696 } 2697 2698 // If we can break out from the catch block and there is a finally block, 2699 // then we will need to collect escaping targets from the catch 2700 // block. Since we don't know yet if there will be a finally block, we 2701 // always collect the targets. 2702 TargetCollector catch_collector; 2703 Scope* catch_scope = NULL; 2704 Variable* catch_variable = NULL; 2705 Block* catch_block = NULL; 2706 Handle<String> name; 2707 if (tok == Token::CATCH) { 2708 Consume(Token::CATCH); 2709 2710 Expect(Token::LPAREN, CHECK_OK); 2711 catch_scope = NewScope(top_scope_, CATCH_SCOPE); 2712 catch_scope->set_start_position(scanner().location().beg_pos); 2713 name = ParseIdentifier(CHECK_OK); 2714 2715 if (!top_scope_->is_classic_mode() && IsEvalOrArguments(name)) { 2716 ReportMessage("strict_catch_variable", Vector<const char*>::empty()); 2717 *ok = false; 2718 return NULL; 2719 } 2720 2721 Expect(Token::RPAREN, CHECK_OK); 2722 2723 if (peek() == Token::LBRACE) { 2724 Target target(&this->target_stack_, &catch_collector); 2725 VariableMode mode = is_extended_mode() ? LET : VAR; 2726 catch_variable = 2727 catch_scope->DeclareLocal(name, mode, kCreatedInitialized); 2728 2729 BlockState block_state(this, catch_scope); 2730 catch_block = ParseBlock(NULL, CHECK_OK); 2731 } else { 2732 Expect(Token::LBRACE, CHECK_OK); 2733 } 2734 catch_scope->set_end_position(scanner().location().end_pos); 2735 tok = peek(); 2736 } 2737 2738 Block* finally_block = NULL; 2739 if (tok == Token::FINALLY || catch_block == NULL) { 2740 Consume(Token::FINALLY); 2741 finally_block = ParseBlock(NULL, CHECK_OK); 2742 } 2743 2744 // Simplify the AST nodes by converting: 2745 // 'try B0 catch B1 finally B2' 2746 // to: 2747 // 'try { try B0 catch B1 } finally B2' 2748 2749 if (catch_block != NULL && finally_block != NULL) { 2750 // If we have both, create an inner try/catch. 2751 ASSERT(catch_scope != NULL && catch_variable != NULL); 2752 int index = current_function_state_->NextHandlerIndex(); 2753 TryCatchStatement* statement = factory()->NewTryCatchStatement( 2754 index, try_block, catch_scope, catch_variable, catch_block); 2755 statement->set_escaping_targets(try_collector.targets()); 2756 try_block = factory()->NewBlock(NULL, 1, false); 2757 try_block->AddStatement(statement); 2758 catch_block = NULL; // Clear to indicate it's been handled. 2759 } 2760 2761 TryStatement* result = NULL; 2762 if (catch_block != NULL) { 2763 ASSERT(finally_block == NULL); 2764 ASSERT(catch_scope != NULL && catch_variable != NULL); 2765 int index = current_function_state_->NextHandlerIndex(); 2766 result = factory()->NewTryCatchStatement( 2767 index, try_block, catch_scope, catch_variable, catch_block); 2768 } else { 2769 ASSERT(finally_block != NULL); 2770 int index = current_function_state_->NextHandlerIndex(); 2771 result = factory()->NewTryFinallyStatement(index, try_block, finally_block); 2772 // Combine the jump targets of the try block and the possible catch block. 2773 try_collector.targets()->AddAll(*catch_collector.targets()); 2774 } 2775 2776 result->set_escaping_targets(try_collector.targets()); 2777 return result; 2778 } 2779 2780 2781 DoWhileStatement* Parser::ParseDoWhileStatement(ZoneStringList* labels, 2782 bool* ok) { 2783 // DoStatement :: 2784 // 'do' Statement 'while' '(' Expression ')' ';' 2785 2786 DoWhileStatement* loop = factory()->NewDoWhileStatement(labels); 2787 Target target(&this->target_stack_, loop); 2788 2789 Expect(Token::DO, CHECK_OK); 2790 Statement* body = ParseStatement(NULL, CHECK_OK); 2791 Expect(Token::WHILE, CHECK_OK); 2792 Expect(Token::LPAREN, CHECK_OK); 2793 2794 if (loop != NULL) { 2795 int position = scanner().location().beg_pos; 2796 loop->set_condition_position(position); 2797 } 2798 2799 Expression* cond = ParseExpression(true, CHECK_OK); 2800 Expect(Token::RPAREN, CHECK_OK); 2801 2802 // Allow do-statements to be terminated with and without 2803 // semi-colons. This allows code such as 'do;while(0)return' to 2804 // parse, which would not be the case if we had used the 2805 // ExpectSemicolon() functionality here. 2806 if (peek() == Token::SEMICOLON) Consume(Token::SEMICOLON); 2807 2808 if (loop != NULL) loop->Initialize(cond, body); 2809 return loop; 2810 } 2811 2812 2813 WhileStatement* Parser::ParseWhileStatement(ZoneStringList* labels, bool* ok) { 2814 // WhileStatement :: 2815 // 'while' '(' Expression ')' Statement 2816 2817 WhileStatement* loop = factory()->NewWhileStatement(labels); 2818 Target target(&this->target_stack_, loop); 2819 2820 Expect(Token::WHILE, CHECK_OK); 2821 Expect(Token::LPAREN, CHECK_OK); 2822 Expression* cond = ParseExpression(true, CHECK_OK); 2823 Expect(Token::RPAREN, CHECK_OK); 2824 Statement* body = ParseStatement(NULL, CHECK_OK); 2825 2826 if (loop != NULL) loop->Initialize(cond, body); 2827 return loop; 2828 } 2829 2830 2831 Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { 2832 // ForStatement :: 2833 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement 2834 2835 Statement* init = NULL; 2836 2837 // Create an in-between scope for let-bound iteration variables. 2838 Scope* saved_scope = top_scope_; 2839 Scope* for_scope = NewScope(top_scope_, BLOCK_SCOPE); 2840 top_scope_ = for_scope; 2841 2842 Expect(Token::FOR, CHECK_OK); 2843 Expect(Token::LPAREN, CHECK_OK); 2844 for_scope->set_start_position(scanner().location().beg_pos); 2845 if (peek() != Token::SEMICOLON) { 2846 if (peek() == Token::VAR || peek() == Token::CONST) { 2847 Handle<String> name; 2848 Block* variable_statement = 2849 ParseVariableDeclarations(kForStatement, NULL, NULL, &name, CHECK_OK); 2850 2851 if (peek() == Token::IN && !name.is_null()) { 2852 VariableProxy* each = top_scope_->NewUnresolved(factory(), name); 2853 ForInStatement* loop = factory()->NewForInStatement(labels); 2854 Target target(&this->target_stack_, loop); 2855 2856 Expect(Token::IN, CHECK_OK); 2857 Expression* enumerable = ParseExpression(true, CHECK_OK); 2858 Expect(Token::RPAREN, CHECK_OK); 2859 2860 Statement* body = ParseStatement(NULL, CHECK_OK); 2861 loop->Initialize(each, enumerable, body); 2862 Block* result = factory()->NewBlock(NULL, 2, false); 2863 result->AddStatement(variable_statement); 2864 result->AddStatement(loop); 2865 top_scope_ = saved_scope; 2866 for_scope->set_end_position(scanner().location().end_pos); 2867 for_scope = for_scope->FinalizeBlockScope(); 2868 ASSERT(for_scope == NULL); 2869 // Parsed for-in loop w/ variable/const declaration. 2870 return result; 2871 } else { 2872 init = variable_statement; 2873 } 2874 } else if (peek() == Token::LET) { 2875 Handle<String> name; 2876 VariableDeclarationProperties decl_props = kHasNoInitializers; 2877 Block* variable_statement = 2878 ParseVariableDeclarations(kForStatement, &decl_props, NULL, &name, 2879 CHECK_OK); 2880 bool accept_IN = !name.is_null() && decl_props != kHasInitializers; 2881 if (peek() == Token::IN && accept_IN) { 2882 // Rewrite a for-in statement of the form 2883 // 2884 // for (let x in e) b 2885 // 2886 // into 2887 // 2888 // <let x' be a temporary variable> 2889 // for (x' in e) { 2890 // let x; 2891 // x = x'; 2892 // b; 2893 // } 2894 2895 // TODO(keuchel): Move the temporary variable to the block scope, after 2896 // implementing stack allocated block scoped variables. 2897 Variable* temp = top_scope_->DeclarationScope()->NewTemporary(name); 2898 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); 2899 VariableProxy* each = top_scope_->NewUnresolved(factory(), name); 2900 ForInStatement* loop = factory()->NewForInStatement(labels); 2901 Target target(&this->target_stack_, loop); 2902 2903 Expect(Token::IN, CHECK_OK); 2904 Expression* enumerable = ParseExpression(true, CHECK_OK); 2905 Expect(Token::RPAREN, CHECK_OK); 2906 2907 Statement* body = ParseStatement(NULL, CHECK_OK); 2908 Block* body_block = factory()->NewBlock(NULL, 3, false); 2909 Assignment* assignment = factory()->NewAssignment( 2910 Token::ASSIGN, each, temp_proxy, RelocInfo::kNoPosition); 2911 Statement* assignment_statement = 2912 factory()->NewExpressionStatement(assignment); 2913 body_block->AddStatement(variable_statement); 2914 body_block->AddStatement(assignment_statement); 2915 body_block->AddStatement(body); 2916 loop->Initialize(temp_proxy, enumerable, body_block); 2917 top_scope_ = saved_scope; 2918 for_scope->set_end_position(scanner().location().end_pos); 2919 for_scope = for_scope->FinalizeBlockScope(); 2920 body_block->set_block_scope(for_scope); 2921 // Parsed for-in loop w/ let declaration. 2922 return loop; 2923 2924 } else { 2925 init = variable_statement; 2926 } 2927 } else { 2928 Expression* expression = ParseExpression(false, CHECK_OK); 2929 if (peek() == Token::IN) { 2930 // Signal a reference error if the expression is an invalid 2931 // left-hand side expression. We could report this as a syntax 2932 // error here but for compatibility with JSC we choose to report 2933 // the error at runtime. 2934 if (expression == NULL || !expression->IsValidLeftHandSide()) { 2935 Handle<String> type = 2936 isolate()->factory()->invalid_lhs_in_for_in_symbol(); 2937 expression = NewThrowReferenceError(type); 2938 } 2939 ForInStatement* loop = factory()->NewForInStatement(labels); 2940 Target target(&this->target_stack_, loop); 2941 2942 Expect(Token::IN, CHECK_OK); 2943 Expression* enumerable = ParseExpression(true, CHECK_OK); 2944 Expect(Token::RPAREN, CHECK_OK); 2945 2946 Statement* body = ParseStatement(NULL, CHECK_OK); 2947 if (loop) loop->Initialize(expression, enumerable, body); 2948 top_scope_ = saved_scope; 2949 for_scope->set_end_position(scanner().location().end_pos); 2950 for_scope = for_scope->FinalizeBlockScope(); 2951 ASSERT(for_scope == NULL); 2952 // Parsed for-in loop. 2953 return loop; 2954 2955 } else { 2956 init = factory()->NewExpressionStatement(expression); 2957 } 2958 } 2959 } 2960 2961 // Standard 'for' loop 2962 ForStatement* loop = factory()->NewForStatement(labels); 2963 Target target(&this->target_stack_, loop); 2964 2965 // Parsed initializer at this point. 2966 Expect(Token::SEMICOLON, CHECK_OK); 2967 2968 Expression* cond = NULL; 2969 if (peek() != Token::SEMICOLON) { 2970 cond = ParseExpression(true, CHECK_OK); 2971 } 2972 Expect(Token::SEMICOLON, CHECK_OK); 2973 2974 Statement* next = NULL; 2975 if (peek() != Token::RPAREN) { 2976 Expression* exp = ParseExpression(true, CHECK_OK); 2977 next = factory()->NewExpressionStatement(exp); 2978 } 2979 Expect(Token::RPAREN, CHECK_OK); 2980 2981 Statement* body = ParseStatement(NULL, CHECK_OK); 2982 top_scope_ = saved_scope; 2983 for_scope->set_end_position(scanner().location().end_pos); 2984 for_scope = for_scope->FinalizeBlockScope(); 2985 if (for_scope != NULL) { 2986 // Rewrite a for statement of the form 2987 // 2988 // for (let x = i; c; n) b 2989 // 2990 // into 2991 // 2992 // { 2993 // let x = i; 2994 // for (; c; n) b 2995 // } 2996 ASSERT(init != NULL); 2997 Block* result = factory()->NewBlock(NULL, 2, false); 2998 result->AddStatement(init); 2999 result->AddStatement(loop); 3000 result->set_block_scope(for_scope); 3001 if (loop) loop->Initialize(NULL, cond, next, body); 3002 return result; 3003 } else { 3004 if (loop) loop->Initialize(init, cond, next, body); 3005 return loop; 3006 } 3007 } 3008 3009 3010 // Precedence = 1 3011 Expression* Parser::ParseExpression(bool accept_IN, bool* ok) { 3012 // Expression :: 3013 // AssignmentExpression 3014 // Expression ',' AssignmentExpression 3015 3016 Expression* result = ParseAssignmentExpression(accept_IN, CHECK_OK); 3017 while (peek() == Token::COMMA) { 3018 Expect(Token::COMMA, CHECK_OK); 3019 int position = scanner().location().beg_pos; 3020 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); 3021 result = 3022 factory()->NewBinaryOperation(Token::COMMA, result, right, position); 3023 } 3024 return result; 3025 } 3026 3027 3028 // Precedence = 2 3029 Expression* Parser::ParseAssignmentExpression(bool accept_IN, bool* ok) { 3030 // AssignmentExpression :: 3031 // ConditionalExpression 3032 // LeftHandSideExpression AssignmentOperator AssignmentExpression 3033 3034 if (fni_ != NULL) fni_->Enter(); 3035 Expression* expression = ParseConditionalExpression(accept_IN, CHECK_OK); 3036 3037 if (!Token::IsAssignmentOp(peek())) { 3038 if (fni_ != NULL) fni_->Leave(); 3039 // Parsed conditional expression only (no assignment). 3040 return expression; 3041 } 3042 3043 // Signal a reference error if the expression is an invalid left-hand 3044 // side expression. We could report this as a syntax error here but 3045 // for compatibility with JSC we choose to report the error at 3046 // runtime. 3047 if (expression == NULL || !expression->IsValidLeftHandSide()) { 3048 Handle<String> type = 3049 isolate()->factory()->invalid_lhs_in_assignment_symbol(); 3050 expression = NewThrowReferenceError(type); 3051 } 3052 3053 if (!top_scope_->is_classic_mode()) { 3054 // Assignment to eval or arguments is disallowed in strict mode. 3055 CheckStrictModeLValue(expression, "strict_lhs_assignment", CHECK_OK); 3056 } 3057 MarkAsLValue(expression); 3058 3059 Token::Value op = Next(); // Get assignment operator. 3060 int pos = scanner().location().beg_pos; 3061 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); 3062 3063 // TODO(1231235): We try to estimate the set of properties set by 3064 // constructors. We define a new property whenever there is an 3065 // assignment to a property of 'this'. We should probably only add 3066 // properties if we haven't seen them before. Otherwise we'll 3067 // probably overestimate the number of properties. 3068 Property* property = expression ? expression->AsProperty() : NULL; 3069 if (op == Token::ASSIGN && 3070 property != NULL && 3071 property->obj()->AsVariableProxy() != NULL && 3072 property->obj()->AsVariableProxy()->is_this()) { 3073 current_function_state_->AddProperty(); 3074 } 3075 3076 // If we assign a function literal to a property we pretenure the 3077 // literal so it can be added as a constant function property. 3078 if (property != NULL && right->AsFunctionLiteral() != NULL) { 3079 right->AsFunctionLiteral()->set_pretenure(); 3080 } 3081 3082 if (fni_ != NULL) { 3083 // Check if the right hand side is a call to avoid inferring a 3084 // name if we're dealing with "a = function(){...}();"-like 3085 // expression. 3086 if ((op == Token::INIT_VAR 3087 || op == Token::INIT_CONST 3088 || op == Token::ASSIGN) 3089 && (right->AsCall() == NULL && right->AsCallNew() == NULL)) { 3090 fni_->Infer(); 3091 } else { 3092 fni_->RemoveLastFunction(); 3093 } 3094 fni_->Leave(); 3095 } 3096 3097 return factory()->NewAssignment(op, expression, right, pos); 3098 } 3099 3100 3101 // Precedence = 3 3102 Expression* Parser::ParseConditionalExpression(bool accept_IN, bool* ok) { 3103 // ConditionalExpression :: 3104 // LogicalOrExpression 3105 // LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression 3106 3107 // We start using the binary expression parser for prec >= 4 only! 3108 Expression* expression = ParseBinaryExpression(4, accept_IN, CHECK_OK); 3109 if (peek() != Token::CONDITIONAL) return expression; 3110 Consume(Token::CONDITIONAL); 3111 // In parsing the first assignment expression in conditional 3112 // expressions we always accept the 'in' keyword; see ECMA-262, 3113 // section 11.12, page 58. 3114 int left_position = scanner().peek_location().beg_pos; 3115 Expression* left = ParseAssignmentExpression(true, CHECK_OK); 3116 Expect(Token::COLON, CHECK_OK); 3117 int right_position = scanner().peek_location().beg_pos; 3118 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); 3119 return factory()->NewConditional( 3120 expression, left, right, left_position, right_position); 3121 } 3122 3123 3124 static int Precedence(Token::Value tok, bool accept_IN) { 3125 if (tok == Token::IN && !accept_IN) 3126 return 0; // 0 precedence will terminate binary expression parsing 3127 3128 return Token::Precedence(tok); 3129 } 3130 3131 3132 // Precedence >= 4 3133 Expression* Parser::ParseBinaryExpression(int prec, bool accept_IN, bool* ok) { 3134 ASSERT(prec >= 4); 3135 Expression* x = ParseUnaryExpression(CHECK_OK); 3136 for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) { 3137 // prec1 >= 4 3138 while (Precedence(peek(), accept_IN) == prec1) { 3139 Token::Value op = Next(); 3140 int position = scanner().location().beg_pos; 3141 Expression* y = ParseBinaryExpression(prec1 + 1, accept_IN, CHECK_OK); 3142 3143 // Compute some expressions involving only number literals. 3144 if (x && x->AsLiteral() && x->AsLiteral()->handle()->IsNumber() && 3145 y && y->AsLiteral() && y->AsLiteral()->handle()->IsNumber()) { 3146 double x_val = x->AsLiteral()->handle()->Number(); 3147 double y_val = y->AsLiteral()->handle()->Number(); 3148 3149 switch (op) { 3150 case Token::ADD: 3151 x = factory()->NewNumberLiteral(x_val + y_val); 3152 continue; 3153 case Token::SUB: 3154 x = factory()->NewNumberLiteral(x_val - y_val); 3155 continue; 3156 case Token::MUL: 3157 x = factory()->NewNumberLiteral(x_val * y_val); 3158 continue; 3159 case Token::DIV: 3160 x = factory()->NewNumberLiteral(x_val / y_val); 3161 continue; 3162 case Token::BIT_OR: { 3163 int value = DoubleToInt32(x_val) | DoubleToInt32(y_val); 3164 x = factory()->NewNumberLiteral(value); 3165 continue; 3166 } 3167 case Token::BIT_AND: { 3168 int value = DoubleToInt32(x_val) & DoubleToInt32(y_val); 3169 x = factory()->NewNumberLiteral(value); 3170 continue; 3171 } 3172 case Token::BIT_XOR: { 3173 int value = DoubleToInt32(x_val) ^ DoubleToInt32(y_val); 3174 x = factory()->NewNumberLiteral(value); 3175 continue; 3176 } 3177 case Token::SHL: { 3178 int value = DoubleToInt32(x_val) << (DoubleToInt32(y_val) & 0x1f); 3179 x = factory()->NewNumberLiteral(value); 3180 continue; 3181 } 3182 case Token::SHR: { 3183 uint32_t shift = DoubleToInt32(y_val) & 0x1f; 3184 uint32_t value = DoubleToUint32(x_val) >> shift; 3185 x = factory()->NewNumberLiteral(value); 3186 continue; 3187 } 3188 case Token::SAR: { 3189 uint32_t shift = DoubleToInt32(y_val) & 0x1f; 3190 int value = ArithmeticShiftRight(DoubleToInt32(x_val), shift); 3191 x = factory()->NewNumberLiteral(value); 3192 continue; 3193 } 3194 default: 3195 break; 3196 } 3197 } 3198 3199 // For now we distinguish between comparisons and other binary 3200 // operations. (We could combine the two and get rid of this 3201 // code and AST node eventually.) 3202 if (Token::IsCompareOp(op)) { 3203 // We have a comparison. 3204 Token::Value cmp = op; 3205 switch (op) { 3206 case Token::NE: cmp = Token::EQ; break; 3207 case Token::NE_STRICT: cmp = Token::EQ_STRICT; break; 3208 default: break; 3209 } 3210 x = factory()->NewCompareOperation(cmp, x, y, position); 3211 if (cmp != op) { 3212 // The comparison was negated - add a NOT. 3213 x = factory()->NewUnaryOperation(Token::NOT, x, position); 3214 } 3215 3216 } else { 3217 // We have a "normal" binary operation. 3218 x = factory()->NewBinaryOperation(op, x, y, position); 3219 } 3220 } 3221 } 3222 return x; 3223 } 3224 3225 3226 Expression* Parser::ParseUnaryExpression(bool* ok) { 3227 // UnaryExpression :: 3228 // PostfixExpression 3229 // 'delete' UnaryExpression 3230 // 'void' UnaryExpression 3231 // 'typeof' UnaryExpression 3232 // '++' UnaryExpression 3233 // '--' UnaryExpression 3234 // '+' UnaryExpression 3235 // '-' UnaryExpression 3236 // '~' UnaryExpression 3237 // '!' UnaryExpression 3238 3239 Token::Value op = peek(); 3240 if (Token::IsUnaryOp(op)) { 3241 op = Next(); 3242 int position = scanner().location().beg_pos; 3243 Expression* expression = ParseUnaryExpression(CHECK_OK); 3244 3245 if (expression != NULL && (expression->AsLiteral() != NULL)) { 3246 Handle<Object> literal = expression->AsLiteral()->handle(); 3247 if (op == Token::NOT) { 3248 // Convert the literal to a boolean condition and negate it. 3249 bool condition = literal->ToBoolean()->IsTrue(); 3250 Handle<Object> result(isolate()->heap()->ToBoolean(!condition)); 3251 return factory()->NewLiteral(result); 3252 } else if (literal->IsNumber()) { 3253 // Compute some expressions involving only number literals. 3254 double value = literal->Number(); 3255 switch (op) { 3256 case Token::ADD: 3257 return expression; 3258 case Token::SUB: 3259 return factory()->NewNumberLiteral(-value); 3260 case Token::BIT_NOT: 3261 return factory()->NewNumberLiteral(~DoubleToInt32(value)); 3262 default: 3263 break; 3264 } 3265 } 3266 } 3267 3268 // "delete identifier" is a syntax error in strict mode. 3269 if (op == Token::DELETE && !top_scope_->is_classic_mode()) { 3270 VariableProxy* operand = expression->AsVariableProxy(); 3271 if (operand != NULL && !operand->is_this()) { 3272 ReportMessage("strict_delete", Vector<const char*>::empty()); 3273 *ok = false; 3274 return NULL; 3275 } 3276 } 3277 3278 return factory()->NewUnaryOperation(op, expression, position); 3279 3280 } else if (Token::IsCountOp(op)) { 3281 op = Next(); 3282 Expression* expression = ParseUnaryExpression(CHECK_OK); 3283 // Signal a reference error if the expression is an invalid 3284 // left-hand side expression. We could report this as a syntax 3285 // error here but for compatibility with JSC we choose to report the 3286 // error at runtime. 3287 if (expression == NULL || !expression->IsValidLeftHandSide()) { 3288 Handle<String> type = 3289 isolate()->factory()->invalid_lhs_in_prefix_op_symbol(); 3290 expression = NewThrowReferenceError(type); 3291 } 3292 3293 if (!top_scope_->is_classic_mode()) { 3294 // Prefix expression operand in strict mode may not be eval or arguments. 3295 CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); 3296 } 3297 MarkAsLValue(expression); 3298 3299 int position = scanner().location().beg_pos; 3300 return factory()->NewCountOperation(op, 3301 true /* prefix */, 3302 expression, 3303 position); 3304 3305 } else { 3306 return ParsePostfixExpression(ok); 3307 } 3308 } 3309 3310 3311 Expression* Parser::ParsePostfixExpression(bool* ok) { 3312 // PostfixExpression :: 3313 // LeftHandSideExpression ('++' | '--')? 3314 3315 Expression* expression = ParseLeftHandSideExpression(CHECK_OK); 3316 if (!scanner().HasAnyLineTerminatorBeforeNext() && 3317 Token::IsCountOp(peek())) { 3318 // Signal a reference error if the expression is an invalid 3319 // left-hand side expression. We could report this as a syntax 3320 // error here but for compatibility with JSC we choose to report the 3321 // error at runtime. 3322 if (expression == NULL || !expression->IsValidLeftHandSide()) { 3323 Handle<String> type = 3324 isolate()->factory()->invalid_lhs_in_postfix_op_symbol(); 3325 expression = NewThrowReferenceError(type); 3326 } 3327 3328 if (!top_scope_->is_classic_mode()) { 3329 // Postfix expression operand in strict mode may not be eval or arguments. 3330 CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); 3331 } 3332 MarkAsLValue(expression); 3333 3334 Token::Value next = Next(); 3335 int position = scanner().location().beg_pos; 3336 expression = 3337 factory()->NewCountOperation(next, 3338 false /* postfix */, 3339 expression, 3340 position); 3341 } 3342 return expression; 3343 } 3344 3345 3346 Expression* Parser::ParseLeftHandSideExpression(bool* ok) { 3347 // LeftHandSideExpression :: 3348 // (NewExpression | MemberExpression) ... 3349 3350 Expression* result; 3351 if (peek() == Token::NEW) { 3352 result = ParseNewExpression(CHECK_OK); 3353 } else { 3354 result = ParseMemberExpression(CHECK_OK); 3355 } 3356 3357 while (true) { 3358 switch (peek()) { 3359 case Token::LBRACK: { 3360 Consume(Token::LBRACK); 3361 int pos = scanner().location().beg_pos; 3362 Expression* index = ParseExpression(true, CHECK_OK); 3363 result = factory()->NewProperty(result, index, pos); 3364 Expect(Token::RBRACK, CHECK_OK); 3365 break; 3366 } 3367 3368 case Token::LPAREN: { 3369 int pos; 3370 if (scanner().current_token() == Token::IDENTIFIER) { 3371 // For call of an identifier we want to report position of 3372 // the identifier as position of the call in the stack trace. 3373 pos = scanner().location().beg_pos; 3374 } else { 3375 // For other kinds of calls we record position of the parenthesis as 3376 // position of the call. Note that this is extremely important for 3377 // expressions of the form function(){...}() for which call position 3378 // should not point to the closing brace otherwise it will intersect 3379 // with positions recorded for function literal and confuse debugger. 3380 pos = scanner().peek_location().beg_pos; 3381 } 3382 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); 3383 3384 // Keep track of eval() calls since they disable all local variable 3385 // optimizations. 3386 // The calls that need special treatment are the 3387 // direct eval calls. These calls are all of the form eval(...), with 3388 // no explicit receiver. 3389 // These calls are marked as potentially direct eval calls. Whether 3390 // they are actually direct calls to eval is determined at run time. 3391 VariableProxy* callee = result->AsVariableProxy(); 3392 if (callee != NULL && 3393 callee->IsVariable(isolate()->factory()->eval_symbol())) { 3394 top_scope_->DeclarationScope()->RecordEvalCall(); 3395 } 3396 result = factory()->NewCall(result, args, pos); 3397 break; 3398 } 3399 3400 case Token::PERIOD: { 3401 Consume(Token::PERIOD); 3402 int pos = scanner().location().beg_pos; 3403 Handle<String> name = ParseIdentifierName(CHECK_OK); 3404 result = 3405 factory()->NewProperty(result, factory()->NewLiteral(name), pos); 3406 if (fni_ != NULL) fni_->PushLiteralName(name); 3407 break; 3408 } 3409 3410 default: 3411 return result; 3412 } 3413 } 3414 } 3415 3416 3417 Expression* Parser::ParseNewPrefix(PositionStack* stack, bool* ok) { 3418 // NewExpression :: 3419 // ('new')+ MemberExpression 3420 3421 // The grammar for new expressions is pretty warped. The keyword 3422 // 'new' can either be a part of the new expression (where it isn't 3423 // followed by an argument list) or a part of the member expression, 3424 // where it must be followed by an argument list. To accommodate 3425 // this, we parse the 'new' keywords greedily and keep track of how 3426 // many we have parsed. This information is then passed on to the 3427 // member expression parser, which is only allowed to match argument 3428 // lists as long as it has 'new' prefixes left 3429 Expect(Token::NEW, CHECK_OK); 3430 PositionStack::Element pos(stack, scanner().location().beg_pos); 3431 3432 Expression* result; 3433 if (peek() == Token::NEW) { 3434 result = ParseNewPrefix(stack, CHECK_OK); 3435 } else { 3436 result = ParseMemberWithNewPrefixesExpression(stack, CHECK_OK); 3437 } 3438 3439 if (!stack->is_empty()) { 3440 int last = stack->pop(); 3441 result = factory()->NewCallNew( 3442 result, new(zone()) ZoneList<Expression*>(0), last); 3443 } 3444 return result; 3445 } 3446 3447 3448 Expression* Parser::ParseNewExpression(bool* ok) { 3449 PositionStack stack(ok); 3450 return ParseNewPrefix(&stack, ok); 3451 } 3452 3453 3454 Expression* Parser::ParseMemberExpression(bool* ok) { 3455 return ParseMemberWithNewPrefixesExpression(NULL, ok); 3456 } 3457 3458 3459 Expression* Parser::ParseMemberWithNewPrefixesExpression(PositionStack* stack, 3460 bool* ok) { 3461 // MemberExpression :: 3462 // (PrimaryExpression | FunctionLiteral) 3463 // ('[' Expression ']' | '.' Identifier | Arguments)* 3464 3465 // Parse the initial primary or function expression. 3466 Expression* result = NULL; 3467 if (peek() == Token::FUNCTION) { 3468 Expect(Token::FUNCTION, CHECK_OK); 3469 int function_token_position = scanner().location().beg_pos; 3470 Handle<String> name; 3471 bool is_strict_reserved_name = false; 3472 if (peek_any_identifier()) { 3473 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, 3474 CHECK_OK); 3475 } 3476 FunctionLiteral::Type type = name.is_null() 3477 ? FunctionLiteral::ANONYMOUS_EXPRESSION 3478 : FunctionLiteral::NAMED_EXPRESSION; 3479 result = ParseFunctionLiteral(name, 3480 is_strict_reserved_name, 3481 function_token_position, 3482 type, 3483 CHECK_OK); 3484 } else { 3485 result = ParsePrimaryExpression(CHECK_OK); 3486 } 3487 3488 while (true) { 3489 switch (peek()) { 3490 case Token::LBRACK: { 3491 Consume(Token::LBRACK); 3492 int pos = scanner().location().beg_pos; 3493 Expression* index = ParseExpression(true, CHECK_OK); 3494 result = factory()->NewProperty(result, index, pos); 3495 if (fni_ != NULL) { 3496 if (index->IsPropertyName()) { 3497 fni_->PushLiteralName(index->AsLiteral()->AsPropertyName()); 3498 } else { 3499 fni_->PushLiteralName( 3500 isolate()->factory()->anonymous_function_symbol()); 3501 } 3502 } 3503 Expect(Token::RBRACK, CHECK_OK); 3504 break; 3505 } 3506 case Token::PERIOD: { 3507 Consume(Token::PERIOD); 3508 int pos = scanner().location().beg_pos; 3509 Handle<String> name = ParseIdentifierName(CHECK_OK); 3510 result = 3511 factory()->NewProperty(result, factory()->NewLiteral(name), pos); 3512 if (fni_ != NULL) fni_->PushLiteralName(name); 3513 break; 3514 } 3515 case Token::LPAREN: { 3516 if ((stack == NULL) || stack->is_empty()) return result; 3517 // Consume one of the new prefixes (already parsed). 3518 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); 3519 int last = stack->pop(); 3520 result = factory()->NewCallNew(result, args, last); 3521 break; 3522 } 3523 default: 3524 return result; 3525 } 3526 } 3527 } 3528 3529 3530 DebuggerStatement* Parser::ParseDebuggerStatement(bool* ok) { 3531 // In ECMA-262 'debugger' is defined as a reserved keyword. In some browser 3532 // contexts this is used as a statement which invokes the debugger as i a 3533 // break point is present. 3534 // DebuggerStatement :: 3535 // 'debugger' ';' 3536 3537 Expect(Token::DEBUGGER, CHECK_OK); 3538 ExpectSemicolon(CHECK_OK); 3539 return factory()->NewDebuggerStatement(); 3540 } 3541 3542 3543 void Parser::ReportUnexpectedToken(Token::Value token) { 3544 // We don't report stack overflows here, to avoid increasing the 3545 // stack depth even further. Instead we report it after parsing is 3546 // over, in ParseProgram/ParseJson. 3547 if (token == Token::ILLEGAL && stack_overflow_) return; 3548 // Four of the tokens are treated specially 3549 switch (token) { 3550 case Token::EOS: 3551 return ReportMessage("unexpected_eos", Vector<const char*>::empty()); 3552 case Token::NUMBER: 3553 return ReportMessage("unexpected_token_number", 3554 Vector<const char*>::empty()); 3555 case Token::STRING: 3556 return ReportMessage("unexpected_token_string", 3557 Vector<const char*>::empty()); 3558 case Token::IDENTIFIER: 3559 return ReportMessage("unexpected_token_identifier", 3560 Vector<const char*>::empty()); 3561 case Token::FUTURE_RESERVED_WORD: 3562 return ReportMessage("unexpected_reserved", 3563 Vector<const char*>::empty()); 3564 case Token::FUTURE_STRICT_RESERVED_WORD: 3565 return ReportMessage(top_scope_->is_classic_mode() ? 3566 "unexpected_token_identifier" : 3567 "unexpected_strict_reserved", 3568 Vector<const char*>::empty()); 3569 default: 3570 const char* name = Token::String(token); 3571 ASSERT(name != NULL); 3572 ReportMessage("unexpected_token", Vector<const char*>(&name, 1)); 3573 } 3574 } 3575 3576 3577 void Parser::ReportInvalidPreparseData(Handle<String> name, bool* ok) { 3578 SmartArrayPointer<char> name_string = name->ToCString(DISALLOW_NULLS); 3579 const char* element[1] = { *name_string }; 3580 ReportMessage("invalid_preparser_data", 3581 Vector<const char*>(element, 1)); 3582 *ok = false; 3583 } 3584 3585 3586 Expression* Parser::ParsePrimaryExpression(bool* ok) { 3587 // PrimaryExpression :: 3588 // 'this' 3589 // 'null' 3590 // 'true' 3591 // 'false' 3592 // Identifier 3593 // Number 3594 // String 3595 // ArrayLiteral 3596 // ObjectLiteral 3597 // RegExpLiteral 3598 // '(' Expression ')' 3599 3600 Expression* result = NULL; 3601 switch (peek()) { 3602 case Token::THIS: { 3603 Consume(Token::THIS); 3604 result = factory()->NewVariableProxy(top_scope_->receiver()); 3605 break; 3606 } 3607 3608 case Token::NULL_LITERAL: 3609 Consume(Token::NULL_LITERAL); 3610 result = factory()->NewLiteral(isolate()->factory()->null_value()); 3611 break; 3612 3613 case Token::TRUE_LITERAL: 3614 Consume(Token::TRUE_LITERAL); 3615 result = factory()->NewLiteral(isolate()->factory()->true_value()); 3616 break; 3617 3618 case Token::FALSE_LITERAL: 3619 Consume(Token::FALSE_LITERAL); 3620 result = factory()->NewLiteral(isolate()->factory()->false_value()); 3621 break; 3622 3623 case Token::IDENTIFIER: 3624 case Token::FUTURE_STRICT_RESERVED_WORD: { 3625 Handle<String> name = ParseIdentifier(CHECK_OK); 3626 if (fni_ != NULL) fni_->PushVariableName(name); 3627 // The name may refer to a module instance object, so its type is unknown. 3628 #ifdef DEBUG 3629 if (FLAG_print_interface_details) 3630 PrintF("# Variable %s ", name->ToAsciiArray()); 3631 #endif 3632 Interface* interface = Interface::NewUnknown(); 3633 result = top_scope_->NewUnresolved( 3634 factory(), name, scanner().location().beg_pos, interface); 3635 break; 3636 } 3637 3638 case Token::NUMBER: { 3639 Consume(Token::NUMBER); 3640 ASSERT(scanner().is_literal_ascii()); 3641 double value = StringToDouble(isolate()->unicode_cache(), 3642 scanner().literal_ascii_string(), 3643 ALLOW_HEX | ALLOW_OCTALS); 3644 result = factory()->NewNumberLiteral(value); 3645 break; 3646 } 3647 3648 case Token::STRING: { 3649 Consume(Token::STRING); 3650 Handle<String> symbol = GetSymbol(CHECK_OK); 3651 result = factory()->NewLiteral(symbol); 3652 if (fni_ != NULL) fni_->PushLiteralName(symbol); 3653 break; 3654 } 3655 3656 case Token::ASSIGN_DIV: 3657 result = ParseRegExpLiteral(true, CHECK_OK); 3658 break; 3659 3660 case Token::DIV: 3661 result = ParseRegExpLiteral(false, CHECK_OK); 3662 break; 3663 3664 case Token::LBRACK: 3665 result = ParseArrayLiteral(CHECK_OK); 3666 break; 3667 3668 case Token::LBRACE: 3669 result = ParseObjectLiteral(CHECK_OK); 3670 break; 3671 3672 case Token::LPAREN: 3673 Consume(Token::LPAREN); 3674 // Heuristically try to detect immediately called functions before 3675 // seeing the call parentheses. 3676 parenthesized_function_ = (peek() == Token::FUNCTION); 3677 result = ParseExpression(true, CHECK_OK); 3678 Expect(Token::RPAREN, CHECK_OK); 3679 break; 3680 3681 case Token::MOD: 3682 if (allow_natives_syntax_ || extension_ != NULL) { 3683 result = ParseV8Intrinsic(CHECK_OK); 3684 break; 3685 } 3686 // If we're not allowing special syntax we fall-through to the 3687 // default case. 3688 3689 default: { 3690 Token::Value tok = Next(); 3691 ReportUnexpectedToken(tok); 3692 *ok = false; 3693 return NULL; 3694 } 3695 } 3696 3697 return result; 3698 } 3699 3700 3701 void Parser::BuildArrayLiteralBoilerplateLiterals(ZoneList<Expression*>* values, 3702 Handle<FixedArray> literals, 3703 bool* is_simple, 3704 int* depth) { 3705 // Fill in the literals. 3706 // Accumulate output values in local variables. 3707 bool is_simple_acc = true; 3708 int depth_acc = 1; 3709 for (int i = 0; i < values->length(); i++) { 3710 MaterializedLiteral* m_literal = values->at(i)->AsMaterializedLiteral(); 3711 if (m_literal != NULL && m_literal->depth() >= depth_acc) { 3712 depth_acc = m_literal->depth() + 1; 3713 } 3714 Handle<Object> boilerplate_value = GetBoilerplateValue(values->at(i)); 3715 if (boilerplate_value->IsUndefined()) { 3716 literals->set_the_hole(i); 3717 is_simple_acc = false; 3718 } else { 3719 literals->set(i, *boilerplate_value); 3720 } 3721 } 3722 3723 *is_simple = is_simple_acc; 3724 *depth = depth_acc; 3725 } 3726 3727 3728 Expression* Parser::ParseArrayLiteral(bool* ok) { 3729 // ArrayLiteral :: 3730 // '[' Expression? (',' Expression?)* ']' 3731 3732 ZoneList<Expression*>* values = new(zone()) ZoneList<Expression*>(4); 3733 Expect(Token::LBRACK, CHECK_OK); 3734 while (peek() != Token::RBRACK) { 3735 Expression* elem; 3736 if (peek() == Token::COMMA) { 3737 elem = GetLiteralTheHole(); 3738 } else { 3739 elem = ParseAssignmentExpression(true, CHECK_OK); 3740 } 3741 values->Add(elem); 3742 if (peek() != Token::RBRACK) { 3743 Expect(Token::COMMA, CHECK_OK); 3744 } 3745 } 3746 Expect(Token::RBRACK, CHECK_OK); 3747 3748 // Update the scope information before the pre-parsing bailout. 3749 int literal_index = current_function_state_->NextMaterializedLiteralIndex(); 3750 3751 // Allocate a fixed array to hold all the object literals. 3752 Handle<FixedArray> object_literals = 3753 isolate()->factory()->NewFixedArray(values->length(), TENURED); 3754 Handle<FixedDoubleArray> double_literals; 3755 ElementsKind elements_kind = FAST_SMI_ONLY_ELEMENTS; 3756 bool has_only_undefined_values = true; 3757 3758 // Fill in the literals. 3759 bool is_simple = true; 3760 int depth = 1; 3761 for (int i = 0, n = values->length(); i < n; i++) { 3762 MaterializedLiteral* m_literal = values->at(i)->AsMaterializedLiteral(); 3763 if (m_literal != NULL && m_literal->depth() + 1 > depth) { 3764 depth = m_literal->depth() + 1; 3765 } 3766 Handle<Object> boilerplate_value = GetBoilerplateValue(values->at(i)); 3767 if (boilerplate_value->IsUndefined()) { 3768 object_literals->set_the_hole(i); 3769 if (elements_kind == FAST_DOUBLE_ELEMENTS) { 3770 double_literals->set_the_hole(i); 3771 } 3772 is_simple = false; 3773 } else { 3774 // Examine each literal element, and adjust the ElementsKind if the 3775 // literal element is not of a type that can be stored in the current 3776 // ElementsKind. Start with FAST_SMI_ONLY_ELEMENTS, and transition to 3777 // FAST_DOUBLE_ELEMENTS and FAST_ELEMENTS as necessary. Always remember 3778 // the tagged value, no matter what the ElementsKind is in case we 3779 // ultimately end up in FAST_ELEMENTS. 3780 has_only_undefined_values = false; 3781 object_literals->set(i, *boilerplate_value); 3782 if (elements_kind == FAST_SMI_ONLY_ELEMENTS) { 3783 // Smi only elements. Notice if a transition to FAST_DOUBLE_ELEMENTS or 3784 // FAST_ELEMENTS is required. 3785 if (!boilerplate_value->IsSmi()) { 3786 if (boilerplate_value->IsNumber() && FLAG_smi_only_arrays) { 3787 // Allocate a double array on the FAST_DOUBLE_ELEMENTS transition to 3788 // avoid over-allocating in TENURED space. 3789 double_literals = isolate()->factory()->NewFixedDoubleArray( 3790 values->length(), TENURED); 3791 // Copy the contents of the FAST_SMI_ONLY_ELEMENT array to the 3792 // FAST_DOUBLE_ELEMENTS array so that they are in sync. 3793 for (int j = 0; j < i; ++j) { 3794 Object* smi_value = object_literals->get(j); 3795 if (smi_value->IsTheHole()) { 3796 double_literals->set_the_hole(j); 3797 } else { 3798 double_literals->set(j, Smi::cast(smi_value)->value()); 3799 } 3800 } 3801 double_literals->set(i, boilerplate_value->Number()); 3802 elements_kind = FAST_DOUBLE_ELEMENTS; 3803 } else { 3804 elements_kind = FAST_ELEMENTS; 3805 } 3806 } 3807 } else if (elements_kind == FAST_DOUBLE_ELEMENTS) { 3808 // Continue to store double values in to FAST_DOUBLE_ELEMENTS arrays 3809 // until the first value is seen that can't be stored as a double. 3810 if (boilerplate_value->IsNumber()) { 3811 double_literals->set(i, boilerplate_value->Number()); 3812 } else { 3813 elements_kind = FAST_ELEMENTS; 3814 } 3815 } 3816 } 3817 } 3818 3819 // Very small array literals that don't have a concrete hint about their type 3820 // from a constant value should default to the slow case to avoid lots of 3821 // elements transitions on really small objects. 3822 if (has_only_undefined_values && values->length() <= 2) { 3823 elements_kind = FAST_ELEMENTS; 3824 } 3825 3826 // Simple and shallow arrays can be lazily copied, we transform the 3827 // elements array to a copy-on-write array. 3828 if (is_simple && depth == 1 && values->length() > 0 && 3829 elements_kind != FAST_DOUBLE_ELEMENTS) { 3830 object_literals->set_map(isolate()->heap()->fixed_cow_array_map()); 3831 } 3832 3833 Handle<FixedArrayBase> element_values = elements_kind == FAST_DOUBLE_ELEMENTS 3834 ? Handle<FixedArrayBase>(double_literals) 3835 : Handle<FixedArrayBase>(object_literals); 3836 3837 // Remember both the literal's constant values as well as the ElementsKind 3838 // in a 2-element FixedArray. 3839 Handle<FixedArray> literals = 3840 isolate()->factory()->NewFixedArray(2, TENURED); 3841 3842 literals->set(0, Smi::FromInt(elements_kind)); 3843 literals->set(1, *element_values); 3844 3845 return factory()->NewArrayLiteral( 3846 literals, values, literal_index, is_simple, depth); 3847 } 3848 3849 3850 bool Parser::IsBoilerplateProperty(ObjectLiteral::Property* property) { 3851 return property != NULL && 3852 property->kind() != ObjectLiteral::Property::PROTOTYPE; 3853 } 3854 3855 3856 bool CompileTimeValue::IsCompileTimeValue(Expression* expression) { 3857 if (expression->AsLiteral() != NULL) return true; 3858 MaterializedLiteral* lit = expression->AsMaterializedLiteral(); 3859 return lit != NULL && lit->is_simple(); 3860 } 3861 3862 3863 bool CompileTimeValue::ArrayLiteralElementNeedsInitialization( 3864 Expression* value) { 3865 // If value is a literal the property value is already set in the 3866 // boilerplate object. 3867 if (value->AsLiteral() != NULL) return false; 3868 // If value is a materialized literal the property value is already set 3869 // in the boilerplate object if it is simple. 3870 if (CompileTimeValue::IsCompileTimeValue(value)) return false; 3871 return true; 3872 } 3873 3874 3875 Handle<FixedArray> CompileTimeValue::GetValue(Expression* expression) { 3876 ASSERT(IsCompileTimeValue(expression)); 3877 Handle<FixedArray> result = FACTORY->NewFixedArray(2, TENURED); 3878 ObjectLiteral* object_literal = expression->AsObjectLiteral(); 3879 if (object_literal != NULL) { 3880 ASSERT(object_literal->is_simple()); 3881 if (object_literal->fast_elements()) { 3882 result->set(kTypeSlot, Smi::FromInt(OBJECT_LITERAL_FAST_ELEMENTS)); 3883 } else { 3884 result->set(kTypeSlot, Smi::FromInt(OBJECT_LITERAL_SLOW_ELEMENTS)); 3885 } 3886 result->set(kElementsSlot, *object_literal->constant_properties()); 3887 } else { 3888 ArrayLiteral* array_literal = expression->AsArrayLiteral(); 3889 ASSERT(array_literal != NULL && array_literal->is_simple()); 3890 result->set(kTypeSlot, Smi::FromInt(ARRAY_LITERAL)); 3891 result->set(kElementsSlot, *array_literal->constant_elements()); 3892 } 3893 return result; 3894 } 3895 3896 3897 CompileTimeValue::Type CompileTimeValue::GetType(Handle<FixedArray> value) { 3898 Smi* type_value = Smi::cast(value->get(kTypeSlot)); 3899 return static_cast<Type>(type_value->value()); 3900 } 3901 3902 3903 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { 3904 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); 3905 } 3906 3907 3908 Handle<Object> Parser::GetBoilerplateValue(Expression* expression) { 3909 if (expression->AsLiteral() != NULL) { 3910 return expression->AsLiteral()->handle(); 3911 } 3912 if (CompileTimeValue::IsCompileTimeValue(expression)) { 3913 return CompileTimeValue::GetValue(expression); 3914 } 3915 return isolate()->factory()->undefined_value(); 3916 } 3917 3918 // Validation per 11.1.5 Object Initialiser 3919 class ObjectLiteralPropertyChecker { 3920 public: 3921 ObjectLiteralPropertyChecker(Parser* parser, LanguageMode language_mode) : 3922 props_(Literal::Match), 3923 parser_(parser), 3924 language_mode_(language_mode) { 3925 } 3926 3927 void CheckProperty( 3928 ObjectLiteral::Property* property, 3929 Scanner::Location loc, 3930 bool* ok); 3931 3932 private: 3933 enum PropertyKind { 3934 kGetAccessor = 0x01, 3935 kSetAccessor = 0x02, 3936 kAccessor = kGetAccessor | kSetAccessor, 3937 kData = 0x04 3938 }; 3939 3940 static intptr_t GetPropertyKind(ObjectLiteral::Property* property) { 3941 switch (property->kind()) { 3942 case ObjectLiteral::Property::GETTER: 3943 return kGetAccessor; 3944 case ObjectLiteral::Property::SETTER: 3945 return kSetAccessor; 3946 default: 3947 return kData; 3948 } 3949 } 3950 3951 HashMap props_; 3952 Parser* parser_; 3953 LanguageMode language_mode_; 3954 }; 3955 3956 3957 void ObjectLiteralPropertyChecker::CheckProperty( 3958 ObjectLiteral::Property* property, 3959 Scanner::Location loc, 3960 bool* ok) { 3961 ASSERT(property != NULL); 3962 Literal* literal = property->key(); 3963 HashMap::Entry* entry = props_.Lookup(literal, literal->Hash(), true); 3964 intptr_t prev = reinterpret_cast<intptr_t> (entry->value); 3965 intptr_t curr = GetPropertyKind(property); 3966 3967 // Duplicate data properties are illegal in strict or extended mode. 3968 if (language_mode_ != CLASSIC_MODE && (curr & prev & kData) != 0) { 3969 parser_->ReportMessageAt(loc, "strict_duplicate_property", 3970 Vector<const char*>::empty()); 3971 *ok = false; 3972 return; 3973 } 3974 // Data property conflicting with an accessor. 3975 if (((curr & kData) && (prev & kAccessor)) || 3976 ((prev & kData) && (curr & kAccessor))) { 3977 parser_->ReportMessageAt(loc, "accessor_data_property", 3978 Vector<const char*>::empty()); 3979 *ok = false; 3980 return; 3981 } 3982 // Two accessors of the same type conflicting 3983 if ((curr & prev & kAccessor) != 0) { 3984 parser_->ReportMessageAt(loc, "accessor_get_set", 3985 Vector<const char*>::empty()); 3986 *ok = false; 3987 return; 3988 } 3989 3990 // Update map 3991 entry->value = reinterpret_cast<void*> (prev | curr); 3992 *ok = true; 3993 } 3994 3995 3996 void Parser::BuildObjectLiteralConstantProperties( 3997 ZoneList<ObjectLiteral::Property*>* properties, 3998 Handle<FixedArray> constant_properties, 3999 bool* is_simple, 4000 bool* fast_elements, 4001 int* depth) { 4002 int position = 0; 4003 // Accumulate the value in local variables and store it at the end. 4004 bool is_simple_acc = true; 4005 int depth_acc = 1; 4006 uint32_t max_element_index = 0; 4007 uint32_t elements = 0; 4008 for (int i = 0; i < properties->length(); i++) { 4009 ObjectLiteral::Property* property = properties->at(i); 4010 if (!IsBoilerplateProperty(property)) { 4011 is_simple_acc = false; 4012 continue; 4013 } 4014 MaterializedLiteral* m_literal = property->value()->AsMaterializedLiteral(); 4015 if (m_literal != NULL && m_literal->depth() >= depth_acc) { 4016 depth_acc = m_literal->depth() + 1; 4017 } 4018 4019 // Add CONSTANT and COMPUTED properties to boilerplate. Use undefined 4020 // value for COMPUTED properties, the real value is filled in at 4021 // runtime. The enumeration order is maintained. 4022 Handle<Object> key = property->key()->handle(); 4023 Handle<Object> value = GetBoilerplateValue(property->value()); 4024 is_simple_acc = is_simple_acc && !value->IsUndefined(); 4025 4026 // Keep track of the number of elements in the object literal and 4027 // the largest element index. If the largest element index is 4028 // much larger than the number of elements, creating an object 4029 // literal with fast elements will be a waste of space. 4030 uint32_t element_index = 0; 4031 if (key->IsString() 4032 && Handle<String>::cast(key)->AsArrayIndex(&element_index) 4033 && element_index > max_element_index) { 4034 max_element_index = element_index; 4035 elements++; 4036 } else if (key->IsSmi()) { 4037 int key_value = Smi::cast(*key)->value(); 4038 if (key_value > 0 4039 && static_cast<uint32_t>(key_value) > max_element_index) { 4040 max_element_index = key_value; 4041 } 4042 elements++; 4043 } 4044 4045 // Add name, value pair to the fixed array. 4046 constant_properties->set(position++, *key); 4047 constant_properties->set(position++, *value); 4048 } 4049 *fast_elements = 4050 (max_element_index <= 32) || ((2 * elements) >= max_element_index); 4051 *is_simple = is_simple_acc; 4052 *depth = depth_acc; 4053 } 4054 4055 4056 ObjectLiteral::Property* Parser::ParseObjectLiteralGetSet(bool is_getter, 4057 bool* ok) { 4058 // Special handling of getter and setter syntax: 4059 // { ... , get foo() { ... }, ... , set foo(v) { ... v ... } , ... } 4060 // We have already read the "get" or "set" keyword. 4061 Token::Value next = Next(); 4062 bool is_keyword = Token::IsKeyword(next); 4063 if (next == Token::IDENTIFIER || next == Token::NUMBER || 4064 next == Token::FUTURE_RESERVED_WORD || 4065 next == Token::FUTURE_STRICT_RESERVED_WORD || 4066 next == Token::STRING || is_keyword) { 4067 Handle<String> name; 4068 if (is_keyword) { 4069 name = isolate_->factory()->LookupAsciiSymbol(Token::String(next)); 4070 } else { 4071 name = GetSymbol(CHECK_OK); 4072 } 4073 FunctionLiteral* value = 4074 ParseFunctionLiteral(name, 4075 false, // reserved words are allowed here 4076 RelocInfo::kNoPosition, 4077 FunctionLiteral::ANONYMOUS_EXPRESSION, 4078 CHECK_OK); 4079 // Allow any number of parameters for compatibilty with JSC. 4080 // Specification only allows zero parameters for get and one for set. 4081 return factory()->NewObjectLiteralProperty(is_getter, value); 4082 } else { 4083 ReportUnexpectedToken(next); 4084 *ok = false; 4085 return NULL; 4086 } 4087 } 4088 4089 4090 Expression* Parser::ParseObjectLiteral(bool* ok) { 4091 // ObjectLiteral :: 4092 // '{' ( 4093 // ((IdentifierName | String | Number) ':' AssignmentExpression) 4094 // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral) 4095 // )*[','] '}' 4096 4097 ZoneList<ObjectLiteral::Property*>* properties = 4098 new(zone()) ZoneList<ObjectLiteral::Property*>(4); 4099 int number_of_boilerplate_properties = 0; 4100 bool has_function = false; 4101 4102 ObjectLiteralPropertyChecker checker(this, top_scope_->language_mode()); 4103 4104 Expect(Token::LBRACE, CHECK_OK); 4105 4106 while (peek() != Token::RBRACE) { 4107 if (fni_ != NULL) fni_->Enter(); 4108 4109 Literal* key = NULL; 4110 Token::Value next = peek(); 4111 4112 // Location of the property name token 4113 Scanner::Location loc = scanner().peek_location(); 4114 4115 switch (next) { 4116 case Token::FUTURE_RESERVED_WORD: 4117 case Token::FUTURE_STRICT_RESERVED_WORD: 4118 case Token::IDENTIFIER: { 4119 bool is_getter = false; 4120 bool is_setter = false; 4121 Handle<String> id = 4122 ParseIdentifierNameOrGetOrSet(&is_getter, &is_setter, CHECK_OK); 4123 if (fni_ != NULL) fni_->PushLiteralName(id); 4124 4125 if ((is_getter || is_setter) && peek() != Token::COLON) { 4126 // Update loc to point to the identifier 4127 loc = scanner().peek_location(); 4128 ObjectLiteral::Property* property = 4129 ParseObjectLiteralGetSet(is_getter, CHECK_OK); 4130 if (IsBoilerplateProperty(property)) { 4131 number_of_boilerplate_properties++; 4132 } 4133 // Validate the property. 4134 checker.CheckProperty(property, loc, CHECK_OK); 4135 properties->Add(property); 4136 if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK); 4137 4138 if (fni_ != NULL) { 4139 fni_->Infer(); 4140 fni_->Leave(); 4141 } 4142 continue; // restart the while 4143 } 4144 // Failed to parse as get/set property, so it's just a property 4145 // called "get" or "set". 4146 key = factory()->NewLiteral(id); 4147 break; 4148 } 4149 case Token::STRING: { 4150 Consume(Token::STRING); 4151 Handle<String> string = GetSymbol(CHECK_OK); 4152 if (fni_ != NULL) fni_->PushLiteralName(string); 4153 uint32_t index; 4154 if (!string.is_null() && string->AsArrayIndex(&index)) { 4155 key = factory()->NewNumberLiteral(index); 4156 break; 4157 } 4158 key = factory()->NewLiteral(string); 4159 break; 4160 } 4161 case Token::NUMBER: { 4162 Consume(Token::NUMBER); 4163 ASSERT(scanner().is_literal_ascii()); 4164 double value = StringToDouble(isolate()->unicode_cache(), 4165 scanner().literal_ascii_string(), 4166 ALLOW_HEX | ALLOW_OCTALS); 4167 key = factory()->NewNumberLiteral(value); 4168 break; 4169 } 4170 default: 4171 if (Token::IsKeyword(next)) { 4172 Consume(next); 4173 Handle<String> string = GetSymbol(CHECK_OK); 4174 key = factory()->NewLiteral(string); 4175 } else { 4176 // Unexpected token. 4177 Token::Value next = Next(); 4178 ReportUnexpectedToken(next); 4179 *ok = false; 4180 return NULL; 4181 } 4182 } 4183 4184 Expect(Token::COLON, CHECK_OK); 4185 Expression* value = ParseAssignmentExpression(true, CHECK_OK); 4186 4187 ObjectLiteral::Property* property = 4188 new(zone()) ObjectLiteral::Property(key, value, isolate()); 4189 4190 // Mark top-level object literals that contain function literals and 4191 // pretenure the literal so it can be added as a constant function 4192 // property. 4193 if (top_scope_->DeclarationScope()->is_global_scope() && 4194 value->AsFunctionLiteral() != NULL) { 4195 has_function = true; 4196 value->AsFunctionLiteral()->set_pretenure(); 4197 } 4198 4199 // Count CONSTANT or COMPUTED properties to maintain the enumeration order. 4200 if (IsBoilerplateProperty(property)) number_of_boilerplate_properties++; 4201 // Validate the property 4202 checker.CheckProperty(property, loc, CHECK_OK); 4203 properties->Add(property); 4204 4205 // TODO(1240767): Consider allowing trailing comma. 4206 if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK); 4207 4208 if (fni_ != NULL) { 4209 fni_->Infer(); 4210 fni_->Leave(); 4211 } 4212 } 4213 Expect(Token::RBRACE, CHECK_OK); 4214 4215 // Computation of literal_index must happen before pre parse bailout. 4216 int literal_index = current_function_state_->NextMaterializedLiteralIndex(); 4217 4218 Handle<FixedArray> constant_properties = isolate()->factory()->NewFixedArray( 4219 number_of_boilerplate_properties * 2, TENURED); 4220 4221 bool is_simple = true; 4222 bool fast_elements = true; 4223 int depth = 1; 4224 BuildObjectLiteralConstantProperties(properties, 4225 constant_properties, 4226 &is_simple, 4227 &fast_elements, 4228 &depth); 4229 return factory()->NewObjectLiteral(constant_properties, 4230 properties, 4231 literal_index, 4232 is_simple, 4233 fast_elements, 4234 depth, 4235 has_function); 4236 } 4237 4238 4239 Expression* Parser::ParseRegExpLiteral(bool seen_equal, bool* ok) { 4240 if (!scanner().ScanRegExpPattern(seen_equal)) { 4241 Next(); 4242 ReportMessage("unterminated_regexp", Vector<const char*>::empty()); 4243 *ok = false; 4244 return NULL; 4245 } 4246 4247 int literal_index = current_function_state_->NextMaterializedLiteralIndex(); 4248 4249 Handle<String> js_pattern = NextLiteralString(TENURED); 4250 scanner().ScanRegExpFlags(); 4251 Handle<String> js_flags = NextLiteralString(TENURED); 4252 Next(); 4253 4254 return factory()->NewRegExpLiteral(js_pattern, js_flags, literal_index); 4255 } 4256 4257 4258 ZoneList<Expression*>* Parser::ParseArguments(bool* ok) { 4259 // Arguments :: 4260 // '(' (AssignmentExpression)*[','] ')' 4261 4262 ZoneList<Expression*>* result = new(zone()) ZoneList<Expression*>(4); 4263 Expect(Token::LPAREN, CHECK_OK); 4264 bool done = (peek() == Token::RPAREN); 4265 while (!done) { 4266 Expression* argument = ParseAssignmentExpression(true, CHECK_OK); 4267 result->Add(argument); 4268 if (result->length() > kMaxNumFunctionParameters) { 4269 ReportMessageAt(scanner().location(), "too_many_arguments", 4270 Vector<const char*>::empty()); 4271 *ok = false; 4272 return NULL; 4273 } 4274 done = (peek() == Token::RPAREN); 4275 if (!done) Expect(Token::COMMA, CHECK_OK); 4276 } 4277 Expect(Token::RPAREN, CHECK_OK); 4278 return result; 4279 } 4280 4281 4282 class SingletonLogger : public ParserRecorder { 4283 public: 4284 SingletonLogger() : has_error_(false), start_(-1), end_(-1) { } 4285 virtual ~SingletonLogger() { } 4286 4287 void Reset() { has_error_ = false; } 4288 4289 virtual void LogFunction(int start, 4290 int end, 4291 int literals, 4292 int properties, 4293 LanguageMode mode) { 4294 ASSERT(!has_error_); 4295 start_ = start; 4296 end_ = end; 4297 literals_ = literals; 4298 properties_ = properties; 4299 mode_ = mode; 4300 }; 4301 4302 // Logs a symbol creation of a literal or identifier. 4303 virtual void LogAsciiSymbol(int start, Vector<const char> literal) { } 4304 virtual void LogUtf16Symbol(int start, Vector<const uc16> literal) { } 4305 4306 // Logs an error message and marks the log as containing an error. 4307 // Further logging will be ignored, and ExtractData will return a vector 4308 // representing the error only. 4309 virtual void LogMessage(int start, 4310 int end, 4311 const char* message, 4312 const char* argument_opt) { 4313 has_error_ = true; 4314 start_ = start; 4315 end_ = end; 4316 message_ = message; 4317 argument_opt_ = argument_opt; 4318 } 4319 4320 virtual int function_position() { return 0; } 4321 4322 virtual int symbol_position() { return 0; } 4323 4324 virtual int symbol_ids() { return -1; } 4325 4326 virtual Vector<unsigned> ExtractData() { 4327 UNREACHABLE(); 4328 return Vector<unsigned>(); 4329 } 4330 4331 virtual void PauseRecording() { } 4332 4333 virtual void ResumeRecording() { } 4334 4335 bool has_error() { return has_error_; } 4336 4337 int start() { return start_; } 4338 int end() { return end_; } 4339 int literals() { 4340 ASSERT(!has_error_); 4341 return literals_; 4342 } 4343 int properties() { 4344 ASSERT(!has_error_); 4345 return properties_; 4346 } 4347 LanguageMode language_mode() { 4348 ASSERT(!has_error_); 4349 return mode_; 4350 } 4351 const char* message() { 4352 ASSERT(has_error_); 4353 return message_; 4354 } 4355 const char* argument_opt() { 4356 ASSERT(has_error_); 4357 return argument_opt_; 4358 } 4359 4360 private: 4361 bool has_error_; 4362 int start_; 4363 int end_; 4364 // For function entries. 4365 int literals_; 4366 int properties_; 4367 LanguageMode mode_; 4368 // For error messages. 4369 const char* message_; 4370 const char* argument_opt_; 4371 }; 4372 4373 4374 FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name, 4375 bool name_is_strict_reserved, 4376 int function_token_position, 4377 FunctionLiteral::Type type, 4378 bool* ok) { 4379 // Function :: 4380 // '(' FormalParameterList? ')' '{' FunctionBody '}' 4381 4382 // Anonymous functions were passed either the empty symbol or a null 4383 // handle as the function name. Remember if we were passed a non-empty 4384 // handle to decide whether to invoke function name inference. 4385 bool should_infer_name = function_name.is_null(); 4386 4387 // We want a non-null handle as the function name. 4388 if (should_infer_name) { 4389 function_name = isolate()->factory()->empty_symbol(); 4390 } 4391 4392 int num_parameters = 0; 4393 // Function declarations are function scoped in normal mode, so they are 4394 // hoisted. In harmony block scoping mode they are block scoped, so they 4395 // are not hoisted. 4396 Scope* scope = (type == FunctionLiteral::DECLARATION && !is_extended_mode()) 4397 ? NewScope(top_scope_->DeclarationScope(), FUNCTION_SCOPE) 4398 : NewScope(top_scope_, FUNCTION_SCOPE); 4399 ZoneList<Statement*>* body = NULL; 4400 int materialized_literal_count = -1; 4401 int expected_property_count = -1; 4402 int handler_count = 0; 4403 bool only_simple_this_property_assignments; 4404 Handle<FixedArray> this_property_assignments; 4405 FunctionLiteral::ParameterFlag duplicate_parameters = 4406 FunctionLiteral::kNoDuplicateParameters; 4407 AstProperties ast_properties; 4408 // Parse function body. 4409 { FunctionState function_state(this, scope, isolate()); 4410 top_scope_->SetScopeName(function_name); 4411 4412 // FormalParameterList :: 4413 // '(' (Identifier)*[','] ')' 4414 Expect(Token::LPAREN, CHECK_OK); 4415 scope->set_start_position(scanner().location().beg_pos); 4416 Scanner::Location name_loc = Scanner::Location::invalid(); 4417 Scanner::Location dupe_loc = Scanner::Location::invalid(); 4418 Scanner::Location reserved_loc = Scanner::Location::invalid(); 4419 4420 bool done = (peek() == Token::RPAREN); 4421 while (!done) { 4422 bool is_strict_reserved = false; 4423 Handle<String> param_name = 4424 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, 4425 CHECK_OK); 4426 4427 // Store locations for possible future error reports. 4428 if (!name_loc.IsValid() && IsEvalOrArguments(param_name)) { 4429 name_loc = scanner().location(); 4430 } 4431 if (!dupe_loc.IsValid() && top_scope_->IsDeclared(param_name)) { 4432 duplicate_parameters = FunctionLiteral::kHasDuplicateParameters; 4433 dupe_loc = scanner().location(); 4434 } 4435 if (!reserved_loc.IsValid() && is_strict_reserved) { 4436 reserved_loc = scanner().location(); 4437 } 4438 4439 top_scope_->DeclareParameter(param_name, VAR); 4440 num_parameters++; 4441 if (num_parameters > kMaxNumFunctionParameters) { 4442 ReportMessageAt(scanner().location(), "too_many_parameters", 4443 Vector<const char*>::empty()); 4444 *ok = false; 4445 return NULL; 4446 } 4447 done = (peek() == Token::RPAREN); 4448 if (!done) Expect(Token::COMMA, CHECK_OK); 4449 } 4450 Expect(Token::RPAREN, CHECK_OK); 4451 4452 Expect(Token::LBRACE, CHECK_OK); 4453 4454 // If we have a named function expression, we add a local variable 4455 // declaration to the body of the function with the name of the 4456 // function and let it refer to the function itself (closure). 4457 // NOTE: We create a proxy and resolve it here so that in the 4458 // future we can change the AST to only refer to VariableProxies 4459 // instead of Variables and Proxis as is the case now. 4460 Variable* fvar = NULL; 4461 Token::Value fvar_init_op = Token::INIT_CONST; 4462 if (type == FunctionLiteral::NAMED_EXPRESSION) { 4463 VariableMode fvar_mode; 4464 if (is_extended_mode()) { 4465 fvar_mode = CONST_HARMONY; 4466 fvar_init_op = Token::INIT_CONST_HARMONY; 4467 } else { 4468 fvar_mode = CONST; 4469 } 4470 fvar = 4471 top_scope_->DeclareFunctionVar(function_name, fvar_mode, factory()); 4472 } 4473 4474 // Determine whether the function will be lazily compiled. 4475 // The heuristics are: 4476 // - It must not have been prohibited by the caller to Parse (some callers 4477 // need a full AST). 4478 // - The outer scope must be trivial (only global variables in scope). 4479 // - The function mustn't be a function expression with an open parenthesis 4480 // before; we consider that a hint that the function will be called 4481 // immediately, and it would be a waste of time to make it lazily 4482 // compiled. 4483 // These are all things we can know at this point, without looking at the 4484 // function itself. 4485 bool is_lazily_compiled = (mode() == PARSE_LAZILY && 4486 top_scope_->outer_scope()->is_global_scope() && 4487 top_scope_->HasTrivialOuterContext() && 4488 !parenthesized_function_); 4489 parenthesized_function_ = false; // The bit was set for this function only. 4490 4491 if (is_lazily_compiled) { 4492 int function_block_pos = scanner().location().beg_pos; 4493 FunctionEntry entry; 4494 if (pre_data_ != NULL) { 4495 // If we have pre_data_, we use it to skip parsing the function body. 4496 // the preparser data contains the information we need to construct the 4497 // lazy function. 4498 entry = pre_data()->GetFunctionEntry(function_block_pos); 4499 if (entry.is_valid()) { 4500 if (entry.end_pos() <= function_block_pos) { 4501 // End position greater than end of stream is safe, and hard 4502 // to check. 4503 ReportInvalidPreparseData(function_name, CHECK_OK); 4504 } 4505 scanner().SeekForward(entry.end_pos() - 1); 4506 4507 scope->set_end_position(entry.end_pos()); 4508 Expect(Token::RBRACE, CHECK_OK); 4509 isolate()->counters()->total_preparse_skipped()->Increment( 4510 scope->end_position() - function_block_pos); 4511 materialized_literal_count = entry.literal_count(); 4512 expected_property_count = entry.property_count(); 4513 top_scope_->SetLanguageMode(entry.language_mode()); 4514 only_simple_this_property_assignments = false; 4515 this_property_assignments = isolate()->factory()->empty_fixed_array(); 4516 } else { 4517 is_lazily_compiled = false; 4518 } 4519 } else { 4520 // With no preparser data, we partially parse the function, without 4521 // building an AST. This gathers the data needed to build a lazy 4522 // function. 4523 SingletonLogger logger; 4524 preparser::PreParser::PreParseResult result = 4525 LazyParseFunctionLiteral(&logger); 4526 if (result == preparser::PreParser::kPreParseStackOverflow) { 4527 // Propagate stack overflow. 4528 stack_overflow_ = true; 4529 *ok = false; 4530 return NULL; 4531 } 4532 if (logger.has_error()) { 4533 const char* arg = logger.argument_opt(); 4534 Vector<const char*> args; 4535 if (arg != NULL) { 4536 args = Vector<const char*>(&arg, 1); 4537 } 4538 ReportMessageAt(Scanner::Location(logger.start(), logger.end()), 4539 logger.message(), args); 4540 *ok = false; 4541 return NULL; 4542 } 4543 scope->set_end_position(logger.end()); 4544 Expect(Token::RBRACE, CHECK_OK); 4545 isolate()->counters()->total_preparse_skipped()->Increment( 4546 scope->end_position() - function_block_pos); 4547 materialized_literal_count = logger.literals(); 4548 expected_property_count = logger.properties(); 4549 top_scope_->SetLanguageMode(logger.language_mode()); 4550 only_simple_this_property_assignments = false; 4551 this_property_assignments = isolate()->factory()->empty_fixed_array(); 4552 } 4553 } 4554 4555 if (!is_lazily_compiled) { 4556 body = new(zone()) ZoneList<Statement*>(8); 4557 if (fvar != NULL) { 4558 VariableProxy* fproxy = 4559 top_scope_->NewUnresolved(factory(), function_name); 4560 fproxy->BindTo(fvar); 4561 body->Add(factory()->NewExpressionStatement( 4562 factory()->NewAssignment(fvar_init_op, 4563 fproxy, 4564 factory()->NewThisFunction(), 4565 RelocInfo::kNoPosition))); 4566 } 4567 ParseSourceElements(body, Token::RBRACE, false, CHECK_OK); 4568 4569 materialized_literal_count = function_state.materialized_literal_count(); 4570 expected_property_count = function_state.expected_property_count(); 4571 handler_count = function_state.handler_count(); 4572 only_simple_this_property_assignments = 4573 function_state.only_simple_this_property_assignments(); 4574 this_property_assignments = function_state.this_property_assignments(); 4575 4576 Expect(Token::RBRACE, CHECK_OK); 4577 scope->set_end_position(scanner().location().end_pos); 4578 } 4579 4580 // Validate strict mode. 4581 if (!top_scope_->is_classic_mode()) { 4582 if (IsEvalOrArguments(function_name)) { 4583 int start_pos = scope->start_position(); 4584 int position = function_token_position != RelocInfo::kNoPosition 4585 ? function_token_position 4586 : (start_pos > 0 ? start_pos - 1 : start_pos); 4587 Scanner::Location location = Scanner::Location(position, start_pos); 4588 ReportMessageAt(location, 4589 "strict_function_name", Vector<const char*>::empty()); 4590 *ok = false; 4591 return NULL; 4592 } 4593 if (name_loc.IsValid()) { 4594 ReportMessageAt(name_loc, "strict_param_name", 4595 Vector<const char*>::empty()); 4596 *ok = false; 4597 return NULL; 4598 } 4599 if (dupe_loc.IsValid()) { 4600 ReportMessageAt(dupe_loc, "strict_param_dupe", 4601 Vector<const char*>::empty()); 4602 *ok = false; 4603 return NULL; 4604 } 4605 if (name_is_strict_reserved) { 4606 int start_pos = scope->start_position(); 4607 int position = function_token_position != RelocInfo::kNoPosition 4608 ? function_token_position 4609 : (start_pos > 0 ? start_pos - 1 : start_pos); 4610 Scanner::Location location = Scanner::Location(position, start_pos); 4611 ReportMessageAt(location, "strict_reserved_word", 4612 Vector<const char*>::empty()); 4613 *ok = false; 4614 return NULL; 4615 } 4616 if (reserved_loc.IsValid()) { 4617 ReportMessageAt(reserved_loc, "strict_reserved_word", 4618 Vector<const char*>::empty()); 4619 *ok = false; 4620 return NULL; 4621 } 4622 CheckOctalLiteral(scope->start_position(), 4623 scope->end_position(), 4624 CHECK_OK); 4625 } 4626 ast_properties = *factory()->visitor()->ast_properties(); 4627 } 4628 4629 if (is_extended_mode()) { 4630 CheckConflictingVarDeclarations(scope, CHECK_OK); 4631 } 4632 4633 FunctionLiteral* function_literal = 4634 factory()->NewFunctionLiteral(function_name, 4635 scope, 4636 body, 4637 materialized_literal_count, 4638 expected_property_count, 4639 handler_count, 4640 only_simple_this_property_assignments, 4641 this_property_assignments, 4642 num_parameters, 4643 duplicate_parameters, 4644 type, 4645 FunctionLiteral::kIsFunction); 4646 function_literal->set_function_token_position(function_token_position); 4647 function_literal->set_ast_properties(&ast_properties); 4648 4649 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); 4650 return function_literal; 4651 } 4652 4653 4654 preparser::PreParser::PreParseResult Parser::LazyParseFunctionLiteral( 4655 SingletonLogger* logger) { 4656 HistogramTimerScope preparse_scope(isolate()->counters()->pre_parse()); 4657 ASSERT_EQ(Token::LBRACE, scanner().current_token()); 4658 4659 if (reusable_preparser_ == NULL) { 4660 intptr_t stack_limit = isolate()->stack_guard()->real_climit(); 4661 bool do_allow_lazy = true; 4662 reusable_preparser_ = new preparser::PreParser(&scanner_, 4663 NULL, 4664 stack_limit, 4665 do_allow_lazy, 4666 allow_natives_syntax_, 4667 allow_modules_); 4668 } 4669 preparser::PreParser::PreParseResult result = 4670 reusable_preparser_->PreParseLazyFunction(top_scope_->language_mode(), 4671 logger); 4672 return result; 4673 } 4674 4675 4676 Expression* Parser::ParseV8Intrinsic(bool* ok) { 4677 // CallRuntime :: 4678 // '%' Identifier Arguments 4679 4680 Expect(Token::MOD, CHECK_OK); 4681 Handle<String> name = ParseIdentifier(CHECK_OK); 4682 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); 4683 4684 if (extension_ != NULL) { 4685 // The extension structures are only accessible while parsing the 4686 // very first time not when reparsing because of lazy compilation. 4687 top_scope_->DeclarationScope()->ForceEagerCompilation(); 4688 } 4689 4690 const Runtime::Function* function = Runtime::FunctionForSymbol(name); 4691 4692 // Check for built-in IS_VAR macro. 4693 if (function != NULL && 4694 function->intrinsic_type == Runtime::RUNTIME && 4695 function->function_id == Runtime::kIS_VAR) { 4696 // %IS_VAR(x) evaluates to x if x is a variable, 4697 // leads to a parse error otherwise. Could be implemented as an 4698 // inline function %_IS_VAR(x) to eliminate this special case. 4699 if (args->length() == 1 && args->at(0)->AsVariableProxy() != NULL) { 4700 return args->at(0); 4701 } else { 4702 ReportMessage("unable_to_parse", Vector<const char*>::empty()); 4703 *ok = false; 4704 return NULL; 4705 } 4706 } 4707 4708 // Check that the expected number of arguments are being passed. 4709 if (function != NULL && 4710 function->nargs != -1 && 4711 function->nargs != args->length()) { 4712 ReportMessage("illegal_access", Vector<const char*>::empty()); 4713 *ok = false; 4714 return NULL; 4715 } 4716 4717 // We have a valid intrinsics call or a call to a builtin. 4718 return factory()->NewCallRuntime(name, function, args); 4719 } 4720 4721 4722 bool Parser::peek_any_identifier() { 4723 Token::Value next = peek(); 4724 return next == Token::IDENTIFIER || 4725 next == Token::FUTURE_RESERVED_WORD || 4726 next == Token::FUTURE_STRICT_RESERVED_WORD; 4727 } 4728 4729 4730 void Parser::Consume(Token::Value token) { 4731 Token::Value next = Next(); 4732 USE(next); 4733 USE(token); 4734 ASSERT(next == token); 4735 } 4736 4737 4738 void Parser::Expect(Token::Value token, bool* ok) { 4739 Token::Value next = Next(); 4740 if (next == token) return; 4741 ReportUnexpectedToken(next); 4742 *ok = false; 4743 } 4744 4745 4746 bool Parser::Check(Token::Value token) { 4747 Token::Value next = peek(); 4748 if (next == token) { 4749 Consume(next); 4750 return true; 4751 } 4752 return false; 4753 } 4754 4755 4756 void Parser::ExpectSemicolon(bool* ok) { 4757 // Check for automatic semicolon insertion according to 4758 // the rules given in ECMA-262, section 7.9, page 21. 4759 Token::Value tok = peek(); 4760 if (tok == Token::SEMICOLON) { 4761 Next(); 4762 return; 4763 } 4764 if (scanner().HasAnyLineTerminatorBeforeNext() || 4765 tok == Token::RBRACE || 4766 tok == Token::EOS) { 4767 return; 4768 } 4769 Expect(Token::SEMICOLON, ok); 4770 } 4771 4772 4773 void Parser::ExpectContextualKeyword(const char* keyword, bool* ok) { 4774 Expect(Token::IDENTIFIER, ok); 4775 if (!*ok) return; 4776 Handle<String> symbol = GetSymbol(ok); 4777 if (!*ok) return; 4778 if (!symbol->IsEqualTo(CStrVector(keyword))) { 4779 *ok = false; 4780 ReportUnexpectedToken(scanner().current_token()); 4781 } 4782 } 4783 4784 4785 Literal* Parser::GetLiteralUndefined() { 4786 return factory()->NewLiteral(isolate()->factory()->undefined_value()); 4787 } 4788 4789 4790 Literal* Parser::GetLiteralTheHole() { 4791 return factory()->NewLiteral(isolate()->factory()->the_hole_value()); 4792 } 4793 4794 4795 // Parses an identifier that is valid for the current scope, in particular it 4796 // fails on strict mode future reserved keywords in a strict scope. 4797 Handle<String> Parser::ParseIdentifier(bool* ok) { 4798 if (!top_scope_->is_classic_mode()) { 4799 Expect(Token::IDENTIFIER, ok); 4800 } else if (!Check(Token::IDENTIFIER)) { 4801 Expect(Token::FUTURE_STRICT_RESERVED_WORD, ok); 4802 } 4803 if (!*ok) return Handle<String>(); 4804 return GetSymbol(ok); 4805 } 4806 4807 4808 // Parses and identifier or a strict mode future reserved word, and indicate 4809 // whether it is strict mode future reserved. 4810 Handle<String> Parser::ParseIdentifierOrStrictReservedWord( 4811 bool* is_strict_reserved, bool* ok) { 4812 *is_strict_reserved = false; 4813 if (!Check(Token::IDENTIFIER)) { 4814 Expect(Token::FUTURE_STRICT_RESERVED_WORD, ok); 4815 *is_strict_reserved = true; 4816 } 4817 if (!*ok) return Handle<String>(); 4818 return GetSymbol(ok); 4819 } 4820 4821 4822 Handle<String> Parser::ParseIdentifierName(bool* ok) { 4823 Token::Value next = Next(); 4824 if (next != Token::IDENTIFIER && 4825 next != Token::FUTURE_RESERVED_WORD && 4826 next != Token::FUTURE_STRICT_RESERVED_WORD && 4827 !Token::IsKeyword(next)) { 4828 ReportUnexpectedToken(next); 4829 *ok = false; 4830 return Handle<String>(); 4831 } 4832 return GetSymbol(ok); 4833 } 4834 4835 4836 void Parser::MarkAsLValue(Expression* expression) { 4837 VariableProxy* proxy = expression != NULL 4838 ? expression->AsVariableProxy() 4839 : NULL; 4840 4841 if (proxy != NULL) proxy->MarkAsLValue(); 4842 } 4843 4844 4845 // Checks LHS expression for assignment and prefix/postfix increment/decrement 4846 // in strict mode. 4847 void Parser::CheckStrictModeLValue(Expression* expression, 4848 const char* error, 4849 bool* ok) { 4850 ASSERT(!top_scope_->is_classic_mode()); 4851 VariableProxy* lhs = expression != NULL 4852 ? expression->AsVariableProxy() 4853 : NULL; 4854 4855 if (lhs != NULL && !lhs->is_this() && IsEvalOrArguments(lhs->name())) { 4856 ReportMessage(error, Vector<const char*>::empty()); 4857 *ok = false; 4858 } 4859 } 4860 4861 4862 // Checks whether an octal literal was last seen between beg_pos and end_pos. 4863 // If so, reports an error. Only called for strict mode. 4864 void Parser::CheckOctalLiteral(int beg_pos, int end_pos, bool* ok) { 4865 Scanner::Location octal = scanner().octal_position(); 4866 if (octal.IsValid() && 4867 beg_pos <= octal.beg_pos && 4868 octal.end_pos <= end_pos) { 4869 ReportMessageAt(octal, "strict_octal_literal", 4870 Vector<const char*>::empty()); 4871 scanner().clear_octal_position(); 4872 *ok = false; 4873 } 4874 } 4875 4876 4877 void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) { 4878 Declaration* decl = scope->CheckConflictingVarDeclarations(); 4879 if (decl != NULL) { 4880 // In harmony mode we treat conflicting variable bindinds as early 4881 // errors. See ES5 16 for a definition of early errors. 4882 Handle<String> name = decl->proxy()->name(); 4883 SmartArrayPointer<char> c_string = name->ToCString(DISALLOW_NULLS); 4884 const char* elms[2] = { "Variable", *c_string }; 4885 Vector<const char*> args(elms, 2); 4886 int position = decl->proxy()->position(); 4887 Scanner::Location location = position == RelocInfo::kNoPosition 4888 ? Scanner::Location::invalid() 4889 : Scanner::Location(position, position + 1); 4890 ReportMessageAt(location, "redeclaration", args); 4891 *ok = false; 4892 } 4893 } 4894 4895 4896 // This function reads an identifier name and determines whether or not it 4897 // is 'get' or 'set'. 4898 Handle<String> Parser::ParseIdentifierNameOrGetOrSet(bool* is_get, 4899 bool* is_set, 4900 bool* ok) { 4901 Handle<String> result = ParseIdentifierName(ok); 4902 if (!*ok) return Handle<String>(); 4903 if (scanner().is_literal_ascii() && scanner().literal_length() == 3) { 4904 const char* token = scanner().literal_ascii_string().start(); 4905 *is_get = strncmp(token, "get", 3) == 0; 4906 *is_set = !*is_get && strncmp(token, "set", 3) == 0; 4907 } 4908 return result; 4909 } 4910 4911 4912 // ---------------------------------------------------------------------------- 4913 // Parser support 4914 4915 4916 bool Parser::TargetStackContainsLabel(Handle<String> label) { 4917 for (Target* t = target_stack_; t != NULL; t = t->previous()) { 4918 BreakableStatement* stat = t->node()->AsBreakableStatement(); 4919 if (stat != NULL && ContainsLabel(stat->labels(), label)) 4920 return true; 4921 } 4922 return false; 4923 } 4924 4925 4926 BreakableStatement* Parser::LookupBreakTarget(Handle<String> label, bool* ok) { 4927 bool anonymous = label.is_null(); 4928 for (Target* t = target_stack_; t != NULL; t = t->previous()) { 4929 BreakableStatement* stat = t->node()->AsBreakableStatement(); 4930 if (stat == NULL) continue; 4931 if ((anonymous && stat->is_target_for_anonymous()) || 4932 (!anonymous && ContainsLabel(stat->labels(), label))) { 4933 RegisterTargetUse(stat->break_target(), t->previous()); 4934 return stat; 4935 } 4936 } 4937 return NULL; 4938 } 4939 4940 4941 IterationStatement* Parser::LookupContinueTarget(Handle<String> label, 4942 bool* ok) { 4943 bool anonymous = label.is_null(); 4944 for (Target* t = target_stack_; t != NULL; t = t->previous()) { 4945 IterationStatement* stat = t->node()->AsIterationStatement(); 4946 if (stat == NULL) continue; 4947 4948 ASSERT(stat->is_target_for_anonymous()); 4949 if (anonymous || ContainsLabel(stat->labels(), label)) { 4950 RegisterTargetUse(stat->continue_target(), t->previous()); 4951 return stat; 4952 } 4953 } 4954 return NULL; 4955 } 4956 4957 4958 void Parser::RegisterTargetUse(Label* target, Target* stop) { 4959 // Register that a break target found at the given stop in the 4960 // target stack has been used from the top of the target stack. Add 4961 // the break target to any TargetCollectors passed on the stack. 4962 for (Target* t = target_stack_; t != stop; t = t->previous()) { 4963 TargetCollector* collector = t->node()->AsTargetCollector(); 4964 if (collector != NULL) collector->AddTarget(target); 4965 } 4966 } 4967 4968 4969 Expression* Parser::NewThrowReferenceError(Handle<String> type) { 4970 return NewThrowError(isolate()->factory()->MakeReferenceError_symbol(), 4971 type, HandleVector<Object>(NULL, 0)); 4972 } 4973 4974 4975 Expression* Parser::NewThrowSyntaxError(Handle<String> type, 4976 Handle<Object> first) { 4977 int argc = first.is_null() ? 0 : 1; 4978 Vector< Handle<Object> > arguments = HandleVector<Object>(&first, argc); 4979 return NewThrowError( 4980 isolate()->factory()->MakeSyntaxError_symbol(), type, arguments); 4981 } 4982 4983 4984 Expression* Parser::NewThrowTypeError(Handle<String> type, 4985 Handle<Object> first, 4986 Handle<Object> second) { 4987 ASSERT(!first.is_null() && !second.is_null()); 4988 Handle<Object> elements[] = { first, second }; 4989 Vector< Handle<Object> > arguments = 4990 HandleVector<Object>(elements, ARRAY_SIZE(elements)); 4991 return NewThrowError( 4992 isolate()->factory()->MakeTypeError_symbol(), type, arguments); 4993 } 4994 4995 4996 Expression* Parser::NewThrowError(Handle<String> constructor, 4997 Handle<String> type, 4998 Vector< Handle<Object> > arguments) { 4999 int argc = arguments.length(); 5000 Handle<FixedArray> elements = isolate()->factory()->NewFixedArray(argc, 5001 TENURED); 5002 for (int i = 0; i < argc; i++) { 5003 Handle<Object> element = arguments[i]; 5004 if (!element.is_null()) { 5005 elements->set(i, *element); 5006 } 5007 } 5008 Handle<JSArray> array = isolate()->factory()->NewJSArrayWithElements( 5009 elements, FAST_ELEMENTS, TENURED); 5010 5011 ZoneList<Expression*>* args = new(zone()) ZoneList<Expression*>(2); 5012 args->Add(factory()->NewLiteral(type)); 5013 args->Add(factory()->NewLiteral(array)); 5014 CallRuntime* call_constructor = 5015 factory()->NewCallRuntime(constructor, NULL, args); 5016 return factory()->NewThrow(call_constructor, scanner().location().beg_pos); 5017 } 5018 5019 // ---------------------------------------------------------------------------- 5020 // Regular expressions 5021 5022 5023 RegExpParser::RegExpParser(FlatStringReader* in, 5024 Handle<String>* error, 5025 bool multiline) 5026 : isolate_(Isolate::Current()), 5027 error_(error), 5028 captures_(NULL), 5029 in_(in), 5030 current_(kEndMarker), 5031 next_pos_(0), 5032 capture_count_(0), 5033 has_more_(true), 5034 multiline_(multiline), 5035 simple_(false), 5036 contains_anchor_(false), 5037 is_scanned_for_captures_(false), 5038 failed_(false) { 5039 Advance(); 5040 } 5041 5042 5043 uc32 RegExpParser::Next() { 5044 if (has_next()) { 5045 return in()->Get(next_pos_); 5046 } else { 5047 return kEndMarker; 5048 } 5049 } 5050 5051 5052 void RegExpParser::Advance() { 5053 if (next_pos_ < in()->length()) { 5054 StackLimitCheck check(isolate()); 5055 if (check.HasOverflowed()) { 5056 ReportError(CStrVector(Isolate::kStackOverflowMessage)); 5057 } else if (isolate()->zone()->excess_allocation()) { 5058 ReportError(CStrVector("Regular expression too large")); 5059 } else { 5060 current_ = in()->Get(next_pos_); 5061 next_pos_++; 5062 } 5063 } else { 5064 current_ = kEndMarker; 5065 has_more_ = false; 5066 } 5067 } 5068 5069 5070 void RegExpParser::Reset(int pos) { 5071 next_pos_ = pos; 5072 Advance(); 5073 } 5074 5075 5076 void RegExpParser::Advance(int dist) { 5077 next_pos_ += dist - 1; 5078 Advance(); 5079 } 5080 5081 5082 bool RegExpParser::simple() { 5083 return simple_; 5084 } 5085 5086 RegExpTree* RegExpParser::ReportError(Vector<const char> message) { 5087 failed_ = true; 5088 *error_ = isolate()->factory()->NewStringFromAscii(message, NOT_TENURED); 5089 // Zip to the end to make sure the no more input is read. 5090 current_ = kEndMarker; 5091 next_pos_ = in()->length(); 5092 return NULL; 5093 } 5094 5095 5096 // Pattern :: 5097 // Disjunction 5098 RegExpTree* RegExpParser::ParsePattern() { 5099 RegExpTree* result = ParseDisjunction(CHECK_FAILED); 5100 ASSERT(!has_more()); 5101 // If the result of parsing is a literal string atom, and it has the 5102 // same length as the input, then the atom is identical to the input. 5103 if (result->IsAtom() && result->AsAtom()->length() == in()->length()) { 5104 simple_ = true; 5105 } 5106 return result; 5107 } 5108 5109 5110 // Disjunction :: 5111 // Alternative 5112 // Alternative | Disjunction 5113 // Alternative :: 5114 // [empty] 5115 // Term Alternative 5116 // Term :: 5117 // Assertion 5118 // Atom 5119 // Atom Quantifier 5120 RegExpTree* RegExpParser::ParseDisjunction() { 5121 // Used to store current state while parsing subexpressions. 5122 RegExpParserState initial_state(NULL, INITIAL, 0); 5123 RegExpParserState* stored_state = &initial_state; 5124 // Cache the builder in a local variable for quick access. 5125 RegExpBuilder* builder = initial_state.builder(); 5126 while (true) { 5127 switch (current()) { 5128 case kEndMarker: 5129 if (stored_state->IsSubexpression()) { 5130 // Inside a parenthesized group when hitting end of input. 5131 ReportError(CStrVector("Unterminated group") CHECK_FAILED); 5132 } 5133 ASSERT_EQ(INITIAL, stored_state->group_type()); 5134 // Parsing completed successfully. 5135 return builder->ToRegExp(); 5136 case ')': { 5137 if (!stored_state->IsSubexpression()) { 5138 ReportError(CStrVector("Unmatched ')'") CHECK_FAILED); 5139 } 5140 ASSERT_NE(INITIAL, stored_state->group_type()); 5141 5142 Advance(); 5143 // End disjunction parsing and convert builder content to new single 5144 // regexp atom. 5145 RegExpTree* body = builder->ToRegExp(); 5146 5147 int end_capture_index = captures_started(); 5148 5149 int capture_index = stored_state->capture_index(); 5150 SubexpressionType type = stored_state->group_type(); 5151 5152 // Restore previous state. 5153 stored_state = stored_state->previous_state(); 5154 builder = stored_state->builder(); 5155 5156 // Build result of subexpression. 5157 if (type == CAPTURE) { 5158 RegExpCapture* capture = new(zone()) RegExpCapture(body, capture_index); 5159 captures_->at(capture_index - 1) = capture; 5160 body = capture; 5161 } else if (type != GROUPING) { 5162 ASSERT(type == POSITIVE_LOOKAHEAD || type == NEGATIVE_LOOKAHEAD); 5163 bool is_positive = (type == POSITIVE_LOOKAHEAD); 5164 body = new(zone()) RegExpLookahead(body, 5165 is_positive, 5166 end_capture_index - capture_index, 5167 capture_index); 5168 } 5169 builder->AddAtom(body); 5170 // For compatability with JSC and ES3, we allow quantifiers after 5171 // lookaheads, and break in all cases. 5172 break; 5173 } 5174 case '|': { 5175 Advance(); 5176 builder->NewAlternative(); 5177 continue; 5178 } 5179 case '*': 5180 case '+': 5181 case '?': 5182 return ReportError(CStrVector("Nothing to repeat")); 5183 case '^': { 5184 Advance(); 5185 if (multiline_) { 5186 builder->AddAssertion( 5187 new(zone()) RegExpAssertion(RegExpAssertion::START_OF_LINE)); 5188 } else { 5189 builder->AddAssertion( 5190 new(zone()) RegExpAssertion(RegExpAssertion::START_OF_INPUT)); 5191 set_contains_anchor(); 5192 } 5193 continue; 5194 } 5195 case '$': { 5196 Advance(); 5197 RegExpAssertion::Type type = 5198 multiline_ ? RegExpAssertion::END_OF_LINE : 5199 RegExpAssertion::END_OF_INPUT; 5200 builder->AddAssertion(new(zone()) RegExpAssertion(type)); 5201 continue; 5202 } 5203 case '.': { 5204 Advance(); 5205 // everything except \x0a, \x0d, \u2028 and \u2029 5206 ZoneList<CharacterRange>* ranges = 5207 new(zone()) ZoneList<CharacterRange>(2); 5208 CharacterRange::AddClassEscape('.', ranges); 5209 RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false); 5210 builder->AddAtom(atom); 5211 break; 5212 } 5213 case '(': { 5214 SubexpressionType type = CAPTURE; 5215 Advance(); 5216 if (current() == '?') { 5217 switch (Next()) { 5218 case ':': 5219 type = GROUPING; 5220 break; 5221 case '=': 5222 type = POSITIVE_LOOKAHEAD; 5223 break; 5224 case '!': 5225 type = NEGATIVE_LOOKAHEAD; 5226 break; 5227 default: 5228 ReportError(CStrVector("Invalid group") CHECK_FAILED); 5229 break; 5230 } 5231 Advance(2); 5232 } else { 5233 if (captures_ == NULL) { 5234 captures_ = new(zone()) ZoneList<RegExpCapture*>(2); 5235 } 5236 if (captures_started() >= kMaxCaptures) { 5237 ReportError(CStrVector("Too many captures") CHECK_FAILED); 5238 } 5239 captures_->Add(NULL); 5240 } 5241 // Store current state and begin new disjunction parsing. 5242 stored_state = new(zone()) RegExpParserState(stored_state, 5243 type, 5244 captures_started()); 5245 builder = stored_state->builder(); 5246 continue; 5247 } 5248 case '[': { 5249 RegExpTree* atom = ParseCharacterClass(CHECK_FAILED); 5250 builder->AddAtom(atom); 5251 break; 5252 } 5253 // Atom :: 5254 // \ AtomEscape 5255 case '\\': 5256 switch (Next()) { 5257 case kEndMarker: 5258 return ReportError(CStrVector("\\ at end of pattern")); 5259 case 'b': 5260 Advance(2); 5261 builder->AddAssertion( 5262 new(zone()) RegExpAssertion(RegExpAssertion::BOUNDARY)); 5263 continue; 5264 case 'B': 5265 Advance(2); 5266 builder->AddAssertion( 5267 new(zone()) RegExpAssertion(RegExpAssertion::NON_BOUNDARY)); 5268 continue; 5269 // AtomEscape :: 5270 // CharacterClassEscape 5271 // 5272 // CharacterClassEscape :: one of 5273 // d D s S w W 5274 case 'd': case 'D': case 's': case 'S': case 'w': case 'W': { 5275 uc32 c = Next(); 5276 Advance(2); 5277 ZoneList<CharacterRange>* ranges = 5278 new(zone()) ZoneList<CharacterRange>(2); 5279 CharacterRange::AddClassEscape(c, ranges); 5280 RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false); 5281 builder->AddAtom(atom); 5282 break; 5283 } 5284 case '1': case '2': case '3': case '4': case '5': case '6': 5285 case '7': case '8': case '9': { 5286 int index = 0; 5287 if (ParseBackReferenceIndex(&index)) { 5288 RegExpCapture* capture = NULL; 5289 if (captures_ != NULL && index <= captures_->length()) { 5290 capture = captures_->at(index - 1); 5291 } 5292 if (capture == NULL) { 5293 builder->AddEmpty(); 5294 break; 5295 } 5296 RegExpTree* atom = new(zone()) RegExpBackReference(capture); 5297 builder->AddAtom(atom); 5298 break; 5299 } 5300 uc32 first_digit = Next(); 5301 if (first_digit == '8' || first_digit == '9') { 5302 // Treat as identity escape 5303 builder->AddCharacter(first_digit); 5304 Advance(2); 5305 break; 5306 } 5307 } 5308 // FALLTHROUGH 5309 case '0': { 5310 Advance(); 5311 uc32 octal = ParseOctalLiteral(); 5312 builder->AddCharacter(octal); 5313 break; 5314 } 5315 // ControlEscape :: one of 5316 // f n r t v 5317 case 'f': 5318 Advance(2); 5319 builder->AddCharacter('\f'); 5320 break; 5321 case 'n': 5322 Advance(2); 5323 builder->AddCharacter('\n'); 5324 break; 5325 case 'r': 5326 Advance(2); 5327 builder->AddCharacter('\r'); 5328 break; 5329 case 't': 5330 Advance(2); 5331 builder->AddCharacter('\t'); 5332 break; 5333 case 'v': 5334 Advance(2); 5335 builder->AddCharacter('\v'); 5336 break; 5337 case 'c': { 5338 Advance(); 5339 uc32 controlLetter = Next(); 5340 // Special case if it is an ASCII letter. 5341 // Convert lower case letters to uppercase. 5342 uc32 letter = controlLetter & ~('a' ^ 'A'); 5343 if (letter < 'A' || 'Z' < letter) { 5344 // controlLetter is not in range 'A'-'Z' or 'a'-'z'. 5345 // This is outside the specification. We match JSC in 5346 // reading the backslash as a literal character instead 5347 // of as starting an escape. 5348 builder->AddCharacter('\\'); 5349 } else { 5350 Advance(2); 5351 builder->AddCharacter(controlLetter & 0x1f); 5352 } 5353 break; 5354 } 5355 case 'x': { 5356 Advance(2); 5357 uc32 value; 5358 if (ParseHexEscape(2, &value)) { 5359 builder->AddCharacter(value); 5360 } else { 5361 builder->AddCharacter('x'); 5362 } 5363 break; 5364 } 5365 case 'u': { 5366 Advance(2); 5367 uc32 value; 5368 if (ParseHexEscape(4, &value)) { 5369 builder->AddCharacter(value); 5370 } else { 5371 builder->AddCharacter('u'); 5372 } 5373 break; 5374 } 5375 default: 5376 // Identity escape. 5377 builder->AddCharacter(Next()); 5378 Advance(2); 5379 break; 5380 } 5381 break; 5382 case '{': { 5383 int dummy; 5384 if (ParseIntervalQuantifier(&dummy, &dummy)) { 5385 ReportError(CStrVector("Nothing to repeat") CHECK_FAILED); 5386 } 5387 // fallthrough 5388 } 5389 default: 5390 builder->AddCharacter(current()); 5391 Advance(); 5392 break; 5393 } // end switch(current()) 5394 5395 int min; 5396 int max; 5397 switch (current()) { 5398 // QuantifierPrefix :: 5399 // * 5400 // + 5401 // ? 5402 // { 5403 case '*': 5404 min = 0; 5405 max = RegExpTree::kInfinity; 5406 Advance(); 5407 break; 5408 case '+': 5409 min = 1; 5410 max = RegExpTree::kInfinity; 5411 Advance(); 5412 break; 5413 case '?': 5414 min = 0; 5415 max = 1; 5416 Advance(); 5417 break; 5418 case '{': 5419 if (ParseIntervalQuantifier(&min, &max)) { 5420 if (max < min) { 5421 ReportError(CStrVector("numbers out of order in {} quantifier.") 5422 CHECK_FAILED); 5423 } 5424 break; 5425 } else { 5426 continue; 5427 } 5428 default: 5429 continue; 5430 } 5431 RegExpQuantifier::Type type = RegExpQuantifier::GREEDY; 5432 if (current() == '?') { 5433 type = RegExpQuantifier::NON_GREEDY; 5434 Advance(); 5435 } else if (FLAG_regexp_possessive_quantifier && current() == '+') { 5436 // FLAG_regexp_possessive_quantifier is a debug-only flag. 5437 type = RegExpQuantifier::POSSESSIVE; 5438 Advance(); 5439 } 5440 builder->AddQuantifierToAtom(min, max, type); 5441 } 5442 } 5443 5444 5445 #ifdef DEBUG 5446 // Currently only used in an ASSERT. 5447 static bool IsSpecialClassEscape(uc32 c) { 5448 switch (c) { 5449 case 'd': case 'D': 5450 case 's': case 'S': 5451 case 'w': case 'W': 5452 return true; 5453 default: 5454 return false; 5455 } 5456 } 5457 #endif 5458 5459 5460 // In order to know whether an escape is a backreference or not we have to scan 5461 // the entire regexp and find the number of capturing parentheses. However we 5462 // don't want to scan the regexp twice unless it is necessary. This mini-parser 5463 // is called when needed. It can see the difference between capturing and 5464 // noncapturing parentheses and can skip character classes and backslash-escaped 5465 // characters. 5466 void RegExpParser::ScanForCaptures() { 5467 // Start with captures started previous to current position 5468 int capture_count = captures_started(); 5469 // Add count of captures after this position. 5470 int n; 5471 while ((n = current()) != kEndMarker) { 5472 Advance(); 5473 switch (n) { 5474 case '\\': 5475 Advance(); 5476 break; 5477 case '[': { 5478 int c; 5479 while ((c = current()) != kEndMarker) { 5480 Advance(); 5481 if (c == '\\') { 5482 Advance(); 5483 } else { 5484 if (c == ']') break; 5485 } 5486 } 5487 break; 5488 } 5489 case '(': 5490 if (current() != '?') capture_count++; 5491 break; 5492 } 5493 } 5494 capture_count_ = capture_count; 5495 is_scanned_for_captures_ = true; 5496 } 5497 5498 5499 bool RegExpParser::ParseBackReferenceIndex(int* index_out) { 5500 ASSERT_EQ('\\', current()); 5501 ASSERT('1' <= Next() && Next() <= '9'); 5502 // Try to parse a decimal literal that is no greater than the total number 5503 // of left capturing parentheses in the input. 5504 int start = position(); 5505 int value = Next() - '0'; 5506 Advance(2); 5507 while (true) { 5508 uc32 c = current(); 5509 if (IsDecimalDigit(c)) { 5510 value = 10 * value + (c - '0'); 5511 if (value > kMaxCaptures) { 5512 Reset(start); 5513 return false; 5514 } 5515 Advance(); 5516 } else { 5517 break; 5518 } 5519 } 5520 if (value > captures_started()) { 5521 if (!is_scanned_for_captures_) { 5522 int saved_position = position(); 5523 ScanForCaptures(); 5524 Reset(saved_position); 5525 } 5526 if (value > capture_count_) { 5527 Reset(start); 5528 return false; 5529 } 5530 } 5531 *index_out = value; 5532 return true; 5533 } 5534 5535 5536 // QuantifierPrefix :: 5537 // { DecimalDigits } 5538 // { DecimalDigits , } 5539 // { DecimalDigits , DecimalDigits } 5540 // 5541 // Returns true if parsing succeeds, and set the min_out and max_out 5542 // values. Values are truncated to RegExpTree::kInfinity if they overflow. 5543 bool RegExpParser::ParseIntervalQuantifier(int* min_out, int* max_out) { 5544 ASSERT_EQ(current(), '{'); 5545 int start = position(); 5546 Advance(); 5547 int min = 0; 5548 if (!IsDecimalDigit(current())) { 5549 Reset(start); 5550 return false; 5551 } 5552 while (IsDecimalDigit(current())) { 5553 int next = current() - '0'; 5554 if (min > (RegExpTree::kInfinity - next) / 10) { 5555 // Overflow. Skip past remaining decimal digits and return -1. 5556 do { 5557 Advance(); 5558 } while (IsDecimalDigit(current())); 5559 min = RegExpTree::kInfinity; 5560 break; 5561 } 5562 min = 10 * min + next; 5563 Advance(); 5564 } 5565 int max = 0; 5566 if (current() == '}') { 5567 max = min; 5568 Advance(); 5569 } else if (current() == ',') { 5570 Advance(); 5571 if (current() == '}') { 5572 max = RegExpTree::kInfinity; 5573 Advance(); 5574 } else { 5575 while (IsDecimalDigit(current())) { 5576 int next = current() - '0'; 5577 if (max > (RegExpTree::kInfinity - next) / 10) { 5578 do { 5579 Advance(); 5580 } while (IsDecimalDigit(current())); 5581 max = RegExpTree::kInfinity; 5582 break; 5583 } 5584 max = 10 * max + next; 5585 Advance(); 5586 } 5587 if (current() != '}') { 5588 Reset(start); 5589 return false; 5590 } 5591 Advance(); 5592 } 5593 } else { 5594 Reset(start); 5595 return false; 5596 } 5597 *min_out = min; 5598 *max_out = max; 5599 return true; 5600 } 5601 5602 5603 uc32 RegExpParser::ParseOctalLiteral() { 5604 ASSERT('0' <= current() && current() <= '7'); 5605 // For compatibility with some other browsers (not all), we parse 5606 // up to three octal digits with a value below 256. 5607 uc32 value = current() - '0'; 5608 Advance(); 5609 if ('0' <= current() && current() <= '7') { 5610 value = value * 8 + current() - '0'; 5611 Advance(); 5612 if (value < 32 && '0' <= current() && current() <= '7') { 5613 value = value * 8 + current() - '0'; 5614 Advance(); 5615 } 5616 } 5617 return value; 5618 } 5619 5620 5621 bool RegExpParser::ParseHexEscape(int length, uc32 *value) { 5622 int start = position(); 5623 uc32 val = 0; 5624 bool done = false; 5625 for (int i = 0; !done; i++) { 5626 uc32 c = current(); 5627 int d = HexValue(c); 5628 if (d < 0) { 5629 Reset(start); 5630 return false; 5631 } 5632 val = val * 16 + d; 5633 Advance(); 5634 if (i == length - 1) { 5635 done = true; 5636 } 5637 } 5638 *value = val; 5639 return true; 5640 } 5641 5642 5643 uc32 RegExpParser::ParseClassCharacterEscape() { 5644 ASSERT(current() == '\\'); 5645 ASSERT(has_next() && !IsSpecialClassEscape(Next())); 5646 Advance(); 5647 switch (current()) { 5648 case 'b': 5649 Advance(); 5650 return '\b'; 5651 // ControlEscape :: one of 5652 // f n r t v 5653 case 'f': 5654 Advance(); 5655 return '\f'; 5656 case 'n': 5657 Advance(); 5658 return '\n'; 5659 case 'r': 5660 Advance(); 5661 return '\r'; 5662 case 't': 5663 Advance(); 5664 return '\t'; 5665 case 'v': 5666 Advance(); 5667 return '\v'; 5668 case 'c': { 5669 uc32 controlLetter = Next(); 5670 uc32 letter = controlLetter & ~('A' ^ 'a'); 5671 // For compatibility with JSC, inside a character class 5672 // we also accept digits and underscore as control characters. 5673 if ((controlLetter >= '0' && controlLetter <= '9') || 5674 controlLetter == '_' || 5675 (letter >= 'A' && letter <= 'Z')) { 5676 Advance(2); 5677 // Control letters mapped to ASCII control characters in the range 5678 // 0x00-0x1f. 5679 return controlLetter & 0x1f; 5680 } 5681 // We match JSC in reading the backslash as a literal 5682 // character instead of as starting an escape. 5683 return '\\'; 5684 } 5685 case '0': case '1': case '2': case '3': case '4': case '5': 5686 case '6': case '7': 5687 // For compatibility, we interpret a decimal escape that isn't 5688 // a back reference (and therefore either \0 or not valid according 5689 // to the specification) as a 1..3 digit octal character code. 5690 return ParseOctalLiteral(); 5691 case 'x': { 5692 Advance(); 5693 uc32 value; 5694 if (ParseHexEscape(2, &value)) { 5695 return value; 5696 } 5697 // If \x is not followed by a two-digit hexadecimal, treat it 5698 // as an identity escape. 5699 return 'x'; 5700 } 5701 case 'u': { 5702 Advance(); 5703 uc32 value; 5704 if (ParseHexEscape(4, &value)) { 5705 return value; 5706 } 5707 // If \u is not followed by a four-digit hexadecimal, treat it 5708 // as an identity escape. 5709 return 'u'; 5710 } 5711 default: { 5712 // Extended identity escape. We accept any character that hasn't 5713 // been matched by a more specific case, not just the subset required 5714 // by the ECMAScript specification. 5715 uc32 result = current(); 5716 Advance(); 5717 return result; 5718 } 5719 } 5720 return 0; 5721 } 5722 5723 5724 CharacterRange RegExpParser::ParseClassAtom(uc16* char_class) { 5725 ASSERT_EQ(0, *char_class); 5726 uc32 first = current(); 5727 if (first == '\\') { 5728 switch (Next()) { 5729 case 'w': case 'W': case 'd': case 'D': case 's': case 'S': { 5730 *char_class = Next(); 5731 Advance(2); 5732 return CharacterRange::Singleton(0); // Return dummy value. 5733 } 5734 case kEndMarker: 5735 return ReportError(CStrVector("\\ at end of pattern")); 5736 default: 5737 uc32 c = ParseClassCharacterEscape(CHECK_FAILED); 5738 return CharacterRange::Singleton(c); 5739 } 5740 } else { 5741 Advance(); 5742 return CharacterRange::Singleton(first); 5743 } 5744 } 5745 5746 5747 static const uc16 kNoCharClass = 0; 5748 5749 // Adds range or pre-defined character class to character ranges. 5750 // If char_class is not kInvalidClass, it's interpreted as a class 5751 // escape (i.e., 's' means whitespace, from '\s'). 5752 static inline void AddRangeOrEscape(ZoneList<CharacterRange>* ranges, 5753 uc16 char_class, 5754 CharacterRange range) { 5755 if (char_class != kNoCharClass) { 5756 CharacterRange::AddClassEscape(char_class, ranges); 5757 } else { 5758 ranges->Add(range); 5759 } 5760 } 5761 5762 5763 RegExpTree* RegExpParser::ParseCharacterClass() { 5764 static const char* kUnterminated = "Unterminated character class"; 5765 static const char* kRangeOutOfOrder = "Range out of order in character class"; 5766 5767 ASSERT_EQ(current(), '['); 5768 Advance(); 5769 bool is_negated = false; 5770 if (current() == '^') { 5771 is_negated = true; 5772 Advance(); 5773 } 5774 ZoneList<CharacterRange>* ranges = new(zone()) ZoneList<CharacterRange>(2); 5775 while (has_more() && current() != ']') { 5776 uc16 char_class = kNoCharClass; 5777 CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED); 5778 if (current() == '-') { 5779 Advance(); 5780 if (current() == kEndMarker) { 5781 // If we reach the end we break out of the loop and let the 5782 // following code report an error. 5783 break; 5784 } else if (current() == ']') { 5785 AddRangeOrEscape(ranges, char_class, first); 5786 ranges->Add(CharacterRange::Singleton('-')); 5787 break; 5788 } 5789 uc16 char_class_2 = kNoCharClass; 5790 CharacterRange next = ParseClassAtom(&char_class_2 CHECK_FAILED); 5791 if (char_class != kNoCharClass || char_class_2 != kNoCharClass) { 5792 // Either end is an escaped character class. Treat the '-' verbatim. 5793 AddRangeOrEscape(ranges, char_class, first); 5794 ranges->Add(CharacterRange::Singleton('-')); 5795 AddRangeOrEscape(ranges, char_class_2, next); 5796 continue; 5797 } 5798 if (first.from() > next.to()) { 5799 return ReportError(CStrVector(kRangeOutOfOrder) CHECK_FAILED); 5800 } 5801 ranges->Add(CharacterRange::Range(first.from(), next.to())); 5802 } else { 5803 AddRangeOrEscape(ranges, char_class, first); 5804 } 5805 } 5806 if (!has_more()) { 5807 return ReportError(CStrVector(kUnterminated) CHECK_FAILED); 5808 } 5809 Advance(); 5810 if (ranges->length() == 0) { 5811 ranges->Add(CharacterRange::Everything()); 5812 is_negated = !is_negated; 5813 } 5814 return new(zone()) RegExpCharacterClass(ranges, is_negated); 5815 } 5816 5817 5818 // ---------------------------------------------------------------------------- 5819 // The Parser interface. 5820 5821 ParserMessage::~ParserMessage() { 5822 for (int i = 0; i < args().length(); i++) 5823 DeleteArray(args()[i]); 5824 DeleteArray(args().start()); 5825 } 5826 5827 5828 ScriptDataImpl::~ScriptDataImpl() { 5829 if (owns_store_) store_.Dispose(); 5830 } 5831 5832 5833 int ScriptDataImpl::Length() { 5834 return store_.length() * sizeof(unsigned); 5835 } 5836 5837 5838 const char* ScriptDataImpl::Data() { 5839 return reinterpret_cast<const char*>(store_.start()); 5840 } 5841 5842 5843 bool ScriptDataImpl::HasError() { 5844 return has_error(); 5845 } 5846 5847 5848 void ScriptDataImpl::Initialize() { 5849 // Prepares state for use. 5850 if (store_.length() >= PreparseDataConstants::kHeaderSize) { 5851 function_index_ = PreparseDataConstants::kHeaderSize; 5852 int symbol_data_offset = PreparseDataConstants::kHeaderSize 5853 + store_[PreparseDataConstants::kFunctionsSizeOffset]; 5854 if (store_.length() > symbol_data_offset) { 5855 symbol_data_ = reinterpret_cast<byte*>(&store_[symbol_data_offset]); 5856 } else { 5857 // Partial preparse causes no symbol information. 5858 symbol_data_ = reinterpret_cast<byte*>(&store_[0] + store_.length()); 5859 } 5860 symbol_data_end_ = reinterpret_cast<byte*>(&store_[0] + store_.length()); 5861 } 5862 } 5863 5864 5865 int ScriptDataImpl::ReadNumber(byte** source) { 5866 // Reads a number from symbol_data_ in base 128. The most significant 5867 // bit marks that there are more digits. 5868 // If the first byte is 0x80 (kNumberTerminator), it would normally 5869 // represent a leading zero. Since that is useless, and therefore won't 5870 // appear as the first digit of any actual value, it is used to 5871 // mark the end of the input stream. 5872 byte* data = *source; 5873 if (data >= symbol_data_end_) return -1; 5874 byte input = *data; 5875 if (input == PreparseDataConstants::kNumberTerminator) { 5876 // End of stream marker. 5877 return -1; 5878 } 5879 int result = input & 0x7f; 5880 data++; 5881 while ((input & 0x80u) != 0) { 5882 if (data >= symbol_data_end_) return -1; 5883 input = *data; 5884 result = (result << 7) | (input & 0x7f); 5885 data++; 5886 } 5887 *source = data; 5888 return result; 5889 } 5890 5891 5892 // Create a Scanner for the preparser to use as input, and preparse the source. 5893 static ScriptDataImpl* DoPreParse(Utf16CharacterStream* source, 5894 int flags, 5895 ParserRecorder* recorder) { 5896 Isolate* isolate = Isolate::Current(); 5897 HistogramTimerScope timer(isolate->counters()->pre_parse()); 5898 Scanner scanner(isolate->unicode_cache()); 5899 scanner.SetHarmonyScoping(FLAG_harmony_scoping); 5900 scanner.Initialize(source); 5901 intptr_t stack_limit = isolate->stack_guard()->real_climit(); 5902 preparser::PreParser::PreParseResult result = 5903 preparser::PreParser::PreParseProgram(&scanner, 5904 recorder, 5905 flags, 5906 stack_limit); 5907 if (result == preparser::PreParser::kPreParseStackOverflow) { 5908 isolate->StackOverflow(); 5909 return NULL; 5910 } 5911 5912 // Extract the accumulated data from the recorder as a single 5913 // contiguous vector that we are responsible for disposing. 5914 Vector<unsigned> store = recorder->ExtractData(); 5915 return new ScriptDataImpl(store); 5916 } 5917 5918 5919 // Preparse, but only collect data that is immediately useful, 5920 // even if the preparser data is only used once. 5921 ScriptDataImpl* ParserApi::PartialPreParse(Handle<String> source, 5922 v8::Extension* extension, 5923 int flags) { 5924 bool allow_lazy = FLAG_lazy && (extension == NULL); 5925 if (!allow_lazy) { 5926 // Partial preparsing is only about lazily compiled functions. 5927 // If we don't allow lazy compilation, the log data will be empty. 5928 return NULL; 5929 } 5930 flags |= kAllowLazy; 5931 PartialParserRecorder recorder; 5932 int source_length = source->length(); 5933 if (source->IsExternalTwoByteString()) { 5934 ExternalTwoByteStringUtf16CharacterStream stream( 5935 Handle<ExternalTwoByteString>::cast(source), 0, source_length); 5936 return DoPreParse(&stream, flags, &recorder); 5937 } else { 5938 GenericStringUtf16CharacterStream stream(source, 0, source_length); 5939 return DoPreParse(&stream, flags, &recorder); 5940 } 5941 } 5942 5943 5944 ScriptDataImpl* ParserApi::PreParse(Utf16CharacterStream* source, 5945 v8::Extension* extension, 5946 int flags) { 5947 Handle<Script> no_script; 5948 if (FLAG_lazy && (extension == NULL)) { 5949 flags |= kAllowLazy; 5950 } 5951 CompleteParserRecorder recorder; 5952 return DoPreParse(source, flags, &recorder); 5953 } 5954 5955 5956 bool RegExpParser::ParseRegExp(FlatStringReader* input, 5957 bool multiline, 5958 RegExpCompileData* result) { 5959 ASSERT(result != NULL); 5960 RegExpParser parser(input, &result->error, multiline); 5961 RegExpTree* tree = parser.ParsePattern(); 5962 if (parser.failed()) { 5963 ASSERT(tree == NULL); 5964 ASSERT(!result->error.is_null()); 5965 } else { 5966 ASSERT(tree != NULL); 5967 ASSERT(result->error.is_null()); 5968 result->tree = tree; 5969 int capture_count = parser.captures_started(); 5970 result->simple = tree->IsAtom() && parser.simple() && capture_count == 0; 5971 result->contains_anchor = parser.contains_anchor(); 5972 result->capture_count = capture_count; 5973 } 5974 return !parser.failed(); 5975 } 5976 5977 5978 bool ParserApi::Parse(CompilationInfo* info, int parsing_flags) { 5979 ASSERT(info->function() == NULL); 5980 FunctionLiteral* result = NULL; 5981 Handle<Script> script = info->script(); 5982 ASSERT((parsing_flags & kLanguageModeMask) == CLASSIC_MODE); 5983 if (!info->is_native() && FLAG_harmony_scoping) { 5984 // Harmony scoping is requested. 5985 parsing_flags |= EXTENDED_MODE; 5986 } 5987 if (!info->is_native() && FLAG_harmony_modules) { 5988 parsing_flags |= kAllowModules; 5989 } 5990 if (FLAG_allow_natives_syntax || info->is_native()) { 5991 // We require %identifier(..) syntax. 5992 parsing_flags |= kAllowNativesSyntax; 5993 } 5994 if (info->is_lazy()) { 5995 ASSERT(!info->is_eval()); 5996 Parser parser(script, parsing_flags, NULL, NULL); 5997 if (info->shared_info()->is_function()) { 5998 result = parser.ParseLazy(info); 5999 } else { 6000 result = parser.ParseProgram(info); 6001 } 6002 } else { 6003 ScriptDataImpl* pre_data = info->pre_parse_data(); 6004 Parser parser(script, parsing_flags, info->extension(), pre_data); 6005 if (pre_data != NULL && pre_data->has_error()) { 6006 Scanner::Location loc = pre_data->MessageLocation(); 6007 const char* message = pre_data->BuildMessage(); 6008 Vector<const char*> args = pre_data->BuildArgs(); 6009 parser.ReportMessageAt(loc, message, args); 6010 DeleteArray(message); 6011 for (int i = 0; i < args.length(); i++) { 6012 DeleteArray(args[i]); 6013 } 6014 DeleteArray(args.start()); 6015 ASSERT(info->isolate()->has_pending_exception()); 6016 } else { 6017 result = parser.ParseProgram(info); 6018 } 6019 } 6020 info->SetFunction(result); 6021 return (result != NULL); 6022 } 6023 6024 } } // namespace v8::internal 6025