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 1411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2273 if (details.type() != FIELD) continue; | 2274 if (details.type() != FIELD) continue; |
2274 PropertyDetails old_details = old_descriptors->GetDetails(i); | 2275 PropertyDetails old_details = old_descriptors->GetDetails(i); |
2275 if (old_details.type() == CALLBACKS) { | 2276 if (old_details.type() == CALLBACKS) { |
2276 ASSERT(details.representation().IsTagged()); | 2277 ASSERT(details.representation().IsTagged()); |
2277 continue; | 2278 continue; |
2278 } | 2279 } |
2279 ASSERT(old_details.type() == CONSTANT || | 2280 ASSERT(old_details.type() == CONSTANT || |
2280 old_details.type() == FIELD); | 2281 old_details.type() == FIELD); |
2281 Object* raw_value = old_details.type() == CONSTANT | 2282 Object* raw_value = old_details.type() == CONSTANT |
2282 ? old_descriptors->GetValue(i) | 2283 ? old_descriptors->GetValue(i) |
2283 : object->RawFastPropertyAt(old_descriptors->GetFieldIndex(i)); | 2284 : object->RawFastPropertyAt(FieldIndex::ForDescriptor(*old_map, i)); |
2284 Handle<Object> value(raw_value, isolate); | 2285 Handle<Object> value(raw_value, isolate); |
2285 if (!old_details.representation().IsDouble() && | 2286 if (!old_details.representation().IsDouble() && |
2286 details.representation().IsDouble()) { | 2287 details.representation().IsDouble()) { |
2287 if (old_details.representation().IsNone()) { | 2288 if (old_details.representation().IsNone()) { |
2288 value = handle(Smi::FromInt(0), isolate); | 2289 value = handle(Smi::FromInt(0), isolate); |
2289 } | 2290 } |
2290 value = Object::NewStorageFor(isolate, value, details.representation()); | 2291 value = Object::NewStorageFor(isolate, value, details.representation()); |
2291 } | 2292 } |
2292 ASSERT(!(details.representation().IsDouble() && value->IsSmi())); | 2293 ASSERT(!(details.representation().IsDouble() && value->IsSmi())); |
2293 int target_index = new_descriptors->GetFieldIndex(i) - inobject; | 2294 int target_index = new_descriptors->GetFieldIndex(i) - inobject; |
(...skipping 15 matching lines...) Expand all Loading... |
2309 array->set(target_index, *value); | 2310 array->set(target_index, *value); |
2310 } | 2311 } |
2311 | 2312 |
2312 // From here on we cannot fail and we shouldn't GC anymore. | 2313 // From here on we cannot fail and we shouldn't GC anymore. |
2313 DisallowHeapAllocation no_allocation; | 2314 DisallowHeapAllocation no_allocation; |
2314 | 2315 |
2315 // Copy (real) inobject properties. If necessary, stop at number_of_fields to | 2316 // Copy (real) inobject properties. If necessary, stop at number_of_fields to |
2316 // avoid overwriting |one_pointer_filler_map|. | 2317 // avoid overwriting |one_pointer_filler_map|. |
2317 int limit = Min(inobject, number_of_fields); | 2318 int limit = Min(inobject, number_of_fields); |
2318 for (int i = 0; i < limit; i++) { | 2319 for (int i = 0; i < limit; i++) { |
2319 object->FastPropertyAtPut(i, array->get(external + i)); | 2320 FieldIndex index = FieldIndex::ForPropertyIndex(*new_map, i); |
| 2321 object->FastPropertyAtPut(index, array->get(external + i)); |
2320 } | 2322 } |
2321 | 2323 |
2322 // Create filler object past the new instance size. | 2324 // Create filler object past the new instance size. |
2323 int new_instance_size = new_map->instance_size(); | 2325 int new_instance_size = new_map->instance_size(); |
2324 int instance_size_delta = old_map->instance_size() - new_instance_size; | 2326 int instance_size_delta = old_map->instance_size() - new_instance_size; |
2325 ASSERT(instance_size_delta >= 0); | 2327 ASSERT(instance_size_delta >= 0); |
2326 Address address = object->address() + new_instance_size; | 2328 Address address = object->address() + new_instance_size; |
2327 | 2329 |
2328 // The trimming is performed on a newly allocated object, which is on a | 2330 // The trimming is performed on a newly allocated object, which is on a |
2329 // fresly allocated page or on an already swept page. Hence, the sweeper | 2331 // fresly allocated page or on an already swept page. Hence, the sweeper |
(...skipping 1189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3519 map()->LookupDescriptor(this, *name, result); | 3521 map()->LookupDescriptor(this, *name, result); |
3520 // A property or a map transition was found. We return all of these result | 3522 // A property or a map transition was found. We return all of these result |
3521 // types because LookupOwnRealNamedProperty is used when setting | 3523 // types because LookupOwnRealNamedProperty is used when setting |
3522 // properties where map transitions are handled. | 3524 // properties where map transitions are handled. |
3523 ASSERT(!result->IsFound() || | 3525 ASSERT(!result->IsFound() || |
3524 (result->holder() == this && result->IsFastPropertyType())); | 3526 (result->holder() == this && result->IsFastPropertyType())); |
3525 // Disallow caching for uninitialized constants. These can only | 3527 // Disallow caching for uninitialized constants. These can only |
3526 // occur as fields. | 3528 // occur as fields. |
3527 if (result->IsField() && | 3529 if (result->IsField() && |
3528 result->IsReadOnly() && | 3530 result->IsReadOnly() && |
3529 RawFastPropertyAt(result->GetFieldIndex().field_index())->IsTheHole()) { | 3531 RawFastPropertyAt(result->GetFieldIndex())->IsTheHole()) { |
3530 result->DisallowCaching(); | 3532 result->DisallowCaching(); |
3531 } | 3533 } |
3532 return; | 3534 return; |
3533 } | 3535 } |
3534 | 3536 |
3535 int entry = property_dictionary()->FindEntry(name); | 3537 int entry = property_dictionary()->FindEntry(name); |
3536 if (entry != NameDictionary::kNotFound) { | 3538 if (entry != NameDictionary::kNotFound) { |
3537 Object* value = property_dictionary()->ValueAt(entry); | 3539 Object* value = property_dictionary()->ValueAt(entry); |
3538 if (IsGlobalObject()) { | 3540 if (IsGlobalObject()) { |
3539 PropertyDetails d = property_dictionary()->DetailsAt(entry); | 3541 PropertyDetails d = property_dictionary()->DetailsAt(entry); |
(...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4035 | 4037 |
4036 | 4038 |
4037 void JSObject::WriteToField(int descriptor, Object* value) { | 4039 void JSObject::WriteToField(int descriptor, Object* value) { |
4038 DisallowHeapAllocation no_gc; | 4040 DisallowHeapAllocation no_gc; |
4039 | 4041 |
4040 DescriptorArray* desc = map()->instance_descriptors(); | 4042 DescriptorArray* desc = map()->instance_descriptors(); |
4041 PropertyDetails details = desc->GetDetails(descriptor); | 4043 PropertyDetails details = desc->GetDetails(descriptor); |
4042 | 4044 |
4043 ASSERT(details.type() == FIELD); | 4045 ASSERT(details.type() == FIELD); |
4044 | 4046 |
4045 int field_index = desc->GetFieldIndex(descriptor); | 4047 FieldIndex index = FieldIndex::ForDescriptor(map(), descriptor); |
4046 if (details.representation().IsDouble()) { | 4048 if (details.representation().IsDouble()) { |
4047 // Nothing more to be done. | 4049 // Nothing more to be done. |
4048 if (value->IsUninitialized()) return; | 4050 if (value->IsUninitialized()) return; |
4049 HeapNumber* box = HeapNumber::cast(RawFastPropertyAt(field_index)); | 4051 HeapNumber* box = HeapNumber::cast(RawFastPropertyAt(index)); |
4050 box->set_value(value->Number()); | 4052 box->set_value(value->Number()); |
4051 } else { | 4053 } else { |
4052 FastPropertyAtPut(field_index, value); | 4054 FastPropertyAtPut(index, value); |
4053 } | 4055 } |
4054 } | 4056 } |
4055 | 4057 |
4056 | 4058 |
4057 static void SetPropertyToField(LookupResult* lookup, | 4059 static void SetPropertyToField(LookupResult* lookup, |
4058 Handle<Object> value) { | 4060 Handle<Object> value) { |
4059 if (lookup->type() == CONSTANT || !lookup->CanHoldValue(value)) { | 4061 if (lookup->type() == CONSTANT || !lookup->CanHoldValue(value)) { |
4060 Representation field_representation = value->OptimalRepresentation(); | 4062 Representation field_representation = value->OptimalRepresentation(); |
4061 Handle<HeapType> field_type = value->OptimalType( | 4063 Handle<HeapType> field_type = value->OptimalType( |
4062 lookup->isolate(), field_representation); | 4064 lookup->isolate(), field_representation); |
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4731 case CONSTANT: { | 4733 case CONSTANT: { |
4732 Handle<Name> key(descs->GetKey(i)); | 4734 Handle<Name> key(descs->GetKey(i)); |
4733 Handle<Object> value(descs->GetConstant(i), isolate); | 4735 Handle<Object> value(descs->GetConstant(i), isolate); |
4734 PropertyDetails d = PropertyDetails( | 4736 PropertyDetails d = PropertyDetails( |
4735 details.attributes(), NORMAL, i + 1); | 4737 details.attributes(), NORMAL, i + 1); |
4736 dictionary = NameDictionary::Add(dictionary, key, value, d); | 4738 dictionary = NameDictionary::Add(dictionary, key, value, d); |
4737 break; | 4739 break; |
4738 } | 4740 } |
4739 case FIELD: { | 4741 case FIELD: { |
4740 Handle<Name> key(descs->GetKey(i)); | 4742 Handle<Name> key(descs->GetKey(i)); |
| 4743 FieldIndex index = FieldIndex::ForDescriptor(*map, i); |
4741 Handle<Object> value( | 4744 Handle<Object> value( |
4742 object->RawFastPropertyAt(descs->GetFieldIndex(i)), isolate); | 4745 object->RawFastPropertyAt(index), isolate); |
4743 PropertyDetails d = | 4746 PropertyDetails d = |
4744 PropertyDetails(details.attributes(), NORMAL, i + 1); | 4747 PropertyDetails(details.attributes(), NORMAL, i + 1); |
4745 dictionary = NameDictionary::Add(dictionary, key, value, d); | 4748 dictionary = NameDictionary::Add(dictionary, key, value, d); |
4746 break; | 4749 break; |
4747 } | 4750 } |
4748 case CALLBACKS: { | 4751 case CALLBACKS: { |
4749 Handle<Name> key(descs->GetKey(i)); | 4752 Handle<Name> key(descs->GetKey(i)); |
4750 Handle<Object> value(descs->GetCallbacksObject(i), isolate); | 4753 Handle<Object> value(descs->GetCallbacksObject(i), isolate); |
4751 PropertyDetails d = PropertyDetails( | 4754 PropertyDetails d = PropertyDetails( |
4752 details.attributes(), CALLBACKS, i + 1); | 4755 details.attributes(), CALLBACKS, i + 1); |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5239 // hidden strings hash code is zero (and no other name has hash | 5242 // hidden strings hash code is zero (and no other name has hash |
5240 // code zero) it will always occupy the first entry if present. | 5243 // code zero) it will always occupy the first entry if present. |
5241 DescriptorArray* descriptors = this->map()->instance_descriptors(); | 5244 DescriptorArray* descriptors = this->map()->instance_descriptors(); |
5242 if (descriptors->number_of_descriptors() > 0) { | 5245 if (descriptors->number_of_descriptors() > 0) { |
5243 int sorted_index = descriptors->GetSortedKeyIndex(0); | 5246 int sorted_index = descriptors->GetSortedKeyIndex(0); |
5244 if (descriptors->GetKey(sorted_index) == GetHeap()->hidden_string() && | 5247 if (descriptors->GetKey(sorted_index) == GetHeap()->hidden_string() && |
5245 sorted_index < map()->NumberOfOwnDescriptors()) { | 5248 sorted_index < map()->NumberOfOwnDescriptors()) { |
5246 ASSERT(descriptors->GetType(sorted_index) == FIELD); | 5249 ASSERT(descriptors->GetType(sorted_index) == FIELD); |
5247 ASSERT(descriptors->GetDetails(sorted_index).representation(). | 5250 ASSERT(descriptors->GetDetails(sorted_index).representation(). |
5248 IsCompatibleForLoad(Representation::Tagged())); | 5251 IsCompatibleForLoad(Representation::Tagged())); |
5249 return this->RawFastPropertyAt( | 5252 FieldIndex index = FieldIndex::ForDescriptor(this->map(), |
5250 descriptors->GetFieldIndex(sorted_index)); | 5253 sorted_index); |
| 5254 return this->RawFastPropertyAt(index); |
5251 } else { | 5255 } else { |
5252 return GetHeap()->undefined_value(); | 5256 return GetHeap()->undefined_value(); |
5253 } | 5257 } |
5254 } else { | 5258 } else { |
5255 return GetHeap()->undefined_value(); | 5259 return GetHeap()->undefined_value(); |
5256 } | 5260 } |
5257 } else { | 5261 } else { |
5258 Isolate* isolate = GetIsolate(); | 5262 Isolate* isolate = GetIsolate(); |
5259 LookupResult result(isolate); | 5263 LookupResult result(isolate); |
5260 LookupOwnRealNamedProperty(isolate->factory()->hidden_string(), &result); | 5264 LookupOwnRealNamedProperty(isolate->factory()->hidden_string(), &result); |
(...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5920 } else { | 5924 } else { |
5921 new_map = Map::Copy(old_map); | 5925 new_map = Map::Copy(old_map); |
5922 new_map->set_is_observed(); | 5926 new_map->set_is_observed(); |
5923 } | 5927 } |
5924 JSObject::MigrateToMap(object, new_map); | 5928 JSObject::MigrateToMap(object, new_map); |
5925 } | 5929 } |
5926 | 5930 |
5927 | 5931 |
5928 Handle<Object> JSObject::FastPropertyAt(Handle<JSObject> object, | 5932 Handle<Object> JSObject::FastPropertyAt(Handle<JSObject> object, |
5929 Representation representation, | 5933 Representation representation, |
5930 int index) { | 5934 FieldIndex index) { |
5931 Isolate* isolate = object->GetIsolate(); | 5935 Isolate* isolate = object->GetIsolate(); |
5932 Handle<Object> raw_value(object->RawFastPropertyAt(index), isolate); | 5936 Handle<Object> raw_value(object->RawFastPropertyAt(index), isolate); |
5933 return Object::NewStorageFor(isolate, raw_value, representation); | 5937 return Object::NewStorageFor(isolate, raw_value, representation); |
5934 } | 5938 } |
5935 | 5939 |
5936 | 5940 |
5937 template<class ContextObject> | 5941 template<class ContextObject> |
5938 class JSObjectWalkVisitor { | 5942 class JSObjectWalkVisitor { |
5939 public: | 5943 public: |
5940 JSObjectWalkVisitor(ContextObject* site_context, bool copying, | 5944 JSObjectWalkVisitor(ContextObject* site_context, bool copying, |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6011 if (!shallow) { | 6015 if (!shallow) { |
6012 HandleScope scope(isolate); | 6016 HandleScope scope(isolate); |
6013 | 6017 |
6014 // Deep copy own properties. | 6018 // Deep copy own properties. |
6015 if (copy->HasFastProperties()) { | 6019 if (copy->HasFastProperties()) { |
6016 Handle<DescriptorArray> descriptors(copy->map()->instance_descriptors()); | 6020 Handle<DescriptorArray> descriptors(copy->map()->instance_descriptors()); |
6017 int limit = copy->map()->NumberOfOwnDescriptors(); | 6021 int limit = copy->map()->NumberOfOwnDescriptors(); |
6018 for (int i = 0; i < limit; i++) { | 6022 for (int i = 0; i < limit; i++) { |
6019 PropertyDetails details = descriptors->GetDetails(i); | 6023 PropertyDetails details = descriptors->GetDetails(i); |
6020 if (details.type() != FIELD) continue; | 6024 if (details.type() != FIELD) continue; |
6021 int index = descriptors->GetFieldIndex(i); | 6025 FieldIndex index = FieldIndex::ForDescriptor(copy->map(), i); |
6022 Handle<Object> value(object->RawFastPropertyAt(index), isolate); | 6026 Handle<Object> value(object->RawFastPropertyAt(index), isolate); |
6023 if (value->IsJSObject()) { | 6027 if (value->IsJSObject()) { |
6024 ASSIGN_RETURN_ON_EXCEPTION( | 6028 ASSIGN_RETURN_ON_EXCEPTION( |
6025 isolate, value, | 6029 isolate, value, |
6026 VisitElementOrProperty(copy, Handle<JSObject>::cast(value)), | 6030 VisitElementOrProperty(copy, Handle<JSObject>::cast(value)), |
6027 JSObject); | 6031 JSObject); |
6028 } else { | 6032 } else { |
6029 Representation representation = details.representation(); | 6033 Representation representation = details.representation(); |
6030 value = Object::NewStorageFor(isolate, value, representation); | 6034 value = Object::NewStorageFor(isolate, value, representation); |
6031 } | 6035 } |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6178 Handle<Object> result = isolate->factory()->undefined_value(); | 6182 Handle<Object> result = isolate->factory()->undefined_value(); |
6179 if (lookup.IsFound() && !lookup.IsTransition()) { | 6183 if (lookup.IsFound() && !lookup.IsTransition()) { |
6180 switch (lookup.type()) { | 6184 switch (lookup.type()) { |
6181 case NORMAL: | 6185 case NORMAL: |
6182 result = GetNormalizedProperty( | 6186 result = GetNormalizedProperty( |
6183 Handle<JSObject>(lookup.holder(), isolate), &lookup); | 6187 Handle<JSObject>(lookup.holder(), isolate), &lookup); |
6184 break; | 6188 break; |
6185 case FIELD: | 6189 case FIELD: |
6186 result = FastPropertyAt(Handle<JSObject>(lookup.holder(), isolate), | 6190 result = FastPropertyAt(Handle<JSObject>(lookup.holder(), isolate), |
6187 lookup.representation(), | 6191 lookup.representation(), |
6188 lookup.GetFieldIndex().field_index()); | 6192 lookup.GetFieldIndex()); |
6189 break; | 6193 break; |
6190 case CONSTANT: | 6194 case CONSTANT: |
6191 result = Handle<Object>(lookup.GetConstant(), isolate); | 6195 result = Handle<Object>(lookup.GetConstant(), isolate); |
6192 break; | 6196 break; |
6193 case CALLBACKS: | 6197 case CALLBACKS: |
6194 case HANDLER: | 6198 case HANDLER: |
6195 case INTERCEPTOR: | 6199 case INTERCEPTOR: |
6196 break; | 6200 break; |
6197 case NONEXISTENT: | 6201 case NONEXISTENT: |
6198 UNREACHABLE(); | 6202 UNREACHABLE(); |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6412 | 6416 |
6413 for (int i = 0; i < size; i++) { | 6417 for (int i = 0; i < size; i++) { |
6414 PropertyDetails details = descs->GetDetails(i); | 6418 PropertyDetails details = descs->GetDetails(i); |
6415 Object* key = descs->GetKey(i); | 6419 Object* key = descs->GetKey(i); |
6416 if (!(details.IsDontEnum() || key->IsSymbol())) { | 6420 if (!(details.IsDontEnum() || key->IsSymbol())) { |
6417 storage->set(index, key); | 6421 storage->set(index, key); |
6418 if (!indices.is_null()) { | 6422 if (!indices.is_null()) { |
6419 if (details.type() != FIELD) { | 6423 if (details.type() != FIELD) { |
6420 indices = Handle<FixedArray>(); | 6424 indices = Handle<FixedArray>(); |
6421 } else { | 6425 } else { |
6422 int field_index = descs->GetFieldIndex(i); | 6426 FieldIndex field_index = FieldIndex::ForDescriptor(*map, i); |
6423 if (field_index >= map->inobject_properties()) { | 6427 int load_by_field_index = field_index.GetLoadByFieldIndex(); |
6424 field_index = -(field_index - map->inobject_properties() + 1); | 6428 indices->set(index, Smi::FromInt(load_by_field_index)); |
6425 } | |
6426 field_index = field_index << 1; | |
6427 if (details.representation().IsDouble()) { | |
6428 field_index |= 1; | |
6429 } | |
6430 indices->set(index, Smi::FromInt(field_index)); | |
6431 } | 6429 } |
6432 } | 6430 } |
6433 index++; | 6431 index++; |
6434 } | 6432 } |
6435 } | 6433 } |
6436 ASSERT(index == storage->length()); | 6434 ASSERT(index == storage->length()); |
6437 | 6435 |
6438 Handle<FixedArray> bridge_storage = | 6436 Handle<FixedArray> bridge_storage = |
6439 isolate->factory()->NewFixedArray( | 6437 isolate->factory()->NewFixedArray( |
6440 DescriptorArray::kEnumCacheBridgeLength); | 6438 DescriptorArray::kEnumCacheBridgeLength); |
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7124 return isolate->factory()->undefined_value(); | 7122 return isolate->factory()->undefined_value(); |
7125 } | 7123 } |
7126 | 7124 |
7127 | 7125 |
7128 Object* JSObject::SlowReverseLookup(Object* value) { | 7126 Object* JSObject::SlowReverseLookup(Object* value) { |
7129 if (HasFastProperties()) { | 7127 if (HasFastProperties()) { |
7130 int number_of_own_descriptors = map()->NumberOfOwnDescriptors(); | 7128 int number_of_own_descriptors = map()->NumberOfOwnDescriptors(); |
7131 DescriptorArray* descs = map()->instance_descriptors(); | 7129 DescriptorArray* descs = map()->instance_descriptors(); |
7132 for (int i = 0; i < number_of_own_descriptors; i++) { | 7130 for (int i = 0; i < number_of_own_descriptors; i++) { |
7133 if (descs->GetType(i) == FIELD) { | 7131 if (descs->GetType(i) == FIELD) { |
7134 Object* property = RawFastPropertyAt(descs->GetFieldIndex(i)); | 7132 Object* property = |
| 7133 RawFastPropertyAt(FieldIndex::ForDescriptor(map(), i)); |
7135 if (descs->GetDetails(i).representation().IsDouble()) { | 7134 if (descs->GetDetails(i).representation().IsDouble()) { |
7136 ASSERT(property->IsHeapNumber()); | 7135 ASSERT(property->IsHeapNumber()); |
7137 if (value->IsNumber() && property->Number() == value->Number()) { | 7136 if (value->IsNumber() && property->Number() == value->Number()) { |
7138 return descs->GetKey(i); | 7137 return descs->GetKey(i); |
7139 } | 7138 } |
7140 } else if (property == value) { | 7139 } else if (property == value) { |
7141 return descs->GetKey(i); | 7140 return descs->GetKey(i); |
7142 } | 7141 } |
7143 } else if (descs->GetType(i) == CONSTANT) { | 7142 } else if (descs->GetType(i) == CONSTANT) { |
7144 if (descs->GetConstant(i) == value) { | 7143 if (descs->GetConstant(i) == value) { |
(...skipping 10056 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17201 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17200 #define ERROR_MESSAGES_TEXTS(C, T) T, |
17202 static const char* error_messages_[] = { | 17201 static const char* error_messages_[] = { |
17203 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17202 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
17204 }; | 17203 }; |
17205 #undef ERROR_MESSAGES_TEXTS | 17204 #undef ERROR_MESSAGES_TEXTS |
17206 return error_messages_[reason]; | 17205 return error_messages_[reason]; |
17207 } | 17206 } |
17208 | 17207 |
17209 | 17208 |
17210 } } // namespace v8::internal | 17209 } } // namespace v8::internal |
OLD | NEW |