| 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/compiler.h" | 5 #include "src/compiler.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "src/ast/ast-numbering.h" | 9 #include "src/ast/ast-numbering.h" |
| 10 #include "src/ast/prettyprinter.h" | 10 #include "src/ast/prettyprinter.h" |
| (...skipping 1465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1476 LanguageMode language_mode = construct_language_mode(FLAG_use_strict); | 1476 LanguageMode language_mode = construct_language_mode(FLAG_use_strict); |
| 1477 CompilationCache* compilation_cache = isolate->compilation_cache(); | 1477 CompilationCache* compilation_cache = isolate->compilation_cache(); |
| 1478 | 1478 |
| 1479 // Do a lookup in the compilation cache but not for extensions. | 1479 // Do a lookup in the compilation cache but not for extensions. |
| 1480 MaybeHandle<SharedFunctionInfo> maybe_result; | 1480 MaybeHandle<SharedFunctionInfo> maybe_result; |
| 1481 Handle<SharedFunctionInfo> result; | 1481 Handle<SharedFunctionInfo> result; |
| 1482 if (extension == NULL) { | 1482 if (extension == NULL) { |
| 1483 // First check per-isolate compilation cache. | 1483 // First check per-isolate compilation cache. |
| 1484 maybe_result = compilation_cache->LookupScript( | 1484 maybe_result = compilation_cache->LookupScript( |
| 1485 source, script_name, line_offset, column_offset, resource_options, | 1485 source, script_name, line_offset, column_offset, resource_options, |
| 1486 context, language_mode); | 1486 context, language_mode, is_module); |
| 1487 if (maybe_result.is_null() && FLAG_serialize_toplevel && | 1487 if (maybe_result.is_null() && FLAG_serialize_toplevel && |
| 1488 compile_options == ScriptCompiler::kConsumeCodeCache && | 1488 compile_options == ScriptCompiler::kConsumeCodeCache && |
| 1489 !isolate->debug()->is_loaded()) { | 1489 !isolate->debug()->is_loaded()) { |
| 1490 // Then check cached code provided by embedder. | 1490 // Then check cached code provided by embedder. |
| 1491 HistogramTimerScope timer(isolate->counters()->compile_deserialize()); | 1491 HistogramTimerScope timer(isolate->counters()->compile_deserialize()); |
| 1492 RuntimeCallTimerScope runtimeTimer(isolate, | 1492 RuntimeCallTimerScope runtimeTimer(isolate, |
| 1493 &RuntimeCallStats::CompileDeserialize); | 1493 &RuntimeCallStats::CompileDeserialize); |
| 1494 TRACE_EVENT0("v8", "V8.CompileDeserialize"); | 1494 TRACE_EVENT0("v8", "V8.CompileDeserialize"); |
| 1495 Handle<SharedFunctionInfo> result; | 1495 Handle<SharedFunctionInfo> result; |
| 1496 if (CodeSerializer::Deserialize(isolate, *cached_data, source) | 1496 if (CodeSerializer::Deserialize(isolate, *cached_data, source) |
| 1497 .ToHandle(&result)) { | 1497 .ToHandle(&result)) { |
| 1498 // Promote to per-isolate compilation cache. | 1498 // Promote to per-isolate compilation cache. |
| 1499 compilation_cache->PutScript(source, context, language_mode, result); | 1499 compilation_cache->PutScript(source, context, language_mode, is_module, |
| 1500 result); |
| 1500 return result; | 1501 return result; |
| 1501 } | 1502 } |
| 1502 // Deserializer failed. Fall through to compile. | 1503 // Deserializer failed. Fall through to compile. |
| 1503 } | 1504 } |
| 1504 } | 1505 } |
| 1505 | 1506 |
| 1506 base::ElapsedTimer timer; | 1507 base::ElapsedTimer timer; |
| 1507 if (FLAG_profile_deserialization && FLAG_serialize_toplevel && | 1508 if (FLAG_profile_deserialization && FLAG_serialize_toplevel && |
| 1508 compile_options == ScriptCompiler::kProduceCodeCache) { | 1509 compile_options == ScriptCompiler::kProduceCodeCache) { |
| 1509 timer.Start(); | 1510 timer.Start(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1525 } | 1526 } |
| 1526 if (!script_name.is_null()) { | 1527 if (!script_name.is_null()) { |
| 1527 script->set_name(*script_name); | 1528 script->set_name(*script_name); |
| 1528 script->set_line_offset(line_offset); | 1529 script->set_line_offset(line_offset); |
| 1529 script->set_column_offset(column_offset); | 1530 script->set_column_offset(column_offset); |
| 1530 } | 1531 } |
| 1531 script->set_origin_options(resource_options); | 1532 script->set_origin_options(resource_options); |
| 1532 if (!source_map_url.is_null()) { | 1533 if (!source_map_url.is_null()) { |
| 1533 script->set_source_mapping_url(*source_map_url); | 1534 script->set_source_mapping_url(*source_map_url); |
| 1534 } | 1535 } |
| 1536 script->set_is_module(is_module); |
| 1535 | 1537 |
| 1536 // Compile the function and add it to the cache. | 1538 // Compile the function and add it to the cache. |
| 1537 Zone zone(isolate->allocator()); | 1539 Zone zone(isolate->allocator()); |
| 1538 ParseInfo parse_info(&zone, script); | 1540 ParseInfo parse_info(&zone, script); |
| 1539 CompilationInfo info(&parse_info, Handle<JSFunction>::null()); | 1541 CompilationInfo info(&parse_info, Handle<JSFunction>::null()); |
| 1540 if (is_module) { | 1542 if (is_module) { |
| 1541 parse_info.set_module(); | 1543 // The ParseInfo constructor unconditionally sets the `is_module` bit |
| 1544 // when its script is module code. |
| 1545 DCHECK(parse_info.is_module()); |
| 1542 } else { | 1546 } else { |
| 1547 // In the current context of script compilation, the input cannot be eval |
| 1548 // code, so the input must be global code. |
| 1543 parse_info.set_global(); | 1549 parse_info.set_global(); |
| 1544 } | 1550 } |
| 1545 if (compile_options != ScriptCompiler::kNoCompileOptions) { | 1551 if (compile_options != ScriptCompiler::kNoCompileOptions) { |
| 1546 parse_info.set_cached_data(cached_data); | 1552 parse_info.set_cached_data(cached_data); |
| 1547 } | 1553 } |
| 1548 parse_info.set_compile_options(compile_options); | 1554 parse_info.set_compile_options(compile_options); |
| 1549 parse_info.set_extension(extension); | 1555 parse_info.set_extension(extension); |
| 1550 parse_info.set_context(context); | 1556 parse_info.set_context(context); |
| 1551 if (FLAG_serialize_toplevel && | 1557 if (FLAG_serialize_toplevel && |
| 1552 compile_options == ScriptCompiler::kProduceCodeCache) { | 1558 compile_options == ScriptCompiler::kProduceCodeCache) { |
| 1553 info.PrepareForSerializing(); | 1559 info.PrepareForSerializing(); |
| 1554 } | 1560 } |
| 1555 | 1561 |
| 1556 parse_info.set_language_mode( | 1562 parse_info.set_language_mode( |
| 1557 static_cast<LanguageMode>(parse_info.language_mode() | language_mode)); | 1563 static_cast<LanguageMode>(parse_info.language_mode() | language_mode)); |
| 1558 result = CompileToplevel(&info); | 1564 result = CompileToplevel(&info); |
| 1559 if (extension == NULL && !result.is_null()) { | 1565 if (extension == NULL && !result.is_null()) { |
| 1560 compilation_cache->PutScript(source, context, language_mode, result); | 1566 compilation_cache->PutScript(source, context, language_mode, is_module, |
| 1567 result); |
| 1561 if (FLAG_serialize_toplevel && | 1568 if (FLAG_serialize_toplevel && |
| 1562 compile_options == ScriptCompiler::kProduceCodeCache) { | 1569 compile_options == ScriptCompiler::kProduceCodeCache) { |
| 1563 HistogramTimerScope histogram_timer( | 1570 HistogramTimerScope histogram_timer( |
| 1564 isolate->counters()->compile_serialize()); | 1571 isolate->counters()->compile_serialize()); |
| 1565 RuntimeCallTimerScope runtimeTimer(isolate, | 1572 RuntimeCallTimerScope runtimeTimer(isolate, |
| 1566 &RuntimeCallStats::CompileSerialize); | 1573 &RuntimeCallStats::CompileSerialize); |
| 1567 TRACE_EVENT0("v8", "V8.CompileSerialize"); | 1574 TRACE_EVENT0("v8", "V8.CompileSerialize"); |
| 1568 *cached_data = CodeSerializer::Serialize(isolate, result, source); | 1575 *cached_data = CodeSerializer::Serialize(isolate, result, source); |
| 1569 if (FLAG_profile_deserialization) { | 1576 if (FLAG_profile_deserialization) { |
| 1570 PrintF("[Compiling and serializing took %0.3f ms]\n", | 1577 PrintF("[Compiling and serializing took %0.3f ms]\n", |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1820 DCHECK(shared->is_compiled()); | 1827 DCHECK(shared->is_compiled()); |
| 1821 function->set_literals(cached.literals); | 1828 function->set_literals(cached.literals); |
| 1822 } else if (shared->is_compiled()) { | 1829 } else if (shared->is_compiled()) { |
| 1823 // TODO(mvstanton): pass pretenure flag to EnsureLiterals. | 1830 // TODO(mvstanton): pass pretenure flag to EnsureLiterals. |
| 1824 JSFunction::EnsureLiterals(function); | 1831 JSFunction::EnsureLiterals(function); |
| 1825 } | 1832 } |
| 1826 } | 1833 } |
| 1827 | 1834 |
| 1828 } // namespace internal | 1835 } // namespace internal |
| 1829 } // namespace v8 | 1836 } // namespace v8 |
| OLD | NEW |