Chromium Code Reviews| Index: src/type-info.cc |
| diff --git a/src/type-info.cc b/src/type-info.cc |
| index 6747fec5f83b9ce8cc1b0ec9ab3c13f28c9ceabb..623201f5bc02f5ccc7c8e1a8f11d0c89c6550219 100644 |
| --- a/src/type-info.cc |
| +++ b/src/type-info.cc |
| @@ -71,8 +71,13 @@ TypeFeedbackOracle::TypeFeedbackOracle(Handle<Code> code, |
| } |
| -Handle<Object> TypeFeedbackOracle::GetInfo(unsigned ast_id) { |
| - int entry = dictionary_->FindEntry(ast_id); |
| +static uint32_t IdToKey(TypeFeedbackId id) { |
|
Michael Starzinger
2012/08/06 13:03:41
Let's use "ast_id" as a name for this local variab
Sven Panne
2012/08/06 14:08:40
Done.
|
| + return static_cast<uint32_t>(id.ToInt()); |
| +} |
| + |
| + |
| +Handle<Object> TypeFeedbackOracle::GetInfo(TypeFeedbackId id) { |
| + int entry = dictionary_->FindEntry(IdToKey(id)); |
| return entry != UnseededNumberDictionary::kNotFound |
| ? Handle<Object>(dictionary_->ValueAt(entry)) |
| : Handle<Object>::cast(isolate_->factory()->undefined_value()); |
| @@ -80,7 +85,7 @@ Handle<Object> TypeFeedbackOracle::GetInfo(unsigned ast_id) { |
| bool TypeFeedbackOracle::LoadIsUninitialized(Property* expr) { |
| - Handle<Object> map_or_code = GetInfo(expr->id()); |
| + Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); |
| if (map_or_code->IsMap()) return false; |
| if (map_or_code->IsCode()) { |
| Handle<Code> code = Handle<Code>::cast(map_or_code); |
| @@ -91,7 +96,7 @@ bool TypeFeedbackOracle::LoadIsUninitialized(Property* expr) { |
| bool TypeFeedbackOracle::LoadIsMonomorphicNormal(Property* expr) { |
| - Handle<Object> map_or_code = GetInfo(expr->id()); |
| + Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); |
| if (map_or_code->IsMap()) return true; |
| if (map_or_code->IsCode()) { |
| Handle<Code> code = Handle<Code>::cast(map_or_code); |
| @@ -106,7 +111,7 @@ bool TypeFeedbackOracle::LoadIsMonomorphicNormal(Property* expr) { |
| bool TypeFeedbackOracle::LoadIsMegamorphicWithTypeInfo(Property* expr) { |
| - Handle<Object> map_or_code = GetInfo(expr->id()); |
| + Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); |
| if (map_or_code->IsCode()) { |
| Handle<Code> code = Handle<Code>::cast(map_or_code); |
| Builtins* builtins = isolate_->builtins(); |
| @@ -118,8 +123,8 @@ bool TypeFeedbackOracle::LoadIsMegamorphicWithTypeInfo(Property* expr) { |
| } |
| -bool TypeFeedbackOracle::StoreIsMonomorphicNormal(Expression* expr) { |
| - Handle<Object> map_or_code = GetInfo(expr->id()); |
| +bool TypeFeedbackOracle::StoreIsMonomorphicNormal(TypeFeedbackId id) { |
| + Handle<Object> map_or_code = GetInfo(id); |
| if (map_or_code->IsMap()) return true; |
| if (map_or_code->IsCode()) { |
| Handle<Code> code = Handle<Code>::cast(map_or_code); |
| @@ -137,8 +142,8 @@ bool TypeFeedbackOracle::StoreIsMonomorphicNormal(Expression* expr) { |
| } |
| -bool TypeFeedbackOracle::StoreIsMegamorphicWithTypeInfo(Expression* expr) { |
| - Handle<Object> map_or_code = GetInfo(expr->id()); |
| +bool TypeFeedbackOracle::StoreIsMegamorphicWithTypeInfo(TypeFeedbackId id) { |
| + Handle<Object> map_or_code = GetInfo(id); |
| if (map_or_code->IsCode()) { |
| Handle<Code> code = Handle<Code>::cast(map_or_code); |
| Builtins* builtins = isolate_->builtins(); |
| @@ -156,26 +161,26 @@ bool TypeFeedbackOracle::StoreIsMegamorphicWithTypeInfo(Expression* expr) { |
| bool TypeFeedbackOracle::CallIsMonomorphic(Call* expr) { |
| - Handle<Object> value = GetInfo(expr->id()); |
| + Handle<Object> value = GetInfo(expr->CallFeedbackId()); |
| return value->IsMap() || value->IsSmi() || value->IsJSFunction(); |
| } |
| bool TypeFeedbackOracle::CallNewIsMonomorphic(CallNew* expr) { |
| - Handle<Object> value = GetInfo(expr->id()); |
| + Handle<Object> value = GetInfo(expr->CallNewFeedbackId()); |
| return value->IsJSFunction(); |
| } |
| bool TypeFeedbackOracle::ObjectLiteralStoreIsMonomorphic( |
| ObjectLiteral::Property* prop) { |
| - Handle<Object> map_or_code = GetInfo(prop->key()->id()); |
| + Handle<Object> map_or_code = GetInfo(prop->key()->LiteralFeedbackId()); |
| return map_or_code->IsMap(); |
| } |
| bool TypeFeedbackOracle::IsForInFastCase(ForInStatement* stmt) { |
| - Handle<Object> value = GetInfo(stmt->PrepareId()); |
| + Handle<Object> value = GetInfo(stmt->ForInFeedbackId()); |
| return value->IsSmi() && |
| Smi::cast(*value)->value() == TypeFeedbackCells::kForInFastCaseMarker; |
| } |
| @@ -183,7 +188,7 @@ bool TypeFeedbackOracle::IsForInFastCase(ForInStatement* stmt) { |
| Handle<Map> TypeFeedbackOracle::LoadMonomorphicReceiverType(Property* expr) { |
| ASSERT(LoadIsMonomorphicNormal(expr)); |
| - Handle<Object> map_or_code = GetInfo(expr->id()); |
| + Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); |
| if (map_or_code->IsCode()) { |
| Handle<Code> code = Handle<Code>::cast(map_or_code); |
| Map* first_map = code->FindFirstMap(); |
| @@ -196,9 +201,10 @@ Handle<Map> TypeFeedbackOracle::LoadMonomorphicReceiverType(Property* expr) { |
| } |
| -Handle<Map> TypeFeedbackOracle::StoreMonomorphicReceiverType(Expression* expr) { |
| - ASSERT(StoreIsMonomorphicNormal(expr)); |
| - Handle<Object> map_or_code = GetInfo(expr->id()); |
| +Handle<Map> TypeFeedbackOracle::StoreMonomorphicReceiverType( |
| + TypeFeedbackId id) { |
| + ASSERT(StoreIsMonomorphicNormal(id)); |
| + Handle<Object> map_or_code = GetInfo(id); |
| if (map_or_code->IsCode()) { |
| Handle<Code> code = Handle<Code>::cast(map_or_code); |
| Map* first_map = code->FindFirstMap(); |
| @@ -216,7 +222,7 @@ void TypeFeedbackOracle::LoadReceiverTypes(Property* expr, |
| SmallMapList* types) { |
| Code::Flags flags = |
| Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NORMAL); |
| - CollectReceiverTypes(expr->id(), name, flags, types); |
| + CollectReceiverTypes(expr->PropertyFeedbackId(), name, flags, types); |
| } |
| @@ -225,7 +231,7 @@ void TypeFeedbackOracle::StoreReceiverTypes(Assignment* expr, |
| SmallMapList* types) { |
| Code::Flags flags = |
| Code::ComputeMonomorphicFlags(Code::STORE_IC, Code::NORMAL); |
| - CollectReceiverTypes(expr->id(), name, flags, types); |
| + CollectReceiverTypes(expr->AssignmentFeedbackId(), name, flags, types); |
| } |
| @@ -245,12 +251,12 @@ void TypeFeedbackOracle::CallReceiverTypes(Call* expr, |
| extra_ic_state, |
| OWN_MAP, |
| arity); |
| - CollectReceiverTypes(expr->id(), name, flags, types); |
| + CollectReceiverTypes(expr->CallFeedbackId(), name, flags, types); |
| } |
| CheckType TypeFeedbackOracle::GetCallCheckType(Call* expr) { |
| - Handle<Object> value = GetInfo(expr->id()); |
| + Handle<Object> value = GetInfo(expr->CallFeedbackId()); |
| if (!value->IsSmi()) return RECEIVER_MAP_CHECK; |
| CheckType check = static_cast<CheckType>(Smi::cast(*value)->value()); |
| ASSERT(check != RECEIVER_MAP_CHECK); |
| @@ -281,30 +287,30 @@ Handle<JSObject> TypeFeedbackOracle::GetPrototypeForPrimitiveCheck( |
| Handle<JSFunction> TypeFeedbackOracle::GetCallTarget(Call* expr) { |
| - return Handle<JSFunction>::cast(GetInfo(expr->id())); |
| + return Handle<JSFunction>::cast(GetInfo(expr->CallFeedbackId())); |
| } |
| Handle<JSFunction> TypeFeedbackOracle::GetCallNewTarget(CallNew* expr) { |
| - return Handle<JSFunction>::cast(GetInfo(expr->id())); |
| + return Handle<JSFunction>::cast(GetInfo(expr->CallNewFeedbackId())); |
| } |
| Handle<Map> TypeFeedbackOracle::GetObjectLiteralStoreMap( |
| ObjectLiteral::Property* prop) { |
| ASSERT(ObjectLiteralStoreIsMonomorphic(prop)); |
| - return Handle<Map>::cast(GetInfo(prop->key()->id())); |
| + return Handle<Map>::cast(GetInfo(prop->key()->LiteralFeedbackId())); |
| } |
| bool TypeFeedbackOracle::LoadIsBuiltin(Property* expr, Builtins::Name id) { |
| - return *GetInfo(expr->id()) == |
| + return *GetInfo(expr->PropertyFeedbackId()) == |
| isolate_->builtins()->builtin(id); |
| } |
| TypeInfo TypeFeedbackOracle::CompareType(CompareOperation* expr) { |
| - Handle<Object> object = GetInfo(expr->id()); |
| + Handle<Object> object = GetInfo(expr->CompareOperationFeedbackId()); |
| TypeInfo unknown = TypeInfo::Unknown(); |
| if (!object->IsCode()) return unknown; |
| Handle<Code> code = Handle<Code>::cast(object); |
| @@ -334,7 +340,7 @@ TypeInfo TypeFeedbackOracle::CompareType(CompareOperation* expr) { |
| bool TypeFeedbackOracle::IsSymbolCompare(CompareOperation* expr) { |
| - Handle<Object> object = GetInfo(expr->id()); |
| + Handle<Object> object = GetInfo(expr->CompareOperationFeedbackId()); |
| if (!object->IsCode()) return false; |
| Handle<Code> code = Handle<Code>::cast(object); |
| if (!code->is_compare_ic_stub()) return false; |
| @@ -344,7 +350,7 @@ bool TypeFeedbackOracle::IsSymbolCompare(CompareOperation* expr) { |
| Handle<Map> TypeFeedbackOracle::GetCompareMap(CompareOperation* expr) { |
| - Handle<Object> object = GetInfo(expr->id()); |
| + Handle<Object> object = GetInfo(expr->CompareOperationFeedbackId()); |
| if (!object->IsCode()) return Handle<Map>::null(); |
| Handle<Code> code = Handle<Code>::cast(object); |
| if (!code->is_compare_ic_stub()) return Handle<Map>::null(); |
| @@ -361,7 +367,7 @@ Handle<Map> TypeFeedbackOracle::GetCompareMap(CompareOperation* expr) { |
| TypeInfo TypeFeedbackOracle::UnaryType(UnaryOperation* expr) { |
| - Handle<Object> object = GetInfo(expr->id()); |
| + Handle<Object> object = GetInfo(expr->UnaryOperationFeedbackId()); |
| TypeInfo unknown = TypeInfo::Unknown(); |
| if (!object->IsCode()) return unknown; |
| Handle<Code> code = Handle<Code>::cast(object); |
| @@ -380,7 +386,7 @@ TypeInfo TypeFeedbackOracle::UnaryType(UnaryOperation* expr) { |
| TypeInfo TypeFeedbackOracle::BinaryType(BinaryOperation* expr) { |
| - Handle<Object> object = GetInfo(expr->id()); |
| + Handle<Object> object = GetInfo(expr->BinaryOperationFeedbackId()); |
| TypeInfo unknown = TypeInfo::Unknown(); |
| if (!object->IsCode()) return unknown; |
| Handle<Code> code = Handle<Code>::cast(object); |
| @@ -464,7 +470,7 @@ TypeInfo TypeFeedbackOracle::SwitchType(CaseClause* clause) { |
| TypeInfo TypeFeedbackOracle::IncrementType(CountOperation* expr) { |
| - Handle<Object> object = GetInfo(expr->CountId()); |
| + Handle<Object> object = GetInfo(expr->CountBinOpFeedbackId()); |
| TypeInfo unknown = TypeInfo::Unknown(); |
| if (!object->IsCode()) return unknown; |
| Handle<Code> code = Handle<Code>::cast(object); |
| @@ -492,7 +498,7 @@ TypeInfo TypeFeedbackOracle::IncrementType(CountOperation* expr) { |
| } |
| -void TypeFeedbackOracle::CollectReceiverTypes(unsigned ast_id, |
| +void TypeFeedbackOracle::CollectReceiverTypes(TypeFeedbackId ast_id, |
| Handle<String> name, |
| Code::Flags flags, |
| SmallMapList* types) { |
| @@ -562,7 +568,7 @@ static void AddMapIfMissing(Handle<Map> map, SmallMapList* list, |
| } |
| -void TypeFeedbackOracle::CollectKeyedReceiverTypes(unsigned ast_id, |
| +void TypeFeedbackOracle::CollectKeyedReceiverTypes(TypeFeedbackId ast_id, |
| SmallMapList* types) { |
| Handle<Object> object = GetInfo(ast_id); |
| if (!object->IsCode()) return; |
| @@ -585,7 +591,7 @@ void TypeFeedbackOracle::CollectKeyedReceiverTypes(unsigned ast_id, |
| } |
| -byte TypeFeedbackOracle::ToBooleanTypes(unsigned ast_id) { |
| +byte TypeFeedbackOracle::ToBooleanTypes(TypeFeedbackId ast_id) { |
| Handle<Object> object = GetInfo(ast_id); |
| return object->IsCode() ? Handle<Code>::cast(object)->to_boolean_state() : 0; |
| } |
| @@ -646,7 +652,8 @@ void TypeFeedbackOracle::ProcessRelocInfos(ZoneList<RelocInfo>* infos) { |
| for (int i = 0; i < infos->length(); i++) { |
| RelocInfo reloc_entry = (*infos)[i]; |
| Address target_address = reloc_entry.target_address(); |
| - unsigned ast_id = static_cast<unsigned>((*infos)[i].data()); |
| + TypeFeedbackId ast_id = |
| + TypeFeedbackId(static_cast<unsigned>((*infos)[i].data())); |
| Code* target = Code::GetCodeFromTargetAddress(target_address); |
| switch (target->kind()) { |
| case Code::LOAD_IC: |
| @@ -699,7 +706,7 @@ void TypeFeedbackOracle::ProcessTypeFeedbackCells(Handle<Code> code) { |
| Handle<TypeFeedbackCells> cache( |
| TypeFeedbackInfo::cast(raw_info)->type_feedback_cells()); |
| for (int i = 0; i < cache->CellCount(); i++) { |
| - unsigned ast_id = cache->AstId(i)->value(); |
| + TypeFeedbackId ast_id = cache->AstId(i); |
| Object* value = cache->Cell(i)->value(); |
| if (value->IsSmi() || |
| (value->IsJSFunction() && |
| @@ -711,9 +718,10 @@ void TypeFeedbackOracle::ProcessTypeFeedbackCells(Handle<Code> code) { |
| } |
| -void TypeFeedbackOracle::SetInfo(unsigned ast_id, Object* target) { |
| - ASSERT(dictionary_->FindEntry(ast_id) == UnseededNumberDictionary::kNotFound); |
| - MaybeObject* maybe_result = dictionary_->AtNumberPut(ast_id, target); |
| +void TypeFeedbackOracle::SetInfo(TypeFeedbackId ast_id, Object* target) { |
| + ASSERT(dictionary_->FindEntry(IdToKey(ast_id)) == |
| + UnseededNumberDictionary::kNotFound); |
| + MaybeObject* maybe_result = dictionary_->AtNumberPut(IdToKey(ast_id), target); |
| USE(maybe_result); |
| #ifdef DEBUG |
| Object* result = NULL; |