| Index: src/type-feedback-vector.cc
|
| diff --git a/src/type-feedback-vector.cc b/src/type-feedback-vector.cc
|
| index 676290c83d021fff88102a40c4d65c478fb56c31..c0078c5001653cdf1eb41592b498b6f884af06c8 100644
|
| --- a/src/type-feedback-vector.cc
|
| +++ b/src/type-feedback-vector.cc
|
| @@ -4,7 +4,6 @@
|
|
|
| #include "src/v8.h"
|
|
|
| -#include "src/ic/ic.h"
|
| #include "src/ic/ic-state.h"
|
| #include "src/objects.h"
|
| #include "src/type-feedback-vector-inl.h"
|
| @@ -152,142 +151,9 @@ void TypeFeedbackVector::ClearSlots(SharedFunctionInfo* shared) {
|
| FeedbackVectorICSlot slot(i);
|
| Object* obj = Get(slot);
|
| if (obj != uninitialized_sentinel) {
|
| - // TODO(mvstanton): To make this code work with --vector-ics,
|
| - // additional Nexus types must be created.
|
| - DCHECK(!FLAG_vector_ics);
|
| - DCHECK(GetKind(slot) == Code::CALL_IC);
|
| - CallICNexus nexus(this, slot);
|
| - ICUtility::Clear(isolate, Code::CALL_IC, host, &nexus);
|
| + ICUtility::Clear(isolate, Code::CALL_IC, host, this, slot);
|
| }
|
| }
|
| }
|
| -
|
| -
|
| -Handle<FixedArray> FeedbackNexus::EnsureArrayOfSize(int length) {
|
| - Isolate* isolate = GetIsolate();
|
| - Handle<Object> feedback = handle(GetFeedback(), isolate);
|
| - if (!feedback->IsFixedArray() ||
|
| - FixedArray::cast(*feedback)->length() != length) {
|
| - Handle<FixedArray> array = isolate->factory()->NewFixedArray(length);
|
| - SetFeedback(*array);
|
| - return array;
|
| - }
|
| - return Handle<FixedArray>::cast(feedback);
|
| -}
|
| -
|
| -
|
| -void FeedbackNexus::InstallHandlers(int start_index, TypeHandleList* types,
|
| - CodeHandleList* handlers) {
|
| - Isolate* isolate = GetIsolate();
|
| - FixedArray* array = FixedArray::cast(GetFeedback());
|
| - 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);
|
| - array->set(start_index + (current * 2 + 1), *handlers->at(current));
|
| - }
|
| -}
|
| -
|
| -
|
| -InlineCacheState CallICNexus::StateFromFeedback() const {
|
| - Isolate* isolate = GetIsolate();
|
| - InlineCacheState state = UNINITIALIZED;
|
| - Object* feedback = GetFeedback();
|
| -
|
| - if (feedback == *vector()->MegamorphicSentinel(isolate)) {
|
| - state = GENERIC;
|
| - } else if (feedback->IsAllocationSite() || feedback->IsJSFunction()) {
|
| - state = MONOMORPHIC;
|
| - } else {
|
| - CHECK(feedback == *vector()->UninitializedSentinel(isolate));
|
| - }
|
| -
|
| - return state;
|
| -}
|
| -
|
| -
|
| -void CallICNexus::ConfigureGeneric() {
|
| - SetFeedback(*vector()->MegamorphicSentinel(GetIsolate()), SKIP_WRITE_BARRIER);
|
| -}
|
| -
|
| -
|
| -void CallICNexus::ConfigureMonomorphicArray() {
|
| - Object* feedback = GetFeedback();
|
| - if (!feedback->IsAllocationSite()) {
|
| - Handle<AllocationSite> new_site =
|
| - GetIsolate()->factory()->NewAllocationSite();
|
| - SetFeedback(*new_site);
|
| - }
|
| -}
|
| -
|
| -
|
| -void CallICNexus::ConfigureUninitialized() {
|
| - SetFeedback(*vector()->UninitializedSentinel(GetIsolate()),
|
| - SKIP_WRITE_BARRIER);
|
| -}
|
| -
|
| -
|
| -void CallICNexus::ConfigureMonomorphic(Handle<JSFunction> function) {
|
| - SetFeedback(*function);
|
| -}
|
| -
|
| -
|
| -int FeedbackNexus::ExtractMaps(int start_index, MapHandleList* maps) const {
|
| - Isolate* isolate = GetIsolate();
|
| - Object* feedback = GetFeedback();
|
| - if (feedback->IsFixedArray()) {
|
| - 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));
|
| - }
|
| - return (array->length() - start_index) / 2;
|
| - }
|
| -
|
| - return 0;
|
| -}
|
| -
|
| -
|
| -MaybeHandle<Code> FeedbackNexus::FindHandlerForMap(int start_index,
|
| - Handle<Map> map) const {
|
| - Object* feedback = GetFeedback();
|
| - 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);
|
| - }
|
| - }
|
| - }
|
| -
|
| - return MaybeHandle<Code>();
|
| -}
|
| -
|
| -
|
| -bool FeedbackNexus::FindHandlers(int start_index, CodeHandleList* code_list,
|
| - int length) const {
|
| - Object* feedback = GetFeedback();
|
| - int count = 0;
|
| - if (feedback->IsFixedArray()) {
|
| - 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) {
|
| - Code* code = Code::cast(array->get(i + 1));
|
| - DCHECK(code->kind() == Code::HANDLER);
|
| - code_list->Add(handle(code));
|
| - count++;
|
| - }
|
| - }
|
| - return count == length;
|
| -}
|
| }
|
| } // namespace v8::internal
|
|
|