| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 947a6e076f4b4deb1269c8a8dc703168b20ccae9..eb8fa715219c36c1e8a66befda6a30aff84363d5 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -12539,47 +12539,19 @@ void JSFunction::AttemptConcurrentOptimization() {
|
| }
|
|
|
| // static
|
| -Handle<LiteralsArray> SharedFunctionInfo::FindOrCreateLiterals(
|
| - Handle<SharedFunctionInfo> shared, Handle<Context> native_context) {
|
| - Isolate* isolate = shared->GetIsolate();
|
| - CodeAndLiterals result =
|
| - shared->SearchOptimizedCodeMap(*native_context, BailoutId::None());
|
| - if (result.literals != nullptr) {
|
| - DCHECK(shared->feedback_metadata()->is_empty() ||
|
| - !result.literals->feedback_vector()->is_empty());
|
| - return handle(result.literals, isolate);
|
| - }
|
| -
|
| - Handle<TypeFeedbackVector> feedback_vector =
|
| - TypeFeedbackVector::New(isolate, handle(shared->feedback_metadata()));
|
| - Handle<LiteralsArray> literals =
|
| - LiteralsArray::New(isolate, feedback_vector, shared->num_literals());
|
| - Handle<Code> code;
|
| - if (result.code != nullptr) {
|
| - code = Handle<Code>(result.code, isolate);
|
| - }
|
| - AddToOptimizedCodeMap(shared, native_context, code, literals,
|
| - BailoutId::None());
|
| - return literals;
|
| -}
|
| -
|
| -// static
|
| void SharedFunctionInfo::AddToOptimizedCodeMap(
|
| Handle<SharedFunctionInfo> shared, Handle<Context> native_context,
|
| - MaybeHandle<Code> code, Handle<LiteralsArray> literals,
|
| - BailoutId osr_ast_id) {
|
| + Handle<Code> code, BailoutId osr_ast_id) {
|
| Isolate* isolate = shared->GetIsolate();
|
| if (isolate->serializer_enabled()) return;
|
| - DCHECK(code.is_null() ||
|
| - code.ToHandleChecked()->kind() == Code::OPTIMIZED_FUNCTION);
|
| + DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION);
|
| DCHECK(native_context->IsNativeContext());
|
| - STATIC_ASSERT(kEntryLength == 3);
|
| + STATIC_ASSERT(kEntryLength == 2);
|
| Handle<FixedArray> new_code_map;
|
| int entry;
|
|
|
| if (!osr_ast_id.IsNone()) {
|
| - Context::AddToOptimizedCodeMap(
|
| - native_context, shared, code.ToHandleChecked(), literals, osr_ast_id);
|
| + Context::AddToOptimizedCodeMap(native_context, shared, code, osr_ast_id);
|
| return;
|
| }
|
|
|
| @@ -12591,15 +12563,9 @@ void SharedFunctionInfo::AddToOptimizedCodeMap(
|
| Handle<FixedArray> old_code_map(shared->optimized_code_map(), isolate);
|
| entry = shared->SearchOptimizedCodeMapEntry(*native_context);
|
| if (entry >= kEntriesStart) {
|
| - // Just set the code and literals of the entry.
|
| - if (!code.is_null()) {
|
| - Handle<WeakCell> code_cell =
|
| - isolate->factory()->NewWeakCell(code.ToHandleChecked());
|
| - old_code_map->set(entry + kCachedCodeOffset, *code_cell);
|
| - }
|
| - Handle<WeakCell> literals_cell =
|
| - isolate->factory()->NewWeakCell(literals);
|
| - old_code_map->set(entry + kLiteralsOffset, *literals_cell);
|
| + // Just set the code of the entry.
|
| + Handle<WeakCell> code_cell = isolate->factory()->NewWeakCell(code);
|
| + old_code_map->set(entry + kCachedCodeOffset, *code_cell);
|
| return;
|
| }
|
|
|
| @@ -12627,15 +12593,11 @@ void SharedFunctionInfo::AddToOptimizedCodeMap(
|
| }
|
| }
|
|
|
| - Handle<WeakCell> code_cell =
|
| - code.is_null() ? isolate->factory()->empty_weak_cell()
|
| - : isolate->factory()->NewWeakCell(code.ToHandleChecked());
|
| - Handle<WeakCell> literals_cell = isolate->factory()->NewWeakCell(literals);
|
| + Handle<WeakCell> code_cell = isolate->factory()->NewWeakCell(code);
|
| WeakCell* context_cell = native_context->self_weak_cell();
|
|
|
| new_code_map->set(entry + kContextOffset, context_cell);
|
| new_code_map->set(entry + kCachedCodeOffset, *code_cell);
|
| - new_code_map->set(entry + kLiteralsOffset, *literals_cell);
|
|
|
| #ifdef DEBUG
|
| for (int i = kEntriesStart; i < new_code_map->length(); i += kEntryLength) {
|
| @@ -12645,8 +12607,6 @@ void SharedFunctionInfo::AddToOptimizedCodeMap(
|
| DCHECK(cell->cleared() ||
|
| (cell->value()->IsCode() &&
|
| Code::cast(cell->value())->kind() == Code::OPTIMIZED_FUNCTION));
|
| - cell = WeakCell::cast(new_code_map->get(i + kLiteralsOffset));
|
| - DCHECK(cell->cleared() || cell->value()->IsFixedArray());
|
| }
|
| #endif
|
|
|
| @@ -12684,7 +12644,7 @@ void SharedFunctionInfo::EvictFromOptimizedCodeMap(Code* optimized_code,
|
| ShortPrint();
|
| PrintF("]\n");
|
| }
|
| - // Just clear the code in order to continue sharing literals.
|
| + // Just clear the code.
|
| code_map->set(src + kCachedCodeOffset, heap->empty_weak_cell(),
|
| SKIP_WRITE_BARRIER);
|
| }
|
| @@ -12701,12 +12661,45 @@ void SharedFunctionInfo::EvictFromOptimizedCodeMap(Code* optimized_code,
|
| void JSFunction::EnsureLiterals(Handle<JSFunction> function) {
|
| Handle<SharedFunctionInfo> shared(function->shared());
|
| Handle<Context> native_context(function->context()->native_context());
|
| - if (function->literals() ==
|
| - function->GetIsolate()->heap()->empty_literals_array()) {
|
| - Handle<LiteralsArray> literals =
|
| - SharedFunctionInfo::FindOrCreateLiterals(shared, native_context);
|
| - function->set_literals(*literals);
|
| + Isolate* isolate = shared->GetIsolate();
|
| +
|
| + if (!function->has_literals_array()) {
|
| + if (FLAG_trace_strong_rooted_literals) {
|
| + PrintF("EnsureLiterals: Installing literals array in %s %p\n",
|
| + shared->DebugName()->ToCString().get(),
|
| + reinterpret_cast<void*>(*function));
|
| + }
|
| + // Top level code didn't get it's literals installed.
|
| + Handle<TypeFeedbackVector> feedback_vector =
|
| + TypeFeedbackVector::New(isolate, handle(shared->feedback_metadata()));
|
| + Handle<LiteralsArray> new_literals =
|
| + LiteralsArray::New(isolate, feedback_vector, shared->num_literals());
|
| + function->set_literals(*new_literals);
|
| + } else if (!function->literals()->has_feedback_vector()) {
|
| + if (FLAG_trace_strong_rooted_literals) {
|
| + PrintF("EnsureLiterals: Installing feedback vector in %s %p\n",
|
| + shared->DebugName()->ToCString().get(),
|
| + reinterpret_cast<void*>(*function));
|
| + }
|
| + // If the feedback vector hasn't been installed, do that.
|
| + Handle<TypeFeedbackVector> feedback_vector = TypeFeedbackVector::New(
|
| + shared->GetIsolate(), handle(shared->feedback_metadata()));
|
| + function->literals()->set_feedback_vector(*feedback_vector);
|
| + } else {
|
| + if (FLAG_trace_strong_rooted_literals) {
|
| + PrintF("EnsureLiterals: did nothing for %s %p\n",
|
| + shared->DebugName()->ToCString().get(),
|
| + reinterpret_cast<void*>(*function));
|
| + }
|
| }
|
| +
|
| + // No matter what, ensure some post-conditions.
|
| + DCHECK(shared->feedback_metadata()->slot_count() != 0 ||
|
| + function->feedback_vector() ==
|
| + shared->GetIsolate()->heap()->empty_type_feedback_vector());
|
| + DCHECK(shared->num_literals() == 0 ||
|
| + function->literals() !=
|
| + shared->GetIsolate()->heap()->empty_literals_array());
|
| }
|
|
|
| static void GetMinInobjectSlack(Map* map, void* data) {
|
| @@ -14276,15 +14269,11 @@ void SharedFunctionInfo::ClearCodeFromOptimizedCodeMap() {
|
| }
|
| }
|
|
|
| -CodeAndLiterals SharedFunctionInfo::SearchOptimizedCodeMap(
|
| - Context* native_context, BailoutId osr_ast_id) {
|
| - CodeAndLiterals result = {nullptr, nullptr};
|
| +Code* SharedFunctionInfo::SearchOptimizedCodeMap(Context* native_context,
|
| + BailoutId osr_ast_id) {
|
| + Code* result = nullptr;
|
| if (!osr_ast_id.IsNone()) {
|
| - Code* code;
|
| - LiteralsArray* literals;
|
| - native_context->SearchOptimizedCodeMap(this, osr_ast_id, &code, &literals);
|
| - result = {code, literals};
|
| - return result;
|
| + return native_context->SearchOptimizedCodeMap(this, osr_ast_id);
|
| }
|
|
|
| DCHECK(osr_ast_id.IsNone());
|
| @@ -14293,12 +14282,8 @@ CodeAndLiterals SharedFunctionInfo::SearchOptimizedCodeMap(
|
| FixedArray* code_map = optimized_code_map();
|
| DCHECK_LE(entry + kEntryLength, code_map->length());
|
| WeakCell* cell = WeakCell::cast(code_map->get(entry + kCachedCodeOffset));
|
| - WeakCell* literals_cell =
|
| - WeakCell::cast(code_map->get(entry + kLiteralsOffset));
|
|
|
| - result = {cell->cleared() ? nullptr : Code::cast(cell->value()),
|
| - literals_cell->cleared() ? nullptr : LiteralsArray::cast(
|
| - literals_cell->value())};
|
| + result = cell->cleared() ? nullptr : Code::cast(cell->value());
|
| }
|
| return result;
|
| }
|
|
|