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

Unified Diff: src/compiler.cc

Issue 1895033003: [compiler] Introduce common structure to compile methods. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@local_cleanup-compiler-simplify-17
Patch Set: Unused var. Created 4 years, 8 months 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 43759571fabe93f0ef1db338c1b8f0329024b773..c87d20bf247b690da9871ef4a424533fe864daa9 100644
--- a/src/compiler.cc
+++ b/src/compiler.cc
@@ -916,15 +916,6 @@ MaybeHandle<Code> GetLazyCode(Handle<JSFunction> function) {
}
-bool CompileForDebugging(CompilationInfo* info) {
- info->MarkAsDebug();
- if (GetUnoptimizedCode(info).is_null()) {
- info->isolate()->clear_pending_exception();
- return false;
- }
- return true;
-}
-
inline bool IsEvalToplevel(Handle<SharedFunctionInfo> shared) {
return shared->is_toplevel() && shared->script()->IsScript() &&
Script::cast(shared->script())->compilation_type() ==
@@ -1077,58 +1068,65 @@ bool Compiler::ParseAndAnalyze(ParseInfo* info) {
bool Compiler::Compile(Handle<JSFunction> function, ClearExceptionFlag flag) {
if (function->is_compiled()) return true;
+ Isolate* isolate = function->GetIsolate();
+ DCHECK(AllowCompilation::IsAllowed(isolate));
- MaybeHandle<Code> maybe_code = GetLazyCode(function);
+ // Start a compilation.
Handle<Code> code;
- if (!maybe_code.ToHandle(&code)) {
+ if (!GetLazyCode(function).ToHandle(&code)) {
if (flag == CLEAR_EXCEPTION) {
- function->GetIsolate()->clear_pending_exception();
+ isolate->clear_pending_exception();
}
return false;
}
+ // Install code on closure.
function->ReplaceCode(*code);
+
+ // Check postconditions on success.
+ DCHECK(!isolate->has_pending_exception());
+ DCHECK(function->shared()->is_compiled());
DCHECK(function->is_compiled());
return true;
}
bool Compiler::CompileOptimized(Handle<JSFunction> function,
ConcurrencyMode mode) {
+ if (function->IsOptimized()) return true;
+ Isolate* isolate = function->GetIsolate();
+ DCHECK(AllowCompilation::IsAllowed(isolate));
+
+ // Start a compilation.
Handle<Code> code;
- if (GetOptimizedCode(function, mode).ToHandle(&code)) {
- // Optimization succeeded, return optimized code.
- function->ReplaceCode(*code);
- } else {
+ if (!GetOptimizedCode(function, mode).ToHandle(&code)) {
// Optimization failed, get unoptimized code.
- Isolate* isolate = function->GetIsolate();
- if (isolate->has_pending_exception()) { // Possible stack overflow.
- return false;
- }
- code = Handle<Code>(function->shared()->code(), isolate);
- if (code->kind() != Code::FUNCTION &&
- code->kind() != Code::OPTIMIZED_FUNCTION) {
- DCHECK(!isolate->has_pending_exception());
- DCHECK(!function->is_compiled());
- if (!function->shared()->is_compiled()) {
- CompilationInfoWithZone info(function);
- if (!GetUnoptimizedCode(&info).ToHandle(&code)) {
- return false;
- }
+ DCHECK(!isolate->has_pending_exception());
+ if (function->shared()->is_compiled()) {
+ code = handle(function->shared()->code(), isolate);
+ } else {
+ CompilationInfoWithZone info(function);
+ if (!GetUnoptimizedCode(&info).ToHandle(&code)) {
+ return false;
}
}
- function->ReplaceCode(*code);
}
- DCHECK(function->code()->kind() == Code::FUNCTION ||
- function->code()->kind() == Code::OPTIMIZED_FUNCTION ||
- (function->code()->is_interpreter_entry_trampoline() &&
- function->shared()->HasBytecodeArray()) ||
- function->IsInOptimizationQueue());
+ // Install code on closure.
+ function->ReplaceCode(*code);
+
+ // Check postconditions on success.
+ DCHECK(!isolate->has_pending_exception());
+ DCHECK(function->shared()->is_compiled());
+ DCHECK(function->is_compiled());
return true;
}
bool Compiler::CompileDebugCode(Handle<JSFunction> function) {
- Zone zone(function->GetIsolate()->allocator());
+ Isolate* isolate = function->GetIsolate();
+ DCHECK(AllowCompilation::IsAllowed(isolate));
+
+ // Start a compilation.
+ Zone zone(isolate->allocator());
ParseInfo parse_info(&zone, function);
CompilationInfo info(&parse_info, Handle<JSFunction>::null());
if (IsEvalToplevel(handle(function->shared()))) {
@@ -1138,16 +1136,61 @@ bool Compiler::CompileDebugCode(Handle<JSFunction> function) {
parse_info.set_allow_lazy_parsing(false);
parse_info.set_lazy(false);
}
- return CompileForDebugging(&info);
+ info.MarkAsDebug();
+ if (GetUnoptimizedCode(&info).is_null()) {
+ isolate->clear_pending_exception();
+ return false;
+ }
+
+ // Check postconditions on success.
+ DCHECK(!isolate->has_pending_exception());
+ DCHECK(function->shared()->is_compiled());
+ DCHECK(function->shared()->HasDebugCode());
+ return true;
}
bool Compiler::CompileDebugCode(Handle<SharedFunctionInfo> shared) {
+ Isolate* isolate = shared->GetIsolate();
+ DCHECK(AllowCompilation::IsAllowed(isolate));
+
+ // Start a compilation.
+ Zone zone(isolate->allocator());
+ ParseInfo parse_info(&zone, shared);
+ CompilationInfo info(&parse_info, Handle<JSFunction>::null());
DCHECK(shared->allows_lazy_compilation_without_context());
DCHECK(!IsEvalToplevel(shared));
- Zone zone(shared->GetIsolate()->allocator());
- ParseInfo parse_info(&zone, shared);
+ info.MarkAsDebug();
+ if (GetUnoptimizedCode(&info).is_null()) {
+ isolate->clear_pending_exception();
+ return false;
+ }
+
+ // Check postconditions on success.
+ DCHECK(!isolate->has_pending_exception());
+ DCHECK(shared->is_compiled());
+ DCHECK(shared->HasDebugCode());
+ return true;
+}
+
+void Compiler::CompileForLiveEdit(Handle<Script> script) {
+ Isolate* isolate = script->GetIsolate();
+ DCHECK(AllowCompilation::IsAllowed(isolate));
+
+ // Start a compilation.
+ // TODO(635): support extensions.
+ Zone zone(isolate->allocator());
+ ParseInfo parse_info(&zone, script);
CompilationInfo info(&parse_info, Handle<JSFunction>::null());
- return CompileForDebugging(&info);
+ PostponeInterruptsScope postpone(isolate);
+ VMState<COMPILER> state(isolate);
+
+ info.MarkAsDebug();
+ info.parse_info()->set_global();
+ if (!Parser::ParseStatic(info.parse_info())) return;
+
+ LiveEditFunctionTracker tracker(isolate, parse_info.literal());
+ if (!CompileBaselineCode(&info)) return;
+ tracker.RecordRootFunctionInfo(info.code());
}
// TODO(turbofan): In the future, unoptimized code with deopt support could
@@ -1192,23 +1235,6 @@ bool Compiler::EnsureDeoptimizationSupport(CompilationInfo* info) {
return true;
}
-void Compiler::CompileForLiveEdit(Handle<Script> script) {
- // TODO(635): support extensions.
- Zone zone(script->GetIsolate()->allocator());
- ParseInfo parse_info(&zone, script);
- CompilationInfo info(&parse_info, Handle<JSFunction>::null());
- PostponeInterruptsScope postpone(info.isolate());
- VMState<COMPILER> state(info.isolate());
-
- info.MarkAsDebug();
- info.parse_info()->set_global();
- if (!Parser::ParseStatic(info.parse_info())) return;
-
- LiveEditFunctionTracker tracker(info.isolate(), parse_info.literal());
- if (!CompileBaselineCode(&info)) return;
- tracker.RecordRootFunctionInfo(info.code());
-}
-
MaybeHandle<JSFunction> Compiler::GetFunctionFromEval(
Handle<String> source, Handle<SharedFunctionInfo> outer_info,
Handle<Context> context, LanguageMode language_mode,
« 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