diff options
Diffstat (limited to 'deps/v8/src/type-info.cc')
-rw-r--r-- | deps/v8/src/type-info.cc | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/deps/v8/src/type-info.cc b/deps/v8/src/type-info.cc index 611373f865..01943414a7 100644 --- a/deps/v8/src/type-info.cc +++ b/deps/v8/src/type-info.cc @@ -16,16 +16,16 @@ namespace internal { TypeFeedbackOracle::TypeFeedbackOracle( - Handle<Code> code, Handle<TypeFeedbackVector> feedback_vector, - Handle<Context> native_context, Zone* zone) - : native_context_(native_context), zone_(zone) { + Isolate* isolate, Zone* zone, Handle<Code> code, + Handle<TypeFeedbackVector> feedback_vector, Handle<Context> native_context) + : native_context_(native_context), isolate_(isolate), zone_(zone) { BuildDictionary(code); DCHECK(dictionary_->IsDictionary()); // We make a copy of the feedback vector because a GC could clear // the type feedback info contained therein. // TODO(mvstanton): revisit the decision to copy when we weakly // traverse the feedback vector at GC time. - feedback_vector_ = TypeFeedbackVector::Copy(isolate(), feedback_vector); + feedback_vector_ = TypeFeedbackVector::Copy(isolate, feedback_vector); } @@ -62,12 +62,23 @@ Handle<Object> TypeFeedbackOracle::GetInfo(FeedbackVectorSlot slot) { Handle<Object> TypeFeedbackOracle::GetInfo(FeedbackVectorICSlot slot) { DCHECK(slot.ToInt() >= 0 && slot.ToInt() < feedback_vector_->length()); + Handle<Object> undefined = + Handle<Object>::cast(isolate()->factory()->undefined_value()); Object* obj = feedback_vector_->Get(slot); + + // Vector-based ICs do not embed direct pointers to maps, functions. + // Instead a WeakCell is always used. + if (obj->IsWeakCell()) { + WeakCell* cell = WeakCell::cast(obj); + if (cell->cleared()) return undefined; + obj = cell->value(); + } + if (!obj->IsJSFunction() || !CanRetainOtherContext(JSFunction::cast(obj), *native_context_)) { return Handle<Object>(obj, isolate()); } - return Handle<Object>::cast(isolate()->factory()->undefined_value()); + return undefined; } |