| Index: src/type-feedback-vector.cc
|
| diff --git a/src/type-feedback-vector.cc b/src/type-feedback-vector.cc
|
| index 2316f2979951fa285e85eb5d50c72323fafc4856..bb22cac1e39113cae9a72afd727500064af26357 100644
|
| --- a/src/type-feedback-vector.cc
|
| +++ b/src/type-feedback-vector.cc
|
| @@ -132,13 +132,9 @@ Handle<TypeFeedbackVector> TypeFeedbackVector::Copy(
|
|
|
| // This logic is copied from
|
| // StaticMarkingVisitor<StaticVisitor>::VisitCodeTarget.
|
| -// TODO(mvstanton): with weak handling of all vector ics, this logic should
|
| -// actually be completely eliminated and we no longer need to clear the
|
| -// vector ICs.
|
| -static bool ClearLogic(Heap* heap, int ic_age, Code::Kind kind,
|
| - InlineCacheState state) {
|
| +static bool ClearLogic(Heap* heap, int ic_age) {
|
| if (FLAG_cleanup_code_caches_at_gc &&
|
| - (kind == Code::CALL_IC || heap->flush_monomorphic_ics() ||
|
| + (heap->flush_monomorphic_ics() ||
|
| // TODO(mvstanton): is this ic_age granular enough? it comes from
|
| // the SharedFunctionInfo which may change on a different schedule
|
| // than ic targets.
|
| @@ -171,16 +167,22 @@ void TypeFeedbackVector::ClearSlots(SharedFunctionInfo* shared) {
|
| }
|
| }
|
| }
|
| +}
|
|
|
| - slots = ICSlots();
|
| - if (slots == 0) return;
|
|
|
| - // Now clear vector-based ICs.
|
| - // Try and pass the containing code (the "host").
|
| - Heap* heap = isolate->heap();
|
| - Code* host = shared->code();
|
| +void TypeFeedbackVector::ClearICSlotsImpl(SharedFunctionInfo* shared,
|
| + bool force_clear) {
|
| + Heap* heap = GetIsolate()->heap();
|
| +
|
| // I'm not sure yet if this ic age is the correct one.
|
| int ic_age = shared->ic_age();
|
| +
|
| + if (!force_clear && !ClearLogic(heap, ic_age)) return;
|
| +
|
| + int slots = ICSlots();
|
| + Code* host = shared->code();
|
| + Object* uninitialized_sentinel =
|
| + TypeFeedbackVector::RawUninitializedSentinel(heap);
|
| for (int i = 0; i < slots; i++) {
|
| FeedbackVectorICSlot slot(i);
|
| Object* obj = Get(slot);
|
| @@ -188,19 +190,13 @@ void TypeFeedbackVector::ClearSlots(SharedFunctionInfo* shared) {
|
| Code::Kind kind = GetKind(slot);
|
| if (kind == Code::CALL_IC) {
|
| CallICNexus nexus(this, slot);
|
| - if (ClearLogic(heap, ic_age, kind, nexus.StateFromFeedback())) {
|
| - nexus.Clear(host);
|
| - }
|
| + nexus.Clear(host);
|
| } else if (kind == Code::LOAD_IC) {
|
| LoadICNexus nexus(this, slot);
|
| - if (ClearLogic(heap, ic_age, kind, nexus.StateFromFeedback())) {
|
| - nexus.Clear(host);
|
| - }
|
| + nexus.Clear(host);
|
| } else if (kind == Code::KEYED_LOAD_IC) {
|
| KeyedLoadICNexus nexus(this, slot);
|
| - if (ClearLogic(heap, ic_age, kind, nexus.StateFromFeedback())) {
|
| - nexus.Clear(host);
|
| - }
|
| + nexus.Clear(host);
|
| }
|
| }
|
| }
|
| @@ -285,7 +281,7 @@ InlineCacheState CallICNexus::StateFromFeedback() const {
|
|
|
| if (feedback == *vector()->MegamorphicSentinel(isolate)) {
|
| return GENERIC;
|
| - } else if (feedback->IsAllocationSite() || feedback->IsJSFunction()) {
|
| + } else if (feedback->IsAllocationSite() || feedback->IsWeakCell()) {
|
| return MONOMORPHIC;
|
| }
|
|
|
| @@ -319,7 +315,8 @@ void CallICNexus::ConfigureUninitialized() {
|
|
|
|
|
| void CallICNexus::ConfigureMonomorphic(Handle<JSFunction> function) {
|
| - SetFeedback(*function);
|
| + Handle<WeakCell> new_cell = GetIsolate()->factory()->NewWeakCell(function);
|
| + SetFeedback(*new_cell);
|
| }
|
|
|
|
|
|
|