Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 7d2939bc250e68c02e7ba7d072383e8fc86d1202..309278703b59e4c34000df3c8c91169aef42893e 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -4996,15 +4996,13 @@ void HOptimizedGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { |
} |
-static bool CanInlinePropertyAccess(Type* type, PropertyAccessType access) { |
+static bool CanInlinePropertyAccess(Type* type) { |
if (type->Is(Type::NumberOrString())) return true; |
if (!type->IsClass()) return false; |
Handle<Map> map = type->AsClass(); |
return map->IsJSObjectMap() && |
!map->is_dictionary_map() && |
- !map->has_named_interceptor() && |
- // Must be a LOAD or a non-observed STORE |
- (access == LOAD || !map->is_observed()); |
+ !map->has_named_interceptor(); |
} |
@@ -5416,7 +5414,7 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField( |
bool HOptimizedGraphBuilder::PropertyAccessInfo::IsCompatible( |
PropertyAccessInfo* info) { |
- if (!CanInlinePropertyAccess(type_, access_type_)) return false; |
+ if (!CanInlinePropertyAccess(type_)) return false; |
// Currently only handle Type::Number as a polymorphic case. |
// TODO(verwaest): Support monomorphic handling of numbers with a HCheckNumber |
@@ -5517,7 +5515,7 @@ bool HOptimizedGraphBuilder::PropertyAccessInfo::LookupInPrototypes() { |
JSObject::TryMigrateInstance(holder_); |
} |
map = Handle<Map>(holder_->map()); |
- if (!CanInlinePropertyAccess(ToType(map), access_type_)) { |
+ if (!CanInlinePropertyAccess(ToType(map))) { |
lookup_.NotFound(); |
return false; |
} |
@@ -5530,7 +5528,7 @@ bool HOptimizedGraphBuilder::PropertyAccessInfo::LookupInPrototypes() { |
bool HOptimizedGraphBuilder::PropertyAccessInfo::CanAccessMonomorphic() { |
- if (!CanInlinePropertyAccess(type_, access_type_)) return false; |
+ if (!CanInlinePropertyAccess(type_)) return false; |
if (IsJSObjectFieldAccessor()) return IsLoad(); |
if (!LookupDescriptor()) return false; |
if (lookup_.IsFound()) { |
@@ -5809,27 +5807,17 @@ void HOptimizedGraphBuilder::HandlePolymorphicNamedFieldAccess( |
static bool ComputeReceiverTypes(Expression* expr, |
HValue* receiver, |
SmallMapList** t, |
- PropertyAccessType access_type, |
Zone* zone) { |
SmallMapList* types = expr->GetReceiverTypes(); |
*t = types; |
bool monomorphic = expr->IsMonomorphic(); |
- Isolate* isolate = zone->isolate(); |
- if (types != NULL) { |
- if (receiver->HasMonomorphicJSObjectType()) { |
- Map* root_map = receiver->GetMonomorphicJSObjectMap()->FindRootMap(); |
- types->FilterForPossibleTransitions(root_map); |
- } else if (types->is_empty() && |
- receiver->IsConstant() && |
- HConstant::cast(receiver)->handle(isolate)->IsJSObject()) { |
- Handle<Map> map(Handle<JSObject>::cast( |
- HConstant::cast(receiver)->handle(isolate))->map()); |
- types->Add(map, zone); |
- } |
+ if (types != NULL && receiver->HasMonomorphicJSObjectType()) { |
+ Map* root_map = receiver->GetMonomorphicJSObjectMap()->FindRootMap(); |
+ types->FilterForPossibleTransitions(root_map); |
monomorphic = types->length() == 1; |
} |
return monomorphic && CanInlinePropertyAccess( |
- IC::MapToType<Type>(types->first(), zone), access_type); |
+ IC::MapToType<Type>(types->first(), zone)); |
} |
@@ -6532,11 +6520,7 @@ HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess( |
HInstruction* instr = NULL; |
SmallMapList* types; |
- bool monomorphic = ComputeReceiverTypes(expr, |
- obj, |
- &types, |
- access_type, |
- zone()); |
+ bool monomorphic = ComputeReceiverTypes(expr, obj, &types, zone()); |
bool force_generic = false; |
if (access_type == STORE && |
@@ -6675,7 +6659,7 @@ HInstruction* HOptimizedGraphBuilder::BuildNamedAccess( |
HValue* value, |
bool is_uninitialized) { |
SmallMapList* types; |
- ComputeReceiverTypes(expr, object, &types, access, zone()); |
+ ComputeReceiverTypes(expr, object, &types, zone()); |
ASSERT(types != NULL); |
if (types->length() > 0) { |
@@ -7991,7 +7975,7 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
HValue* receiver = Top(); |
SmallMapList* types; |
- ComputeReceiverTypes(expr, receiver, &types, LOAD, zone()); |
+ ComputeReceiverTypes(expr, receiver, &types, zone()); |
if (prop->key()->IsPropertyName() && types->length() > 0) { |
Handle<String> name = prop->key()->AsLiteral()->AsPropertyName(); |