Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Unified Diff: src/compiler.cc

Issue 1525663002: [interpreter] Unify decision how to compile baseline code. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Back out widening of intake valve. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler.cc
diff --git a/src/compiler.cc b/src/compiler.cc
index cf66a02856e9769d1fa827b510c6e4e61fd80003..2504ba7ff60df3d7f3217abefa177193fa4586de 100644
--- a/src/compiler.cc
+++ b/src/compiler.cc
@@ -706,8 +706,6 @@ static bool CompileUnoptimizedCode(CompilationInfo* info) {
// TODO(rmcilroy): Remove this temporary work-around when ignition supports
// catch and eval.
static bool IgnitionShouldFallbackToFullCodeGen(Scope* scope) {
- if (!FLAG_ignition_fallback_on_eval_and_catch) return false;
-
if (scope->is_eval_scope() || scope->is_catch_scope() ||
scope->calls_eval()) {
return true;
@@ -719,21 +717,46 @@ static bool IgnitionShouldFallbackToFullCodeGen(Scope* scope) {
}
-static bool GenerateBytecode(CompilationInfo* info) {
- DCHECK(AllowCompilation::IsAllowed(info->isolate()));
- bool success = false;
- if (Compiler::Analyze(info->parse_info())) {
- if (IgnitionShouldFallbackToFullCodeGen(info->scope())) {
- success = FullCodeGenerator::MakeCode(info);
- } else {
- success = interpreter::Interpreter::MakeBytecode(info);
- }
+static bool UseIgnition(CompilationInfo* info) {
+ // Cannot use Ignition when the {function_data} is already used.
+ if (info->has_shared_info() && info->shared_info()->HasBuiltinFunctionId()) {
+ return false;
}
- if (!success) {
+
+ // Checks whether the scope chain is supported.
+ if (FLAG_ignition_fallback_on_eval_and_catch &&
+ IgnitionShouldFallbackToFullCodeGen(info->scope())) {
+ return false;
+ }
+
+ // Checks whether top level functions should be passed by the filter.
+ if (info->closure().is_null()) {
+ Vector<const char> filter = CStrVector(FLAG_ignition_filter);
+ return (filter.length() == 0) || (filter.length() == 1 && filter[0] == '*');
+ }
+
+ // Finally respect the filter.
+ return info->closure()->PassesFilter(FLAG_ignition_filter);
+}
+
+
+static bool GenerateBaselineCode(CompilationInfo* info) {
+ if (FLAG_ignition && UseIgnition(info)) {
+ return interpreter::Interpreter::MakeBytecode(info);
+ } else {
+ return FullCodeGenerator::MakeCode(info);
+ }
+}
+
+
+static bool CompileBaselineCode(CompilationInfo* info) {
+ DCHECK(AllowCompilation::IsAllowed(info->isolate()));
+ if (!Compiler::Analyze(info->parse_info()) || !GenerateBaselineCode(info)) {
Isolate* isolate = info->isolate();
if (!isolate->has_pending_exception()) isolate->StackOverflow();
+ return false;
}
- return success;
+ return true;
}
@@ -750,15 +773,9 @@ MUST_USE_RESULT static MaybeHandle<Code> GetUnoptimizedCodeCommon(
SetExpectedNofPropertiesFromEstimate(shared, lit->expected_property_count());
MaybeDisableOptimization(shared, lit->dont_optimize_reason());
- if (FLAG_ignition && !shared->HasBuiltinFunctionId() &&
- info->closure()->PassesFilter(FLAG_ignition_filter)) {
- // Compile bytecode for the interpreter.
- if (!GenerateBytecode(info)) return MaybeHandle<Code>();
- } else {
- // Compile unoptimized code.
- if (!CompileUnoptimizedCode(info)) return MaybeHandle<Code>();
-
- CHECK_EQ(Code::FUNCTION, info->code()->kind());
+ // Compile either unoptimized code or bytecode for the interpreter.
+ if (!CompileBaselineCode(info)) return MaybeHandle<Code>();
+ if (info->code()->kind() == Code::FUNCTION) { // Only for full code.
RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, info, shared);
}
@@ -1177,13 +1194,6 @@ void Compiler::CompileForLiveEdit(Handle<Script> script) {
}
-// Checks whether top level functions should be passed by {raw_filter}.
-static bool TopLevelFunctionPassesFilter(const char* raw_filter) {
- Vector<const char> filter = CStrVector(raw_filter);
- return (filter.length() == 0) || (filter.length() == 1 && filter[0] == '*');
-}
-
-
static Handle<SharedFunctionInfo> CompileToplevel(CompilationInfo* info) {
Isolate* isolate = info->isolate();
PostponeInterruptsScope postpone(isolate);
@@ -1247,14 +1257,8 @@ static Handle<SharedFunctionInfo> CompileToplevel(CompilationInfo* info) {
HistogramTimerScope timer(rate);
// Compile the code.
- if (FLAG_ignition && TopLevelFunctionPassesFilter(FLAG_ignition_filter)) {
- if (!GenerateBytecode(info)) {
- return Handle<SharedFunctionInfo>::null();
- }
- } else {
- if (!CompileUnoptimizedCode(info)) {
- return Handle<SharedFunctionInfo>::null();
- }
+ if (!CompileBaselineCode(info)) {
+ return Handle<SharedFunctionInfo>::null();
}
// Allocate function.
@@ -1601,7 +1605,7 @@ Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfo(
scope_info = Handle<ScopeInfo>(ScopeInfo::Empty(isolate));
} else if (Renumber(info.parse_info()) &&
FullCodeGenerator::MakeCode(&info)) {
- // MakeCode will ensure that the feedback vector is present and
+ // Code generation will ensure that the feedback vector is present and
// appropriately sized.
DCHECK(!info.code().is_null());
scope_info = ScopeInfo::Create(info.isolate(), info.zone(), info.scope());
@@ -1619,6 +1623,10 @@ Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfo(
isolate->factory()->NewSharedFunctionInfo(
literal->name(), literal->materialized_literal_count(),
literal->kind(), info.code(), scope_info, info.feedback_vector());
+ if (info.has_bytecode_array()) {
+ DCHECK(result->function_data()->IsUndefined());
+ result->set_function_data(*info.bytecode_array());
+ }
SharedFunctionInfo::InitFromFunctionLiteral(result, literal);
SharedFunctionInfo::SetScript(result, script);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698