Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 2615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2626 return context->extension()->ReferencesObject(obj); | 2626 return context->extension()->ReferencesObject(obj); |
| 2627 } | 2627 } |
| 2628 } | 2628 } |
| 2629 | 2629 |
| 2630 // No references to object. | 2630 // No references to object. |
| 2631 return false; | 2631 return false; |
| 2632 } | 2632 } |
| 2633 | 2633 |
| 2634 | 2634 |
| 2635 // Tests for the fast common case for property enumeration: | 2635 // Tests for the fast common case for property enumeration: |
| 2636 // - this object has an enum cache | 2636 // - This object and all prototypes has an enum cache (which means that it has |
| 2637 // - this object has no elements | 2637 // no interceptors and needs no access checks). |
| 2638 // - no prototype has enumerable properties/elements | 2638 // - This object has no elements. |
| 2639 // - neither this object nor any prototype has interceptors | 2639 // - No prototype has enumerable properties/elements. |
| 2640 bool JSObject::IsSimpleEnum() { | 2640 bool JSObject::IsSimpleEnum() { |
| 2641 JSObject* arguments_boilerplate = | |
| 2642 Top::context()->global_context()->arguments_boilerplate(); | |
| 2643 JSFunction* arguments_function = | |
| 2644 JSFunction::cast(arguments_boilerplate->map()->constructor()); | |
| 2645 if (IsAccessCheckNeeded()) return false; | |
| 2646 if (map()->constructor() == arguments_function) return false; | |
| 2647 | |
| 2648 for (Object* o = this; | 2641 for (Object* o = this; |
| 2649 o != Heap::null_value(); | 2642 o != Heap::null_value(); |
| 2650 o = JSObject::cast(o)->GetPrototype()) { | 2643 o = JSObject::cast(o)->GetPrototype()) { |
| 2651 JSObject* curr = JSObject::cast(o); | 2644 JSObject* curr = JSObject::cast(o); |
| 2652 if (!curr->HasFastProperties()) return false; | |
| 2653 if (!curr->map()->instance_descriptors()->HasEnumCache()) return false; | 2645 if (!curr->map()->instance_descriptors()->HasEnumCache()) return false; |
| 2646 ASSERT(!curr->HasNamedInterceptor()); | |
| 2647 ASSERT(!curr->HasIndexedInterceptor()); | |
| 2648 ASSERT(!curr->IsAccessCheckNeeded()); | |
| 2654 if (curr->NumberOfEnumElements() > 0) return false; | 2649 if (curr->NumberOfEnumElements() > 0) return false; |
|
Erik Corry
2009/12/01 10:21:08
Seems like it would be better to check this when c
| |
| 2655 if (curr->HasNamedInterceptor()) return false; | |
| 2656 if (curr->HasIndexedInterceptor()) return false; | |
| 2657 if (curr != this) { | 2650 if (curr != this) { |
| 2658 FixedArray* curr_fixed_array = | 2651 FixedArray* curr_fixed_array = |
| 2659 FixedArray::cast(curr->map()->instance_descriptors()->GetEnumCache()); | 2652 FixedArray::cast(curr->map()->instance_descriptors()->GetEnumCache()); |
| 2660 if (curr_fixed_array->length() > 0) { | 2653 if (curr_fixed_array->length() > 0) return false; |
| 2661 return false; | |
| 2662 } | |
| 2663 } | 2654 } |
| 2664 } | 2655 } |
| 2665 return true; | 2656 return true; |
| 2666 } | 2657 } |
| 2667 | 2658 |
| 2668 | 2659 |
| 2669 int Map::NumberOfDescribedProperties() { | 2660 int Map::NumberOfDescribedProperties() { |
| 2670 int result = 0; | 2661 int result = 0; |
| 2671 DescriptorArray* descs = instance_descriptors(); | 2662 DescriptorArray* descs = instance_descriptors(); |
| 2672 for (int i = 0; i < descs->number_of_descriptors(); i++) { | 2663 for (int i = 0; i < descs->number_of_descriptors(); i++) { |
| (...skipping 3798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6471 } | 6462 } |
| 6472 } | 6463 } |
| 6473 | 6464 |
| 6474 | 6465 |
| 6475 int JSObject::NumberOfLocalElements(PropertyAttributes filter) { | 6466 int JSObject::NumberOfLocalElements(PropertyAttributes filter) { |
| 6476 return GetLocalElementKeys(NULL, filter); | 6467 return GetLocalElementKeys(NULL, filter); |
| 6477 } | 6468 } |
| 6478 | 6469 |
| 6479 | 6470 |
| 6480 int JSObject::NumberOfEnumElements() { | 6471 int JSObject::NumberOfEnumElements() { |
| 6472 // Fast case for objects with no elements. | |
| 6473 if (!IsJSValue() && HasFastElements()) { | |
| 6474 uint32_t length = IsJSArray() ? | |
| 6475 static_cast<uint32_t>( | |
| 6476 Smi::cast(JSArray::cast(this)->length())->value()) : | |
| 6477 static_cast<uint32_t>(FixedArray::cast(elements())->length()); | |
| 6478 if (length == 0) return 0; | |
| 6479 } | |
| 6480 // Compute the number of enumerable elements. | |
| 6481 return NumberOfLocalElements(static_cast<PropertyAttributes>(DONT_ENUM)); | 6481 return NumberOfLocalElements(static_cast<PropertyAttributes>(DONT_ENUM)); |
| 6482 } | 6482 } |
| 6483 | 6483 |
| 6484 | 6484 |
| 6485 int JSObject::GetLocalElementKeys(FixedArray* storage, | 6485 int JSObject::GetLocalElementKeys(FixedArray* storage, |
| 6486 PropertyAttributes filter) { | 6486 PropertyAttributes filter) { |
| 6487 int counter = 0; | 6487 int counter = 0; |
| 6488 switch (GetElementsKind()) { | 6488 switch (GetElementsKind()) { |
| 6489 case FAST_ELEMENTS: { | 6489 case FAST_ELEMENTS: { |
| 6490 int length = IsJSArray() ? | 6490 int length = IsJSArray() ? |
| (...skipping 1797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8288 if (break_point_objects()->IsUndefined()) return 0; | 8288 if (break_point_objects()->IsUndefined()) return 0; |
| 8289 // Single beak point. | 8289 // Single beak point. |
| 8290 if (!break_point_objects()->IsFixedArray()) return 1; | 8290 if (!break_point_objects()->IsFixedArray()) return 1; |
| 8291 // Multiple break points. | 8291 // Multiple break points. |
| 8292 return FixedArray::cast(break_point_objects())->length(); | 8292 return FixedArray::cast(break_point_objects())->length(); |
| 8293 } | 8293 } |
| 8294 #endif | 8294 #endif |
| 8295 | 8295 |
| 8296 | 8296 |
| 8297 } } // namespace v8::internal | 8297 } } // namespace v8::internal |
| OLD | NEW |