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