Commit 15b4804c authored by mvstanton's avatar mvstanton Committed by Commit bot

Add non-script SharedFunctionInfos to the Iterator.

BUG=

Review URL: https://codereview.chromium.org/1410223007

Cr-Commit-Position: refs/heads/master@{#31597}
parent c9ab3606
...@@ -2161,6 +2161,11 @@ Handle<SharedFunctionInfo> Factory::NewSharedFunctionInfo( ...@@ -2161,6 +2161,11 @@ Handle<SharedFunctionInfo> Factory::NewSharedFunctionInfo(
share->set_compiler_hints(0); share->set_compiler_hints(0);
share->set_opt_count_and_bailout_reason(0); share->set_opt_count_and_bailout_reason(0);
// Link into the list.
Handle<Object> new_noscript_list =
WeakFixedArray::Add(noscript_shared_function_infos(), share);
isolate()->heap()->set_noscript_shared_function_infos(*new_noscript_list);
return share; return share;
} }
......
...@@ -2808,6 +2808,8 @@ void Heap::CreateInitialObjects() { ...@@ -2808,6 +2808,8 @@ void Heap::CreateInitialObjects() {
set_weak_stack_trace_list(Smi::FromInt(0)); set_weak_stack_trace_list(Smi::FromInt(0));
set_noscript_shared_function_infos(Smi::FromInt(0));
// Will be filled in by Interpreter::Initialize(). // Will be filled in by Interpreter::Initialize().
set_interpreter_table( set_interpreter_table(
*interpreter::Interpreter::CreateUninitializedInterpreterTable( *interpreter::Interpreter::CreateUninitializedInterpreterTable(
...@@ -2850,6 +2852,7 @@ bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) { ...@@ -2850,6 +2852,7 @@ bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) {
case kDetachedContextsRootIndex: case kDetachedContextsRootIndex:
case kWeakObjectToCodeTableRootIndex: case kWeakObjectToCodeTableRootIndex:
case kRetainedMapsRootIndex: case kRetainedMapsRootIndex:
case kNoScriptSharedFunctionInfosRootIndex:
case kWeakStackTraceListRootIndex: case kWeakStackTraceListRootIndex:
// Smi values // Smi values
#define SMI_ENTRY(type, name, Name) case k##Name##RootIndex: #define SMI_ENTRY(type, name, Name) case k##Name##RootIndex:
......
...@@ -187,6 +187,7 @@ namespace internal { ...@@ -187,6 +187,7 @@ namespace internal {
V(Object, weak_stack_trace_list, WeakStackTraceList) \ V(Object, weak_stack_trace_list, WeakStackTraceList) \
V(Object, code_stub_context, CodeStubContext) \ V(Object, code_stub_context, CodeStubContext) \
V(JSObject, code_stub_exports_object, CodeStubExportsObject) \ V(JSObject, code_stub_exports_object, CodeStubExportsObject) \
V(Object, noscript_shared_function_infos, NoScriptSharedFunctionInfos) \
V(FixedArray, interpreter_table, InterpreterTable) \ V(FixedArray, interpreter_table, InterpreterTable) \
V(Map, bytecode_array_map, BytecodeArrayMap) \ V(Map, bytecode_array_map, BytecodeArrayMap) \
V(BytecodeArray, empty_bytecode_array, EmptyBytecodeArray) V(BytecodeArray, empty_bytecode_array, EmptyBytecodeArray)
...@@ -1164,6 +1165,10 @@ class Heap { ...@@ -1164,6 +1165,10 @@ class Heap {
roots_[kStringTableRootIndex] = value; roots_[kStringTableRootIndex] = value;
} }
void SetRootNoScriptSharedFunctionInfos(Object* value) {
roots_[kNoScriptSharedFunctionInfosRootIndex] = value;
}
// Set the stack limit in the roots_ array. Some architectures generate // Set the stack limit in the roots_ array. Some architectures generate
// code that looks here, because it is faster than loading from the static // code that looks here, because it is faster than loading from the static
// jslimit_/real_jslimit_ variable in the StackGuard. // jslimit_/real_jslimit_ variable in the StackGuard.
......
...@@ -12102,9 +12102,8 @@ Script* Script::Iterator::Next() { return iterator_.Next<Script>(); } ...@@ -12102,9 +12102,8 @@ Script* Script::Iterator::Next() { return iterator_.Next<Script>(); }
SharedFunctionInfo::Iterator::Iterator(Isolate* isolate) SharedFunctionInfo::Iterator::Iterator(Isolate* isolate)
: script_iterator_(isolate), sfi_iterator_(NULL) { : script_iterator_(isolate),
NextScript(); sfi_iterator_(isolate->heap()->noscript_shared_function_infos()) {}
}
bool SharedFunctionInfo::Iterator::NextScript() { bool SharedFunctionInfo::Iterator::NextScript() {
...@@ -12127,19 +12126,20 @@ SharedFunctionInfo* SharedFunctionInfo::Iterator::Next() { ...@@ -12127,19 +12126,20 @@ SharedFunctionInfo* SharedFunctionInfo::Iterator::Next() {
void SharedFunctionInfo::SetScript(Handle<SharedFunctionInfo> shared, void SharedFunctionInfo::SetScript(Handle<SharedFunctionInfo> shared,
Handle<Object> script_object) { Handle<Object> script_object) {
if (shared->script() == *script_object) return; if (shared->script() == *script_object) return;
// Remove shared function info from old script's list. Isolate* isolate = shared->GetIsolate();
if (shared->script()->IsScript()) {
Script* old_script = Script::cast(shared->script()); // Add shared function info to new script's list. If a collection occurs,
if (old_script->shared_function_infos()->IsWeakFixedArray()) { // the shared function info may be temporarily in two lists.
WeakFixedArray* list = // This is okay because the gc-time processing of these lists can tolerate
WeakFixedArray::cast(old_script->shared_function_infos()); // duplicates.
list->Remove(shared); Handle<Object> list;
}
}
// Add shared function info to new script's list.
if (script_object->IsScript()) { if (script_object->IsScript()) {
Handle<Script> script = Handle<Script>::cast(script_object); Handle<Script> script = Handle<Script>::cast(script_object);
Handle<Object> list(script->shared_function_infos(), shared->GetIsolate()); list = handle(script->shared_function_infos(), isolate);
} else {
list = isolate->factory()->noscript_shared_function_infos();
}
#ifdef DEBUG #ifdef DEBUG
{ {
WeakFixedArray::Iterator iterator(*list); WeakFixedArray::Iterator iterator(*list);
...@@ -12150,8 +12150,28 @@ void SharedFunctionInfo::SetScript(Handle<SharedFunctionInfo> shared, ...@@ -12150,8 +12150,28 @@ void SharedFunctionInfo::SetScript(Handle<SharedFunctionInfo> shared,
} }
#endif // DEBUG #endif // DEBUG
list = WeakFixedArray::Add(list, shared); list = WeakFixedArray::Add(list, shared);
if (script_object->IsScript()) {
Handle<Script> script = Handle<Script>::cast(script_object);
script->set_shared_function_infos(*list); script->set_shared_function_infos(*list);
} else {
isolate->heap()->SetRootNoScriptSharedFunctionInfos(*list);
} }
// Remove shared function info from old script's list.
if (shared->script()->IsScript()) {
Script* old_script = Script::cast(shared->script());
if (old_script->shared_function_infos()->IsWeakFixedArray()) {
WeakFixedArray* list =
WeakFixedArray::cast(old_script->shared_function_infos());
list->Remove(shared);
}
} else {
// Remove shared function info from root array.
Object* list = isolate->heap()->noscript_shared_function_infos();
CHECK(WeakFixedArray::cast(list)->Remove(shared));
}
// Finally set new script. // Finally set new script.
shared->set_script(*script_object); shared->set_script(*script_object);
} }
......
...@@ -6855,9 +6855,7 @@ class SharedFunctionInfo: public HeapObject { ...@@ -6855,9 +6855,7 @@ class SharedFunctionInfo: public HeapObject {
void ResetForNewContext(int new_ic_age); void ResetForNewContext(int new_ic_age);
// Iterate over all shared function infos that are created from a script. // Iterate over all shared function infos.
// That excludes shared function infos created for API functions and C++
// builtins.
class Iterator { class Iterator {
public: public:
explicit Iterator(Isolate* isolate); explicit Iterator(Isolate* isolate);
......
...@@ -6227,20 +6227,9 @@ TEST(SharedFunctionInfoIterator) { ...@@ -6227,20 +6227,9 @@ TEST(SharedFunctionInfoIterator) {
HeapIterator it(heap); HeapIterator it(heap);
for (HeapObject* obj = it.next(); obj != NULL; obj = it.next()) { for (HeapObject* obj = it.next(); obj != NULL; obj = it.next()) {
if (!obj->IsSharedFunctionInfo()) continue; if (!obj->IsSharedFunctionInfo()) continue;
// Shared function infos without a script (API functions or C++ builtins)
// are not returned by the iterator because they are not created from a
// script. They are not interesting for type feedback vector anyways.
// TODO(mvstanton): There are builtins that use type feedback vectors,
// consider adding these to the iterator.
SharedFunctionInfo* shared = SharedFunctionInfo::cast(obj);
if (shared->script()->IsUndefined()) {
CHECK(shared->native() || shared->feedback_vector()->is_empty());
} else {
sfi_count++; sfi_count++;
} }
} }
}
{ {
SharedFunctionInfo::Iterator iterator(isolate); SharedFunctionInfo::Iterator iterator(isolate);
......
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