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; |
} |