Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 552d4f5516e3feaeb6f2ff9b6e838e5e8c465c34..9618c9dccd723f9640af71e219bff7aba0323207 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -7816,6 +7816,17 @@ void WeakFixedArray::Compact() { |
} |
+void WeakFixedArray::Iterator::Reset(Object* maybe_array) { |
+ if (maybe_array->IsWeakFixedArray()) { |
+ list_ = WeakFixedArray::cast(maybe_array); |
+ index_ = 0; |
+#ifdef DEBUG |
+ last_used_index_ = list_->last_used_index(); |
+#endif // DEBUG |
+ } |
+} |
+ |
+ |
void JSObject::PrototypeRegistryCompactionCallback::Callback(Object* value, |
int old_index, |
int new_index) { |
@@ -9666,16 +9677,10 @@ static void InvalidatePrototypeChainsInternal(Map* map) { |
cell->set_value(Smi::FromInt(Map::kPrototypeChainInvalid)); |
} |
- Object* maybe_array = proto_info->prototype_users(); |
- if (!maybe_array->IsWeakFixedArray()) return; |
- |
- WeakFixedArray* users = WeakFixedArray::cast(maybe_array); |
- for (int i = 0; i < users->Length(); ++i) { |
- Object* maybe_user = users->Get(i); |
- if (maybe_user->IsSmi()) continue; |
- |
- // For now, only maps register themselves as users. |
- Map* user = Map::cast(maybe_user); |
+ WeakFixedArray::Iterator iterator(proto_info->prototype_users()); |
+ // For now, only maps register themselves as users. |
+ Map* user; |
+ while ((user = iterator.Next<Map>())) { |
// Walk the prototype chain (backwards, towards leaf objects) if necessary. |
InvalidatePrototypeChainsInternal(user); |
} |
@@ -10179,22 +10184,48 @@ Handle<JSObject> Script::GetWrapper(Handle<Script> script) { |
MaybeHandle<SharedFunctionInfo> Script::FindSharedFunctionInfo( |
FunctionLiteral* fun) { |
- if (shared_function_infos()->IsWeakFixedArray()) { |
- WeakFixedArray* array = WeakFixedArray::cast(shared_function_infos()); |
- for (int i = 0; i < array->Length(); i++) { |
- Object* obj = array->Get(i); |
- if (!obj->IsSharedFunctionInfo()) continue; |
- SharedFunctionInfo* shared = SharedFunctionInfo::cast(obj); |
- if (fun->function_token_position() == shared->function_token_position() && |
- fun->start_position() == shared->start_position()) { |
- return Handle<SharedFunctionInfo>(shared); |
- } |
+ WeakFixedArray::Iterator iterator(shared_function_infos()); |
+ SharedFunctionInfo* shared; |
+ while ((shared = iterator.Next<SharedFunctionInfo>())) { |
+ if (fun->function_token_position() == shared->function_token_position() && |
+ fun->start_position() == shared->start_position()) { |
+ return Handle<SharedFunctionInfo>(shared); |
} |
} |
return MaybeHandle<SharedFunctionInfo>(); |
} |
+Script::Iterator::Iterator(Isolate* isolate) |
+ : iterator_(isolate->heap()->script_list()) {} |
+ |
+ |
+Script* Script::Iterator::Next() { return iterator_.Next<Script>(); } |
+ |
+ |
+SharedFunctionInfo::Iterator::Iterator(Isolate* isolate) |
+ : script_iterator_(isolate), sfi_iterator_(NULL) { |
+ NextScript(); |
+} |
+ |
+ |
+bool SharedFunctionInfo::Iterator::NextScript() { |
+ Script* script = script_iterator_.Next(); |
+ if (script == NULL) return false; |
+ sfi_iterator_.Reset(script->shared_function_infos()); |
+ return true; |
+} |
+ |
+ |
+SharedFunctionInfo* SharedFunctionInfo::Iterator::Next() { |
+ do { |
+ SharedFunctionInfo* next = sfi_iterator_.Next<SharedFunctionInfo>(); |
+ if (next != NULL) return next; |
+ } while (NextScript()); |
+ return NULL; |
+} |
+ |
+ |
void SharedFunctionInfo::SetScript(Handle<SharedFunctionInfo> shared, |
Handle<Object> script_object) { |
if (shared->script() == *script_object) return; |
@@ -10212,10 +10243,11 @@ void SharedFunctionInfo::SetScript(Handle<SharedFunctionInfo> shared, |
Handle<Script> script = Handle<Script>::cast(script_object); |
Handle<Object> list(script->shared_function_infos(), shared->GetIsolate()); |
#ifdef DEBUG |
- if (list->IsWeakFixedArray()) { |
- Handle<WeakFixedArray> array = Handle<WeakFixedArray>::cast(list); |
- for (int i = 0; i < array->Length(); ++i) { |
- DCHECK(array->Get(i) != *shared); |
+ { |
+ WeakFixedArray::Iterator iterator(*list); |
+ SharedFunctionInfo* next; |
+ while ((next = iterator.Next<SharedFunctionInfo>())) { |
+ DCHECK_NE(next, *shared); |
} |
} |
#endif // DEBUG |