| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index ba981718d73cef59f3325a18cde7e0b4f9aa13e4..6bb7015354a4537f8a57d182d6e770cbc34743a1 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -4557,31 +4557,6 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
|
| }
|
|
|
|
|
| -// Sets the lookup result and returns true if the load/store can be inlined.
|
| -static bool ComputeLoadStoreField(Handle<Map> type,
|
| - Handle<String> name,
|
| - LookupResult* lookup,
|
| - bool is_store) {
|
| - ASSERT(!is_store || !type->is_observed());
|
| - if (!CanInlinePropertyAccess(*type)) {
|
| - lookup->NotFound();
|
| - return false;
|
| - }
|
| - // If we directly find a field, the access can be inlined.
|
| - type->LookupDescriptor(NULL, *name, lookup);
|
| - if (lookup->IsField()) return true;
|
| -
|
| - // For a load, we are out of luck if there is no such field.
|
| - if (!is_store) return false;
|
| -
|
| - // 2nd chance: A store into a non-existent field can still be inlined if we
|
| - // have a matching transition and some room left in the object.
|
| - type->LookupTransition(NULL, *name, lookup);
|
| - return lookup->IsTransitionToField(*type) &&
|
| - (type->unused_property_fields() > 0);
|
| -}
|
| -
|
| -
|
| HCheckMaps* HOptimizedGraphBuilder::AddCheckMap(HValue* object,
|
| Handle<Map> map) {
|
| BuildCheckHeapObject(object);
|
| @@ -4687,6 +4662,28 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedGeneric(
|
| }
|
|
|
|
|
| +// Sets the lookup result and returns true if the load/store can be inlined.
|
| +static bool ComputeStoreField(Handle<Map> type,
|
| + Handle<String> name,
|
| + LookupResult* lookup,
|
| + bool lookup_transition = true) {
|
| + ASSERT(!type->is_observed());
|
| + if (!CanInlinePropertyAccess(*type)) {
|
| + lookup->NotFound();
|
| + return false;
|
| + }
|
| + // If we directly find a field, the access can be inlined.
|
| + type->LookupDescriptor(NULL, *name, lookup);
|
| + if (lookup->IsField()) return true;
|
| +
|
| + if (!lookup_transition) return false;
|
| +
|
| + type->LookupTransition(NULL, *name, lookup);
|
| + return lookup->IsTransitionToField(*type) &&
|
| + (type->unused_property_fields() > 0);
|
| +}
|
| +
|
| +
|
| HInstruction* HOptimizedGraphBuilder::BuildStoreNamedMonomorphic(
|
| HValue* object,
|
| Handle<String> name,
|
| @@ -4694,7 +4691,7 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedMonomorphic(
|
| Handle<Map> map) {
|
| // Handle a store to a known field.
|
| LookupResult lookup(isolate());
|
| - if (ComputeLoadStoreField(map, name, &lookup, true)) {
|
| + if (ComputeStoreField(map, name, &lookup)) {
|
| HCheckMaps* checked_object = AddCheckMap(object, map);
|
| return BuildStoreNamedField(checked_object, name, value, map, &lookup);
|
| }
|
| @@ -4964,7 +4961,7 @@ bool HOptimizedGraphBuilder::TryStorePolymorphicAsMonomorphic(
|
| for (count = 0; count < types->length(); ++count) {
|
| Handle<Map> map = types->at(count);
|
| // Pass false to ignore transitions.
|
| - if (!ComputeLoadStoreField(map, name, &lookup, false)) break;
|
| + if (!ComputeStoreField(map, name, &lookup, false)) break;
|
| ASSERT(!map->is_observed());
|
|
|
| HObjectAccess new_access = HObjectAccess::ForField(map, &lookup, name);
|
| @@ -5026,7 +5023,7 @@ void HOptimizedGraphBuilder::HandlePolymorphicStoreNamedField(
|
| for (int i = 0; i < types->length() && count < kMaxStorePolymorphism; ++i) {
|
| Handle<Map> map = types->at(i);
|
| LookupResult lookup(isolate());
|
| - if (ComputeLoadStoreField(map, name, &lookup, true)) {
|
| + if (ComputeStoreField(map, name, &lookup)) {
|
| if (count == 0) {
|
| BuildCheckHeapObject(object);
|
| join = graph()->CreateBasicBlock();
|
|
|