| 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 910 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 921 DCHECK(parsing_on_main_thread_); | 921 DCHECK(parsing_on_main_thread_); |
| 922 ast_value_factory()->Internalize(info->isolate()); | 922 ast_value_factory()->Internalize(info->isolate()); |
| 923 } | 923 } |
| 924 original_scope_ = *scope; | 924 original_scope_ = *scope; |
| 925 if (info->is_eval()) { | 925 if (info->is_eval()) { |
| 926 if (!(*scope)->is_script_scope() || is_strict(info->language_mode())) { | 926 if (!(*scope)->is_script_scope() || is_strict(info->language_mode())) { |
| 927 *scope = NewScope(*scope, EVAL_SCOPE); | 927 *scope = NewScope(*scope, EVAL_SCOPE); |
| 928 } | 928 } |
| 929 } else if (info->is_global()) { | 929 } else if (info->is_global()) { |
| 930 *scope = NewScope(*scope, SCRIPT_SCOPE); | 930 *scope = NewScope(*scope, SCRIPT_SCOPE); |
| 931 } else if (info->is_module()) { |
| 932 *scope = NewScope(*scope, MODULE_SCOPE); |
| 931 } | 933 } |
| 932 (*scope)->set_start_position(0); | 934 (*scope)->set_start_position(0); |
| 933 // End position will be set by the caller. | 935 // End position will be set by the caller. |
| 934 | 936 |
| 935 // Compute the parsing mode. | 937 // Compute the parsing mode. |
| 936 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY; | 938 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY; |
| 937 if (allow_natives() || extension_ != NULL || | 939 if (allow_natives() || extension_ != NULL || |
| 938 (*scope)->is_eval_scope()) { | 940 (*scope)->is_eval_scope()) { |
| 939 mode = PARSE_EAGERLY; | 941 mode = PARSE_EAGERLY; |
| 940 } | 942 } |
| 941 ParsingModeScope parsing_mode(this, mode); | 943 ParsingModeScope parsing_mode(this, mode); |
| 942 | 944 |
| 943 // Enters 'scope'. | 945 // Enters 'scope'. |
| 944 AstNodeFactory function_factory(ast_value_factory()); | 946 AstNodeFactory function_factory(ast_value_factory()); |
| 945 FunctionState function_state(&function_state_, &scope_, *scope, | 947 FunctionState function_state(&function_state_, &scope_, *scope, |
| 946 kNormalFunction, &function_factory); | 948 kNormalFunction, &function_factory); |
| 947 | 949 |
| 948 scope_->SetLanguageMode(info->language_mode()); | 950 scope_->SetLanguageMode(info->language_mode()); |
| 949 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); | 951 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); |
| 950 bool ok = true; | 952 bool ok = true; |
| 951 int beg_pos = scanner()->location().beg_pos; | 953 int beg_pos = scanner()->location().beg_pos; |
| 952 if (info->is_module()) { | 954 if (info->is_module()) { |
| 953 DCHECK(allow_harmony_modules()); | 955 DCHECK(allow_harmony_modules()); |
| 954 Statement* stmt = ParseModule(&ok); | 956 ParseModule(body, &ok); |
| 955 if (ok) { | |
| 956 body->Add(stmt, zone()); | |
| 957 } | |
| 958 } else { | 957 } else { |
| 959 ParseStatementList(body, Token::EOS, info->is_eval(), eval_scope, &ok); | 958 ParseStatementList(body, Token::EOS, info->is_eval(), eval_scope, &ok); |
| 960 } | 959 } |
| 961 | 960 |
| 962 if (ok && is_strict(language_mode())) { | 961 if (ok && is_strict(language_mode())) { |
| 963 CheckStrictOctalLiteral(beg_pos, scanner()->location().end_pos, &ok); | 962 CheckStrictOctalLiteral(beg_pos, scanner()->location().end_pos, &ok); |
| 964 } | 963 } |
| 965 | 964 |
| 966 if (ok && allow_harmony_scoping() && is_strict(language_mode())) { | 965 if (ok && allow_harmony_scoping() && is_strict(language_mode())) { |
| 967 CheckConflictingVarDeclarations(scope_, &ok); | 966 CheckConflictingVarDeclarations(scope_, &ok); |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1247 case Token::IMPORT: | 1246 case Token::IMPORT: |
| 1248 return ParseImportDeclaration(ok); | 1247 return ParseImportDeclaration(ok); |
| 1249 case Token::EXPORT: | 1248 case Token::EXPORT: |
| 1250 return ParseExportDeclaration(ok); | 1249 return ParseExportDeclaration(ok); |
| 1251 default: | 1250 default: |
| 1252 return ParseStatementListItem(ok); | 1251 return ParseStatementListItem(ok); |
| 1253 } | 1252 } |
| 1254 } | 1253 } |
| 1255 | 1254 |
| 1256 | 1255 |
| 1257 Statement* Parser::ParseModule(bool* ok) { | 1256 void* Parser::ParseModule(ZoneList<Statement*>* body, bool* ok) { |
| 1258 // (Ecma 262 6th Edition, 15.2): | 1257 // (Ecma 262 6th Edition, 15.2): |
| 1259 // Module : | 1258 // Module : |
| 1260 // ModuleBody? | 1259 // ModuleBody? |
| 1261 // | 1260 // |
| 1262 // ModuleBody : | 1261 // ModuleBody : |
| 1263 // ModuleItem* | 1262 // ModuleItem* |
| 1264 | 1263 |
| 1265 Block* body = factory()->NewBlock(NULL, 16, false, RelocInfo::kNoPosition); | 1264 DCHECK(scope_->is_module_scope()); |
| 1266 Scope* scope = NewScope(scope_, MODULE_SCOPE); | 1265 scope_->SetLanguageMode( |
| 1267 scope->set_start_position(scanner()->location().beg_pos); | 1266 static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT)); |
| 1268 scope->SetLanguageMode( | |
| 1269 static_cast<LanguageMode>(scope->language_mode() | STRICT_BIT)); | |
| 1270 | 1267 |
| 1271 { | 1268 while (peek() != Token::EOS) { |
| 1272 BlockState block_state(&scope_, scope); | 1269 Statement* stat = ParseModuleItem(CHECK_OK); |
| 1273 | 1270 if (stat && !stat->IsEmpty()) { |
| 1274 while (peek() != Token::EOS) { | 1271 body->Add(stat, zone()); |
| 1275 Statement* stat = ParseModuleItem(CHECK_OK); | |
| 1276 if (stat && !stat->IsEmpty()) { | |
| 1277 body->AddStatement(stat, zone()); | |
| 1278 } | |
| 1279 } | 1272 } |
| 1280 } | 1273 } |
| 1281 | 1274 |
| 1282 scope->set_end_position(scanner()->location().end_pos); | |
| 1283 body->set_scope(scope); | |
| 1284 | |
| 1285 // Check that all exports are bound. | 1275 // Check that all exports are bound. |
| 1286 ModuleDescriptor* descriptor = scope->module(); | 1276 ModuleDescriptor* descriptor = scope_->module(); |
| 1287 for (ModuleDescriptor::Iterator it = descriptor->iterator(); !it.done(); | 1277 for (ModuleDescriptor::Iterator it = descriptor->iterator(); !it.done(); |
| 1288 it.Advance()) { | 1278 it.Advance()) { |
| 1289 if (scope->LookupLocal(it.local_name()) == NULL) { | 1279 if (scope_->LookupLocal(it.local_name()) == NULL) { |
| 1290 // TODO(adamk): Pass both local_name and export_name once ParserTraits | 1280 // TODO(adamk): Pass both local_name and export_name once ParserTraits |
| 1291 // supports multiple arg error messages. | 1281 // supports multiple arg error messages. |
| 1292 // Also try to report this at a better location. | 1282 // Also try to report this at a better location. |
| 1293 ParserTraits::ReportMessage("module_export_undefined", it.local_name()); | 1283 ParserTraits::ReportMessage("module_export_undefined", it.local_name()); |
| 1294 *ok = false; | 1284 *ok = false; |
| 1295 return NULL; | 1285 return NULL; |
| 1296 } | 1286 } |
| 1297 } | 1287 } |
| 1298 | 1288 |
| 1299 scope->module()->Freeze(); | 1289 scope_->module()->Freeze(); |
| 1300 return body; | 1290 return NULL; |
| 1301 } | 1291 } |
| 1302 | 1292 |
| 1303 | 1293 |
| 1304 Literal* Parser::ParseModuleSpecifier(bool* ok) { | 1294 Literal* Parser::ParseModuleSpecifier(bool* ok) { |
| 1305 // ModuleSpecifier : | 1295 // ModuleSpecifier : |
| 1306 // StringLiteral | 1296 // StringLiteral |
| 1307 | 1297 |
| 1308 int pos = peek_position(); | 1298 int pos = peek_position(); |
| 1309 Expect(Token::STRING, CHECK_OK); | 1299 Expect(Token::STRING, CHECK_OK); |
| 1310 return factory()->NewStringLiteral(GetSymbol(scanner()), pos); | 1300 return factory()->NewStringLiteral(GetSymbol(scanner()), pos); |
| (...skipping 4174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5485 } else { | 5475 } else { |
| 5486 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); | 5476 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); |
| 5487 running_hash = StringHasher::ComputeRunningHash(running_hash, data, | 5477 running_hash = StringHasher::ComputeRunningHash(running_hash, data, |
| 5488 raw_string->length()); | 5478 raw_string->length()); |
| 5489 } | 5479 } |
| 5490 } | 5480 } |
| 5491 | 5481 |
| 5492 return running_hash; | 5482 return running_hash; |
| 5493 } | 5483 } |
| 5494 } } // namespace v8::internal | 5484 } } // namespace v8::internal |
| OLD | NEW |