Index: src/type-feedback-vector.cc |
diff --git a/src/type-feedback-vector.cc b/src/type-feedback-vector.cc |
index 45028b87879f7bbe2984179c111f586ce6f9025e..c51d9877f1c27c4e31fcdb02316a36c1883e2c92 100644 |
--- a/src/type-feedback-vector.cc |
+++ b/src/type-feedback-vector.cc |
@@ -223,12 +223,13 @@ Handle<FixedArray> FeedbackNexus::EnsureArrayOfSize(int length) { |
void FeedbackNexus::InstallHandlers(int start_index, TypeHandleList* types, |
CodeHandleList* handlers) { |
Isolate* isolate = GetIsolate(); |
- FixedArray* array = FixedArray::cast(GetFeedback()); |
+ Handle<FixedArray> array = handle(FixedArray::cast(GetFeedback()), isolate); |
int receiver_count = types->length(); |
for (int current = 0; current < receiver_count; ++current) { |
Handle<HeapType> type = types->at(current); |
Handle<Map> map = IC::TypeToMap(*type, isolate); |
- array->set(start_index + (current * 2), *map); |
+ Handle<WeakCell> cell = Map::WeakCellForMap(map); |
+ array->set(start_index + (current * 2), *cell); |
array->set(start_index + (current * 2 + 1), *handlers->at(current)); |
} |
} |
@@ -244,6 +245,8 @@ InlineCacheState LoadICNexus::StateFromFeedback() const { |
} else if (feedback == *vector()->PremonomorphicSentinel(isolate)) { |
return PREMONOMORPHIC; |
} else if (feedback->IsFixedArray()) { |
+ // Determine state purely by our structure, don't check if the maps are |
+ // cleared. |
FixedArray* array = FixedArray::cast(feedback); |
int length = array->length(); |
DCHECK(length >= 2); |
@@ -264,6 +267,8 @@ InlineCacheState KeyedLoadICNexus::StateFromFeedback() const { |
} else if (feedback == *vector()->GenericSentinel(isolate)) { |
return GENERIC; |
} else if (feedback->IsFixedArray()) { |
+ // Determine state purely by our structure, don't check if the maps are |
+ // cleared. |
FixedArray* array = FixedArray::cast(feedback); |
int length = array->length(); |
DCHECK(length >= 3); |
@@ -344,7 +349,8 @@ void LoadICNexus::ConfigureMonomorphic(Handle<HeapType> type, |
Handle<Code> handler) { |
Handle<FixedArray> array = EnsureArrayOfSize(2); |
Handle<Map> receiver_map = IC::TypeToMap(*type, GetIsolate()); |
- array->set(0, *receiver_map); |
+ Handle<WeakCell> cell = Map::WeakCellForMap(receiver_map); |
+ array->set(0, *cell); |
array->set(1, *handler); |
} |
@@ -359,7 +365,8 @@ void KeyedLoadICNexus::ConfigureMonomorphic(Handle<Name> name, |
} else { |
array->set(0, *name); |
} |
- array->set(1, *receiver_map); |
+ Handle<WeakCell> cell = Map::WeakCellForMap(receiver_map); |
+ array->set(1, *cell); |
array->set(2, *handler); |
} |
@@ -390,15 +397,20 @@ int FeedbackNexus::ExtractMaps(int start_index, MapHandleList* maps) const { |
Isolate* isolate = GetIsolate(); |
Object* feedback = GetFeedback(); |
if (feedback->IsFixedArray()) { |
+ int found = 0; |
FixedArray* array = FixedArray::cast(feedback); |
// The array should be of the form [<optional name>], then |
// [map, handler, map, handler, ... ] |
DCHECK(array->length() >= (2 + start_index)); |
for (int i = start_index; i < array->length(); i += 2) { |
- Map* map = Map::cast(array->get(i)); |
- maps->Add(handle(map, isolate)); |
+ WeakCell* cell = WeakCell::cast(array->get(i)); |
+ if (!cell->cleared()) { |
+ Map* map = Map::cast(cell->value()); |
+ maps->Add(handle(map, isolate)); |
+ found++; |
+ } |
} |
- return (array->length() - start_index) / 2; |
+ return found; |
} |
return 0; |
@@ -411,11 +423,14 @@ MaybeHandle<Code> FeedbackNexus::FindHandlerForMap(int start_index, |
if (feedback->IsFixedArray()) { |
FixedArray* array = FixedArray::cast(feedback); |
for (int i = start_index; i < array->length(); i += 2) { |
- Map* array_map = Map::cast(array->get(i)); |
- if (array_map == *map) { |
- Code* code = Code::cast(array->get(i + 1)); |
- DCHECK(code->kind() == Code::HANDLER); |
- return handle(code); |
+ WeakCell* cell = WeakCell::cast(array->get(i)); |
+ if (!cell->cleared()) { |
+ Map* array_map = Map::cast(cell->value()); |
+ if (array_map == *map) { |
+ Code* code = Code::cast(array->get(i + 1)); |
+ DCHECK(code->kind() == Code::HANDLER); |
+ return handle(code); |
+ } |
} |
} |
} |
@@ -431,13 +446,17 @@ bool FeedbackNexus::FindHandlers(int start_index, CodeHandleList* code_list, |
if (feedback->IsFixedArray()) { |
FixedArray* array = FixedArray::cast(feedback); |
// The array should be of the form [<optional name>], then |
- // [map, handler, map, handler, ... ] |
+ // [map, handler, map, handler, ... ]. Be sure to skip handlers whose maps |
+ // have been cleared. |
DCHECK(array->length() >= (2 + start_index)); |
for (int i = start_index; i < array->length(); i += 2) { |
- Code* code = Code::cast(array->get(i + 1)); |
- DCHECK(code->kind() == Code::HANDLER); |
- code_list->Add(handle(code)); |
- count++; |
+ WeakCell* cell = WeakCell::cast(array->get(i)); |
+ if (!cell->cleared()) { |
+ Code* code = Code::cast(array->get(i + 1)); |
+ DCHECK(code->kind() == Code::HANDLER); |
+ code_list->Add(handle(code)); |
+ count++; |
+ } |
} |
} |
return count == length; |