| Index: src/parser.cc
|
| diff --git a/src/parser.cc b/src/parser.cc
|
| index 9435e703daa1ba4a0c9301f875382887bfaafb00..de4457c3dd991b3ab36bc54ff16024000608a66c 100644
|
| --- a/src/parser.cc
|
| +++ b/src/parser.cc
|
| @@ -601,8 +601,8 @@ Parser::Parser(Handle<Script> script,
|
| fni_(NULL),
|
| allow_natives_syntax_(allow_natives_syntax),
|
| stack_overflow_(false),
|
| - parenthesized_function_(false),
|
| - harmony_scoping_(false) {
|
| + parenthesized_function_(false) {
|
| + scanner().SetHarmonyScoping(FLAG_harmony_scoping);
|
| AstNode::ResetIds();
|
| }
|
|
|
| @@ -666,7 +666,7 @@ FunctionLiteral* Parser::DoParseProgram(Handle<String> source,
|
| CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok);
|
| }
|
|
|
| - if (ok && harmony_scoping_) {
|
| + if (ok && is_extended_mode()) {
|
| CheckConflictingVarDeclarations(scope, &ok);
|
| }
|
|
|
| @@ -833,10 +833,6 @@ void Parser::ReportMessageAt(Scanner::Location source_location,
|
| isolate()->Throw(*result, &location);
|
| }
|
|
|
| -void Parser::SetHarmonyScoping(bool block_scoping) {
|
| - scanner().SetHarmonyScoping(block_scoping);
|
| - harmony_scoping_ = block_scoping;
|
| -}
|
|
|
| // Base class containing common code for the different finder classes used by
|
| // the parser.
|
| @@ -1199,7 +1195,8 @@ void* Parser::ParseSourceElements(ZoneList<Statement*>* processor,
|
| directive->Equals(isolate()->heap()->use_strict()) &&
|
| token_loc.end_pos - token_loc.beg_pos ==
|
| isolate()->heap()->use_strict()->length() + 2) {
|
| - top_scope_->SetLanguageMode(harmony_scoping_
|
| + // TODO(ES6): Fix entering extended mode, once it is specified.
|
| + top_scope_->SetLanguageMode(FLAG_harmony_scoping
|
| ? EXTENDED_MODE : STRICT_MODE);
|
| // "use strict" is the only directive for now.
|
| directive_prologue = false;
|
| @@ -1413,7 +1410,7 @@ VariableProxy* Parser::Declare(Handle<String> name,
|
| var->mode() == CONST ||
|
| var->mode() == CONST_HARMONY ||
|
| var->mode() == LET);
|
| - if (harmony_scoping_) {
|
| + if (is_extended_mode()) {
|
| // In harmony mode we treat re-declarations as early errors. See
|
| // ES5 16 for a definition of early errors.
|
| SmartArrayPointer<char> c_string = name->ToCString(DISALLOW_NULLS);
|
| @@ -1571,7 +1568,7 @@ Statement* Parser::ParseFunctionDeclaration(bool* ok) {
|
| // Even if we're not at the top-level of the global or a function
|
| // scope, we treat is as such and introduce the function with it's
|
| // initial value upon entering the corresponding scope.
|
| - VariableMode mode = harmony_scoping_ ? LET : VAR;
|
| + VariableMode mode = is_extended_mode() ? LET : VAR;
|
| Declare(name, mode, fun, true, CHECK_OK);
|
| return EmptyStatement();
|
| }
|
| @@ -2304,7 +2301,7 @@ TryStatement* Parser::ParseTryStatement(bool* ok) {
|
|
|
| if (peek() == Token::LBRACE) {
|
| Target target(&this->target_stack_, &catch_collector);
|
| - VariableMode mode = harmony_scoping_ ? LET : VAR;
|
| + VariableMode mode = is_extended_mode() ? LET : VAR;
|
| catch_variable =
|
| catch_scope->DeclareLocal(name, mode, kCreatedInitialized);
|
|
|
| @@ -3915,7 +3912,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name,
|
| // Function declarations are function scoped in normal mode, so they are
|
| // hoisted. In harmony block scoping mode they are block scoped, so they
|
| // are not hoisted.
|
| - Scope* scope = (type == FunctionLiteral::DECLARATION && !harmony_scoping_)
|
| + Scope* scope = (type == FunctionLiteral::DECLARATION && !is_extended_mode())
|
| ? NewScope(top_scope_->DeclarationScope(), FUNCTION_SCOPE)
|
| : NewScope(top_scope_, FUNCTION_SCOPE);
|
| ZoneList<Statement*>* body = NULL;
|
| @@ -3956,7 +3953,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name,
|
| reserved_loc = scanner().location();
|
| }
|
|
|
| - top_scope_->DeclareParameter(param_name, harmony_scoping_ ? LET : VAR);
|
| + top_scope_->DeclareParameter(param_name, is_extended_mode() ? LET : VAR);
|
| num_parameters++;
|
| if (num_parameters > kMaxNumFunctionParameters) {
|
| ReportMessageAt(scanner().location(), "too_many_parameters",
|
| @@ -3981,7 +3978,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name,
|
| Token::Value fvar_init_op = Token::INIT_CONST;
|
| if (type == FunctionLiteral::NAMED_EXPRESSION) {
|
| VariableMode fvar_mode;
|
| - if (harmony_scoping_) {
|
| + if (is_extended_mode()) {
|
| fvar_mode = CONST_HARMONY;
|
| fvar_init_op = Token::INIT_CONST_HARMONY;
|
| } else {
|
| @@ -4099,7 +4096,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name,
|
| }
|
| }
|
|
|
| - if (harmony_scoping_) {
|
| + if (is_extended_mode()) {
|
| CheckConflictingVarDeclarations(scope, CHECK_OK);
|
| }
|
|
|
| @@ -5338,7 +5335,7 @@ static ScriptDataImpl* DoPreParse(UC16CharacterStream* source,
|
| ParserRecorder* recorder) {
|
| Isolate* isolate = Isolate::Current();
|
| Scanner scanner(isolate->unicode_cache());
|
| - scanner.SetHarmonyScoping((flags & kHarmonyScoping) != 0);
|
| + scanner.SetHarmonyScoping(FLAG_harmony_scoping);
|
| scanner.Initialize(source);
|
| intptr_t stack_limit = isolate->stack_guard()->real_climit();
|
| if (!preparser::PreParser::PreParseProgram(&scanner,
|
| @@ -5411,13 +5408,11 @@ bool ParserApi::Parse(CompilationInfo* info) {
|
| ASSERT(info->function() == NULL);
|
| FunctionLiteral* result = NULL;
|
| Handle<Script> script = info->script();
|
| - bool harmony_scoping = !info->is_native() && FLAG_harmony_scoping;
|
| if (info->is_lazy()) {
|
| bool allow_natives_syntax =
|
| FLAG_allow_natives_syntax ||
|
| info->is_native();
|
| Parser parser(script, allow_natives_syntax, NULL, NULL);
|
| - parser.SetHarmonyScoping(harmony_scoping);
|
| result = parser.ParseLazy(info);
|
| } else {
|
| // Whether we allow %identifier(..) syntax.
|
| @@ -5428,7 +5423,6 @@ bool ParserApi::Parse(CompilationInfo* info) {
|
| allow_natives_syntax,
|
| info->extension(),
|
| pre_data);
|
| - parser.SetHarmonyScoping(harmony_scoping);
|
| if (pre_data != NULL && pre_data->has_error()) {
|
| Scanner::Location loc = pre_data->MessageLocation();
|
| const char* message = pre_data->BuildMessage();
|
|
|