Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index d2f6d3559bf99d37b31b448a1e777a76d933002b..891aeaa3abd3ecebed3bbe7364c564293a70c011 100644 |
--- a/src/objects.h |
+++ b/src/objects.h |
@@ -1211,7 +1211,9 @@ class JSObject: public HeapObject { |
public: |
enum DeleteMode { NORMAL_DELETION, FORCE_DELETION }; |
enum ElementsKind { |
+ // The only "fast" kind. |
FAST_ELEMENTS, |
+ // All the kinds below are "slow". |
DICTIONARY_ELEMENTS, |
PIXEL_ELEMENTS, |
EXTERNAL_BYTE_ELEMENTS, |
@@ -1232,8 +1234,21 @@ class JSObject: public HeapObject { |
inline StringDictionary* property_dictionary(); // Gets slow properties. |
// [elements]: The elements (properties with names that are integers). |
- // elements is a FixedArray in the fast case, a Dictionary in the slow |
- // case, and a PixelArray or ExternalArray in special cases. |
+ // |
+ // Elements can be in two general modes: fast and slow. Each mode |
+ // corrensponds to a set of object representations of elements that |
+ // have something in common. |
+ // |
+ // In the fast mode elements is a FixedArray and so each element can |
+ // be quickly accessed. This fact is used in the generated code. The |
+ // elements array can have one of the two maps in this mode: |
+ // fixed_array_map or fixed_cow_array_map (for copy-on-write |
+ // arrays). In the latter case the elements array may be shared by a |
+ // few objects and so before writing to any element the array must |
+ // be copied. Use EnsureWritableFastElements in this case. |
+ // |
+ // In the slow mode elements is either a NumberDictionary or a |
+ // PixelArray or an ExternalArray. |
DECL_ACCESSORS(elements, HeapObject) |
inline void initialize_elements(); |
inline Object* ResetElements(); |
@@ -1251,6 +1266,8 @@ class JSObject: public HeapObject { |
inline bool HasExternalFloatElements(); |
inline bool AllowsSetElementsLength(); |
inline NumberDictionary* element_dictionary(); // Gets slow elements. |
+ // Requires: this->HasFastElements(). |
+ inline Object* EnsureWritableFastElements(); |
// Collects elements starting at index 0. |
// Undefined values are placed after non-undefined values. |
@@ -1703,6 +1720,10 @@ class FixedArray: public HeapObject { |
inline void set_null(int index); |
inline void set_the_hole(int index); |
+ // Setters with less debug checks for the GC to use. |
+ inline void set_unchecked(int index, Smi* value); |
+ inline void set_null_unchecked(int index); |
+ |
// Gives access to raw memory which stores the array's data. |
inline Object** data_start(); |
@@ -3061,7 +3082,8 @@ class Map: public HeapObject { |
inline bool is_extensible(); |
// Tells whether the instance has fast elements. |
- void set_has_fast_elements(bool value) { |
+ // Equivalent to instance->GetElementsKind() == FAST_ELEMENTS. |
+ inline void set_has_fast_elements(bool value) { |
if (value) { |
set_bit_field2(bit_field2() | (1 << kHasFastElements)); |
} else { |
@@ -3069,7 +3091,7 @@ class Map: public HeapObject { |
} |
} |
- bool has_fast_elements() { |
+ inline bool has_fast_elements() { |
return ((1 << kHasFastElements) & bit_field2()) != 0; |
} |