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

Side by Side Diff: src/objects.cc

Issue 7787007: Key external array map transitions on ElementsKind instead of ExternalArrayType (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: review feedback Created 9 years, 3 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
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 holder); 584 holder);
585 case HANDLER: { 585 case HANDLER: {
586 JSProxy* proxy = JSProxy::cast(this); 586 JSProxy* proxy = JSProxy::cast(this);
587 return GetPropertyWithHandler(receiver, name, proxy->handler()); 587 return GetPropertyWithHandler(receiver, name, proxy->handler());
588 } 588 }
589 case INTERCEPTOR: { 589 case INTERCEPTOR: {
590 JSObject* recvr = JSObject::cast(receiver); 590 JSObject* recvr = JSObject::cast(receiver);
591 return holder->GetPropertyWithInterceptor(recvr, name, attributes); 591 return holder->GetPropertyWithInterceptor(recvr, name, attributes);
592 } 592 }
593 case MAP_TRANSITION: 593 case MAP_TRANSITION:
594 case EXTERNAL_ARRAY_TRANSITION: 594 case ELEMENTS_TRANSITION:
595 case CONSTANT_TRANSITION: 595 case CONSTANT_TRANSITION:
596 case NULL_DESCRIPTOR: 596 case NULL_DESCRIPTOR:
597 break; 597 break;
598 } 598 }
599 UNREACHABLE(); 599 UNREACHABLE();
600 return NULL; 600 return NULL;
601 } 601 }
602 602
603 603
604 MaybeObject* Object::GetElementWithReceiver(Object* receiver, uint32_t index) { 604 MaybeObject* Object::GetElementWithReceiver(Object* receiver, uint32_t index) {
(...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after
1428 if (!maybe_new_descriptors->ToObject(&new_descriptors)) { 1428 if (!maybe_new_descriptors->ToObject(&new_descriptors)) {
1429 return maybe_new_descriptors; 1429 return maybe_new_descriptors;
1430 } 1430 }
1431 } 1431 }
1432 1432
1433 // Only allow map transition if the object isn't the global object and there 1433 // Only allow map transition if the object isn't the global object and there
1434 // is not a transition for the name, or there's a transition for the name but 1434 // is not a transition for the name, or there's a transition for the name but
1435 // it's unrelated to properties. 1435 // it's unrelated to properties.
1436 int descriptor_index = old_descriptors->Search(name); 1436 int descriptor_index = old_descriptors->Search(name);
1437 1437
1438 // External array transitions are stored in the descriptor for property "", 1438 // Element transitions are stored in the descriptor for property "", which is
1439 // which is not a identifier and should have forced a switch to slow 1439 // not a identifier and should have forced a switch to slow properties above.
1440 // properties above.
1441 ASSERT(descriptor_index == DescriptorArray::kNotFound || 1440 ASSERT(descriptor_index == DescriptorArray::kNotFound ||
1442 old_descriptors->GetType(descriptor_index) != EXTERNAL_ARRAY_TRANSITION); 1441 old_descriptors->GetType(descriptor_index) != ELEMENTS_TRANSITION);
1443 bool can_insert_transition = descriptor_index == DescriptorArray::kNotFound || 1442 bool can_insert_transition = descriptor_index == DescriptorArray::kNotFound ||
1444 old_descriptors->GetType(descriptor_index) == EXTERNAL_ARRAY_TRANSITION; 1443 old_descriptors->GetType(descriptor_index) == ELEMENTS_TRANSITION;
1445 bool allow_map_transition = 1444 bool allow_map_transition =
1446 can_insert_transition && 1445 can_insert_transition &&
1447 (isolate->context()->global_context()->object_function()->map() != map()); 1446 (isolate->context()->global_context()->object_function()->map() != map());
1448 1447
1449 ASSERT(index < map()->inobject_properties() || 1448 ASSERT(index < map()->inobject_properties() ||
1450 (index - map()->inobject_properties()) < properties()->length() || 1449 (index - map()->inobject_properties()) < properties()->length() ||
1451 map()->unused_property_fields() == 0); 1450 map()->unused_property_fields() == 0);
1452 // Allocate a new map for the object. 1451 // Allocate a new map for the object.
1453 Object* r; 1452 Object* r;
1454 { MaybeObject* maybe_r = map()->CopyDropDescriptors(); 1453 { MaybeObject* maybe_r = map()->CopyDropDescriptors();
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
1982 cache->Update(descriptors, name, number); 1981 cache->Update(descriptors, name, number);
1983 } 1982 }
1984 if (number != DescriptorArray::kNotFound) { 1983 if (number != DescriptorArray::kNotFound) {
1985 result->DescriptorResult(holder, descriptors->GetDetails(number), number); 1984 result->DescriptorResult(holder, descriptors->GetDetails(number), number);
1986 } else { 1985 } else {
1987 result->NotFound(); 1986 result->NotFound();
1988 } 1987 }
1989 } 1988 }
1990 1989
1991 1990
1992 static ElementsKind GetElementsKindFromExternalArrayType( 1991 MaybeObject* Map::GetElementsTransitionMap(ElementsKind elements_kind,
1993 ExternalArrayType array_type) { 1992 bool safe_to_add_transition) {
1994 switch (array_type) {
1995 case kExternalByteArray:
1996 return EXTERNAL_BYTE_ELEMENTS;
1997 break;
1998 case kExternalUnsignedByteArray:
1999 return EXTERNAL_UNSIGNED_BYTE_ELEMENTS;
2000 break;
2001 case kExternalShortArray:
2002 return EXTERNAL_SHORT_ELEMENTS;
2003 break;
2004 case kExternalUnsignedShortArray:
2005 return EXTERNAL_UNSIGNED_SHORT_ELEMENTS;
2006 break;
2007 case kExternalIntArray:
2008 return EXTERNAL_INT_ELEMENTS;
2009 break;
2010 case kExternalUnsignedIntArray:
2011 return EXTERNAL_UNSIGNED_INT_ELEMENTS;
2012 break;
2013 case kExternalFloatArray:
2014 return EXTERNAL_FLOAT_ELEMENTS;
2015 break;
2016 case kExternalDoubleArray:
2017 return EXTERNAL_DOUBLE_ELEMENTS;
2018 break;
2019 case kExternalPixelArray:
2020 return EXTERNAL_PIXEL_ELEMENTS;
2021 break;
2022 }
2023 UNREACHABLE();
2024 return DICTIONARY_ELEMENTS;
2025 }
2026
2027
2028 MaybeObject* Map::GetExternalArrayElementsMap(ExternalArrayType array_type,
2029 bool safe_to_add_transition) {
2030 Heap* current_heap = heap(); 1993 Heap* current_heap = heap();
2031 DescriptorArray* descriptors = instance_descriptors(); 1994 DescriptorArray* descriptors = instance_descriptors();
2032 String* external_array_sentinel_name = current_heap->empty_symbol(); 1995 String* elements_transition_sentinel_name = current_heap->empty_symbol();
2033 1996
2034 if (safe_to_add_transition) { 1997 if (safe_to_add_transition) {
2035 // It's only safe to manipulate the descriptor array if it would be 1998 // It's only safe to manipulate the descriptor array if it would be
2036 // safe to add a transition. 1999 // safe to add a transition.
2037 2000
2038 ASSERT(!is_shared()); // no transitions can be added to shared maps. 2001 ASSERT(!is_shared()); // no transitions can be added to shared maps.
2039 // Check if the external array transition already exists. 2002 // Check if the elements transition already exists.
2040 DescriptorLookupCache* cache = 2003 DescriptorLookupCache* cache =
2041 current_heap->isolate()->descriptor_lookup_cache(); 2004 current_heap->isolate()->descriptor_lookup_cache();
2042 int index = cache->Lookup(descriptors, external_array_sentinel_name); 2005 int index = cache->Lookup(descriptors, elements_transition_sentinel_name);
2043 if (index == DescriptorLookupCache::kAbsent) { 2006 if (index == DescriptorLookupCache::kAbsent) {
2044 index = descriptors->Search(external_array_sentinel_name); 2007 index = descriptors->Search(elements_transition_sentinel_name);
2045 cache->Update(descriptors, 2008 cache->Update(descriptors,
2046 external_array_sentinel_name, 2009 elements_transition_sentinel_name,
2047 index); 2010 index);
2048 } 2011 }
2049 2012
2050 // If the transition already exists, check the type. If there is a match, 2013 // If the transition already exists, check the type. If there is a match,
2051 // return it. 2014 // return it.
2052 if (index != DescriptorArray::kNotFound) { 2015 if (index != DescriptorArray::kNotFound) {
2053 PropertyDetails details(PropertyDetails(descriptors->GetDetails(index))); 2016 PropertyDetails details(PropertyDetails(descriptors->GetDetails(index)));
2054 if (details.type() == EXTERNAL_ARRAY_TRANSITION && 2017 if (details.type() == ELEMENTS_TRANSITION &&
2055 details.array_type() == array_type) { 2018 details.elements_kind() == elements_kind) {
2056 return descriptors->GetValue(index); 2019 return descriptors->GetValue(index);
2057 } else { 2020 } else {
2058 safe_to_add_transition = false; 2021 safe_to_add_transition = false;
2059 } 2022 }
2060 } 2023 }
2061 } 2024 }
2062 2025
2063 // No transition to an existing external array map. Make a new one. 2026 // No transition to an existing map for the given ElementsKind. Make a new
2027 // one.
2064 Object* obj; 2028 Object* obj;
2065 { MaybeObject* maybe_map = CopyDropTransitions(); 2029 { MaybeObject* maybe_map = CopyDropTransitions();
2066 if (!maybe_map->ToObject(&obj)) return maybe_map; 2030 if (!maybe_map->ToObject(&obj)) return maybe_map;
2067 } 2031 }
2068 Map* new_map = Map::cast(obj); 2032 Map* new_map = Map::cast(obj);
2069 2033
2070 new_map->set_elements_kind(GetElementsKindFromExternalArrayType(array_type)); 2034 new_map->set_elements_kind(elements_kind);
2071 GetIsolate()->counters()->map_to_external_array_elements()->Increment(); 2035 GetIsolate()->counters()->map_to_external_array_elements()->Increment();
2072 2036
2073 // Only remember the map transition if the object's map is NOT equal to the 2037 // Only remember the map transition if the object's map is NOT equal to the
2074 // global object_function's map and there is not an already existing 2038 // global object_function's map and there is not an already existing
2075 // non-matching external array transition. 2039 // non-matching element transition.
2076 bool allow_map_transition = 2040 bool allow_map_transition =
2077 safe_to_add_transition && 2041 safe_to_add_transition &&
2078 (GetIsolate()->context()->global_context()->object_function()->map() != 2042 (GetIsolate()->context()->global_context()->object_function()->map() !=
2079 map()); 2043 map());
2080 if (allow_map_transition) { 2044 if (allow_map_transition) {
2081 // Allocate new instance descriptors for the old map with map transition. 2045 // Allocate new instance descriptors for the old map with map transition.
2082 ExternalArrayTransitionDescriptor desc(external_array_sentinel_name, 2046 ElementsTransitionDescriptor desc(elements_transition_sentinel_name,
2083 Map::cast(new_map), 2047 Map::cast(new_map),
2084 array_type); 2048 elements_kind);
2085 Object* new_descriptors; 2049 Object* new_descriptors;
2086 MaybeObject* maybe_new_descriptors = descriptors->CopyInsert( 2050 MaybeObject* maybe_new_descriptors = descriptors->CopyInsert(
2087 &desc, 2051 &desc,
2088 KEEP_TRANSITIONS); 2052 KEEP_TRANSITIONS);
2089 if (!maybe_new_descriptors->ToObject(&new_descriptors)) { 2053 if (!maybe_new_descriptors->ToObject(&new_descriptors)) {
2090 return maybe_new_descriptors; 2054 return maybe_new_descriptors;
2091 } 2055 }
2092 descriptors = DescriptorArray::cast(new_descriptors); 2056 descriptors = DescriptorArray::cast(new_descriptors);
2093 set_instance_descriptors(descriptors); 2057 set_instance_descriptors(descriptors);
2094 } 2058 }
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
2491 ASSERT(!HEAP->InNewSpace(function)); 2455 ASSERT(!HEAP->InNewSpace(function));
2492 if (value == function) { 2456 if (value == function) {
2493 set_map(target_map); 2457 set_map(target_map);
2494 return value; 2458 return value;
2495 } 2459 }
2496 // Otherwise, replace with a MAP_TRANSITION to a new map with a 2460 // Otherwise, replace with a MAP_TRANSITION to a new map with a
2497 // FIELD, even if the value is a constant function. 2461 // FIELD, even if the value is a constant function.
2498 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes); 2462 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes);
2499 } 2463 }
2500 case NULL_DESCRIPTOR: 2464 case NULL_DESCRIPTOR:
2501 case EXTERNAL_ARRAY_TRANSITION: 2465 case ELEMENTS_TRANSITION:
2502 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes); 2466 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes);
2503 default: 2467 default:
2504 UNREACHABLE(); 2468 UNREACHABLE();
2505 } 2469 }
2506 UNREACHABLE(); 2470 UNREACHABLE();
2507 return value; 2471 return value;
2508 } 2472 }
2509 2473
2510 2474
2511 // Set a real local property, even if it is READ_ONLY. If the property is not 2475 // Set a real local property, even if it is READ_ONLY. If the property is not
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
2579 return ConvertDescriptorToField(name, value, attributes); 2543 return ConvertDescriptorToField(name, value, attributes);
2580 case CALLBACKS: 2544 case CALLBACKS:
2581 case INTERCEPTOR: 2545 case INTERCEPTOR:
2582 // Override callback in clone 2546 // Override callback in clone
2583 return ConvertDescriptorToField(name, value, attributes); 2547 return ConvertDescriptorToField(name, value, attributes);
2584 case CONSTANT_TRANSITION: 2548 case CONSTANT_TRANSITION:
2585 // Replace with a MAP_TRANSITION to a new map with a FIELD, even 2549 // Replace with a MAP_TRANSITION to a new map with a FIELD, even
2586 // if the value is a function. 2550 // if the value is a function.
2587 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes); 2551 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes);
2588 case NULL_DESCRIPTOR: 2552 case NULL_DESCRIPTOR:
2589 case EXTERNAL_ARRAY_TRANSITION: 2553 case ELEMENTS_TRANSITION:
2590 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes); 2554 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes);
2591 default: 2555 default:
2592 UNREACHABLE(); 2556 UNREACHABLE();
2593 } 2557 }
2594 UNREACHABLE(); 2558 UNREACHABLE();
2595 return value; 2559 return value;
2596 } 2560 }
2597 2561
2598 2562
2599 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( 2563 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor(
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
2860 dictionary->Add(descs->GetKey(i), value, d); 2824 dictionary->Add(descs->GetKey(i), value, d);
2861 if (!maybe_result->ToObject(&result)) return maybe_result; 2825 if (!maybe_result->ToObject(&result)) return maybe_result;
2862 } 2826 }
2863 dictionary = StringDictionary::cast(result); 2827 dictionary = StringDictionary::cast(result);
2864 break; 2828 break;
2865 } 2829 }
2866 case MAP_TRANSITION: 2830 case MAP_TRANSITION:
2867 case CONSTANT_TRANSITION: 2831 case CONSTANT_TRANSITION:
2868 case NULL_DESCRIPTOR: 2832 case NULL_DESCRIPTOR:
2869 case INTERCEPTOR: 2833 case INTERCEPTOR:
2870 case EXTERNAL_ARRAY_TRANSITION: 2834 case ELEMENTS_TRANSITION:
2871 break; 2835 break;
2872 default: 2836 default:
2873 UNREACHABLE(); 2837 UNREACHABLE();
2874 } 2838 }
2875 } 2839 }
2876 2840
2877 Heap* current_heap = map_of_this->heap(); 2841 Heap* current_heap = map_of_this->heap();
2878 2842
2879 // Copy the next enumeration index from instance descriptor. 2843 // Copy the next enumeration index from instance descriptor.
2880 int index = map_of_this->instance_descriptors()->NextEnumerationIndex(); 2844 int index = map_of_this->instance_descriptors()->NextEnumerationIndex();
(...skipping 3324 matching lines...) Expand 10 before | Expand all | Expand 10 after
6205 for (int i = 0; i < length; i++) { 6169 for (int i = 0; i < length; i++) {
6206 fprintf(file, "%c", Get(i)); 6170 fprintf(file, "%c", Get(i));
6207 } 6171 }
6208 } 6172 }
6209 6173
6210 6174
6211 void Map::CreateBackPointers() { 6175 void Map::CreateBackPointers() {
6212 DescriptorArray* descriptors = instance_descriptors(); 6176 DescriptorArray* descriptors = instance_descriptors();
6213 for (int i = 0; i < descriptors->number_of_descriptors(); i++) { 6177 for (int i = 0; i < descriptors->number_of_descriptors(); i++) {
6214 if (descriptors->GetType(i) == MAP_TRANSITION || 6178 if (descriptors->GetType(i) == MAP_TRANSITION ||
6215 descriptors->GetType(i) == EXTERNAL_ARRAY_TRANSITION || 6179 descriptors->GetType(i) == ELEMENTS_TRANSITION ||
6216 descriptors->GetType(i) == CONSTANT_TRANSITION) { 6180 descriptors->GetType(i) == CONSTANT_TRANSITION) {
6217 // Get target. 6181 // Get target.
6218 Map* target = Map::cast(descriptors->GetValue(i)); 6182 Map* target = Map::cast(descriptors->GetValue(i));
6219 #ifdef DEBUG 6183 #ifdef DEBUG
6220 // Verify target. 6184 // Verify target.
6221 Object* source_prototype = prototype(); 6185 Object* source_prototype = prototype();
6222 Object* target_prototype = target->prototype(); 6186 Object* target_prototype = target->prototype();
6223 ASSERT(source_prototype->IsJSObject() || 6187 ASSERT(source_prototype->IsJSObject() ||
6224 source_prototype->IsMap() || 6188 source_prototype->IsMap() ||
6225 source_prototype->IsNull()); 6189 source_prototype->IsNull());
(...skipping 22 matching lines...) Expand all
6248 d->get(DescriptorArray::kContentArrayIndex)); 6212 d->get(DescriptorArray::kContentArrayIndex));
6249 ASSERT(contents->length() >= 2); 6213 ASSERT(contents->length() >= 2);
6250 for (int i = 0; i < contents->length(); i += 2) { 6214 for (int i = 0; i < contents->length(); i += 2) {
6251 // If the pair (value, details) is a map transition, 6215 // If the pair (value, details) is a map transition,
6252 // check if the target is live. If not, null the descriptor. 6216 // check if the target is live. If not, null the descriptor.
6253 // Also drop the back pointer for that map transition, so that this 6217 // Also drop the back pointer for that map transition, so that this
6254 // map is not reached again by following a back pointer from a 6218 // map is not reached again by following a back pointer from a
6255 // non-live object. 6219 // non-live object.
6256 PropertyDetails details(Smi::cast(contents->get(i + 1))); 6220 PropertyDetails details(Smi::cast(contents->get(i + 1)));
6257 if (details.type() == MAP_TRANSITION || 6221 if (details.type() == MAP_TRANSITION ||
6258 details.type() == EXTERNAL_ARRAY_TRANSITION || 6222 details.type() == ELEMENTS_TRANSITION ||
6259 details.type() == CONSTANT_TRANSITION) { 6223 details.type() == CONSTANT_TRANSITION) {
6260 Map* target = reinterpret_cast<Map*>(contents->get(i)); 6224 Map* target = reinterpret_cast<Map*>(contents->get(i));
6261 ASSERT(target->IsHeapObject()); 6225 ASSERT(target->IsHeapObject());
6262 if (!target->IsMarked()) { 6226 if (!target->IsMarked()) {
6263 ASSERT(target->IsMap()); 6227 ASSERT(target->IsMap());
6264 contents->set_unchecked(i + 1, NullDescriptorDetails); 6228 contents->set_unchecked(i + 1, NullDescriptorDetails);
6265 contents->set_null_unchecked(heap, i); 6229 contents->set_null_unchecked(heap, i);
6266 ASSERT(target->prototype() == this || 6230 ASSERT(target->prototype() == this ||
6267 target->prototype() == real_prototype); 6231 target->prototype() == real_prototype);
6268 // Getter prototype() is read-only, set_prototype() has side effects. 6232 // Getter prototype() is read-only, set_prototype() has side effects.
(...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after
7137 7101
7138 const char* Code::PropertyType2String(PropertyType type) { 7102 const char* Code::PropertyType2String(PropertyType type) {
7139 switch (type) { 7103 switch (type) {
7140 case NORMAL: return "NORMAL"; 7104 case NORMAL: return "NORMAL";
7141 case FIELD: return "FIELD"; 7105 case FIELD: return "FIELD";
7142 case CONSTANT_FUNCTION: return "CONSTANT_FUNCTION"; 7106 case CONSTANT_FUNCTION: return "CONSTANT_FUNCTION";
7143 case CALLBACKS: return "CALLBACKS"; 7107 case CALLBACKS: return "CALLBACKS";
7144 case HANDLER: return "HANDLER"; 7108 case HANDLER: return "HANDLER";
7145 case INTERCEPTOR: return "INTERCEPTOR"; 7109 case INTERCEPTOR: return "INTERCEPTOR";
7146 case MAP_TRANSITION: return "MAP_TRANSITION"; 7110 case MAP_TRANSITION: return "MAP_TRANSITION";
7147 case EXTERNAL_ARRAY_TRANSITION: return "EXTERNAL_ARRAY_TRANSITION"; 7111 case ELEMENTS_TRANSITION: return "ELEMENTS_TRANSITION";
7148 case CONSTANT_TRANSITION: return "CONSTANT_TRANSITION"; 7112 case CONSTANT_TRANSITION: return "CONSTANT_TRANSITION";
7149 case NULL_DESCRIPTOR: return "NULL_DESCRIPTOR"; 7113 case NULL_DESCRIPTOR: return "NULL_DESCRIPTOR";
7150 } 7114 }
7151 UNREACHABLE(); 7115 UNREACHABLE();
7152 return NULL; 7116 return NULL;
7153 } 7117 }
7154 7118
7155 7119
7156 void Code::PrintExtraICState(FILE* out, Kind kind, ExtraICState extra) { 7120 void Code::PrintExtraICState(FILE* out, Kind kind, ExtraICState extra) {
7157 const char* name = NULL; 7121 const char* name = NULL;
(...skipping 4451 matching lines...) Expand 10 before | Expand all | Expand 10 after
11609 if (break_point_objects()->IsUndefined()) return 0; 11573 if (break_point_objects()->IsUndefined()) return 0;
11610 // Single break point. 11574 // Single break point.
11611 if (!break_point_objects()->IsFixedArray()) return 1; 11575 if (!break_point_objects()->IsFixedArray()) return 1;
11612 // Multiple break points. 11576 // Multiple break points.
11613 return FixedArray::cast(break_point_objects())->length(); 11577 return FixedArray::cast(break_point_objects())->length();
11614 } 11578 }
11615 #endif 11579 #endif
11616 11580
11617 11581
11618 } } // namespace v8::internal 11582 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698