Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index 2a84972a3f1e1d7eecc8673c6d99979d34f0faeb..339ca3980adffe14cbc44ebcc17f95bc9a20a481 100644 |
--- a/src/objects.h |
+++ b/src/objects.h |
@@ -1438,6 +1438,7 @@ class JSObject: public JSReceiver { |
// The "slow" kind. |
DICTIONARY_ELEMENTS, |
+ NON_STRICT_ARGUMENTS_ELEMENTS, |
// The "fast" kind for external arrays |
EXTERNAL_BYTE_ELEMENTS, |
EXTERNAL_UNSIGNED_BYTE_ELEMENTS, |
@@ -1475,13 +1476,16 @@ class JSObject: public JSReceiver { |
// |
// 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. |
+ // elements array can have one of three maps in this mode: |
+ // fixed_array_map, non_strict_arguments_elements_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 an ExternalArray. |
+ // In the slow mode the elements is either a NumberDictionary, an |
+ // ExternalArray, or a FixedArray parameter map for a (non-strict) |
+ // arguments object. |
DECL_ACCESSORS(elements, HeapObject) |
inline void initialize_elements(); |
MUST_USE_RESULT inline MaybeObject* ResetElements(); |
@@ -1499,9 +1503,12 @@ class JSObject: public JSReceiver { |
inline bool HasExternalUnsignedIntElements(); |
inline bool HasExternalFloatElements(); |
inline bool HasExternalDoubleElements(); |
+ bool HasFastArgumentsElements(); |
+ bool HasDictionaryArgumentsElements(); |
inline bool AllowsSetElementsLength(); |
inline NumberDictionary* element_dictionary(); // Gets slow elements. |
- // Requires: this->HasFastElements(). |
+ |
+ // Requires: HasFastElements(). |
MUST_USE_RESULT inline MaybeObject* EnsureWritableFastElements(); |
// Collects elements starting at index 0. |
@@ -1687,7 +1694,11 @@ class JSObject: public JSReceiver { |
MUST_USE_RESULT MaybeObject* SetFastElement(uint32_t index, |
Object* value, |
StrictModeFlag strict_mode, |
- bool check_prototype = true); |
+ bool check_prototype); |
+ MUST_USE_RESULT MaybeObject* SetDictionaryElement(uint32_t index, |
+ Object* value, |
+ StrictModeFlag strict_mode, |
+ bool check_prototype); |
MUST_USE_RESULT MaybeObject* SetFastDoubleElement( |
uint32_t index, |
@@ -1700,7 +1711,7 @@ class JSObject: public JSReceiver { |
MUST_USE_RESULT MaybeObject* SetElement(uint32_t index, |
Object* value, |
StrictModeFlag strict_mode, |
- bool check_prototype = true); |
+ bool check_prototype); |
// Returns the index'th element. |
// The undefined object if index is out of bounds. |
@@ -1712,6 +1723,9 @@ class JSObject: public JSReceiver { |
// failed. |
MaybeObject* GetExternalElement(uint32_t index); |
+ // Replace the elements' backing store with fast elements of the given |
+ // capacity. Update the length for JSArrays. Returns the new backing |
+ // store. |
MUST_USE_RESULT MaybeObject* SetFastElementsCapacityAndLength(int capacity, |
int length); |
MUST_USE_RESULT MaybeObject* SetFastDoubleElementsCapacityAndLength( |
@@ -1841,6 +1855,9 @@ class JSObject: public JSReceiver { |
MUST_USE_RESULT MaybeObject* NormalizeProperties( |
PropertyNormalizationMode mode, |
int expected_additional_properties); |
+ |
+ // Convert and update the elements backing store to be a NumberDictionary |
+ // dictionary. Returns the backing after conversion. |
MUST_USE_RESULT MaybeObject* NormalizeElements(); |
MUST_USE_RESULT MaybeObject* UpdateMapCodeCache(String* name, Code* code); |
@@ -1986,6 +2003,17 @@ class JSObject: public JSReceiver { |
DeleteMode mode); |
MUST_USE_RESULT MaybeObject* DeleteElementWithInterceptor(uint32_t index); |
+ MUST_USE_RESULT MaybeObject* DeleteFastElement(uint32_t index); |
+ MUST_USE_RESULT MaybeObject* DeleteDictionaryElement(uint32_t index, |
+ DeleteMode mode); |
+ |
+ bool ReferencesObjectFromElements(FixedArray* elements, |
+ ElementsKind kind, |
+ Object* object); |
+ bool HasElementInElements(FixedArray* elements, |
+ ElementsKind kind, |
+ uint32_t index); |
+ |
// Returns true if most of the elements backing storage is used. |
bool HasDenseElements(); |
@@ -3894,6 +3922,8 @@ class Map: public HeapObject { |
(bit_field2() & kElementsKindMask) >> kElementsKindShift); |
} |
+ // Tells whether the instance has fast elements. |
+ // Equivalent to instance->GetElementsKind() == FAST_ELEMENTS. |
inline bool has_fast_elements() { |
return elements_kind() == JSObject::FAST_ELEMENTS; |
} |
@@ -4475,9 +4505,7 @@ class SharedFunctionInfo: public HeapObject { |
// False if there are definitely no live objects created from this function. |
// True if live objects _may_ exist (existence not guaranteed). |
// May go back from true to false after GC. |
- inline bool live_objects_may_exist(); |
- |
- inline void set_live_objects_may_exist(bool value); |
+ DECL_BOOLEAN_ACCESSORS(live_objects_may_exist) |
// [instance class name]: class name for instances. |
DECL_ACCESSORS(instance_class_name, Object) |
@@ -4568,8 +4596,7 @@ class SharedFunctionInfo: public HeapObject { |
// Indicates if this function can be lazy compiled. |
// This is used to determine if we can safely flush code from a function |
// when doing GC if we expect that the function will no longer be used. |
- inline bool allows_lazy_compilation(); |
- inline void set_allows_lazy_compilation(bool flag); |
+ DECL_BOOLEAN_ACCESSORS(allows_lazy_compilation) |
// Indicates how many full GCs this function has survived with assigned |
// code object. Used to determine when it is relatively safe to flush |
@@ -4583,12 +4610,16 @@ class SharedFunctionInfo: public HeapObject { |
// shared function info. If a function is repeatedly optimized or if |
// we cannot optimize the function we disable optimization to avoid |
// spending time attempting to optimize it again. |
- inline bool optimization_disabled(); |
- inline void set_optimization_disabled(bool value); |
+ DECL_BOOLEAN_ACCESSORS(optimization_disabled) |
// Indicates whether the function is a strict mode function. |
- inline bool strict_mode(); |
- inline void set_strict_mode(bool value); |
+ DECL_BOOLEAN_ACCESSORS(strict_mode) |
+ |
+ // False if the function definitely does not allocate an arguments object. |
+ DECL_BOOLEAN_ACCESSORS(uses_arguments) |
+ |
+ // True if the function has any duplicated parameter names. |
+ DECL_BOOLEAN_ACCESSORS(has_duplicate_parameters) |
// Indicates whether the function is a native function. |
// These needs special threatment in .call and .apply since |
@@ -4780,16 +4811,22 @@ class SharedFunctionInfo: public HeapObject { |
static const int kStartPositionMask = ~((1 << kStartPositionShift) - 1); |
// Bit positions in compiler_hints. |
- static const int kHasOnlySimpleThisPropertyAssignments = 0; |
- static const int kAllowLazyCompilation = 1; |
- static const int kLiveObjectsMayExist = 2; |
- static const int kCodeAgeShift = 3; |
- static const int kCodeAgeMask = 0x7; |
- static const int kOptimizationDisabled = 6; |
- static const int kStrictModeFunction = 7; |
- static const int kNative = 8; |
+ static const int kCodeAgeSize = 3; |
+ static const int kCodeAgeMask = (1 << kCodeAgeSize) - 1; |
static const int kBoundFunction = 9; |
+ enum CompilerHints { |
+ kHasOnlySimpleThisPropertyAssignments, |
+ kAllowLazyCompilation, |
+ kLiveObjectsMayExist, |
+ kCodeAgeShift, |
+ kOptimizationDisabled = kCodeAgeShift + kCodeAgeSize, |
+ kStrictModeFunction, |
+ kUsesArguments, |
+ kHasDuplicateParameters, |
+ kNative |
+ }; |
+ |
private: |
#if V8_HOST_ARCH_32_BIT |
// On 32 bit platforms, compiler hints is a smi. |