Index: src/elements.cc |
=================================================================== |
--- src/elements.cc (revision 10035) |
+++ src/elements.cc (working copy) |
@@ -801,42 +801,45 @@ |
void ElementsAccessor::InitializeOncePerProcess() { |
+ // First argument in list is the accessor class, the second argument is can |
+ // be any arbitrary unique identifier, in this case chosen to be the |
+ // corresponding enum. Use the fast element handler for smi-only arrays. |
+ // The implementation is currently identical. Note that the order must match |
+ // that of the ElementsKind enum for the |accessor_array[]| below to work. |
+#define ELEMENTS_LIST(V) \ |
+ V(FastObjectElementsAccessor, FAST_SMI_ONLY_ELEMENTS) \ |
+ V(FastObjectElementsAccessor, FAST_ELEMENTS) \ |
+ V(FastDoubleElementsAccessor, FAST_DOUBLE_ELEMENTS) \ |
+ V(DictionaryElementsAccessor, DICTIONARY_ELEMENTS) \ |
+ V(NonStrictArgumentsElementsAccessor, NON_STRICT_ARGUMENTS_ELEMENTS) \ |
+ V(ExternalByteElementsAccessor, EXTERNAL_BYTE_ELEMENTS) \ |
+ V(ExternalUnsignedByteElementsAccessor, EXTERNAL_UNSIGNED_BYTE_ELEMENTS) \ |
+ V(ExternalShortElementsAccessor, EXTERNAL_SHORT_ELEMENTS) \ |
+ V(ExternalUnsignedShortElementsAccessor, EXTERNAL_UNSIGNED_SHORT_ELEMENTS) \ |
+ V(ExternalIntElementsAccessor, EXTERNAL_INT_ELEMENTS) \ |
+ V(ExternalUnsignedIntElementsAccessor, EXTERNAL_UNSIGNED_INT_ELEMENTS) \ |
+ V(ExternalFloatElementsAccessor, EXTERNAL_FLOAT_ELEMENTS) \ |
+ V(ExternalDoubleElementsAccessor, EXTERNAL_DOUBLE_ELEMENTS) \ |
+ V(PixelElementsAccessor, EXTERNAL_PIXEL_ELEMENTS) |
+ |
static struct ConcreteElementsAccessors { |
- // Use the fast element handler for smi-only arrays. The implementation is |
- // currently identical. |
- FastObjectElementsAccessor fast_smi_elements_handler; |
- FastObjectElementsAccessor fast_elements_handler; |
- FastDoubleElementsAccessor fast_double_elements_handler; |
- DictionaryElementsAccessor dictionary_elements_handler; |
- NonStrictArgumentsElementsAccessor non_strict_arguments_elements_handler; |
- ExternalByteElementsAccessor byte_elements_handler; |
- ExternalUnsignedByteElementsAccessor unsigned_byte_elements_handler; |
- ExternalShortElementsAccessor short_elements_handler; |
- ExternalUnsignedShortElementsAccessor unsigned_short_elements_handler; |
- ExternalIntElementsAccessor int_elements_handler; |
- ExternalUnsignedIntElementsAccessor unsigned_int_elements_handler; |
- ExternalFloatElementsAccessor float_elements_handler; |
- ExternalDoubleElementsAccessor double_elements_handler; |
- PixelElementsAccessor pixel_elements_handler; |
- } element_accessors; |
+#define ACCESSOR_STRUCT(Class, Name) Class* Name##_handler; |
+ ELEMENTS_LIST(ACCESSOR_STRUCT) |
+#undef ACCESSOR_STRUCT |
+ } element_accessors = { |
+#define ACCESSOR_INIT(Class, Name) new Class(), |
+ ELEMENTS_LIST(ACCESSOR_INIT) |
+#undef ACCESSOR_INIT |
+ }; |
static ElementsAccessor* accessor_array[] = { |
- &element_accessors.fast_smi_elements_handler, |
- &element_accessors.fast_elements_handler, |
- &element_accessors.fast_double_elements_handler, |
- &element_accessors.dictionary_elements_handler, |
- &element_accessors.non_strict_arguments_elements_handler, |
- &element_accessors.byte_elements_handler, |
- &element_accessors.unsigned_byte_elements_handler, |
- &element_accessors.short_elements_handler, |
- &element_accessors.unsigned_short_elements_handler, |
- &element_accessors.int_elements_handler, |
- &element_accessors.unsigned_int_elements_handler, |
- &element_accessors.float_elements_handler, |
- &element_accessors.double_elements_handler, |
- &element_accessors.pixel_elements_handler |
+#define ACCESSOR_ARRAY(Class, Name) element_accessors.Name##_handler, |
+ ELEMENTS_LIST(ACCESSOR_ARRAY) |
+#undef ACCESSOR_ARRAY |
}; |
+#undef ELEMENTS_LIST |
+ |
STATIC_ASSERT((sizeof(accessor_array) / sizeof(*accessor_array)) == |
kElementsKindCount); |