Index: src/type-info.cc |
diff --git a/src/type-info.cc b/src/type-info.cc |
index 790d77cb19cd55b49a122d4ead43d4c69586e767..d84e44e436d80f958d0afc259db465ff67cc91d2 100644 |
--- a/src/type-info.cc |
+++ b/src/type-info.cc |
@@ -140,6 +140,12 @@ bool TypeFeedbackOracle::CallIsMonomorphic(Call* expr) { |
} |
+bool TypeFeedbackOracle::CallNewIsMonomorphic(CallNew* expr) { |
+ Handle<Object> value = GetInfo(expr->id()); |
+ return value->IsJSFunction(); |
+} |
+ |
+ |
Handle<Map> TypeFeedbackOracle::LoadMonomorphicReceiverType(Property* expr) { |
ASSERT(LoadIsMonomorphicNormal(expr)); |
Handle<Object> map_or_code = GetInfo(expr->id()); |
@@ -541,6 +547,7 @@ void TypeFeedbackOracle::BuildDictionary(Handle<Code> code) { |
GetRelocInfos(code, &infos); |
CreateDictionary(code, &infos); |
ProcessRelocInfos(&infos); |
+ ProcessTypeFeedbackCells(code); |
Erik Corry
2012/01/30 15:01:11
This call uses number dictionaries on the heap, an
Vyacheslav Egorov (Chromium)
2012/01/30 15:10:03
Good catch! Yeah, CreateDictionary should add leng
Michael Starzinger
2012/01/30 15:22:58
Nice catch! Fix: https://chromiumcodereview.appspo
|
// Allocate handle in the parent scope. |
dictionary_ = scope.CloseAndEscape(dictionary_); |
} |
@@ -619,18 +626,6 @@ void TypeFeedbackOracle::ProcessRelocInfos(ZoneList<RelocInfo>* infos) { |
SetInfo(ast_id, target); |
break; |
- case Code::STUB: |
- if (target->major_key() == CodeStub::CallFunction && |
- target->has_function_cache()) { |
- Object* value = CallFunctionStub::GetCachedValue(reloc_entry.pc()); |
- if (value->IsJSFunction() && |
- !CanRetainOtherContext(JSFunction::cast(value), |
- *global_context_)) { |
- SetInfo(ast_id, value); |
- } |
- } |
- break; |
- |
default: |
break; |
} |
@@ -638,6 +633,20 @@ void TypeFeedbackOracle::ProcessRelocInfos(ZoneList<RelocInfo>* infos) { |
} |
+void TypeFeedbackOracle::ProcessTypeFeedbackCells(Handle<Code> code) { |
+ Handle<TypeFeedbackCells> cache(code->type_feedback_cells()); |
+ for (int i = 0; i < cache->CellCount(); i++) { |
+ unsigned ast_id = cache->AstId(i)->value(); |
+ Object* value = cache->Cell(i)->value(); |
+ if (value->IsJSFunction() && |
+ !CanRetainOtherContext(JSFunction::cast(value), |
+ *global_context_)) { |
+ SetInfo(ast_id, value); |
+ } |
+ } |
+} |
+ |
+ |
void TypeFeedbackOracle::SetInfo(unsigned ast_id, Object* target) { |
ASSERT(dictionary_->FindEntry(ast_id) == NumberDictionary::kNotFound); |
MaybeObject* maybe_result = dictionary_->AtNumberPut(ast_id, target); |