| OLD | NEW | 
|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/v8.h" | 5 #include "src/v8.h" | 
| 6 | 6 | 
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" | 
| 8 #include "src/allocation-site-scopes.h" | 8 #include "src/allocation-site-scopes.h" | 
| 9 #include "src/api.h" | 9 #include "src/api.h" | 
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" | 
| 11 #include "src/bootstrapper.h" | 11 #include "src/bootstrapper.h" | 
| 12 #include "src/codegen.h" | 12 #include "src/codegen.h" | 
| 13 #include "src/code-stubs.h" | 13 #include "src/code-stubs.h" | 
| 14 #include "src/cpu-profiler.h" | 14 #include "src/cpu-profiler.h" | 
| 15 #include "src/debug.h" | 15 #include "src/debug.h" | 
| 16 #include "src/deoptimizer.h" | 16 #include "src/deoptimizer.h" | 
| 17 #include "src/date.h" | 17 #include "src/date.h" | 
| 18 #include "src/elements.h" | 18 #include "src/elements.h" | 
| 19 #include "src/execution.h" | 19 #include "src/execution.h" | 
|  | 20 #include "src/field-index.h" | 
|  | 21 #include "src/field-index-inl.h" | 
| 20 #include "src/full-codegen.h" | 22 #include "src/full-codegen.h" | 
| 21 #include "src/hydrogen.h" | 23 #include "src/hydrogen.h" | 
| 22 #include "src/isolate-inl.h" | 24 #include "src/isolate-inl.h" | 
| 23 #include "src/log.h" | 25 #include "src/log.h" | 
| 24 #include "src/objects-inl.h" | 26 #include "src/objects-inl.h" | 
| 25 #include "src/objects-visiting-inl.h" | 27 #include "src/objects-visiting-inl.h" | 
| 26 #include "src/macro-assembler.h" | 28 #include "src/macro-assembler.h" | 
| 27 #include "src/mark-compact.h" | 29 #include "src/mark-compact.h" | 
| 28 #include "src/safepoint-table.h" | 30 #include "src/safepoint-table.h" | 
| 29 #include "src/string-search.h" | 31 #include "src/string-search.h" | 
| (...skipping 810 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 840 | 842 | 
| 841   Handle<Object> value; | 843   Handle<Object> value; | 
| 842   switch (result->type()) { | 844   switch (result->type()) { | 
| 843     case NORMAL: { | 845     case NORMAL: { | 
| 844       value = JSObject::GetNormalizedProperty( | 846       value = JSObject::GetNormalizedProperty( | 
| 845           handle(result->holder(), isolate), result); | 847           handle(result->holder(), isolate), result); | 
| 846       break; | 848       break; | 
| 847     } | 849     } | 
| 848     case FIELD: | 850     case FIELD: | 
| 849       value = JSObject::FastPropertyAt(handle(result->holder(), isolate), | 851       value = JSObject::FastPropertyAt(handle(result->holder(), isolate), | 
| 850                                        result->representation(), | 852           result->representation(), FieldIndex::ForLookupResult(result)); | 
| 851                                        result->GetFieldIndex().field_index()); |  | 
| 852       break; | 853       break; | 
| 853     case CONSTANT: | 854     case CONSTANT: | 
| 854       return handle(result->GetConstant(), isolate); | 855       return handle(result->GetConstant(), isolate); | 
| 855     case CALLBACKS: | 856     case CALLBACKS: | 
| 856       return GetPropertyWithCallback( | 857       return GetPropertyWithCallback( | 
| 857           receiver, name, handle(result->holder(), isolate), | 858           receiver, name, handle(result->holder(), isolate), | 
| 858           handle(result->GetCallbackObject(), isolate)); | 859           handle(result->GetCallbackObject(), isolate)); | 
| 859     case HANDLER: | 860     case HANDLER: | 
| 860       return JSProxy::GetPropertyWithHandler( | 861       return JSProxy::GetPropertyWithHandler( | 
| 861           handle(result->proxy(), isolate), receiver, name); | 862           handle(result->proxy(), isolate), receiver, name); | 
| (...skipping 1417 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2279     if (details.type() != FIELD) continue; | 2280     if (details.type() != FIELD) continue; | 
| 2280     PropertyDetails old_details = old_descriptors->GetDetails(i); | 2281     PropertyDetails old_details = old_descriptors->GetDetails(i); | 
| 2281     if (old_details.type() == CALLBACKS) { | 2282     if (old_details.type() == CALLBACKS) { | 
| 2282       ASSERT(details.representation().IsTagged()); | 2283       ASSERT(details.representation().IsTagged()); | 
| 2283       continue; | 2284       continue; | 
| 2284     } | 2285     } | 
| 2285     ASSERT(old_details.type() == CONSTANT || | 2286     ASSERT(old_details.type() == CONSTANT || | 
| 2286            old_details.type() == FIELD); | 2287            old_details.type() == FIELD); | 
| 2287     Object* raw_value = old_details.type() == CONSTANT | 2288     Object* raw_value = old_details.type() == CONSTANT | 
| 2288         ? old_descriptors->GetValue(i) | 2289         ? old_descriptors->GetValue(i) | 
| 2289         : object->RawFastPropertyAt(old_descriptors->GetFieldIndex(i)); | 2290         : object->RawFastPropertyAt(FieldIndex::ForDescriptor(*old_map, i)); | 
| 2290     Handle<Object> value(raw_value, isolate); | 2291     Handle<Object> value(raw_value, isolate); | 
| 2291     if (!old_details.representation().IsDouble() && | 2292     if (!old_details.representation().IsDouble() && | 
| 2292         details.representation().IsDouble()) { | 2293         details.representation().IsDouble()) { | 
| 2293       if (old_details.representation().IsNone()) { | 2294       if (old_details.representation().IsNone()) { | 
| 2294         value = handle(Smi::FromInt(0), isolate); | 2295         value = handle(Smi::FromInt(0), isolate); | 
| 2295       } | 2296       } | 
| 2296       value = Object::NewStorageFor(isolate, value, details.representation()); | 2297       value = Object::NewStorageFor(isolate, value, details.representation()); | 
| 2297     } | 2298     } | 
| 2298     ASSERT(!(details.representation().IsDouble() && value->IsSmi())); | 2299     ASSERT(!(details.representation().IsDouble() && value->IsSmi())); | 
| 2299     int target_index = new_descriptors->GetFieldIndex(i) - inobject; | 2300     int target_index = new_descriptors->GetFieldIndex(i) - inobject; | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 2315     array->set(target_index, *value); | 2316     array->set(target_index, *value); | 
| 2316   } | 2317   } | 
| 2317 | 2318 | 
| 2318   // From here on we cannot fail and we shouldn't GC anymore. | 2319   // From here on we cannot fail and we shouldn't GC anymore. | 
| 2319   DisallowHeapAllocation no_allocation; | 2320   DisallowHeapAllocation no_allocation; | 
| 2320 | 2321 | 
| 2321   // Copy (real) inobject properties. If necessary, stop at number_of_fields to | 2322   // Copy (real) inobject properties. If necessary, stop at number_of_fields to | 
| 2322   // avoid overwriting |one_pointer_filler_map|. | 2323   // avoid overwriting |one_pointer_filler_map|. | 
| 2323   int limit = Min(inobject, number_of_fields); | 2324   int limit = Min(inobject, number_of_fields); | 
| 2324   for (int i = 0; i < limit; i++) { | 2325   for (int i = 0; i < limit; i++) { | 
| 2325     object->FastPropertyAtPut(i, array->get(external + i)); | 2326     FieldIndex index = FieldIndex::ForPropertyIndex(*new_map, i); | 
|  | 2327     object->FastPropertyAtPut(index, array->get(external + i)); | 
| 2326   } | 2328   } | 
| 2327 | 2329 | 
| 2328   // Create filler object past the new instance size. | 2330   // Create filler object past the new instance size. | 
| 2329   int new_instance_size = new_map->instance_size(); | 2331   int new_instance_size = new_map->instance_size(); | 
| 2330   int instance_size_delta = old_map->instance_size() - new_instance_size; | 2332   int instance_size_delta = old_map->instance_size() - new_instance_size; | 
| 2331   ASSERT(instance_size_delta >= 0); | 2333   ASSERT(instance_size_delta >= 0); | 
| 2332   Address address = object->address() + new_instance_size; | 2334   Address address = object->address() + new_instance_size; | 
| 2333 | 2335 | 
| 2334   // The trimming is performed on a newly allocated object, which is on a | 2336   // The trimming is performed on a newly allocated object, which is on a | 
| 2335   // fresly allocated page or on an already swept page. Hence, the sweeper | 2337   // fresly allocated page or on an already swept page. Hence, the sweeper | 
| (...skipping 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3514     map()->LookupDescriptor(this, *name, result); | 3516     map()->LookupDescriptor(this, *name, result); | 
| 3515     // A property or a map transition was found. We return all of these result | 3517     // A property or a map transition was found. We return all of these result | 
| 3516     // types because LookupOwnRealNamedProperty is used when setting | 3518     // types because LookupOwnRealNamedProperty is used when setting | 
| 3517     // properties where map transitions are handled. | 3519     // properties where map transitions are handled. | 
| 3518     ASSERT(!result->IsFound() || | 3520     ASSERT(!result->IsFound() || | 
| 3519            (result->holder() == this && result->IsFastPropertyType())); | 3521            (result->holder() == this && result->IsFastPropertyType())); | 
| 3520     // Disallow caching for uninitialized constants. These can only | 3522     // Disallow caching for uninitialized constants. These can only | 
| 3521     // occur as fields. | 3523     // occur as fields. | 
| 3522     if (result->IsField() && | 3524     if (result->IsField() && | 
| 3523         result->IsReadOnly() && | 3525         result->IsReadOnly() && | 
| 3524         RawFastPropertyAt(result->GetFieldIndex().field_index())->IsTheHole()) { | 3526         RawFastPropertyAt(result->GetFieldIndex())->IsTheHole()) { | 
| 3525       result->DisallowCaching(); | 3527       result->DisallowCaching(); | 
| 3526     } | 3528     } | 
| 3527     return; | 3529     return; | 
| 3528   } | 3530   } | 
| 3529 | 3531 | 
| 3530   int entry = property_dictionary()->FindEntry(name); | 3532   int entry = property_dictionary()->FindEntry(name); | 
| 3531   if (entry != NameDictionary::kNotFound) { | 3533   if (entry != NameDictionary::kNotFound) { | 
| 3532     Object* value = property_dictionary()->ValueAt(entry); | 3534     Object* value = property_dictionary()->ValueAt(entry); | 
| 3533     if (IsGlobalObject()) { | 3535     if (IsGlobalObject()) { | 
| 3534       PropertyDetails d = property_dictionary()->DetailsAt(entry); | 3536       PropertyDetails d = property_dictionary()->DetailsAt(entry); | 
| (...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4030 | 4032 | 
| 4031 | 4033 | 
| 4032 void JSObject::WriteToField(int descriptor, Object* value) { | 4034 void JSObject::WriteToField(int descriptor, Object* value) { | 
| 4033   DisallowHeapAllocation no_gc; | 4035   DisallowHeapAllocation no_gc; | 
| 4034 | 4036 | 
| 4035   DescriptorArray* desc = map()->instance_descriptors(); | 4037   DescriptorArray* desc = map()->instance_descriptors(); | 
| 4036   PropertyDetails details = desc->GetDetails(descriptor); | 4038   PropertyDetails details = desc->GetDetails(descriptor); | 
| 4037 | 4039 | 
| 4038   ASSERT(details.type() == FIELD); | 4040   ASSERT(details.type() == FIELD); | 
| 4039 | 4041 | 
| 4040   int field_index = desc->GetFieldIndex(descriptor); | 4042   FieldIndex index = FieldIndex::ForDescriptor(map(), descriptor); | 
| 4041   if (details.representation().IsDouble()) { | 4043   if (details.representation().IsDouble()) { | 
| 4042     // Nothing more to be done. | 4044     // Nothing more to be done. | 
| 4043     if (value->IsUninitialized()) return; | 4045     if (value->IsUninitialized()) return; | 
| 4044     HeapNumber* box = HeapNumber::cast(RawFastPropertyAt(field_index)); | 4046     HeapNumber* box = HeapNumber::cast(RawFastPropertyAt(index)); | 
| 4045     box->set_value(value->Number()); | 4047     box->set_value(value->Number()); | 
| 4046   } else { | 4048   } else { | 
| 4047     FastPropertyAtPut(field_index, value); | 4049     FastPropertyAtPut(index, value); | 
| 4048   } | 4050   } | 
| 4049 } | 4051 } | 
| 4050 | 4052 | 
| 4051 | 4053 | 
| 4052 static void SetPropertyToField(LookupResult* lookup, | 4054 static void SetPropertyToField(LookupResult* lookup, | 
| 4053                                Handle<Object> value) { | 4055                                Handle<Object> value) { | 
| 4054   if (lookup->type() == CONSTANT || !lookup->CanHoldValue(value)) { | 4056   if (lookup->type() == CONSTANT || !lookup->CanHoldValue(value)) { | 
| 4055     Representation field_representation = value->OptimalRepresentation(); | 4057     Representation field_representation = value->OptimalRepresentation(); | 
| 4056     Handle<HeapType> field_type = value->OptimalType( | 4058     Handle<HeapType> field_type = value->OptimalType( | 
| 4057         lookup->isolate(), field_representation); | 4059         lookup->isolate(), field_representation); | 
| (...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4726       case CONSTANT: { | 4728       case CONSTANT: { | 
| 4727         Handle<Name> key(descs->GetKey(i)); | 4729         Handle<Name> key(descs->GetKey(i)); | 
| 4728         Handle<Object> value(descs->GetConstant(i), isolate); | 4730         Handle<Object> value(descs->GetConstant(i), isolate); | 
| 4729         PropertyDetails d = PropertyDetails( | 4731         PropertyDetails d = PropertyDetails( | 
| 4730             details.attributes(), NORMAL, i + 1); | 4732             details.attributes(), NORMAL, i + 1); | 
| 4731         dictionary = NameDictionary::Add(dictionary, key, value, d); | 4733         dictionary = NameDictionary::Add(dictionary, key, value, d); | 
| 4732         break; | 4734         break; | 
| 4733       } | 4735       } | 
| 4734       case FIELD: { | 4736       case FIELD: { | 
| 4735         Handle<Name> key(descs->GetKey(i)); | 4737         Handle<Name> key(descs->GetKey(i)); | 
|  | 4738         FieldIndex index = FieldIndex::ForDescriptor(*map, i); | 
| 4736         Handle<Object> value( | 4739         Handle<Object> value( | 
| 4737             object->RawFastPropertyAt(descs->GetFieldIndex(i)), isolate); | 4740             object->RawFastPropertyAt(index), isolate); | 
| 4738         PropertyDetails d = | 4741         PropertyDetails d = | 
| 4739             PropertyDetails(details.attributes(), NORMAL, i + 1); | 4742             PropertyDetails(details.attributes(), NORMAL, i + 1); | 
| 4740         dictionary = NameDictionary::Add(dictionary, key, value, d); | 4743         dictionary = NameDictionary::Add(dictionary, key, value, d); | 
| 4741         break; | 4744         break; | 
| 4742       } | 4745       } | 
| 4743       case CALLBACKS: { | 4746       case CALLBACKS: { | 
| 4744         Handle<Name> key(descs->GetKey(i)); | 4747         Handle<Name> key(descs->GetKey(i)); | 
| 4745         Handle<Object> value(descs->GetCallbacksObject(i), isolate); | 4748         Handle<Object> value(descs->GetCallbacksObject(i), isolate); | 
| 4746         PropertyDetails d = PropertyDetails( | 4749         PropertyDetails d = PropertyDetails( | 
| 4747             details.attributes(), CALLBACKS, i + 1); | 4750             details.attributes(), CALLBACKS, i + 1); | 
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5234     // hidden strings hash code is zero (and no other name has hash | 5237     // hidden strings hash code is zero (and no other name has hash | 
| 5235     // code zero) it will always occupy the first entry if present. | 5238     // code zero) it will always occupy the first entry if present. | 
| 5236     DescriptorArray* descriptors = this->map()->instance_descriptors(); | 5239     DescriptorArray* descriptors = this->map()->instance_descriptors(); | 
| 5237     if (descriptors->number_of_descriptors() > 0) { | 5240     if (descriptors->number_of_descriptors() > 0) { | 
| 5238       int sorted_index = descriptors->GetSortedKeyIndex(0); | 5241       int sorted_index = descriptors->GetSortedKeyIndex(0); | 
| 5239       if (descriptors->GetKey(sorted_index) == GetHeap()->hidden_string() && | 5242       if (descriptors->GetKey(sorted_index) == GetHeap()->hidden_string() && | 
| 5240           sorted_index < map()->NumberOfOwnDescriptors()) { | 5243           sorted_index < map()->NumberOfOwnDescriptors()) { | 
| 5241         ASSERT(descriptors->GetType(sorted_index) == FIELD); | 5244         ASSERT(descriptors->GetType(sorted_index) == FIELD); | 
| 5242         ASSERT(descriptors->GetDetails(sorted_index).representation(). | 5245         ASSERT(descriptors->GetDetails(sorted_index).representation(). | 
| 5243                IsCompatibleForLoad(Representation::Tagged())); | 5246                IsCompatibleForLoad(Representation::Tagged())); | 
| 5244         return this->RawFastPropertyAt( | 5247         FieldIndex index = FieldIndex::ForDescriptor(this->map(), | 
| 5245             descriptors->GetFieldIndex(sorted_index)); | 5248                                                      sorted_index); | 
|  | 5249         return this->RawFastPropertyAt(index); | 
| 5246       } else { | 5250       } else { | 
| 5247         return GetHeap()->undefined_value(); | 5251         return GetHeap()->undefined_value(); | 
| 5248       } | 5252       } | 
| 5249     } else { | 5253     } else { | 
| 5250       return GetHeap()->undefined_value(); | 5254       return GetHeap()->undefined_value(); | 
| 5251     } | 5255     } | 
| 5252   } else { | 5256   } else { | 
| 5253     Isolate* isolate = GetIsolate(); | 5257     Isolate* isolate = GetIsolate(); | 
| 5254     LookupResult result(isolate); | 5258     LookupResult result(isolate); | 
| 5255     LookupOwnRealNamedProperty(isolate->factory()->hidden_string(), &result); | 5259     LookupOwnRealNamedProperty(isolate->factory()->hidden_string(), &result); | 
| (...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5915   } else { | 5919   } else { | 
| 5916     new_map = Map::Copy(old_map); | 5920     new_map = Map::Copy(old_map); | 
| 5917     new_map->set_is_observed(); | 5921     new_map->set_is_observed(); | 
| 5918   } | 5922   } | 
| 5919   JSObject::MigrateToMap(object, new_map); | 5923   JSObject::MigrateToMap(object, new_map); | 
| 5920 } | 5924 } | 
| 5921 | 5925 | 
| 5922 | 5926 | 
| 5923 Handle<Object> JSObject::FastPropertyAt(Handle<JSObject> object, | 5927 Handle<Object> JSObject::FastPropertyAt(Handle<JSObject> object, | 
| 5924                                         Representation representation, | 5928                                         Representation representation, | 
| 5925                                         int index) { | 5929                                         FieldIndex index) { | 
| 5926   Isolate* isolate = object->GetIsolate(); | 5930   Isolate* isolate = object->GetIsolate(); | 
| 5927   Handle<Object> raw_value(object->RawFastPropertyAt(index), isolate); | 5931   Handle<Object> raw_value(object->RawFastPropertyAt(index), isolate); | 
| 5928   return Object::NewStorageFor(isolate, raw_value, representation); | 5932   return Object::NewStorageFor(isolate, raw_value, representation); | 
| 5929 } | 5933 } | 
| 5930 | 5934 | 
| 5931 | 5935 | 
| 5932 template<class ContextObject> | 5936 template<class ContextObject> | 
| 5933 class JSObjectWalkVisitor { | 5937 class JSObjectWalkVisitor { | 
| 5934  public: | 5938  public: | 
| 5935   JSObjectWalkVisitor(ContextObject* site_context, bool copying, | 5939   JSObjectWalkVisitor(ContextObject* site_context, bool copying, | 
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6006   if (!shallow) { | 6010   if (!shallow) { | 
| 6007     HandleScope scope(isolate); | 6011     HandleScope scope(isolate); | 
| 6008 | 6012 | 
| 6009     // Deep copy own properties. | 6013     // Deep copy own properties. | 
| 6010     if (copy->HasFastProperties()) { | 6014     if (copy->HasFastProperties()) { | 
| 6011       Handle<DescriptorArray> descriptors(copy->map()->instance_descriptors()); | 6015       Handle<DescriptorArray> descriptors(copy->map()->instance_descriptors()); | 
| 6012       int limit = copy->map()->NumberOfOwnDescriptors(); | 6016       int limit = copy->map()->NumberOfOwnDescriptors(); | 
| 6013       for (int i = 0; i < limit; i++) { | 6017       for (int i = 0; i < limit; i++) { | 
| 6014         PropertyDetails details = descriptors->GetDetails(i); | 6018         PropertyDetails details = descriptors->GetDetails(i); | 
| 6015         if (details.type() != FIELD) continue; | 6019         if (details.type() != FIELD) continue; | 
| 6016         int index = descriptors->GetFieldIndex(i); | 6020         FieldIndex index = FieldIndex::ForDescriptor(copy->map(), i); | 
| 6017         Handle<Object> value(object->RawFastPropertyAt(index), isolate); | 6021         Handle<Object> value(object->RawFastPropertyAt(index), isolate); | 
| 6018         if (value->IsJSObject()) { | 6022         if (value->IsJSObject()) { | 
| 6019           ASSIGN_RETURN_ON_EXCEPTION( | 6023           ASSIGN_RETURN_ON_EXCEPTION( | 
| 6020               isolate, value, | 6024               isolate, value, | 
| 6021               VisitElementOrProperty(copy, Handle<JSObject>::cast(value)), | 6025               VisitElementOrProperty(copy, Handle<JSObject>::cast(value)), | 
| 6022               JSObject); | 6026               JSObject); | 
| 6023         } else { | 6027         } else { | 
| 6024           Representation representation = details.representation(); | 6028           Representation representation = details.representation(); | 
| 6025           value = Object::NewStorageFor(isolate, value, representation); | 6029           value = Object::NewStorageFor(isolate, value, representation); | 
| 6026         } | 6030         } | 
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6173   Handle<Object> result = isolate->factory()->undefined_value(); | 6177   Handle<Object> result = isolate->factory()->undefined_value(); | 
| 6174   if (lookup.IsFound() && !lookup.IsTransition()) { | 6178   if (lookup.IsFound() && !lookup.IsTransition()) { | 
| 6175     switch (lookup.type()) { | 6179     switch (lookup.type()) { | 
| 6176       case NORMAL: | 6180       case NORMAL: | 
| 6177         result = GetNormalizedProperty( | 6181         result = GetNormalizedProperty( | 
| 6178             Handle<JSObject>(lookup.holder(), isolate), &lookup); | 6182             Handle<JSObject>(lookup.holder(), isolate), &lookup); | 
| 6179         break; | 6183         break; | 
| 6180       case FIELD: | 6184       case FIELD: | 
| 6181         result = FastPropertyAt(Handle<JSObject>(lookup.holder(), isolate), | 6185         result = FastPropertyAt(Handle<JSObject>(lookup.holder(), isolate), | 
| 6182                                 lookup.representation(), | 6186                                 lookup.representation(), | 
| 6183                                 lookup.GetFieldIndex().field_index()); | 6187                                 lookup.GetFieldIndex()); | 
| 6184         break; | 6188         break; | 
| 6185       case CONSTANT: | 6189       case CONSTANT: | 
| 6186         result = Handle<Object>(lookup.GetConstant(), isolate); | 6190         result = Handle<Object>(lookup.GetConstant(), isolate); | 
| 6187         break; | 6191         break; | 
| 6188       case CALLBACKS: | 6192       case CALLBACKS: | 
| 6189       case HANDLER: | 6193       case HANDLER: | 
| 6190       case INTERCEPTOR: | 6194       case INTERCEPTOR: | 
| 6191         break; | 6195         break; | 
| 6192       case NONEXISTENT: | 6196       case NONEXISTENT: | 
| 6193         UNREACHABLE(); | 6197         UNREACHABLE(); | 
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6407 | 6411 | 
| 6408     for (int i = 0; i < size; i++) { | 6412     for (int i = 0; i < size; i++) { | 
| 6409       PropertyDetails details = descs->GetDetails(i); | 6413       PropertyDetails details = descs->GetDetails(i); | 
| 6410       Object* key = descs->GetKey(i); | 6414       Object* key = descs->GetKey(i); | 
| 6411       if (!(details.IsDontEnum() || key->IsSymbol())) { | 6415       if (!(details.IsDontEnum() || key->IsSymbol())) { | 
| 6412         storage->set(index, key); | 6416         storage->set(index, key); | 
| 6413         if (!indices.is_null()) { | 6417         if (!indices.is_null()) { | 
| 6414           if (details.type() != FIELD) { | 6418           if (details.type() != FIELD) { | 
| 6415             indices = Handle<FixedArray>(); | 6419             indices = Handle<FixedArray>(); | 
| 6416           } else { | 6420           } else { | 
| 6417             int field_index = descs->GetFieldIndex(i); | 6421             FieldIndex field_index = FieldIndex::ForDescriptor(*map, i); | 
| 6418             if (field_index >= map->inobject_properties()) { | 6422             int load_by_field_index = field_index.GetLoadByFieldIndex(); | 
| 6419               field_index = -(field_index - map->inobject_properties() + 1); | 6423             indices->set(index, Smi::FromInt(load_by_field_index)); | 
| 6420             } |  | 
| 6421             field_index = field_index << 1; |  | 
| 6422             if (details.representation().IsDouble()) { |  | 
| 6423               field_index |= 1; |  | 
| 6424             } |  | 
| 6425             indices->set(index, Smi::FromInt(field_index)); |  | 
| 6426           } | 6424           } | 
| 6427         } | 6425         } | 
| 6428         index++; | 6426         index++; | 
| 6429       } | 6427       } | 
| 6430     } | 6428     } | 
| 6431     ASSERT(index == storage->length()); | 6429     ASSERT(index == storage->length()); | 
| 6432 | 6430 | 
| 6433     Handle<FixedArray> bridge_storage = | 6431     Handle<FixedArray> bridge_storage = | 
| 6434         isolate->factory()->NewFixedArray( | 6432         isolate->factory()->NewFixedArray( | 
| 6435             DescriptorArray::kEnumCacheBridgeLength); | 6433             DescriptorArray::kEnumCacheBridgeLength); | 
| (...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 7119   return isolate->factory()->undefined_value(); | 7117   return isolate->factory()->undefined_value(); | 
| 7120 } | 7118 } | 
| 7121 | 7119 | 
| 7122 | 7120 | 
| 7123 Object* JSObject::SlowReverseLookup(Object* value) { | 7121 Object* JSObject::SlowReverseLookup(Object* value) { | 
| 7124   if (HasFastProperties()) { | 7122   if (HasFastProperties()) { | 
| 7125     int number_of_own_descriptors = map()->NumberOfOwnDescriptors(); | 7123     int number_of_own_descriptors = map()->NumberOfOwnDescriptors(); | 
| 7126     DescriptorArray* descs = map()->instance_descriptors(); | 7124     DescriptorArray* descs = map()->instance_descriptors(); | 
| 7127     for (int i = 0; i < number_of_own_descriptors; i++) { | 7125     for (int i = 0; i < number_of_own_descriptors; i++) { | 
| 7128       if (descs->GetType(i) == FIELD) { | 7126       if (descs->GetType(i) == FIELD) { | 
| 7129         Object* property = RawFastPropertyAt(descs->GetFieldIndex(i)); | 7127         Object* property = | 
|  | 7128             RawFastPropertyAt(FieldIndex::ForDescriptor(map(), i)); | 
| 7130         if (descs->GetDetails(i).representation().IsDouble()) { | 7129         if (descs->GetDetails(i).representation().IsDouble()) { | 
| 7131           ASSERT(property->IsHeapNumber()); | 7130           ASSERT(property->IsHeapNumber()); | 
| 7132           if (value->IsNumber() && property->Number() == value->Number()) { | 7131           if (value->IsNumber() && property->Number() == value->Number()) { | 
| 7133             return descs->GetKey(i); | 7132             return descs->GetKey(i); | 
| 7134           } | 7133           } | 
| 7135         } else if (property == value) { | 7134         } else if (property == value) { | 
| 7136           return descs->GetKey(i); | 7135           return descs->GetKey(i); | 
| 7137         } | 7136         } | 
| 7138       } else if (descs->GetType(i) == CONSTANT) { | 7137       } else if (descs->GetType(i) == CONSTANT) { | 
| 7139         if (descs->GetConstant(i) == value) { | 7138         if (descs->GetConstant(i) == value) { | 
| (...skipping 10056 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 17196 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17195 #define ERROR_MESSAGES_TEXTS(C, T) T, | 
| 17197   static const char* error_messages_[] = { | 17196   static const char* error_messages_[] = { | 
| 17198       ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17197       ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 
| 17199   }; | 17198   }; | 
| 17200 #undef ERROR_MESSAGES_TEXTS | 17199 #undef ERROR_MESSAGES_TEXTS | 
| 17201   return error_messages_[reason]; | 17200   return error_messages_[reason]; | 
| 17202 } | 17201 } | 
| 17203 | 17202 | 
| 17204 | 17203 | 
| 17205 } }  // namespace v8::internal | 17204 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|