Index: src/objects.h |
=================================================================== |
--- src/objects.h (revision 5696) |
+++ src/objects.h (working copy) |
@@ -41,9 +41,10 @@ |
// Most object types in the V8 JavaScript are described in this file. |
// |
// Inheritance hierarchy: |
+// - MaybeObject (an object or a failure) |
+// - Failure (immediate for marking failed operation) |
// - Object |
// - Smi (immediate small integer) |
-// - Failure (immediate for marking failed operation) |
// - HeapObject (superclass for everything allocated in the heap) |
// - JSObject |
// - JSArray |
@@ -584,14 +585,43 @@ |
// A template-ized version of the IsXXX functions. |
template <class C> static inline bool Is(Object* obj); |
+class MaybeObject BASE_EMBEDDED { |
+ public: |
+ inline bool IsFailure(); |
+ inline bool IsRetryAfterGC(); |
+ inline bool IsOutOfMemory(); |
+ inline bool IsException(); |
+ INLINE(bool IsTheHole()); |
+ inline bool ToObject(Object** obj) { |
+ if (IsFailure()) return false; |
+ *obj = reinterpret_cast<Object*>(this); |
+ return true; |
+ } |
+ inline Object* ToObjectUnchecked() { |
+ ASSERT(!IsFailure()); |
+ return reinterpret_cast<Object*>(this); |
+ } |
+ inline Object* ToObjectChecked() { |
+ CHECK(!IsFailure()); |
+ return reinterpret_cast<Object*>(this); |
+ } |
+#ifdef DEBUG |
+ // Prints this object with details. |
+ void Print(); |
+ void PrintLn(); |
+ // Verifies the object. |
+ void Verify(); |
+#endif |
+}; |
+ |
// Object is the abstract superclass for all classes in the |
// object hierarchy. |
// Object does not use any virtual functions to avoid the |
// allocation of the C++ vtable. |
// Since Smi and Failure are subclasses of Object no |
// data members can be present in Object. |
-class Object BASE_EMBEDDED { |
+class Object : public MaybeObject { |
public: |
// Type testing. |
inline bool IsSmi(); |
@@ -619,10 +649,6 @@ |
inline bool IsExternalIntArray(); |
inline bool IsExternalUnsignedIntArray(); |
inline bool IsExternalFloatArray(); |
- inline bool IsFailure(); |
- inline bool IsRetryAfterGC(); |
- inline bool IsOutOfMemoryFailure(); |
- inline bool IsException(); |
inline bool IsJSObject(); |
inline bool IsJSContextExtensionObject(); |
inline bool IsMap(); |
@@ -669,7 +695,6 @@ |
// Oddball testing. |
INLINE(bool IsUndefined()); |
- INLINE(bool IsTheHole()); |
INLINE(bool IsNull()); |
INLINE(bool IsTrue()); |
INLINE(bool IsFalse()); |
@@ -679,38 +704,43 @@ |
inline bool HasSpecificClassOf(String* name); |
- Object* ToObject(); // ECMA-262 9.9. |
- Object* ToBoolean(); // ECMA-262 9.2. |
+ MUST_USE_RESULT MaybeObject* ToObject(); // ECMA-262 9.9. |
+ Object* ToBoolean(); // ECMA-262 9.2. |
// Convert to a JSObject if needed. |
// global_context is used when creating wrapper object. |
- Object* ToObject(Context* global_context); |
+ MUST_USE_RESULT MaybeObject* ToObject(Context* global_context); |
// Converts this to a Smi if possible. |
// Failure is returned otherwise. |
- inline Object* ToSmi(); |
+ MUST_USE_RESULT inline MaybeObject* ToSmi(); |
void Lookup(String* name, LookupResult* result); |
// Property access. |
- inline Object* GetProperty(String* key); |
- inline Object* GetProperty(String* key, PropertyAttributes* attributes); |
- Object* GetPropertyWithReceiver(Object* receiver, |
- String* key, |
- PropertyAttributes* attributes); |
- Object* GetProperty(Object* receiver, |
- LookupResult* result, |
- String* key, |
- PropertyAttributes* attributes); |
- Object* GetPropertyWithCallback(Object* receiver, |
- Object* structure, |
- String* name, |
- Object* holder); |
- Object* GetPropertyWithDefinedGetter(Object* receiver, |
- JSFunction* getter); |
+ MUST_USE_RESULT inline MaybeObject* GetProperty(String* key); |
+ MUST_USE_RESULT inline MaybeObject* GetProperty( |
+ String* key, |
+ PropertyAttributes* attributes); |
+ MUST_USE_RESULT MaybeObject* GetPropertyWithReceiver( |
+ Object* receiver, |
+ String* key, |
+ PropertyAttributes* attributes); |
+ MUST_USE_RESULT MaybeObject* GetProperty(Object* receiver, |
+ LookupResult* result, |
+ String* key, |
+ PropertyAttributes* attributes); |
+ MUST_USE_RESULT MaybeObject* GetPropertyWithCallback(Object* receiver, |
+ Object* structure, |
+ String* name, |
+ Object* holder); |
+ MUST_USE_RESULT MaybeObject* GetPropertyWithDefinedGetter(Object* receiver, |
+ JSFunction* getter); |
- inline Object* GetElement(uint32_t index); |
- Object* GetElementWithReceiver(Object* receiver, uint32_t index); |
+ inline MaybeObject* GetElement(uint32_t index); |
+ // For use when we know that no exception can be thrown. |
+ inline Object* GetElementNoExceptionThrown(uint32_t index); |
+ MaybeObject* GetElementWithReceiver(Object* receiver, uint32_t index); |
// Return the object's prototype (might be Heap::null_value()). |
Object* GetPrototype(); |
@@ -724,12 +754,6 @@ |
inline bool IsStringObjectWithCharacterAt(uint32_t index); |
#ifdef DEBUG |
- // Prints this object with details. |
- void Print(); |
- void PrintLn(); |
- // Verifies the object. |
- void Verify(); |
- |
// Verify a pointer is a valid object pointer. |
static void VerifyPointer(Object* p); |
#endif |
@@ -815,7 +839,7 @@ |
const int kFailureTypeTagSize = 2; |
const int kFailureTypeTagMask = (1 << kFailureTypeTagSize) - 1; |
-class Failure: public Object { |
+class Failure: public MaybeObject { |
public: |
// RuntimeStubs assumes EXCEPTION = 1 in the compiler-generated code. |
enum Type { |
@@ -840,7 +864,7 @@ |
static inline Failure* InternalError(); |
static inline Failure* OutOfMemoryException(); |
// Casting. |
- static inline Failure* cast(Object* object); |
+ static inline Failure* cast(MaybeObject* object); |
// Dispatched behavior. |
void FailurePrint(); |
@@ -1249,7 +1273,7 @@ |
// PixelArray or an ExternalArray. |
DECL_ACCESSORS(elements, HeapObject) |
inline void initialize_elements(); |
- inline Object* ResetElements(); |
+ MUST_USE_RESULT inline MaybeObject* ResetElements(); |
inline ElementsKind GetElementsKind(); |
inline bool HasFastElements(); |
inline bool HasDictionaryElements(); |
@@ -1265,41 +1289,45 @@ |
inline bool AllowsSetElementsLength(); |
inline NumberDictionary* element_dictionary(); // Gets slow elements. |
// Requires: this->HasFastElements(). |
- inline Object* EnsureWritableFastElements(); |
+ MUST_USE_RESULT inline MaybeObject* EnsureWritableFastElements(); |
// Collects elements starting at index 0. |
// Undefined values are placed after non-undefined values. |
// Returns the number of non-undefined values. |
- Object* PrepareElementsForSort(uint32_t limit); |
+ MUST_USE_RESULT MaybeObject* PrepareElementsForSort(uint32_t limit); |
// As PrepareElementsForSort, but only on objects where elements is |
// a dictionary, and it will stay a dictionary. |
- MUST_USE_RESULT Object* PrepareSlowElementsForSort(uint32_t limit); |
+ MUST_USE_RESULT MaybeObject* PrepareSlowElementsForSort(uint32_t limit); |
- Object* SetProperty(String* key, |
- Object* value, |
- PropertyAttributes attributes); |
- Object* SetProperty(LookupResult* result, |
- String* key, |
- Object* value, |
- PropertyAttributes attributes); |
- Object* SetPropertyWithFailedAccessCheck(LookupResult* result, |
- String* name, |
- Object* value); |
- Object* SetPropertyWithCallback(Object* structure, |
- String* name, |
- Object* value, |
- JSObject* holder); |
- Object* SetPropertyWithDefinedSetter(JSFunction* setter, |
- Object* value); |
- Object* SetPropertyWithInterceptor(String* name, |
- Object* value, |
- PropertyAttributes attributes); |
- Object* SetPropertyPostInterceptor(String* name, |
- Object* value, |
- PropertyAttributes attributes); |
- Object* IgnoreAttributesAndSetLocalProperty(String* key, |
- Object* value, |
- PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* SetProperty(String* key, |
+ Object* value, |
+ PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* SetProperty(LookupResult* result, |
+ String* key, |
+ Object* value, |
+ PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* SetPropertyWithFailedAccessCheck( |
+ LookupResult* result, |
+ String* name, |
+ Object* value); |
+ MUST_USE_RESULT MaybeObject* SetPropertyWithCallback(Object* structure, |
+ String* name, |
+ Object* value, |
+ JSObject* holder); |
+ MUST_USE_RESULT MaybeObject* SetPropertyWithDefinedSetter(JSFunction* setter, |
+ Object* value); |
+ MUST_USE_RESULT MaybeObject* SetPropertyWithInterceptor( |
+ String* name, |
+ Object* value, |
+ PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* SetPropertyPostInterceptor( |
+ String* name, |
+ Object* value, |
+ PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* IgnoreAttributesAndSetLocalProperty( |
+ String* key, |
+ Object* value, |
+ PropertyAttributes attributes); |
// Retrieve a value in a normalized object given a lookup result. |
// Handles the special representation of JS global objects. |
@@ -1311,13 +1339,13 @@ |
// Sets the property value in a normalized object given (key, value, details). |
// Handles the special representation of JS global objects. |
- MUST_USE_RESULT Object* SetNormalizedProperty(String* name, |
- Object* value, |
- PropertyDetails details); |
+ MUST_USE_RESULT MaybeObject* SetNormalizedProperty(String* name, |
+ Object* value, |
+ PropertyDetails details); |
// Deletes the named property in a normalized object. |
- MUST_USE_RESULT Object* DeleteNormalizedProperty(String* name, |
- DeleteMode mode); |
+ MUST_USE_RESULT MaybeObject* DeleteNormalizedProperty(String* name, |
+ DeleteMode mode); |
// Returns the class name ([[Class]] property in the specification). |
String* class_name(); |
@@ -1335,28 +1363,31 @@ |
String* name); |
PropertyAttributes GetLocalPropertyAttribute(String* name); |
- MUST_USE_RESULT Object* DefineAccessor(String* name, |
- bool is_getter, |
- JSFunction* fun, |
- PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* DefineAccessor(String* name, |
+ bool is_getter, |
+ JSFunction* fun, |
+ PropertyAttributes attributes); |
Object* LookupAccessor(String* name, bool is_getter); |
- MUST_USE_RESULT Object* DefineAccessor(AccessorInfo* info); |
+ MUST_USE_RESULT MaybeObject* DefineAccessor(AccessorInfo* info); |
// Used from Object::GetProperty(). |
- Object* GetPropertyWithFailedAccessCheck(Object* receiver, |
- LookupResult* result, |
- String* name, |
- PropertyAttributes* attributes); |
- Object* GetPropertyWithInterceptor(JSObject* receiver, |
- String* name, |
- PropertyAttributes* attributes); |
- Object* GetPropertyPostInterceptor(JSObject* receiver, |
- String* name, |
- PropertyAttributes* attributes); |
- Object* GetLocalPropertyPostInterceptor(JSObject* receiver, |
- String* name, |
- PropertyAttributes* attributes); |
+ MaybeObject* GetPropertyWithFailedAccessCheck( |
+ Object* receiver, |
+ LookupResult* result, |
+ String* name, |
+ PropertyAttributes* attributes); |
+ MaybeObject* GetPropertyWithInterceptor( |
+ JSObject* receiver, |
+ String* name, |
+ PropertyAttributes* attributes); |
+ MaybeObject* GetPropertyPostInterceptor( |
+ JSObject* receiver, |
+ String* name, |
+ PropertyAttributes* attributes); |
+ MaybeObject* GetLocalPropertyPostInterceptor(JSObject* receiver, |
+ String* name, |
+ PropertyAttributes* attributes); |
// Returns true if this is an instance of an api function and has |
// been modified since it was created. May give false positives. |
@@ -1390,10 +1421,11 @@ |
// These accessors do not touch interceptors or accessors. |
inline bool HasHiddenPropertiesObject(); |
inline Object* GetHiddenPropertiesObject(); |
- inline Object* SetHiddenPropertiesObject(Object* hidden_obj); |
+ MUST_USE_RESULT inline MaybeObject* SetHiddenPropertiesObject( |
+ Object* hidden_obj); |
- MUST_USE_RESULT Object* DeleteProperty(String* name, DeleteMode mode); |
- MUST_USE_RESULT Object* DeleteElement(uint32_t index, DeleteMode mode); |
+ MUST_USE_RESULT MaybeObject* DeleteProperty(String* name, DeleteMode mode); |
+ MUST_USE_RESULT MaybeObject* DeleteElement(uint32_t index, DeleteMode mode); |
// Tests for the fast common case for property enumeration. |
bool IsSimpleEnum(); |
@@ -1411,7 +1443,8 @@ |
inline Object* GetPrototype(); |
// Set the object's prototype (only JSObject and null are allowed). |
- Object* SetPrototype(Object* value, bool skip_hidden_prototypes); |
+ MUST_USE_RESULT MaybeObject* SetPrototype(Object* value, |
+ bool skip_hidden_prototypes); |
// Tells whether the index'th element is present. |
inline bool HasElement(uint32_t index); |
@@ -1440,20 +1473,20 @@ |
bool HasElementWithInterceptor(JSObject* receiver, uint32_t index); |
bool HasElementPostInterceptor(JSObject* receiver, uint32_t index); |
- MUST_USE_RESULT Object* SetFastElement(uint32_t index, Object* value); |
+ MUST_USE_RESULT MaybeObject* SetFastElement(uint32_t index, Object* value); |
// Set the index'th array element. |
// A Failure object is returned if GC is needed. |
- MUST_USE_RESULT Object* SetElement(uint32_t index, Object* value); |
+ MUST_USE_RESULT MaybeObject* SetElement(uint32_t index, Object* value); |
// Returns the index'th element. |
// The undefined object if index is out of bounds. |
- Object* GetElementWithReceiver(JSObject* receiver, uint32_t index); |
- Object* GetElementWithInterceptor(JSObject* receiver, uint32_t index); |
+ MaybeObject* GetElementWithReceiver(JSObject* receiver, uint32_t index); |
+ MaybeObject* GetElementWithInterceptor(JSObject* receiver, uint32_t index); |
- MUST_USE_RESULT Object* SetFastElementsCapacityAndLength(int capacity, |
- int length); |
- MUST_USE_RESULT Object* SetSlowElements(Object* length); |
+ MUST_USE_RESULT MaybeObject* SetFastElementsCapacityAndLength(int capacity, |
+ int length); |
+ MUST_USE_RESULT MaybeObject* SetSlowElements(Object* length); |
// Lookup interceptors are used for handling properties controlled by host |
// objects. |
@@ -1466,7 +1499,7 @@ |
bool HasRealNamedCallbackProperty(String* key); |
// Initializes the array to a certain length |
- MUST_USE_RESULT Object* SetElementsLength(Object* length); |
+ MUST_USE_RESULT MaybeObject* SetElementsLength(Object* length); |
// Get the header size for a JSObject. Used to compute the index of |
// internal fields as well as the number of internal fields. |
@@ -1515,9 +1548,9 @@ |
// Add a property to a fast-case object using a map transition to |
// new_map. |
- Object* AddFastPropertyUsingMap(Map* new_map, |
- String* name, |
- Object* value); |
+ MUST_USE_RESULT MaybeObject* AddFastPropertyUsingMap(Map* new_map, |
+ String* name, |
+ Object* value); |
// Add a constant function property to a fast-case object. |
// This leaves a CONSTANT_TRANSITION in the old map, and |
@@ -1525,20 +1558,22 @@ |
// normal property is added instead, with a map transition. |
// This avoids the creation of many maps with the same constant |
// function, all orphaned. |
- Object* AddConstantFunctionProperty(String* name, |
- JSFunction* function, |
- PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* AddConstantFunctionProperty( |
+ String* name, |
+ JSFunction* function, |
+ PropertyAttributes attributes); |
- Object* ReplaceSlowProperty(String* name, |
- Object* value, |
- PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* ReplaceSlowProperty( |
+ String* name, |
+ Object* value, |
+ PropertyAttributes attributes); |
// Converts a descriptor of any other type to a real field, |
// backed by the properties array. Descriptors of visible |
// types, such as CONSTANT_FUNCTION, keep their enumeration order. |
// Converts the descriptor on the original object's map to a |
// map transition, and the the new field is on the object's new map. |
- Object* ConvertDescriptorToFieldAndMapTransition( |
+ MUST_USE_RESULT MaybeObject* ConvertDescriptorToFieldAndMapTransition( |
String* name, |
Object* new_value, |
PropertyAttributes attributes); |
@@ -1546,38 +1581,41 @@ |
// Converts a descriptor of any other type to a real field, |
// backed by the properties array. Descriptors of visible |
// types, such as CONSTANT_FUNCTION, keep their enumeration order. |
- Object* ConvertDescriptorToField(String* name, |
- Object* new_value, |
- PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* ConvertDescriptorToField( |
+ String* name, |
+ Object* new_value, |
+ PropertyAttributes attributes); |
// Add a property to a fast-case object. |
- Object* AddFastProperty(String* name, |
- Object* value, |
- PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* AddFastProperty(String* name, |
+ Object* value, |
+ PropertyAttributes attributes); |
// Add a property to a slow-case object. |
- Object* AddSlowProperty(String* name, |
- Object* value, |
- PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* AddSlowProperty(String* name, |
+ Object* value, |
+ PropertyAttributes attributes); |
// Add a property to an object. |
- Object* AddProperty(String* name, |
- Object* value, |
- PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* AddProperty(String* name, |
+ Object* value, |
+ PropertyAttributes attributes); |
// Convert the object to use the canonical dictionary |
// representation. If the object is expected to have additional properties |
// added this number can be indicated to have the backing store allocated to |
// an initial capacity for holding these properties. |
- Object* NormalizeProperties(PropertyNormalizationMode mode, |
- int expected_additional_properties); |
- Object* NormalizeElements(); |
+ MUST_USE_RESULT MaybeObject* NormalizeProperties( |
+ PropertyNormalizationMode mode, |
+ int expected_additional_properties); |
+ MUST_USE_RESULT MaybeObject* NormalizeElements(); |
- Object* UpdateMapCodeCache(String* name, Code* code); |
+ MUST_USE_RESULT MaybeObject* UpdateMapCodeCache(String* name, Code* code); |
// Transform slow named properties to fast variants. |
// Returns failure if allocation failed. |
- Object* TransformToFastProperties(int unused_property_fields); |
+ MUST_USE_RESULT MaybeObject* TransformToFastProperties( |
+ int unused_property_fields); |
// Access fast-case object properties at index. |
inline Object* FastPropertyAt(int index); |
@@ -1603,7 +1641,7 @@ |
static inline JSObject* cast(Object* obj); |
// Disalow further properties to be added to the object. |
- MUST_USE_RESULT Object* PreventExtensions(); |
+ MUST_USE_RESULT MaybeObject* PreventExtensions(); |
// Dispatched behavior. |
@@ -1668,28 +1706,28 @@ |
}; |
private: |
- Object* GetElementWithCallback(Object* receiver, |
- Object* structure, |
- uint32_t index, |
- Object* holder); |
- Object* SetElementWithCallback(Object* structure, |
- uint32_t index, |
- Object* value, |
- JSObject* holder); |
- MUST_USE_RESULT Object* SetElementWithInterceptor(uint32_t index, |
- Object* value); |
- MUST_USE_RESULT Object* SetElementWithoutInterceptor(uint32_t index, |
- Object* value); |
+ MUST_USE_RESULT MaybeObject* GetElementWithCallback(Object* receiver, |
+ Object* structure, |
+ uint32_t index, |
+ Object* holder); |
+ MaybeObject* SetElementWithCallback(Object* structure, |
+ uint32_t index, |
+ Object* value, |
+ JSObject* holder); |
+ MUST_USE_RESULT MaybeObject* SetElementWithInterceptor(uint32_t index, |
+ Object* value); |
+ MUST_USE_RESULT MaybeObject* SetElementWithoutInterceptor(uint32_t index, |
+ Object* value); |
- Object* GetElementPostInterceptor(JSObject* receiver, uint32_t index); |
+ MaybeObject* GetElementPostInterceptor(JSObject* receiver, uint32_t index); |
- MUST_USE_RESULT Object* DeletePropertyPostInterceptor(String* name, |
- DeleteMode mode); |
- MUST_USE_RESULT Object* DeletePropertyWithInterceptor(String* name); |
+ MUST_USE_RESULT MaybeObject* DeletePropertyPostInterceptor(String* name, |
+ DeleteMode mode); |
+ MUST_USE_RESULT MaybeObject* DeletePropertyWithInterceptor(String* name); |
- MUST_USE_RESULT Object* DeleteElementPostInterceptor(uint32_t index, |
- DeleteMode mode); |
- MUST_USE_RESULT Object* DeleteElementWithInterceptor(uint32_t index); |
+ MUST_USE_RESULT MaybeObject* DeleteElementPostInterceptor(uint32_t index, |
+ DeleteMode mode); |
+ MUST_USE_RESULT MaybeObject* DeleteElementWithInterceptor(uint32_t index); |
PropertyAttributes GetPropertyAttributePostInterceptor(JSObject* receiver, |
String* name, |
@@ -1711,14 +1749,17 @@ |
bool HasDenseElements(); |
bool CanSetCallback(String* name); |
- MUST_USE_RESULT Object* SetElementCallback(uint32_t index, |
- Object* structure, |
- PropertyAttributes attributes); |
- MUST_USE_RESULT Object* SetPropertyCallback(String* name, |
- Object* structure, |
- PropertyAttributes attributes); |
- MUST_USE_RESULT Object* DefineGetterSetter(String* name, |
- PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* SetElementCallback( |
+ uint32_t index, |
+ Object* structure, |
+ PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* SetPropertyCallback( |
+ String* name, |
+ Object* structure, |
+ PropertyAttributes attributes); |
+ MUST_USE_RESULT MaybeObject* DefineGetterSetter( |
+ String* name, |
+ PropertyAttributes attributes); |
void LookupInDescriptor(String* name, LookupResult* result); |
@@ -1757,14 +1798,14 @@ |
inline Object** data_start(); |
// Copy operations. |
- inline Object* Copy(); |
- MUST_USE_RESULT Object* CopySize(int new_length); |
+ MUST_USE_RESULT inline MaybeObject* Copy(); |
+ MUST_USE_RESULT MaybeObject* CopySize(int new_length); |
// Add the elements of a JSArray to this FixedArray. |
- MUST_USE_RESULT Object* AddKeysFromJSArray(JSArray* array); |
+ MUST_USE_RESULT MaybeObject* AddKeysFromJSArray(JSArray* array); |
// Compute the union of this and other. |
- MUST_USE_RESULT Object* UnionOfKeys(FixedArray* other); |
+ MUST_USE_RESULT MaybeObject* UnionOfKeys(FixedArray* other); |
// Copy a sub array from the receiver to dest. |
void CopyTo(int pos, FixedArray* dest, int dest_pos, int len); |
@@ -1903,12 +1944,12 @@ |
// or null), its enumeration index is kept as is. |
// If adding a real property, map transitions must be removed. If adding |
// a transition, they must not be removed. All null descriptors are removed. |
- MUST_USE_RESULT Object* CopyInsert(Descriptor* descriptor, |
- TransitionFlag transition_flag); |
+ MUST_USE_RESULT MaybeObject* CopyInsert(Descriptor* descriptor, |
+ TransitionFlag transition_flag); |
// Remove all transitions. Return a copy of the array with all transitions |
// removed, or a Failure object if the new array could not be allocated. |
- MUST_USE_RESULT Object* RemoveTransitions(); |
+ MUST_USE_RESULT MaybeObject* RemoveTransitions(); |
// Sort the instance descriptors by the hash codes of their keys. |
// Does not check for duplicates. |
@@ -1941,7 +1982,7 @@ |
// Allocates a DescriptorArray, but returns the singleton |
// empty descriptor array object if number_of_descriptors is 0. |
- MUST_USE_RESULT static Object* Allocate(int number_of_descriptors); |
+ MUST_USE_RESULT static MaybeObject* Allocate(int number_of_descriptors); |
// Casting. |
static inline DescriptorArray* cast(Object* obj); |
@@ -2081,7 +2122,7 @@ |
} |
// Returns a new HashTable object. Might return Failure. |
- MUST_USE_RESULT static Object* Allocate( |
+ MUST_USE_RESULT static MaybeObject* Allocate( |
int at_least_space_for, |
PretenureFlag pretenure = NOT_TENURED); |
@@ -2177,7 +2218,7 @@ |
} |
// Ensure enough space for n additional elements. |
- MUST_USE_RESULT Object* EnsureCapacity(int n, Key key); |
+ MUST_USE_RESULT MaybeObject* EnsureCapacity(int n, Key key); |
}; |
@@ -2193,7 +2234,7 @@ |
virtual uint32_t HashForObject(Object* key) = 0; |
// Returns the key object for storing into the hash table. |
// If allocations fails a failure object is returned. |
- MUST_USE_RESULT virtual Object* AsObject() = 0; |
+ MUST_USE_RESULT virtual MaybeObject* AsObject() = 0; |
// Required. |
virtual ~HashTableKey() {} |
}; |
@@ -2209,7 +2250,7 @@ |
static uint32_t HashForObject(HashTableKey* key, Object* object) { |
return key->HashForObject(object); |
} |
- MUST_USE_RESULT static Object* AsObject(HashTableKey* key) { |
+ MUST_USE_RESULT static MaybeObject* AsObject(HashTableKey* key) { |
return key->AsObject(); |
} |
@@ -2227,8 +2268,8 @@ |
// added. The return value is the symbol table which might have |
// been enlarged. If the return value is not a failure, the symbol |
// pointer *s is set to the symbol found. |
- Object* LookupSymbol(Vector<const char> str, Object** s); |
- Object* LookupString(String* key, Object** s); |
+ MUST_USE_RESULT MaybeObject* LookupSymbol(Vector<const char> str, Object** s); |
+ MUST_USE_RESULT MaybeObject* LookupString(String* key, Object** s); |
// Looks up a symbol that is equal to the given string and returns |
// true if it is found, assigning the symbol to the given output |
@@ -2240,7 +2281,7 @@ |
static inline SymbolTable* cast(Object* obj); |
private: |
- Object* LookupKey(HashTableKey* key, Object** s); |
+ MUST_USE_RESULT MaybeObject* LookupKey(HashTableKey* key, Object** s); |
DISALLOW_IMPLICIT_CONSTRUCTORS(SymbolTable); |
}; |
@@ -2259,7 +2300,7 @@ |
return key->HashForObject(object); |
} |
- MUST_USE_RESULT static Object* AsObject(HashTableKey* key) { |
+ MUST_USE_RESULT static MaybeObject* AsObject(HashTableKey* key) { |
return key->AsObject(); |
} |
@@ -2276,7 +2317,7 @@ |
public: |
// Find cached value for a string key, otherwise return null. |
Object* Lookup(FixedArray* key); |
- Object* Put(FixedArray* key, Map* value); |
+ MUST_USE_RESULT MaybeObject* Put(FixedArray* key, Map* value); |
static inline MapCache* cast(Object* obj); |
private: |
@@ -2347,10 +2388,10 @@ |
} |
// Returns a new array for dictionary usage. Might return Failure. |
- MUST_USE_RESULT static Object* Allocate(int at_least_space_for); |
+ MUST_USE_RESULT static MaybeObject* Allocate(int at_least_space_for); |
// Ensure enough space for n additional elements. |
- Object* EnsureCapacity(int n, Key key); |
+ MUST_USE_RESULT MaybeObject* EnsureCapacity(int n, Key key); |
#ifdef DEBUG |
void Print(); |
@@ -2364,20 +2405,22 @@ |
Object* value, |
PropertyDetails details); |
- Object* Add(Key key, Object* value, PropertyDetails details); |
+ MUST_USE_RESULT MaybeObject* Add(Key key, |
+ Object* value, |
+ PropertyDetails details); |
protected: |
// Generic at put operation. |
- Object* AtPut(Key key, Object* value); |
+ MUST_USE_RESULT MaybeObject* AtPut(Key key, Object* value); |
// Add entry to dictionary. |
- Object* AddEntry(Key key, |
- Object* value, |
- PropertyDetails details, |
- uint32_t hash); |
+ MUST_USE_RESULT MaybeObject* AddEntry(Key key, |
+ Object* value, |
+ PropertyDetails details, |
+ uint32_t hash); |
// Generate new enumeration indices to avoid enumeration index overflow. |
- Object* GenerateNewEnumerationIndices(); |
+ MUST_USE_RESULT MaybeObject* GenerateNewEnumerationIndices(); |
static const int kMaxNumberKeyIndex = |
HashTable<Shape, Key>::kPrefixStartIndex; |
static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1; |
@@ -2389,7 +2432,7 @@ |
static inline bool IsMatch(String* key, Object* other); |
static inline uint32_t Hash(String* key); |
static inline uint32_t HashForObject(String* key, Object* object); |
- MUST_USE_RESULT static inline Object* AsObject(String* key); |
+ MUST_USE_RESULT static inline MaybeObject* AsObject(String* key); |
static const int kPrefixSize = 2; |
static const int kEntrySize = 3; |
static const bool kIsEnumerable = true; |
@@ -2407,8 +2450,9 @@ |
void CopyEnumKeysTo(FixedArray* storage, FixedArray* sort_array); |
// For transforming properties of a JSObject. |
- Object* TransformPropertiesToFastFor(JSObject* obj, |
- int unused_property_fields); |
+ MUST_USE_RESULT MaybeObject* TransformPropertiesToFastFor( |
+ JSObject* obj, |
+ int unused_property_fields); |
// Find entry for key otherwise return kNotFound. Optimzed version of |
// HashTable::FindEntry. |
@@ -2421,7 +2465,7 @@ |
static inline bool IsMatch(uint32_t key, Object* other); |
static inline uint32_t Hash(uint32_t key); |
static inline uint32_t HashForObject(uint32_t key, Object* object); |
- MUST_USE_RESULT static inline Object* AsObject(uint32_t key); |
+ MUST_USE_RESULT static inline MaybeObject* AsObject(uint32_t key); |
static const int kPrefixSize = 2; |
static const int kEntrySize = 3; |
static const bool kIsEnumerable = false; |
@@ -2436,13 +2480,15 @@ |
} |
// Type specific at put (default NONE attributes is used when adding). |
- Object* AtNumberPut(uint32_t key, Object* value); |
- Object* AddNumberEntry(uint32_t key, |
- Object* value, |
- PropertyDetails details); |
+ MUST_USE_RESULT MaybeObject* AtNumberPut(uint32_t key, Object* value); |
+ MUST_USE_RESULT MaybeObject* AddNumberEntry(uint32_t key, |
+ Object* value, |
+ PropertyDetails details); |
// Set an existing entry or add a new one if needed. |
- Object* Set(uint32_t key, Object* value, PropertyDetails details); |
+ MUST_USE_RESULT MaybeObject* Set(uint32_t key, |
+ Object* value, |
+ PropertyDetails details); |
void UpdateMaxNumberKey(uint32_t key); |
@@ -2509,7 +2555,8 @@ |
public: |
static const int kEntries = 64; |
- Object* Get(JSObject* object, PropertyNormalizationMode mode); |
+ MUST_USE_RESULT MaybeObject* Get(JSObject* object, |
+ PropertyNormalizationMode mode); |
void Clear(); |
@@ -2686,7 +2733,7 @@ |
// This accessor applies the correct conversion from Smi, HeapNumber |
// and undefined. |
- Object* SetValue(uint32_t index, Object* value); |
+ MaybeObject* SetValue(uint32_t index, Object* value); |
// Casting. |
static inline ExternalByteArray* cast(Object* obj); |
@@ -2709,7 +2756,7 @@ |
// This accessor applies the correct conversion from Smi, HeapNumber |
// and undefined. |
- Object* SetValue(uint32_t index, Object* value); |
+ MaybeObject* SetValue(uint32_t index, Object* value); |
// Casting. |
static inline ExternalUnsignedByteArray* cast(Object* obj); |
@@ -2732,7 +2779,7 @@ |
// This accessor applies the correct conversion from Smi, HeapNumber |
// and undefined. |
- Object* SetValue(uint32_t index, Object* value); |
+ MaybeObject* SetValue(uint32_t index, Object* value); |
// Casting. |
static inline ExternalShortArray* cast(Object* obj); |
@@ -2755,7 +2802,7 @@ |
// This accessor applies the correct conversion from Smi, HeapNumber |
// and undefined. |
- Object* SetValue(uint32_t index, Object* value); |
+ MaybeObject* SetValue(uint32_t index, Object* value); |
// Casting. |
static inline ExternalUnsignedShortArray* cast(Object* obj); |
@@ -2778,7 +2825,7 @@ |
// This accessor applies the correct conversion from Smi, HeapNumber |
// and undefined. |
- Object* SetValue(uint32_t index, Object* value); |
+ MaybeObject* SetValue(uint32_t index, Object* value); |
// Casting. |
static inline ExternalIntArray* cast(Object* obj); |
@@ -2801,7 +2848,7 @@ |
// This accessor applies the correct conversion from Smi, HeapNumber |
// and undefined. |
- Object* SetValue(uint32_t index, Object* value); |
+ MaybeObject* SetValue(uint32_t index, Object* value); |
// Casting. |
static inline ExternalUnsignedIntArray* cast(Object* obj); |
@@ -2824,7 +2871,7 @@ |
// This accessor applies the correct conversion from Smi, HeapNumber |
// and undefined. |
- Object* SetValue(uint32_t index, Object* value); |
+ MaybeObject* SetValue(uint32_t index, Object* value); |
// Casting. |
static inline ExternalFloatArray* cast(Object* obj); |
@@ -3192,24 +3239,24 @@ |
// [stub cache]: contains stubs compiled for this map. |
DECL_ACCESSORS(code_cache, Object) |
- MUST_USE_RESULT Object* CopyDropDescriptors(); |
+ MUST_USE_RESULT MaybeObject* CopyDropDescriptors(); |
- MUST_USE_RESULT Object* CopyNormalized(PropertyNormalizationMode mode, |
- NormalizedMapSharingMode sharing); |
+ MUST_USE_RESULT MaybeObject* CopyNormalized(PropertyNormalizationMode mode, |
+ NormalizedMapSharingMode sharing); |
// Returns a copy of the map, with all transitions dropped from the |
// instance descriptors. |
- MUST_USE_RESULT Object* CopyDropTransitions(); |
+ MUST_USE_RESULT MaybeObject* CopyDropTransitions(); |
// Returns this map if it has the fast elements bit set, otherwise |
// returns a copy of the map, with all transitions dropped from the |
// descriptors and the fast elements bit set. |
- inline Object* GetFastElementsMap(); |
+ MUST_USE_RESULT inline MaybeObject* GetFastElementsMap(); |
// Returns this map if it has the fast elements bit cleared, |
// otherwise returns a copy of the map, with all transitions dropped |
// from the descriptors and the fast elements bit cleared. |
- inline Object* GetSlowElementsMap(); |
+ MUST_USE_RESULT inline MaybeObject* GetSlowElementsMap(); |
// Returns the property index for name (only valid for FAST MODE). |
int PropertyIndexFor(String* name); |
@@ -3232,7 +3279,7 @@ |
inline void ClearCodeCache(); |
// Update code cache. |
- MUST_USE_RESULT Object* UpdateCodeCache(String* name, Code* code); |
+ MUST_USE_RESULT MaybeObject* UpdateCodeCache(String* name, Code* code); |
// Returns the found code or undefined if absent. |
Object* FindInCodeCache(String* name, Code::Flags flags); |
@@ -3881,7 +3928,7 @@ |
inline Object* prototype(); |
inline Object* instance_prototype(); |
Object* SetInstancePrototype(Object* value); |
- MUST_USE_RESULT Object* SetPrototype(Object* value); |
+ MUST_USE_RESULT MaybeObject* SetPrototype(Object* value); |
// After prototype is removed, it will not be created when accessed, and |
// [[Construct]] from this function will not be allowed. |
@@ -3991,8 +4038,17 @@ |
// Retrieve the property cell used to store a property. |
Object* GetPropertyCell(LookupResult* result); |
+ // This is like GetProperty, but is used when you know the lookup won't fail |
+ // by throwing an exception. This is for the debug and builtins global |
+ // objects, where it is known which properties can be expected to be present |
+ // on the object. |
+ Object* GetPropertyNoExceptionThrown(String* key) { |
+ Object* answer = GetProperty(key)->ToObjectUnchecked(); |
+ return answer; |
+ } |
+ |
// Ensure that the global object has a cell for the given property name. |
- Object* EnsurePropertyCell(String* name); |
+ MUST_USE_RESULT MaybeObject* EnsurePropertyCell(String* name); |
// Casting. |
static inline GlobalObject* cast(Object* obj); |
@@ -4222,7 +4278,7 @@ |
return key->HashForObject(object); |
} |
- MUST_USE_RESULT static Object* AsObject(HashTableKey* key) { |
+ MUST_USE_RESULT static MaybeObject* AsObject(HashTableKey* key) { |
return key->AsObject(); |
} |
@@ -4238,9 +4294,9 @@ |
Object* Lookup(String* src); |
Object* LookupEval(String* src, Context* context); |
Object* LookupRegExp(String* source, JSRegExp::Flags flags); |
- Object* Put(String* src, Object* value); |
- Object* PutEval(String* src, Context* context, Object* value); |
- Object* PutRegExp(String* src, JSRegExp::Flags flags, FixedArray* value); |
+ MaybeObject* Put(String* src, Object* value); |
+ MaybeObject* PutEval(String* src, Context* context, Object* value); |
+ MaybeObject* PutRegExp(String* src, JSRegExp::Flags flags, FixedArray* value); |
static inline CompilationCacheTable* cast(Object* obj); |
@@ -4255,7 +4311,7 @@ |
DECL_ACCESSORS(normal_type_cache, Object) |
// Add the code object to the cache. |
- MUST_USE_RESULT Object* Update(String* name, Code* code); |
+ MUST_USE_RESULT MaybeObject* Update(String* name, Code* code); |
// Lookup code object in the cache. Returns code object if found and undefined |
// if not. |
@@ -4283,8 +4339,8 @@ |
static const int kSize = kNormalTypeCacheOffset + kPointerSize; |
private: |
- MUST_USE_RESULT Object* UpdateDefaultCache(String* name, Code* code); |
- MUST_USE_RESULT Object* UpdateNormalTypeCache(String* name, Code* code); |
+ MUST_USE_RESULT MaybeObject* UpdateDefaultCache(String* name, Code* code); |
+ MUST_USE_RESULT MaybeObject* UpdateNormalTypeCache(String* name, Code* code); |
Object* LookupDefaultCache(String* name, Code::Flags flags); |
Object* LookupNormalTypeCache(String* name, Code::Flags flags); |
@@ -4312,7 +4368,7 @@ |
return key->HashForObject(object); |
} |
- MUST_USE_RESULT static Object* AsObject(HashTableKey* key) { |
+ MUST_USE_RESULT static MaybeObject* AsObject(HashTableKey* key) { |
return key->AsObject(); |
} |
@@ -4325,7 +4381,7 @@ |
HashTableKey*> { |
public: |
Object* Lookup(String* name, Code::Flags flags); |
- MUST_USE_RESULT Object* Put(String* name, Code* code); |
+ MUST_USE_RESULT MaybeObject* Put(String* name, Code* code); |
int GetIndex(String* name, Code::Flags flags); |
void RemoveByIndex(int index); |
@@ -4492,7 +4548,7 @@ |
// |
// Use FlattenString from Handles.cc to flatten even in case an |
// allocation failure happens. |
- inline Object* TryFlatten(PretenureFlag pretenure = NOT_TENURED); |
+ inline MaybeObject* TryFlatten(PretenureFlag pretenure = NOT_TENURED); |
// Convenience function. Has exactly the same behavior as |
// TryFlatten(), except in the case of failure returns the original |
@@ -4507,7 +4563,9 @@ |
bool MarkAsUndetectable(); |
// Return a substring. |
- Object* SubString(int from, int to, PretenureFlag pretenure = NOT_TENURED); |
+ MUST_USE_RESULT MaybeObject* SubString(int from, |
+ int to, |
+ PretenureFlag pretenure = NOT_TENURED); |
// String equality operations. |
inline bool Equals(String* other); |
@@ -4709,7 +4767,7 @@ |
// Try to flatten the top level ConsString that is hiding behind this |
// string. This is a no-op unless the string is a ConsString. Flatten |
// mutates the ConsString and might return a failure. |
- Object* SlowTryFlatten(PretenureFlag pretenure); |
+ MUST_USE_RESULT MaybeObject* SlowTryFlatten(PretenureFlag pretenure); |
static inline bool IsHashFieldComputed(uint32_t field); |
@@ -5101,7 +5159,8 @@ |
#endif |
// Initialize the fields. |
- Object* Initialize(const char* to_string, Object* to_number); |
+ MUST_USE_RESULT MaybeObject* Initialize(const char* to_string, |
+ Object* to_number); |
// Layout description. |
static const int kToStringOffset = HeapObject::kHeaderSize; |
@@ -5193,13 +5252,13 @@ |
// is set to a smi. This matches the set function on FixedArray. |
inline void set_length(Smi* length); |
- MUST_USE_RESULT Object* JSArrayUpdateLengthFromIndex(uint32_t index, |
- Object* value); |
+ MUST_USE_RESULT MaybeObject* JSArrayUpdateLengthFromIndex(uint32_t index, |
+ Object* value); |
// Initialize the array with the given capacity. The function may |
// fail due to out-of-memory situations, but only if the requested |
// capacity is non-zero. |
- MUST_USE_RESULT Object* Initialize(int capacity); |
+ MUST_USE_RESULT MaybeObject* Initialize(int capacity); |
// Set the content of the array to the content of storage. |
inline void SetContent(FixedArray* storage); |