Index: src/type-info.cc |
diff --git a/src/type-info.cc b/src/type-info.cc |
index de6f5bf04294d2202dbb26c102fa38dedad92527..df657cb6ac40dcc2f2c6af7374ecac7af9ecba23 100644 |
--- a/src/type-info.cc |
+++ b/src/type-info.cc |
@@ -28,6 +28,7 @@ |
#include "v8.h" |
#include "ast.h" |
+#include "code-stubs.h" |
#include "compiler.h" |
#include "ic.h" |
#include "macro-assembler.h" |
@@ -88,6 +89,19 @@ bool TypeFeedbackOracle::LoadIsMonomorphicNormal(Property* expr) { |
} |
+bool TypeFeedbackOracle::LoadIsMegamorphicWithTypeInfo(Property* expr) { |
+ Handle<Object> map_or_code(GetInfo(expr->id())); |
+ if (map_or_code->IsCode()) { |
+ Handle<Code> code = Handle<Code>::cast(map_or_code); |
+ Builtins* builtins = Isolate::Current()->builtins(); |
+ return code->is_keyed_load_stub() && |
+ *code != builtins->builtin(Builtins::kKeyedLoadIC_Generic) && |
+ code->ic_state() == MEGAMORPHIC; |
+ } |
+ return false; |
+} |
+ |
+ |
bool TypeFeedbackOracle::StoreIsMonomorphicNormal(Expression* expr) { |
Handle<Object> map_or_code(GetInfo(expr->id())); |
if (map_or_code->IsMap()) return true; |
@@ -101,6 +115,19 @@ bool TypeFeedbackOracle::StoreIsMonomorphicNormal(Expression* expr) { |
} |
+bool TypeFeedbackOracle::StoreIsMegamorphicWithTypeInfo(Expression* expr) { |
+ Handle<Object> map_or_code(GetInfo(expr->id())); |
+ if (map_or_code->IsCode()) { |
+ Handle<Code> code = Handle<Code>::cast(map_or_code); |
+ Builtins* builtins = Isolate::Current()->builtins(); |
+ return code->is_keyed_store_stub() && |
+ *code != builtins->builtin(Builtins::kKeyedStoreIC_Generic) && |
+ code->ic_state() == MEGAMORPHIC; |
+ } |
+ return false; |
+} |
+ |
+ |
bool TypeFeedbackOracle::CallIsMonomorphic(Call* expr) { |
Handle<Object> value = GetInfo(expr->id()); |
return value->IsMap() || value->IsSmi(); |
@@ -390,6 +417,27 @@ ZoneMapList* TypeFeedbackOracle::CollectReceiverTypes(unsigned ast_id, |
} |
+void TypeFeedbackOracle::CollectKeyedReceiverTypes( |
+ unsigned ast_id, |
+ ZoneMapList* types) { |
+ Handle<Object> object = GetInfo(ast_id); |
+ if (!object->IsCode()) return; |
+ Handle<Code> code = Handle<Code>::cast(object); |
+ if (code->kind() == Code::KEYED_LOAD_IC || |
+ code->kind() == Code::KEYED_STORE_IC) { |
+ AssertNoAllocation no_allocation; |
+ int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); |
+ for (RelocIterator it(*code, mask); !it.done(); it.next()) { |
+ RelocInfo* info = it.rinfo(); |
+ Object* object = info->target_object(); |
+ if (object->IsMap()) { |
+ types->Add(Handle<Map>(Map::cast(object))); |
+ } |
+ } |
+ } |
+} |
+ |
+ |
void TypeFeedbackOracle::SetInfo(unsigned ast_id, Object* target) { |
ASSERT(dictionary_->FindEntry(ast_id) == NumberDictionary::kNotFound); |
MaybeObject* maybe_result = dictionary_->AtNumberPut(ast_id, target); |