Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(69)

Side by Side Diff: src/objects.cc

Issue 300283002: Introduce FieldIndex to unify and abstract property/field offset (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix nit Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698