| Index: src/type-info.cc
|
| diff --git a/src/type-info.cc b/src/type-info.cc
|
| index 0ba6dfa852e25118518e3c04273a41d7c02b563e..04e909bd6fe3f94ea6c064cc883e7670a7f3c396 100644
|
| --- a/src/type-info.cc
|
| +++ b/src/type-info.cc
|
| @@ -43,18 +43,18 @@ namespace internal {
|
|
|
|
|
| TypeFeedbackOracle::TypeFeedbackOracle(Handle<Code> code,
|
| + Handle<FixedArray> feedback_vector,
|
| Handle<Context> native_context,
|
| Zone* zone)
|
| : native_context_(native_context),
|
| zone_(zone) {
|
| - Object* raw_info = code->type_feedback_info();
|
| - if (raw_info->IsTypeFeedbackInfo()) {
|
| - feedback_vector_ = Handle<FixedArray>(TypeFeedbackInfo::cast(raw_info)->
|
| - feedback_vector());
|
| - }
|
| -
|
| BuildDictionary(code);
|
| ASSERT(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_ = isolate()->factory()->CopyFixedArray(feedback_vector);
|
| }
|
|
|
|
|
| @@ -136,9 +136,9 @@ bool TypeFeedbackOracle::CallNewIsMonomorphic(int slot) {
|
|
|
| byte TypeFeedbackOracle::ForInType(int feedback_vector_slot) {
|
| Handle<Object> value = GetInfo(feedback_vector_slot);
|
| - return value->IsSmi() &&
|
| - Smi::cast(*value)->value() == TypeFeedbackInfo::kForInFastCaseMarker
|
| - ? ForInStatement::FAST_FOR_IN : ForInStatement::SLOW_FOR_IN;
|
| + return value.is_identical_to(
|
| + TypeFeedbackInfo::UninitializedSentinel(isolate()))
|
| + ? ForInStatement::FAST_FOR_IN : ForInStatement::SLOW_FOR_IN;
|
| }
|
|
|
|
|
|
|