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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/ast.h" | 8 #include "src/ast.h" |
9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
(...skipping 993 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1004 | 1004 |
1005 // Enters 'scope'. | 1005 // Enters 'scope'. |
1006 AstNodeFactory function_factory(ast_value_factory()); | 1006 AstNodeFactory function_factory(ast_value_factory()); |
1007 FunctionState function_state(&function_state_, &scope_, scope, | 1007 FunctionState function_state(&function_state_, &scope_, scope, |
1008 kNormalFunction, &function_factory); | 1008 kNormalFunction, &function_factory); |
1009 | 1009 |
1010 scope_->SetLanguageMode(info->language_mode()); | 1010 scope_->SetLanguageMode(info->language_mode()); |
1011 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); | 1011 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); |
1012 bool ok = true; | 1012 bool ok = true; |
1013 int beg_pos = scanner()->location().beg_pos; | 1013 int beg_pos = scanner()->location().beg_pos; |
1014 function_state.set_consecutive_class_declaration_batch_start(beg_pos); | |
1014 if (info->is_module()) { | 1015 if (info->is_module()) { |
1015 DCHECK(allow_harmony_modules()); | 1016 DCHECK(allow_harmony_modules()); |
1016 ParseModuleItemList(body, &ok); | 1017 ParseModuleItemList(body, &ok); |
1017 } else { | 1018 } else { |
1018 Scope* eval_scope = nullptr; | 1019 Scope* eval_scope = nullptr; |
1019 ParseStatementList(body, Token::EOS, info->is_eval(), &eval_scope, &ok); | 1020 ParseStatementList(body, Token::EOS, info->is_eval(), &eval_scope, &ok); |
1020 if (eval_scope != nullptr) | 1021 if (eval_scope != nullptr) |
1021 eval_scope->set_end_position(scanner()->peek_location().beg_pos); | 1022 eval_scope->set_end_position(scanner()->peek_location().beg_pos); |
1022 } | 1023 } |
1023 | 1024 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1123 // Ok to use Isolate here, since lazy function parsing is only done in the | 1124 // Ok to use Isolate here, since lazy function parsing is only done in the |
1124 // main thread. | 1125 // main thread. |
1125 DCHECK(parsing_on_main_thread_); | 1126 DCHECK(parsing_on_main_thread_); |
1126 scope = Scope::DeserializeScopeChain(isolate, zone(), | 1127 scope = Scope::DeserializeScopeChain(isolate, zone(), |
1127 info->closure()->context(), scope); | 1128 info->closure()->context(), scope); |
1128 } | 1129 } |
1129 original_scope_ = scope; | 1130 original_scope_ = scope; |
1130 AstNodeFactory function_factory(ast_value_factory()); | 1131 AstNodeFactory function_factory(ast_value_factory()); |
1131 FunctionState function_state(&function_state_, &scope_, scope, | 1132 FunctionState function_state(&function_state_, &scope_, scope, |
1132 shared_info->kind(), &function_factory); | 1133 shared_info->kind(), &function_factory); |
1134 function_state.set_consecutive_class_declaration_batch_start( | |
1135 scanner()->location().beg_pos); | |
1133 DCHECK(is_sloppy(scope->language_mode()) || | 1136 DCHECK(is_sloppy(scope->language_mode()) || |
1134 is_strict(info->language_mode())); | 1137 is_strict(info->language_mode())); |
1135 DCHECK(info->language_mode() == shared_info->language_mode()); | 1138 DCHECK(info->language_mode() == shared_info->language_mode()); |
1136 scope->SetLanguageMode(shared_info->language_mode()); | 1139 scope->SetLanguageMode(shared_info->language_mode()); |
1137 FunctionLiteral::FunctionType function_type = shared_info->is_expression() | 1140 FunctionLiteral::FunctionType function_type = shared_info->is_expression() |
1138 ? (shared_info->is_anonymous() | 1141 ? (shared_info->is_anonymous() |
1139 ? FunctionLiteral::ANONYMOUS_EXPRESSION | 1142 ? FunctionLiteral::ANONYMOUS_EXPRESSION |
1140 : FunctionLiteral::NAMED_EXPRESSION) | 1143 : FunctionLiteral::NAMED_EXPRESSION) |
1141 : FunctionLiteral::DECLARATION; | 1144 : FunctionLiteral::DECLARATION; |
1142 bool ok = true; | 1145 bool ok = true; |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1307 return 0; | 1310 return 0; |
1308 } | 1311 } |
1309 | 1312 |
1310 | 1313 |
1311 Statement* Parser::ParseStatementListItem(bool* ok) { | 1314 Statement* Parser::ParseStatementListItem(bool* ok) { |
1312 // (Ecma 262 6th Edition, 13.1): | 1315 // (Ecma 262 6th Edition, 13.1): |
1313 // StatementListItem: | 1316 // StatementListItem: |
1314 // Statement | 1317 // Statement |
1315 // Declaration | 1318 // Declaration |
1316 | 1319 |
1320 if (peek() != Token::CLASS) { | |
rossberg
2015/04/20 11:15:25
Hm, I'm not sure I fully understand the logic. You
marja
2015/04/20 15:58:22
Done + added a test for the counterexample (which
| |
1321 // No more classes follow; reset the start position for the consecutive | |
1322 // class declaration batch. | |
1323 function_state_->set_consecutive_class_declaration_batch_start( | |
1324 scanner()->peek_location().beg_pos); | |
1325 } | |
1326 | |
1317 switch (peek()) { | 1327 switch (peek()) { |
1318 case Token::FUNCTION: | 1328 case Token::FUNCTION: |
1319 return ParseFunctionDeclaration(NULL, ok); | 1329 return ParseFunctionDeclaration(NULL, ok); |
1320 case Token::CLASS: | 1330 case Token::CLASS: |
1321 return ParseClassDeclaration(NULL, ok); | 1331 return ParseClassDeclaration(NULL, ok); |
1322 case Token::CONST: | 1332 case Token::CONST: |
1323 case Token::VAR: | 1333 case Token::VAR: |
1324 return ParseVariableStatement(kStatementListItem, NULL, ok); | 1334 return ParseVariableStatement(kStatementListItem, NULL, ok); |
1325 case Token::LET: | 1335 case Token::LET: |
1326 if (is_strict(language_mode())) { | 1336 if (is_strict(language_mode())) { |
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1939 if (declaration_scope->is_function_scope() || | 1949 if (declaration_scope->is_function_scope() || |
1940 declaration_scope->is_strict_eval_scope() || | 1950 declaration_scope->is_strict_eval_scope() || |
1941 declaration_scope->is_block_scope() || | 1951 declaration_scope->is_block_scope() || |
1942 declaration_scope->is_module_scope() || | 1952 declaration_scope->is_module_scope() || |
1943 declaration_scope->is_script_scope()) { | 1953 declaration_scope->is_script_scope()) { |
1944 // Declare the variable in the declaration scope. | 1954 // Declare the variable in the declaration scope. |
1945 var = declaration_scope->LookupLocal(name); | 1955 var = declaration_scope->LookupLocal(name); |
1946 if (var == NULL) { | 1956 if (var == NULL) { |
1947 // Declare the name. | 1957 // Declare the name. |
1948 Variable::Kind kind = Variable::NORMAL; | 1958 Variable::Kind kind = Variable::NORMAL; |
1959 int consecutive_declaration_batch_start = -1; | |
1949 if (declaration->IsFunctionDeclaration()) { | 1960 if (declaration->IsFunctionDeclaration()) { |
1950 kind = Variable::FUNCTION; | 1961 kind = Variable::FUNCTION; |
1951 } else if (declaration->IsVariableDeclaration() && | 1962 } else if (declaration->IsVariableDeclaration() && |
1952 declaration->AsVariableDeclaration()->is_class_declaration()) { | 1963 declaration->AsVariableDeclaration()->is_class_declaration()) { |
1953 kind = Variable::CLASS; | 1964 kind = Variable::CLASS; |
1965 consecutive_declaration_batch_start = | |
1966 declaration->AsVariableDeclaration() | |
1967 ->consecutive_declaration_batch_start(); | |
1954 } | 1968 } |
1955 var = declaration_scope->DeclareLocal( | 1969 var = declaration_scope->DeclareLocal( |
1956 name, mode, declaration->initialization(), kind, kNotAssigned); | 1970 name, mode, declaration->initialization(), kind, kNotAssigned, |
1971 consecutive_declaration_batch_start); | |
1957 } else if (IsLexicalVariableMode(mode) || | 1972 } else if (IsLexicalVariableMode(mode) || |
1958 IsLexicalVariableMode(var->mode()) || | 1973 IsLexicalVariableMode(var->mode()) || |
1959 ((mode == CONST_LEGACY || var->mode() == CONST_LEGACY) && | 1974 ((mode == CONST_LEGACY || var->mode() == CONST_LEGACY) && |
1960 !declaration_scope->is_script_scope())) { | 1975 !declaration_scope->is_script_scope())) { |
1961 // The name was declared in this scope before; check for conflicting | 1976 // The name was declared in this scope before; check for conflicting |
1962 // re-declarations. We have a conflict if either of the declarations is | 1977 // re-declarations. We have a conflict if either of the declarations is |
1963 // not a var (in script scope, we also have to ignore legacy const for | 1978 // not a var (in script scope, we also have to ignore legacy const for |
1964 // compatibility). There is similar code in runtime.cc in the Declare | 1979 // compatibility). There is similar code in runtime.cc in the Declare |
1965 // functions. The function CheckConflictingVarDeclarations checks for | 1980 // functions. The function CheckConflictingVarDeclarations checks for |
1966 // var and let bindings from different scopes whereas this is a check for | 1981 // var and let bindings from different scopes whereas this is a check for |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2166 bool is_strict_reserved = false; | 2181 bool is_strict_reserved = false; |
2167 const AstRawString* name = | 2182 const AstRawString* name = |
2168 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | 2183 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
2169 ClassLiteral* value = ParseClassLiteral(name, scanner()->location(), | 2184 ClassLiteral* value = ParseClassLiteral(name, scanner()->location(), |
2170 is_strict_reserved, pos, CHECK_OK); | 2185 is_strict_reserved, pos, CHECK_OK); |
2171 | 2186 |
2172 VariableMode mode = is_strong(language_mode()) ? CONST : LET; | 2187 VariableMode mode = is_strong(language_mode()) ? CONST : LET; |
2173 VariableProxy* proxy = NewUnresolved(name, mode); | 2188 VariableProxy* proxy = NewUnresolved(name, mode); |
2174 const bool is_class_declaration = true; | 2189 const bool is_class_declaration = true; |
2175 Declaration* declaration = factory()->NewVariableDeclaration( | 2190 Declaration* declaration = factory()->NewVariableDeclaration( |
2176 proxy, mode, scope_, pos, is_class_declaration); | 2191 proxy, mode, scope_, pos, is_class_declaration, |
2192 function_state_->consecutive_class_declaration_batch_start()); | |
2177 Declare(declaration, true, CHECK_OK); | 2193 Declare(declaration, true, CHECK_OK); |
2178 proxy->var()->set_initializer_position(position()); | 2194 proxy->var()->set_initializer_position(position()); |
2179 | 2195 |
2180 Token::Value init_op = | 2196 Token::Value init_op = |
2181 is_strong(language_mode()) ? Token::INIT_CONST : Token::INIT_LET; | 2197 is_strong(language_mode()) ? Token::INIT_CONST : Token::INIT_LET; |
2182 Assignment* assignment = factory()->NewAssignment(init_op, proxy, value, pos); | 2198 Assignment* assignment = factory()->NewAssignment(init_op, proxy, value, pos); |
2183 Statement* assignment_statement = | 2199 Statement* assignment_statement = |
2184 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); | 2200 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); |
2185 if (names) names->Add(name, zone()); | 2201 if (names) names->Add(name, zone()); |
2186 return assignment_statement; | 2202 return assignment_statement; |
(...skipping 1713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3900 // expressions. This also marks the FunctionState as a generator. | 3916 // expressions. This also marks the FunctionState as a generator. |
3901 Variable* temp = scope_->DeclarationScope()->NewTemporary( | 3917 Variable* temp = scope_->DeclarationScope()->NewTemporary( |
3902 ast_value_factory()->dot_generator_object_string()); | 3918 ast_value_factory()->dot_generator_object_string()); |
3903 function_state.set_generator_object_variable(temp); | 3919 function_state.set_generator_object_variable(temp); |
3904 } | 3920 } |
3905 | 3921 |
3906 // FormalParameterList :: | 3922 // FormalParameterList :: |
3907 // '(' (Identifier)*[','] ')' | 3923 // '(' (Identifier)*[','] ')' |
3908 Expect(Token::LPAREN, CHECK_OK); | 3924 Expect(Token::LPAREN, CHECK_OK); |
3909 scope->set_start_position(scanner()->location().beg_pos); | 3925 scope->set_start_position(scanner()->location().beg_pos); |
3926 function_state.set_consecutive_class_declaration_batch_start( | |
3927 scanner()->location().beg_pos); | |
3910 | 3928 |
3911 // We don't yet know if the function will be strict, so we cannot yet | 3929 // We don't yet know if the function will be strict, so we cannot yet |
3912 // produce errors for parameter names or duplicates. However, we remember | 3930 // produce errors for parameter names or duplicates. However, we remember |
3913 // the locations of these errors if they occur and produce the errors later. | 3931 // the locations of these errors if they occur and produce the errors later. |
3914 Scanner::Location eval_args_loc = Scanner::Location::invalid(); | 3932 Scanner::Location eval_args_loc = Scanner::Location::invalid(); |
3915 Scanner::Location dupe_loc = Scanner::Location::invalid(); | 3933 Scanner::Location dupe_loc = Scanner::Location::invalid(); |
3916 Scanner::Location reserved_loc = Scanner::Location::invalid(); | 3934 Scanner::Location reserved_loc = Scanner::Location::invalid(); |
3917 | 3935 |
3918 // Similarly for strong mode. | 3936 // Similarly for strong mode. |
3919 Scanner::Location undefined_loc = Scanner::Location::invalid(); | 3937 Scanner::Location undefined_loc = Scanner::Location::invalid(); |
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4324 Scope* block_scope = NewScope(scope_, BLOCK_SCOPE); | 4342 Scope* block_scope = NewScope(scope_, BLOCK_SCOPE); |
4325 block_scope->tag_as_class_scope(); | 4343 block_scope->tag_as_class_scope(); |
4326 BlockState block_state(&scope_, block_scope); | 4344 BlockState block_state(&scope_, block_scope); |
4327 scope_->SetLanguageMode( | 4345 scope_->SetLanguageMode( |
4328 static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT)); | 4346 static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT)); |
4329 scope_->SetScopeName(name); | 4347 scope_->SetScopeName(name); |
4330 | 4348 |
4331 VariableProxy* proxy = NULL; | 4349 VariableProxy* proxy = NULL; |
4332 if (name != NULL) { | 4350 if (name != NULL) { |
4333 proxy = NewUnresolved(name, CONST); | 4351 proxy = NewUnresolved(name, CONST); |
4334 Declaration* declaration = | 4352 const bool is_class_declaration = true; |
4335 factory()->NewVariableDeclaration(proxy, CONST, block_scope, pos); | 4353 Declaration* declaration = factory()->NewVariableDeclaration( |
4354 proxy, CONST, block_scope, pos, is_class_declaration, | |
4355 function_state_->consecutive_class_declaration_batch_start()); | |
4336 Declare(declaration, true, CHECK_OK); | 4356 Declare(declaration, true, CHECK_OK); |
4337 } | 4357 } |
4338 | 4358 |
4339 Expression* extends = NULL; | 4359 Expression* extends = NULL; |
4340 if (Check(Token::EXTENDS)) { | 4360 if (Check(Token::EXTENDS)) { |
4341 block_scope->set_start_position(scanner()->location().end_pos); | 4361 block_scope->set_start_position(scanner()->location().end_pos); |
4342 extends = ParseLeftHandSideExpression(CHECK_OK); | 4362 extends = ParseLeftHandSideExpression(CHECK_OK); |
4343 } else { | 4363 } else { |
4344 block_scope->set_start_position(scanner()->location().end_pos); | 4364 block_scope->set_start_position(scanner()->location().end_pos); |
4345 } | 4365 } |
(...skipping 1435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5781 | 5801 |
5782 Expression* Parser::SpreadCallNew(Expression* function, | 5802 Expression* Parser::SpreadCallNew(Expression* function, |
5783 ZoneList<v8::internal::Expression*>* args, | 5803 ZoneList<v8::internal::Expression*>* args, |
5784 int pos) { | 5804 int pos) { |
5785 args->InsertAt(0, function, zone()); | 5805 args->InsertAt(0, function, zone()); |
5786 | 5806 |
5787 return factory()->NewCallRuntime( | 5807 return factory()->NewCallRuntime( |
5788 ast_value_factory()->reflect_construct_string(), NULL, args, pos); | 5808 ast_value_factory()->reflect_construct_string(), NULL, args, pos); |
5789 } | 5809 } |
5790 } } // namespace v8::internal | 5810 } } // namespace v8::internal |
OLD | NEW |