OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/parsing/parser.h" | 5 #include "src/parsing/parser.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "src/api.h" | 9 #include "src/api.h" |
10 #include "src/ast/ast-expression-rewriter.h" | 10 #include "src/ast/ast-expression-rewriter.h" |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 | 508 |
509 Expression* Parser::NewV8Intrinsic(const AstRawString* name, | 509 Expression* Parser::NewV8Intrinsic(const AstRawString* name, |
510 ZoneList<Expression*>* args, int pos, | 510 ZoneList<Expression*>* args, int pos, |
511 bool* ok) { | 511 bool* ok) { |
512 if (extension_ != nullptr) { | 512 if (extension_ != nullptr) { |
513 // The extension structures are only accessible while parsing the | 513 // The extension structures are only accessible while parsing the |
514 // very first time, not when reparsing because of lazy compilation. | 514 // very first time, not when reparsing because of lazy compilation. |
515 GetClosureScope()->ForceEagerCompilation(); | 515 GetClosureScope()->ForceEagerCompilation(); |
516 } | 516 } |
517 | 517 |
518 const Runtime::Function* function = Runtime::FunctionForName(name->string()); | 518 DCHECK(name->is_one_byte()); |
| 519 const Runtime::Function* function = |
| 520 Runtime::FunctionForName(name->raw_data(), name->length()); |
519 | 521 |
520 if (function != nullptr) { | 522 if (function != nullptr) { |
521 // Check for possible name clash. | 523 // Check for possible name clash. |
522 DCHECK_EQ(Context::kNotFound, | 524 DCHECK_EQ(Context::kNotFound, |
523 Context::IntrinsicIndexForName(name->string())); | 525 Context::IntrinsicIndexForName(name->raw_data(), name->length())); |
524 // Check for built-in IS_VAR macro. | 526 // Check for built-in IS_VAR macro. |
525 if (function->function_id == Runtime::kIS_VAR) { | 527 if (function->function_id == Runtime::kIS_VAR) { |
526 DCHECK_EQ(Runtime::RUNTIME, function->intrinsic_type); | 528 DCHECK_EQ(Runtime::RUNTIME, function->intrinsic_type); |
527 // %IS_VAR(x) evaluates to x if x is a variable, | 529 // %IS_VAR(x) evaluates to x if x is a variable, |
528 // leads to a parse error otherwise. Could be implemented as an | 530 // leads to a parse error otherwise. Could be implemented as an |
529 // inline function %_IS_VAR(x) to eliminate this special case. | 531 // inline function %_IS_VAR(x) to eliminate this special case. |
530 if (args->length() == 1 && args->at(0)->AsVariableProxy() != nullptr) { | 532 if (args->length() == 1 && args->at(0)->AsVariableProxy() != nullptr) { |
531 return args->at(0); | 533 return args->at(0); |
532 } else { | 534 } else { |
533 ReportMessage(MessageTemplate::kNotIsvar); | 535 ReportMessage(MessageTemplate::kNotIsvar); |
534 *ok = false; | 536 *ok = false; |
535 return nullptr; | 537 return nullptr; |
536 } | 538 } |
537 } | 539 } |
538 | 540 |
539 // Check that the expected number of arguments are being passed. | 541 // Check that the expected number of arguments are being passed. |
540 if (function->nargs != -1 && function->nargs != args->length()) { | 542 if (function->nargs != -1 && function->nargs != args->length()) { |
541 ReportMessage(MessageTemplate::kRuntimeWrongNumArgs); | 543 ReportMessage(MessageTemplate::kRuntimeWrongNumArgs); |
542 *ok = false; | 544 *ok = false; |
543 return nullptr; | 545 return nullptr; |
544 } | 546 } |
545 | 547 |
546 return factory()->NewCallRuntime(function, args, pos); | 548 return factory()->NewCallRuntime(function, args, pos); |
547 } | 549 } |
548 | 550 |
549 int context_index = Context::IntrinsicIndexForName(name->string()); | 551 int context_index = |
| 552 Context::IntrinsicIndexForName(name->raw_data(), name->length()); |
550 | 553 |
551 // Check that the function is defined. | 554 // Check that the function is defined. |
552 if (context_index == Context::kNotFound) { | 555 if (context_index == Context::kNotFound) { |
553 ReportMessage(MessageTemplate::kNotDefined, name); | 556 ReportMessage(MessageTemplate::kNotDefined, name); |
554 *ok = false; | 557 *ok = false; |
555 return nullptr; | 558 return nullptr; |
556 } | 559 } |
557 | 560 |
558 return factory()->NewCallRuntime(context_index, args, pos); | 561 return factory()->NewCallRuntime(context_index, args, pos); |
559 } | 562 } |
(...skipping 3869 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4429 } | 4432 } |
4430 | 4433 |
4431 | 4434 |
4432 bool Parser::Parse(ParseInfo* info) { | 4435 bool Parser::Parse(ParseInfo* info) { |
4433 DCHECK(info->literal() == NULL); | 4436 DCHECK(info->literal() == NULL); |
4434 FunctionLiteral* result = NULL; | 4437 FunctionLiteral* result = NULL; |
4435 // Ok to use Isolate here; this function is only called in the main thread. | 4438 // Ok to use Isolate here; this function is only called in the main thread. |
4436 DCHECK(parsing_on_main_thread_); | 4439 DCHECK(parsing_on_main_thread_); |
4437 Isolate* isolate = info->isolate(); | 4440 Isolate* isolate = info->isolate(); |
4438 pre_parse_timer_ = isolate->counters()->pre_parse(); | 4441 pre_parse_timer_ = isolate->counters()->pre_parse(); |
4439 if (FLAG_trace_parse || allow_natives() || extension_ != NULL) { | |
4440 // If intrinsics are allowed, the Parser cannot operate independent of the | |
4441 // V8 heap because of Runtime. Tell the string table to internalize strings | |
4442 // and values right after they're created. | |
4443 ast_value_factory()->Internalize(isolate); | |
4444 } | |
4445 | 4442 |
4446 if (info->is_lazy()) { | 4443 if (info->is_lazy()) { |
4447 DCHECK(!info->is_eval()); | 4444 DCHECK(!info->is_eval()); |
4448 if (info->shared_info()->is_function()) { | 4445 if (info->shared_info()->is_function()) { |
4449 result = ParseLazy(isolate, info); | 4446 result = ParseLazy(isolate, info); |
4450 } else { | 4447 } else { |
4451 result = ParseProgram(isolate, info); | 4448 result = ParseProgram(isolate, info); |
4452 } | 4449 } |
4453 } else { | 4450 } else { |
4454 SetCachedData(info); | 4451 SetCachedData(info); |
(...skipping 1552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6007 node->Print(Isolate::Current()); | 6004 node->Print(Isolate::Current()); |
6008 } | 6005 } |
6009 #endif // DEBUG | 6006 #endif // DEBUG |
6010 | 6007 |
6011 #undef CHECK_OK | 6008 #undef CHECK_OK |
6012 #undef CHECK_OK_VOID | 6009 #undef CHECK_OK_VOID |
6013 #undef CHECK_FAILED | 6010 #undef CHECK_FAILED |
6014 | 6011 |
6015 } // namespace internal | 6012 } // namespace internal |
6016 } // namespace v8 | 6013 } // namespace v8 |
OLD | NEW |