Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index ea6fefd9668b593e67cd72df5087f6898b166bc1..cd0f6e78500755de175c22fca419c20d4f4ef5b1 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -375,6 +375,12 @@ bool ShouldUseIgnition(CompilationInfo* info) { |
return shared->PassesFilter(FLAG_ignition_filter); |
} |
+bool UseAsmWasm(DeclarationScope* scope, Handle<SharedFunctionInfo> shared_info, |
+ bool is_debug) { |
+ return FLAG_validate_asm && scope->asm_module() && |
+ !shared_info->is_asm_wasm_broken() && !is_debug; |
+} |
+ |
CompilationJob* GetUnoptimizedCompilationJob(CompilationInfo* info) { |
// Function should have been parsed and analyzed before creating a compilation |
// job. |
@@ -462,8 +468,7 @@ bool Renumber(ParseInfo* parse_info, |
} |
bool GenerateUnoptimizedCode(CompilationInfo* info) { |
- if (FLAG_validate_asm && info->scope()->asm_module() && |
- !info->shared_info()->is_asm_wasm_broken() && !info->is_debug()) { |
+ if (UseAsmWasm(info->scope(), info->shared_info(), info->is_debug())) { |
EnsureFeedbackMetadata(info); |
MaybeHandle<FixedArray> wasm_data; |
wasm_data = AsmJs::CompileAsmViaWasm(info); |
@@ -512,7 +517,9 @@ bool CompileUnoptimizedInnerFunctions( |
outer_info->parse_info()->ast_value_factory()); |
parse_info.set_ast_value_factory_owned(false); |
- CompilationInfo info(&parse_info, Handle<JSFunction>::null()); |
+ Zone compile_zone(isolate->allocator(), ZONE_NAME); |
+ CompilationInfo info(&compile_zone, &parse_info, |
+ Handle<JSFunction>::null()); |
if (outer_info->will_serialize()) info.PrepareForSerializing(); |
if (outer_info->is_debug()) info.MarkAsDebug(); |
@@ -530,13 +537,36 @@ bool CompileUnoptimizedInnerFunctions( |
return true; |
} |
+bool InnerFunctionIsAsmModule( |
+ ThreadedList<ThreadedListZoneEntry<FunctionLiteral*>>* literals) { |
+ for (auto it : *literals) { |
+ FunctionLiteral* literal = it->value(); |
+ if (literal->scope()->IsAsmModule()) return true; |
+ } |
+ return false; |
+} |
+ |
bool CompileUnoptimizedCode(CompilationInfo* info) { |
Isolate* isolate = info->isolate(); |
DCHECK(AllowCompilation::IsAllowed(isolate)); |
Compiler::EagerInnerFunctionLiterals inner_literals; |
- if (!Compiler::Analyze(info->parse_info(), &inner_literals) || |
- !CompileUnoptimizedInnerFunctions(&inner_literals, info) || |
+ if (!Compiler::Analyze(info->parse_info(), &inner_literals)) { |
+ if (!isolate->has_pending_exception()) isolate->StackOverflow(); |
+ return false; |
+ } |
+ |
+ // TODO(rmcilroy,bradnelson): Remove this UseAsmWasm check once the asm-wasm |
+ // builder doesn't do parsing when visiting function declarations. |
+ if (!info->scope()->IsAsmModule() && |
+ !InnerFunctionIsAsmModule(&inner_literals)) { |
rmcilroy
2017/01/23 15:54:35
I'm going to send out a separate mail to figure ou
|
+ // Seal the parse zone so that it can be shared by parallel inner function |
+ // compilation jobs. |
+ DCHECK_NE(info->parse_info()->zone(), info->zone()); |
+ info->parse_info()->zone()->Seal(); |
+ } |
+ |
+ if (!CompileUnoptimizedInnerFunctions(&inner_literals, info) || |
!GenerateUnoptimizedCode(info)) { |
if (!isolate->has_pending_exception()) isolate->StackOverflow(); |
return false; |
@@ -888,7 +918,8 @@ MaybeHandle<Code> GetBaselineCode(Handle<JSFunction> function) { |
VMState<COMPILER> state(isolate); |
PostponeInterruptsScope postpone(isolate); |
ParseInfo parse_info(handle(function->shared())); |
- CompilationInfo info(&parse_info, function); |
+ Zone compile_zone(isolate->allocator(), ZONE_NAME); |
+ CompilationInfo info(&compile_zone, &parse_info, function); |
DCHECK(function->shared()->is_compiled()); |
@@ -1021,7 +1052,8 @@ MaybeHandle<Code> GetLazyCode(Handle<JSFunction> function) { |
} |
ParseInfo parse_info(handle(function->shared())); |
- CompilationInfo info(&parse_info, function); |
+ Zone compile_zone(isolate->allocator(), ZONE_NAME); |
+ CompilationInfo info(&compile_zone, &parse_info, function); |
Handle<Code> result; |
ASSIGN_RETURN_ON_EXCEPTION(isolate, result, GetUnoptimizedCode(&info), Code); |
@@ -1200,7 +1232,8 @@ bool Compiler::CompileOptimized(Handle<JSFunction> function, |
function->shared()->ReplaceCode(*code); |
} else { |
ParseInfo parse_info(handle(function->shared())); |
- CompilationInfo info(&parse_info, function); |
+ Zone compile_zone(isolate->allocator(), ZONE_NAME); |
+ CompilationInfo info(&compile_zone, &parse_info, function); |
if (!GetUnoptimizedCode(&info).ToHandle(&code)) { |
return false; |
} |
@@ -1224,7 +1257,8 @@ bool Compiler::CompileDebugCode(Handle<SharedFunctionInfo> shared) { |
// Start a compilation. |
ParseInfo parse_info(shared); |
- CompilationInfo info(&parse_info, Handle<JSFunction>::null()); |
+ Zone compile_zone(isolate->allocator(), ZONE_NAME); |
+ CompilationInfo info(&compile_zone, &parse_info, Handle<JSFunction>::null()); |
info.MarkAsDebug(); |
if (GetUnoptimizedCode(&info).is_null()) { |
isolate->clear_pending_exception(); |
@@ -1251,7 +1285,8 @@ MaybeHandle<JSArray> Compiler::CompileForLiveEdit(Handle<Script> script) { |
// Start a compilation. |
ParseInfo parse_info(script); |
- CompilationInfo info(&parse_info, Handle<JSFunction>::null()); |
+ Zone compile_zone(isolate->allocator(), ZONE_NAME); |
+ CompilationInfo info(&compile_zone, &parse_info, Handle<JSFunction>::null()); |
info.MarkAsDebug(); |
// TODO(635): support extensions. |
@@ -1291,8 +1326,9 @@ bool Compiler::EnsureDeoptimizationSupport(CompilationInfo* info) { |
DCHECK_NOT_NULL(info->scope()); |
Handle<SharedFunctionInfo> shared = info->shared_info(); |
if (!shared->has_deoptimization_support()) { |
- Zone zone(info->isolate()->allocator(), ZONE_NAME); |
- CompilationInfo unoptimized(info->parse_info(), info->closure()); |
+ Zone compile_zone(info->isolate()->allocator(), ZONE_NAME); |
+ CompilationInfo unoptimized(&compile_zone, info->parse_info(), |
+ info->closure()); |
unoptimized.EnableDeoptimizationSupport(); |
// Don't generate full-codegen code for functions it can't support. |
@@ -1386,7 +1422,9 @@ MaybeHandle<JSFunction> Compiler::GetFunctionFromEval( |
Script::SetEvalOrigin(script, outer_info, eval_position); |
ParseInfo parse_info(script); |
- CompilationInfo info(&parse_info, Handle<JSFunction>::null()); |
+ Zone compile_zone(isolate->allocator(), ZONE_NAME); |
+ CompilationInfo info(&compile_zone, &parse_info, |
+ Handle<JSFunction>::null()); |
parse_info.set_eval(); |
parse_info.set_language_mode(language_mode); |
parse_info.set_parse_restriction(restriction); |
@@ -1564,7 +1602,9 @@ Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfoForScript( |
// Compile the function and add it to the cache. |
ParseInfo parse_info(script); |
- CompilationInfo info(&parse_info, Handle<JSFunction>::null()); |
+ Zone compile_zone(isolate->allocator(), ZONE_NAME); |
+ CompilationInfo info(&compile_zone, &parse_info, |
+ Handle<JSFunction>::null()); |
if (resource_options.IsModule()) parse_info.set_module(); |
if (compile_options != ScriptCompiler::kNoCompileOptions) { |
parse_info.set_cached_data(cached_data); |
@@ -1625,7 +1665,9 @@ Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfoForStreamedScript( |
parse_info->set_language_mode( |
static_cast<LanguageMode>(parse_info->language_mode() | language_mode)); |
- CompilationInfo compile_info(parse_info, Handle<JSFunction>::null()); |
+ Zone compile_zone(isolate->allocator(), ZONE_NAME); |
+ CompilationInfo compile_info(&compile_zone, parse_info, |
+ Handle<JSFunction>::null()); |
// The source was parsed lazily, so compiling for debugging is not possible. |
DCHECK(!compile_info.is_debug()); |