Commit 22e3211d authored by Ross McIlroy's avatar Ross McIlroy Committed by Commit Bot

[compiler] Remove script() from CompilationInfo

Removes script() from CompilationInfo since it might not be created when
compiling from a background thread.

BUG=v8:5203

Change-Id: Ic36fd04cf4792336707b2d3715d47c59b6a97faf
Reviewed-on: https://chromium-review.googlesource.com/690299Reviewed-by: 's avatarMichael Starzinger <mstarzinger@chromium.org>
Commit-Queue: Ross McIlroy <rmcilroy@chromium.org>
Cr-Commit-Position: refs/heads/master@{#48220}
parent 8f06e08a
......@@ -249,8 +249,7 @@ CompilationJob::Status AsmJsCompilationJob::ExecuteJobImpl() {
allow_deref.emplace();
DCHECK(!compilation_info()->isolate()->has_pending_exception());
ReportCompilationFailure(compilation_info()->script(),
parser.failure_location(),
ReportCompilationFailure(parse_info()->script(), parser.failure_location(),
parser.failure_message());
return FAILED;
}
......@@ -292,7 +291,7 @@ CompilationJob::Status AsmJsCompilationJob::FinalizeJobImpl() {
SyncCompileTranslatedAsmJs(
compilation_info()->isolate(), &thrower,
wasm::ModuleWireBytes(module_->begin(), module_->end()),
compilation_info()->script(),
parse_info()->script(),
Vector<const byte>(asm_offsets_->begin(), asm_offsets_->size()))
.ToHandleChecked();
DCHECK(!thrower.error());
......@@ -308,7 +307,7 @@ CompilationJob::Status AsmJsCompilationJob::FinalizeJobImpl() {
compilation_info()->SetCode(
BUILTIN_CODE(compilation_info()->isolate(), InstantiateAsmJs));
ReportCompilationSuccess(compilation_info()->script(),
ReportCompilationSuccess(parse_info()->script(),
compilation_info()->literal()->position(),
translate_time_, compile_time_, module_->size());
return SUCCEEDED;
......
......@@ -199,12 +199,12 @@ void CodeGenerator::PrintCode(Handle<Code> code, CompilationInfo* info) {
bool print_source = code->kind() == Code::OPTIMIZED_FUNCTION;
if (print_source) {
Handle<SharedFunctionInfo> shared = info->shared_info();
Handle<Script> script = info->script();
if (!script->IsUndefined(isolate) &&
!script->source()->IsUndefined(isolate)) {
if (shared->script()->IsScript() &&
!Script::cast(shared->script())->source()->IsUndefined(isolate)) {
os << "--- Raw source ---\n";
StringCharacterStream stream(String::cast(script->source()),
shared->start_position());
StringCharacterStream stream(
String::cast(Script::cast(shared->script())->source()),
shared->start_position());
// fun->end_position() points to the last character in the stream. We
// need to compensate by adding one to calculate the length.
int source_len = shared->end_position() - shared->start_position() + 1;
......
......@@ -22,8 +22,7 @@ namespace internal {
CompilationInfo::CompilationInfo(Zone* zone, Isolate* isolate,
ParseInfo* parse_info,
FunctionLiteral* literal)
: CompilationInfo(parse_info->script(), {},
Code::ComputeFlags(Code::OPTIMIZED_FUNCTION), BASE,
: CompilationInfo({}, Code::ComputeFlags(Code::OPTIMIZED_FUNCTION), BASE,
isolate, zone) {
// NOTE: The parse_info passed here represents the global information gathered
// during parsing, but does not represent specific details of the actual
......@@ -40,10 +39,9 @@ CompilationInfo::CompilationInfo(Zone* zone, Isolate* isolate,
}
CompilationInfo::CompilationInfo(Zone* zone, Isolate* isolate,
Handle<Script> script,
Handle<SharedFunctionInfo> shared,
Handle<JSFunction> closure)
: CompilationInfo(script, {}, Code::ComputeFlags(Code::OPTIMIZED_FUNCTION),
: CompilationInfo({}, Code::ComputeFlags(Code::OPTIMIZED_FUNCTION),
OPTIMIZE, isolate, zone) {
shared_info_ = shared;
closure_ = closure;
......@@ -63,15 +61,12 @@ CompilationInfo::CompilationInfo(Zone* zone, Isolate* isolate,
CompilationInfo::CompilationInfo(Vector<const char> debug_name,
Isolate* isolate, Zone* zone,
Code::Flags code_flags)
: CompilationInfo(Handle<Script>::null(), debug_name, code_flags, STUB,
isolate, zone) {}
: CompilationInfo(debug_name, code_flags, STUB, isolate, zone) {}
CompilationInfo::CompilationInfo(Handle<Script> script,
Vector<const char> debug_name,
CompilationInfo::CompilationInfo(Vector<const char> debug_name,
Code::Flags code_flags, Mode mode,
Isolate* isolate, Zone* zone)
: isolate_(isolate),
script_(script),
literal_(nullptr),
flags_(0),
code_flags_(code_flags),
......@@ -120,9 +115,6 @@ void CompilationInfo::set_deferred_handles(DeferredHandles* deferred_handles) {
}
void CompilationInfo::ReopenHandlesInNewHandleScope() {
if (!script_.is_null()) {
script_ = Handle<Script>(*script_);
}
if (!shared_info_.is_null()) {
shared_info_ = Handle<SharedFunctionInfo>(*shared_info_);
}
......
......@@ -53,7 +53,7 @@ class V8_EXPORT_PRIVATE CompilationInfo final {
CompilationInfo(Zone* zone, Isolate* isolate, ParseInfo* parse_info,
FunctionLiteral* literal);
// Construct a compilation info for optimized compilation.
CompilationInfo(Zone* zone, Isolate* isolate, Handle<Script> script,
CompilationInfo(Zone* zone, Isolate* isolate,
Handle<SharedFunctionInfo> shared,
Handle<JSFunction> closure);
// Construct a compilation info for stub compilation (or testing).
......@@ -61,8 +61,6 @@ class V8_EXPORT_PRIVATE CompilationInfo final {
Code::Flags code_flags);
~CompilationInfo();
Handle<Script> script() const { return script_; }
FunctionLiteral* literal() const { return literal_; }
void set_literal(FunctionLiteral* literal) {
DCHECK_NOT_NULL(literal);
......@@ -268,9 +266,8 @@ class V8_EXPORT_PRIVATE CompilationInfo final {
// OPTIMIZE is optimized code generated by the Hydrogen-based backend.
enum Mode { BASE, OPTIMIZE, STUB };
CompilationInfo(Handle<Script> script, Vector<const char> debug_name,
Code::Flags code_flags, Mode mode, Isolate* isolate,
Zone* zone);
CompilationInfo(Vector<const char> debug_name, Code::Flags code_flags,
Mode mode, Isolate* isolate, Zone* zone);
void SetMode(Mode mode) { mode_ = mode; }
......@@ -283,7 +280,6 @@ class V8_EXPORT_PRIVATE CompilationInfo final {
bool GetFlag(Flag flag) const { return (flags_ & flag) != 0; }
Isolate* isolate_;
Handle<Script> script_;
FunctionLiteral* literal_;
SourceRangeMap* source_range_map_; // Used when block coverage is enabled.
......
......@@ -202,6 +202,7 @@ Isolate* CompilationJob::isolate() const {
namespace {
void RecordFunctionCompilation(CodeEventListener::LogEventsAndTags tag,
Handle<Script> script,
CompilationInfo* compilation_info) {
// Log the code generation. If source information is available include
// script name and line number. Check explicitly whether logging is
......@@ -209,7 +210,6 @@ void RecordFunctionCompilation(CodeEventListener::LogEventsAndTags tag,
if (compilation_info->isolate()->logger()->is_logging_code_events() ||
compilation_info->isolate()->is_profiling()) {
Handle<SharedFunctionInfo> shared = compilation_info->shared_info();
Handle<Script> script = compilation_info->script();
Handle<AbstractCode> abstract_code =
compilation_info->has_bytecode_array()
? Handle<AbstractCode>::cast(compilation_info->bytecode_array())
......@@ -352,7 +352,7 @@ CompilationJob::Status FinalizeUnoptimizedCompilationJob(CompilationJob* job) {
log_tag = parse_info->lazy_compile() ? CodeEventListener::LAZY_COMPILE_TAG
: CodeEventListener::FUNCTION_TAG;
}
RecordFunctionCompilation(log_tag, compilation_info);
RecordFunctionCompilation(log_tag, parse_info->script(), compilation_info);
job->RecordUnoptimizedCompilationStats();
}
return status;
......@@ -550,7 +550,7 @@ bool GetOptimizedCodeNow(CompilationJob* job) {
DCHECK(!isolate->has_pending_exception());
InsertCodeIntoOptimizedCodeCache(compilation_info);
RecordFunctionCompilation(CodeEventListener::LAZY_COMPILE_TAG,
compilation_info);
job->parse_info()->script(), compilation_info);
return true;
}
......@@ -727,7 +727,7 @@ CompilationJob::Status FinalizeOptimizedCompilationJob(CompilationJob* job) {
} else if (job->FinalizeJob() == CompilationJob::SUCCEEDED) {
job->RecordOptimizedCompilationStats();
RecordFunctionCompilation(CodeEventListener::LAZY_COMPILE_TAG,
compilation_info);
job->parse_info()->script(), compilation_info);
InsertCodeIntoOptimizedCodeCache(compilation_info);
if (FLAG_trace_opt) {
PrintF("[completed optimizing ");
......
......@@ -46,8 +46,9 @@ std::unique_ptr<char[]> GetVisualizerLogFileName(CompilationInfo* info,
}
EmbeddedVector<char, 256> source_file(0);
bool source_available = false;
if (FLAG_trace_file_names && !info->script().is_null()) {
Object* source_name = info->script()->name();
if (FLAG_trace_file_names && info->has_shared_info() &&
info->shared_info()->script()->IsScript()) {
Object* source_name = Script::cast(info->shared_info()->script())->name();
if (source_name->IsString()) {
String* str = String::cast(source_name);
if (str->length() > 0) {
......
......@@ -550,7 +550,8 @@ class PipelineRunScope {
ZoneStats::Scope zone_scope_;
};
PipelineStatistics* CreatePipelineStatistics(CompilationInfo* info,
PipelineStatistics* CreatePipelineStatistics(Handle<Script> script,
CompilationInfo* info,
ZoneStats* zone_stats) {
PipelineStatistics* pipeline_statistics = nullptr;
......@@ -566,7 +567,6 @@ PipelineStatistics* CreatePipelineStatistics(CompilationInfo* info,
json_of << "{\"function\":\"" << function_name.get()
<< "\", \"sourcePosition\":" << pos << ", \"source\":\"";
Isolate* isolate = info->isolate();
Handle<Script> script = info->script();
if (!script.is_null() && !script->source()->IsUndefined(isolate)) {
DisallowHeapAllocation no_allocation;
int start = info->shared_info()->start_position();
......@@ -596,9 +596,9 @@ class PipelineCompilationJob final : public CompilationJob {
parse_info_(parse_info),
zone_stats_(function->GetIsolate()->allocator()),
compilation_info_(parse_info_.get()->zone(), function->GetIsolate(),
parse_info_->script(), shared_info, function),
pipeline_statistics_(
CreatePipelineStatistics(compilation_info(), &zone_stats_)),
shared_info, function),
pipeline_statistics_(CreatePipelineStatistics(
parse_info_->script(), compilation_info(), &zone_stats_)),
data_(&zone_stats_, compilation_info(), pipeline_statistics_.get()),
pipeline_(&data_),
linkage_(nullptr) {}
......@@ -746,7 +746,8 @@ class PipelineWasmCompilationJob final : public CompilationJob {
: CompilationJob(info->isolate(), nullptr, info, "TurboFan",
State::kReadyToExecute),
zone_stats_(info->isolate()->allocator()),
pipeline_statistics_(CreatePipelineStatistics(info, &zone_stats_)),
pipeline_statistics_(CreatePipelineStatistics(Handle<Script>::null(),
info, &zone_stats_)),
data_(&zone_stats_, info, jsgraph, pipeline_statistics_.get(),
source_positions, protected_insts),
pipeline_(&data_),
......@@ -1796,7 +1797,7 @@ Handle<Code> Pipeline::GenerateCodeForCodeStub(Isolate* isolate,
Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info) {
ZoneStats zone_stats(info->isolate()->allocator());
std::unique_ptr<PipelineStatistics> pipeline_statistics(
CreatePipelineStatistics(info, &zone_stats));
CreatePipelineStatistics(Handle<Script>::null(), info, &zone_stats));
PipelineData data(&zone_stats, info, pipeline_statistics.get());
PipelineImpl pipeline(&data);
......
......@@ -678,7 +678,8 @@ class BytecodeGenerator::GlobalDeclarationsBuilder final : public ZoneObject {
declarations_.push_back(Declaration(name, slot, nullptr));
}
Handle<FixedArray> AllocateDeclarations(CompilationInfo* info) {
Handle<FixedArray> AllocateDeclarations(CompilationInfo* info,
Handle<Script> script) {
DCHECK(has_constant_pool_entry_);
int array_index = 0;
Handle<FixedArray> data = info->isolate()->factory()->NewFixedArray(
......@@ -689,8 +690,8 @@ class BytecodeGenerator::GlobalDeclarationsBuilder final : public ZoneObject {
if (func == nullptr) {
initial_value = info->isolate()->factory()->undefined_value();
} else {
initial_value = Compiler::GetSharedFunctionInfo(func, info->script(),
info->isolate());
initial_value =
Compiler::GetSharedFunctionInfo(func, script, info->isolate());
}
// Return a null handle if any initial values can't be created. Caller
......@@ -803,10 +804,11 @@ BytecodeGenerator::BytecodeGenerator(CompilationInfo* info)
}
}
Handle<BytecodeArray> BytecodeGenerator::FinalizeBytecode(Isolate* isolate) {
Handle<BytecodeArray> BytecodeGenerator::FinalizeBytecode(
Isolate* isolate, Handle<Script> script) {
DCHECK(ThreadId::Current().Equals(isolate->thread_id()));
AllocateDeferredConstants(isolate);
AllocateDeferredConstants(isolate, script);
if (block_coverage_builder_) {
info()->set_coverage_info(
......@@ -827,11 +829,12 @@ Handle<BytecodeArray> BytecodeGenerator::FinalizeBytecode(Isolate* isolate) {
return bytecode_array;
}
void BytecodeGenerator::AllocateDeferredConstants(Isolate* isolate) {
void BytecodeGenerator::AllocateDeferredConstants(Isolate* isolate,
Handle<Script> script) {
// Build global declaration pair arrays.
for (GlobalDeclarationsBuilder* globals_builder : global_declarations_) {
Handle<FixedArray> declarations =
globals_builder->AllocateDeclarations(info());
globals_builder->AllocateDeclarations(info(), script);
if (declarations.is_null()) return SetStackOverflow();
builder()->SetDeferredConstantPoolEntry(
globals_builder->constant_pool_entry(), declarations);
......@@ -841,7 +844,7 @@ void BytecodeGenerator::AllocateDeferredConstants(Isolate* isolate) {
for (std::pair<FunctionLiteral*, size_t> literal : function_literals_) {
FunctionLiteral* expr = literal.first;
Handle<SharedFunctionInfo> shared_info =
Compiler::GetSharedFunctionInfo(expr, info()->script(), isolate);
Compiler::GetSharedFunctionInfo(expr, script, isolate);
if (shared_info.is_null()) return SetStackOverflow();
builder()->SetDeferredConstantPoolEntry(literal.second, shared_info);
}
......
......@@ -31,7 +31,8 @@ class BytecodeGenerator final : public AstVisitor<BytecodeGenerator> {
explicit BytecodeGenerator(CompilationInfo* info);
void GenerateBytecode(uintptr_t stack_limit);
Handle<BytecodeArray> FinalizeBytecode(Isolate* isolate);
Handle<BytecodeArray> FinalizeBytecode(Isolate* isolate,
Handle<Script> script);
#define DECLARE_VISIT(type) void Visit##type(type* node);
AST_NODE_LIST(DECLARE_VISIT)
......@@ -63,7 +64,7 @@ class BytecodeGenerator final : public AstVisitor<BytecodeGenerator> {
enum class TypeHint { kAny, kBoolean };
void GenerateBytecodeBody();
void AllocateDeferredConstants(Isolate* isolate);
void AllocateDeferredConstants(Isolate* isolate, Handle<Script> script);
DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
......
......@@ -207,7 +207,8 @@ InterpreterCompilationJob::Status InterpreterCompilationJob::FinalizeJobImpl() {
!executed_on_background_thread() ? runtime_call_stats_ : nullptr,
&RuntimeCallStats::CompileIgnitionFinalization);
Handle<BytecodeArray> bytecodes = generator()->FinalizeBytecode(isolate());
Handle<BytecodeArray> bytecodes =
generator()->FinalizeBytecode(isolate(), parse_info()->script());
if (generator()->HasStackOverflow()) {
return FAILED;
}
......
......@@ -140,8 +140,8 @@ Handle<JSFunction> FunctionTester::ForMachineGraph(Graph* graph,
Handle<JSFunction> FunctionTester::Compile(Handle<JSFunction> function) {
Handle<SharedFunctionInfo> shared(function->shared());
ParseInfo parse_info(shared);
CompilationInfo info(parse_info.zone(), function->GetIsolate(),
parse_info.script(), shared, function);
CompilationInfo info(parse_info.zone(), function->GetIsolate(), shared,
function);
if (flags_ & CompilationInfo::kInliningEnabled) {
info.MarkAsInliningEnabled();
......@@ -165,8 +165,8 @@ Handle<JSFunction> FunctionTester::Compile(Handle<JSFunction> function) {
Handle<JSFunction> FunctionTester::CompileGraph(Graph* graph) {
Handle<SharedFunctionInfo> shared(function->shared());
ParseInfo parse_info(shared);
CompilationInfo info(parse_info.zone(), function->GetIsolate(),
parse_info.script(), shared, function);
CompilationInfo info(parse_info.zone(), function->GetIsolate(), shared,
function);
Handle<Code> code = Pipeline::GenerateCodeForTesting(&info, graph);
CHECK(!code.is_null());
......
......@@ -47,9 +47,8 @@ TEST(TestLinkageCreate) {
HandleAndZoneScope handles;
Handle<JSFunction> function = Compile("a + b");
Handle<SharedFunctionInfo> shared(function->shared());
Handle<Script> script(Script::cast(shared->script()));
CompilationInfo info(handles.main_zone(), function->GetIsolate(), script,
shared, function);
CompilationInfo info(handles.main_zone(), function->GetIsolate(), shared,
function);
CallDescriptor* descriptor = Linkage::ComputeIncoming(info.zone(), &info);
CHECK(descriptor);
}
......@@ -65,9 +64,8 @@ TEST(TestLinkageJSFunctionIncoming) {
Handle<JSFunction>::cast(v8::Utils::OpenHandle(
*v8::Local<v8::Function>::Cast(CompileRun(sources[i]))));
Handle<SharedFunctionInfo> shared(function->shared());
Handle<Script> script(Script::cast(shared->script()));
CompilationInfo info(handles.main_zone(), function->GetIsolate(), script,
shared, function);
CompilationInfo info(handles.main_zone(), function->GetIsolate(), shared,
function);
CallDescriptor* descriptor = Linkage::ComputeIncoming(info.zone(), &info);
CHECK(descriptor);
......@@ -83,9 +81,8 @@ TEST(TestLinkageJSCall) {
HandleAndZoneScope handles;
Handle<JSFunction> function = Compile("a + c");
Handle<SharedFunctionInfo> shared(function->shared());
Handle<Script> script(Script::cast(shared->script()));
CompilationInfo info(handles.main_zone(), function->GetIsolate(), script,
shared, function);
CompilationInfo info(handles.main_zone(), function->GetIsolate(), shared,
function);
for (int i = 0; i < 32; i++) {
CallDescriptor* descriptor = Linkage::GetJSCallDescriptor(
......
......@@ -119,9 +119,8 @@ class BytecodeGraphTester {
Zone zone(function->GetIsolate()->allocator(), ZONE_NAME);
Handle<SharedFunctionInfo> shared(function->shared());
Handle<Script> script(Script::cast(shared->script()));
CompilationInfo compilation_info(&zone, function->GetIsolate(), script,
shared, function);
CompilationInfo compilation_info(&zone, function->GetIsolate(), shared,
function);
Handle<Code> code = Pipeline::GenerateCodeForTesting(&compilation_info);
function->set_code(*code);
......
......@@ -30,8 +30,7 @@ class BlockingCompilationJob : public CompilationJob {
State::kReadyToExecute),
shared_(function->shared()),
parse_info_(shared_),
info_(parse_info_.zone(), function->GetIsolate(), parse_info_.script(),
shared_, function),
info_(parse_info_.zone(), function->GetIsolate(), shared_, function),
blocking_(false),
semaphore_(0) {}
~BlockingCompilationJob() override = default;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment