| Index: src/objects-inl.h
|
| diff --git a/src/objects-inl.h b/src/objects-inl.h
|
| index a8c5baf5104d1f739997209c84a7387fdd42132f..83f46e3484dcd8b48db2509518398543084742ea 100644
|
| --- a/src/objects-inl.h
|
| +++ b/src/objects-inl.h
|
| @@ -54,14 +54,11 @@ int PropertyDetails::field_width_in_words() const {
|
| return representation().IsDouble() ? kDoubleSize / kPointerSize : 1;
|
| }
|
|
|
| -
|
| -#define TYPE_CHECKER(type, instancetype) \
|
| - bool Object::Is##type() const { \
|
| - return Object::IsHeapObject() && \
|
| - HeapObject::cast(this)->map()->instance_type() == instancetype; \
|
| +#define TYPE_CHECKER(type, instancetype) \
|
| + bool HeapObject::Is##type() const { \
|
| + return map()->instance_type() == instancetype; \
|
| }
|
|
|
| -
|
| #define CAST_ACCESSOR(type) \
|
| type* type::cast(Object* object) { \
|
| SLOW_DCHECK(object->Is##type()); \
|
| @@ -128,25 +125,20 @@ int PropertyDetails::field_width_in_words() const {
|
| set_##field(BooleanBit::set(field(), offset, value)); \
|
| }
|
|
|
| -
|
| -bool Object::IsFixedArrayBase() const {
|
| +bool HeapObject::IsFixedArrayBase() const {
|
| return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase();
|
| }
|
|
|
| -
|
| -bool Object::IsFixedArray() const {
|
| - if (!IsHeapObject()) return false;
|
| - InstanceType instance_type = HeapObject::cast(this)->map()->instance_type();
|
| +bool HeapObject::IsFixedArray() const {
|
| + InstanceType instance_type = map()->instance_type();
|
| return instance_type == FIXED_ARRAY_TYPE ||
|
| instance_type == TRANSITION_ARRAY_TYPE;
|
| }
|
|
|
|
|
| // External objects are not extensible, so the map check is enough.
|
| -bool Object::IsExternal() const {
|
| - return Object::IsHeapObject() &&
|
| - HeapObject::cast(this)->map() ==
|
| - HeapObject::cast(this)->GetHeap()->external_map();
|
| +bool HeapObject::IsExternal() const {
|
| + return map() == GetHeap()->external_map();
|
| }
|
|
|
|
|
| @@ -155,113 +147,90 @@ TYPE_CHECKER(MutableHeapNumber, MUTABLE_HEAP_NUMBER_TYPE)
|
| TYPE_CHECKER(Symbol, SYMBOL_TYPE)
|
| TYPE_CHECKER(Simd128Value, SIMD128_VALUE_TYPE)
|
|
|
| -
|
| #define SIMD128_TYPE_CHECKER(TYPE, Type, type, lane_count, lane_type) \
|
| - bool Object::Is##Type() const { \
|
| - return Object::IsHeapObject() && \
|
| - HeapObject::cast(this)->map() == \
|
| - HeapObject::cast(this)->GetHeap()->type##_map(); \
|
| - }
|
| + bool HeapObject::Is##Type() const { return map() == GetHeap()->type##_map(); }
|
| SIMD128_TYPES(SIMD128_TYPE_CHECKER)
|
| #undef SIMD128_TYPE_CHECKER
|
|
|
| +#define IS_TYPE_FUNCTION_DEF(type_) \
|
| + bool Object::Is##type_() const { \
|
| + return IsHeapObject() && HeapObject::cast(this)->Is##type_(); \
|
| + }
|
| +HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DEF)
|
| +ODDBALL_LIST(IS_TYPE_FUNCTION_DEF)
|
| +#undef IS_TYPE_FUNCTION_DEF
|
|
|
| -bool Object::IsString() const {
|
| - return Object::IsHeapObject()
|
| - && HeapObject::cast(this)->map()->instance_type() < FIRST_NONSTRING_TYPE;
|
| +bool HeapObject::IsString() const {
|
| + return map()->instance_type() < FIRST_NONSTRING_TYPE;
|
| }
|
|
|
| -
|
| -bool Object::IsName() const {
|
| - STATIC_ASSERT(FIRST_NAME_TYPE == FIRST_TYPE);
|
| - return Object::IsHeapObject() &&
|
| - HeapObject::cast(this)->map()->instance_type() <= LAST_NAME_TYPE;
|
| +bool HeapObject::IsName() const {
|
| + return map()->instance_type() <= LAST_NAME_TYPE;
|
| }
|
|
|
| -
|
| -bool Object::IsUniqueName() const {
|
| +bool HeapObject::IsUniqueName() const {
|
| return IsInternalizedString() || IsSymbol();
|
| }
|
|
|
| -
|
| -bool Object::IsFunction() const {
|
| +bool HeapObject::IsFunction() const {
|
| STATIC_ASSERT(LAST_FUNCTION_TYPE == LAST_TYPE);
|
| - return Object::IsHeapObject() &&
|
| - HeapObject::cast(this)->map()->instance_type() >= FIRST_FUNCTION_TYPE;
|
| + return map()->instance_type() >= FIRST_FUNCTION_TYPE;
|
| }
|
|
|
| +bool HeapObject::IsCallable() const { return map()->is_callable(); }
|
|
|
| -bool Object::IsCallable() const {
|
| - return Object::IsHeapObject() && HeapObject::cast(this)->map()->is_callable();
|
| -}
|
| -
|
| -
|
| -bool Object::IsConstructor() const {
|
| - return Object::IsHeapObject() &&
|
| - HeapObject::cast(this)->map()->is_constructor();
|
| -}
|
| -
|
| +bool HeapObject::IsConstructor() const { return map()->is_constructor(); }
|
|
|
| -bool Object::IsTemplateInfo() const {
|
| +bool HeapObject::IsTemplateInfo() const {
|
| return IsObjectTemplateInfo() || IsFunctionTemplateInfo();
|
| }
|
|
|
| -
|
| -bool Object::IsInternalizedString() const {
|
| - if (!this->IsHeapObject()) return false;
|
| - uint32_t type = HeapObject::cast(this)->map()->instance_type();
|
| +bool HeapObject::IsInternalizedString() const {
|
| + uint32_t type = map()->instance_type();
|
| STATIC_ASSERT(kNotInternalizedTag != 0);
|
| return (type & (kIsNotStringMask | kIsNotInternalizedMask)) ==
|
| (kStringTag | kInternalizedTag);
|
| }
|
|
|
| -
|
| -bool Object::IsConsString() const {
|
| +bool HeapObject::IsConsString() const {
|
| if (!IsString()) return false;
|
| return StringShape(String::cast(this)).IsCons();
|
| }
|
|
|
| -
|
| -bool Object::IsSlicedString() const {
|
| +bool HeapObject::IsSlicedString() const {
|
| if (!IsString()) return false;
|
| return StringShape(String::cast(this)).IsSliced();
|
| }
|
|
|
| -
|
| -bool Object::IsSeqString() const {
|
| +bool HeapObject::IsSeqString() const {
|
| if (!IsString()) return false;
|
| return StringShape(String::cast(this)).IsSequential();
|
| }
|
|
|
| -
|
| -bool Object::IsSeqOneByteString() const {
|
| +bool HeapObject::IsSeqOneByteString() const {
|
| if (!IsString()) return false;
|
| return StringShape(String::cast(this)).IsSequential() &&
|
| String::cast(this)->IsOneByteRepresentation();
|
| }
|
|
|
| -
|
| -bool Object::IsSeqTwoByteString() const {
|
| +bool HeapObject::IsSeqTwoByteString() const {
|
| if (!IsString()) return false;
|
| return StringShape(String::cast(this)).IsSequential() &&
|
| String::cast(this)->IsTwoByteRepresentation();
|
| }
|
|
|
| -
|
| -bool Object::IsExternalString() const {
|
| +bool HeapObject::IsExternalString() const {
|
| if (!IsString()) return false;
|
| return StringShape(String::cast(this)).IsExternal();
|
| }
|
|
|
| -
|
| -bool Object::IsExternalOneByteString() const {
|
| +bool HeapObject::IsExternalOneByteString() const {
|
| if (!IsString()) return false;
|
| return StringShape(String::cast(this)).IsExternal() &&
|
| String::cast(this)->IsOneByteRepresentation();
|
| }
|
|
|
| -
|
| -bool Object::IsExternalTwoByteString() const {
|
| +bool HeapObject::IsExternalTwoByteString() const {
|
| if (!IsString()) return false;
|
| return StringShape(String::cast(this)).IsExternal() &&
|
| String::cast(this)->IsTwoByteRepresentation();
|
| @@ -661,10 +630,8 @@ TYPE_CHECKER(ByteArray, BYTE_ARRAY_TYPE)
|
| TYPE_CHECKER(BytecodeArray, BYTECODE_ARRAY_TYPE)
|
| TYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE)
|
|
|
| -
|
| -bool Object::IsFiller() const {
|
| - if (!Object::IsHeapObject()) return false;
|
| - InstanceType instance_type = HeapObject::cast(this)->map()->instance_type();
|
| +bool HeapObject::IsFiller() const {
|
| + InstanceType instance_type = map()->instance_type();
|
| return instance_type == FREE_SPACE_TYPE || instance_type == FILLER_TYPE;
|
| }
|
|
|
| @@ -676,35 +643,23 @@ bool Object::IsFiller() const {
|
| TYPED_ARRAYS(TYPED_ARRAY_TYPE_CHECKER)
|
| #undef TYPED_ARRAY_TYPE_CHECKER
|
|
|
| -
|
| -bool Object::IsFixedTypedArrayBase() const {
|
| - if (!Object::IsHeapObject()) return false;
|
| -
|
| - InstanceType instance_type =
|
| - HeapObject::cast(this)->map()->instance_type();
|
| +bool HeapObject::IsFixedTypedArrayBase() const {
|
| + InstanceType instance_type = map()->instance_type();
|
| return (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE &&
|
| instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE);
|
| }
|
|
|
| -
|
| -bool Object::IsJSReceiver() const {
|
| +bool HeapObject::IsJSReceiver() const {
|
| STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
|
| - return IsHeapObject() &&
|
| - HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_RECEIVER_TYPE;
|
| + return map()->instance_type() >= FIRST_JS_RECEIVER_TYPE;
|
| }
|
|
|
| -
|
| -bool Object::IsJSObject() const {
|
| +bool HeapObject::IsJSObject() const {
|
| STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE);
|
| - return IsHeapObject() && HeapObject::cast(this)->map()->IsJSObjectMap();
|
| -}
|
| -
|
| -
|
| -bool Object::IsJSProxy() const {
|
| - if (!Object::IsHeapObject()) return false;
|
| - return HeapObject::cast(this)->map()->IsJSProxyMap();
|
| + return map()->IsJSObjectMap();
|
| }
|
|
|
| +bool HeapObject::IsJSProxy() const { return map()->IsJSProxyMap(); }
|
|
|
| TYPE_CHECKER(JSSet, JS_SET_TYPE)
|
| TYPE_CHECKER(JSMap, JS_MAP_TYPE)
|
| @@ -718,35 +673,25 @@ TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE)
|
| TYPE_CHECKER(WeakFixedArray, FIXED_ARRAY_TYPE)
|
| TYPE_CHECKER(TransitionArray, TRANSITION_ARRAY_TYPE)
|
|
|
| -
|
| -bool Object::IsJSWeakCollection() const {
|
| +bool HeapObject::IsJSWeakCollection() const {
|
| return IsJSWeakMap() || IsJSWeakSet();
|
| }
|
|
|
| +bool HeapObject::IsDescriptorArray() const { return IsFixedArray(); }
|
|
|
| -bool Object::IsDescriptorArray() const {
|
| - return IsFixedArray();
|
| -}
|
| -
|
| -
|
| -bool Object::IsArrayList() const { return IsFixedArray(); }
|
| -
|
| +bool HeapObject::IsArrayList() const { return IsFixedArray(); }
|
|
|
| bool Object::IsLayoutDescriptor() const {
|
| return IsSmi() || IsFixedTypedArrayBase();
|
| }
|
|
|
| +bool HeapObject::IsTypeFeedbackVector() const { return IsFixedArray(); }
|
|
|
| -bool Object::IsTypeFeedbackVector() const { return IsFixedArray(); }
|
| -
|
| -
|
| -bool Object::IsTypeFeedbackMetadata() const { return IsFixedArray(); }
|
| -
|
| -
|
| -bool Object::IsLiteralsArray() const { return IsFixedArray(); }
|
| +bool HeapObject::IsTypeFeedbackMetadata() const { return IsFixedArray(); }
|
|
|
| +bool HeapObject::IsLiteralsArray() const { return IsFixedArray(); }
|
|
|
| -bool Object::IsDeoptimizationInputData() const {
|
| +bool HeapObject::IsDeoptimizationInputData() const {
|
| // Must be a fixed array.
|
| if (!IsFixedArray()) return false;
|
|
|
| @@ -761,8 +706,7 @@ bool Object::IsDeoptimizationInputData() const {
|
| return length >= 0 && length % DeoptimizationInputData::kDeoptEntrySize == 0;
|
| }
|
|
|
| -
|
| -bool Object::IsDeoptimizationOutputData() const {
|
| +bool HeapObject::IsDeoptimizationOutputData() const {
|
| if (!IsFixedArray()) return false;
|
| // There's actually no way to see the difference between a fixed array and
|
| // a deoptimization data array. Since this is used for asserts we can check
|
| @@ -771,27 +715,23 @@ bool Object::IsDeoptimizationOutputData() const {
|
| return true;
|
| }
|
|
|
| -
|
| -bool Object::IsHandlerTable() const {
|
| +bool HeapObject::IsHandlerTable() const {
|
| if (!IsFixedArray()) return false;
|
| // There's actually no way to see the difference between a fixed array and
|
| // a handler table array.
|
| return true;
|
| }
|
|
|
| -
|
| -bool Object::IsDependentCode() const {
|
| +bool HeapObject::IsDependentCode() const {
|
| if (!IsFixedArray()) return false;
|
| // There's actually no way to see the difference between a fixed array and
|
| // a dependent codes array.
|
| return true;
|
| }
|
|
|
| -
|
| -bool Object::IsContext() const {
|
| - if (!Object::IsHeapObject()) return false;
|
| - Map* map = HeapObject::cast(this)->map();
|
| - Heap* heap = map->GetHeap();
|
| +bool HeapObject::IsContext() const {
|
| + Map* map = this->map();
|
| + Heap* heap = GetHeap();
|
| return (map == heap->function_context_map() ||
|
| map == heap->catch_context_map() ||
|
| map == heap->with_context_map() ||
|
| @@ -801,26 +741,16 @@ bool Object::IsContext() const {
|
| map == heap->script_context_map());
|
| }
|
|
|
| -
|
| -bool Object::IsNativeContext() const {
|
| - return Object::IsHeapObject() &&
|
| - HeapObject::cast(this)->map() ==
|
| - HeapObject::cast(this)->GetHeap()->native_context_map();
|
| +bool HeapObject::IsNativeContext() const {
|
| + return map() == GetHeap()->native_context_map();
|
| }
|
|
|
| -
|
| -bool Object::IsScriptContextTable() const {
|
| - if (!Object::IsHeapObject()) return false;
|
| - Map* map = HeapObject::cast(this)->map();
|
| - Heap* heap = map->GetHeap();
|
| - return map == heap->script_context_table_map();
|
| +bool HeapObject::IsScriptContextTable() const {
|
| + return map() == GetHeap()->script_context_table_map();
|
| }
|
|
|
| -
|
| -bool Object::IsScopeInfo() const {
|
| - return Object::IsHeapObject() &&
|
| - HeapObject::cast(this)->map() ==
|
| - HeapObject::cast(this)->GetHeap()->scope_info_map();
|
| +bool HeapObject::IsScopeInfo() const {
|
| + return map() == GetHeap()->scope_info_map();
|
| }
|
|
|
|
|
| @@ -845,17 +775,18 @@ TYPE_CHECKER(JSValue, JS_VALUE_TYPE)
|
| TYPE_CHECKER(JSDate, JS_DATE_TYPE)
|
| TYPE_CHECKER(JSMessageObject, JS_MESSAGE_OBJECT_TYPE)
|
|
|
| -bool Object::IsAbstractCode() const { return IsBytecodeArray() || IsCode(); }
|
| +bool HeapObject::IsAbstractCode() const {
|
| + return IsBytecodeArray() || IsCode();
|
| +}
|
|
|
| -bool Object::IsStringWrapper() const {
|
| +bool HeapObject::IsStringWrapper() const {
|
| return IsJSValue() && JSValue::cast(this)->value()->IsString();
|
| }
|
|
|
|
|
| TYPE_CHECKER(Foreign, FOREIGN_TYPE)
|
|
|
| -
|
| -bool Object::IsBoolean() const {
|
| +bool HeapObject::IsBoolean() const {
|
| return IsOddball() &&
|
| ((Oddball::cast(this)->kind() & Oddball::kNotBooleanMask) == 0);
|
| }
|
| @@ -866,8 +797,7 @@ TYPE_CHECKER(JSArrayBuffer, JS_ARRAY_BUFFER_TYPE)
|
| TYPE_CHECKER(JSTypedArray, JS_TYPED_ARRAY_TYPE)
|
| TYPE_CHECKER(JSDataView, JS_DATA_VIEW_TYPE)
|
|
|
| -
|
| -bool Object::IsJSArrayBufferView() const {
|
| +bool HeapObject::IsJSArrayBufferView() const {
|
| return IsJSDataView() || IsJSTypedArray();
|
| }
|
|
|
| @@ -879,22 +809,14 @@ template <> inline bool Is<JSArray>(Object* obj) {
|
| return obj->IsJSArray();
|
| }
|
|
|
| -
|
| -bool Object::IsHashTable() const {
|
| - return Object::IsHeapObject() &&
|
| - HeapObject::cast(this)->map() ==
|
| - HeapObject::cast(this)->GetHeap()->hash_table_map();
|
| -}
|
| -
|
| -
|
| -bool Object::IsWeakHashTable() const {
|
| - return IsHashTable();
|
| +bool HeapObject::IsHashTable() const {
|
| + return map() == GetHeap()->hash_table_map();
|
| }
|
|
|
| +bool HeapObject::IsWeakHashTable() const { return IsHashTable(); }
|
|
|
| -bool Object::IsDictionary() const {
|
| - return IsHashTable() &&
|
| - this != HeapObject::cast(this)->GetHeap()->string_table();
|
| +bool HeapObject::IsDictionary() const {
|
| + return IsHashTable() && this != GetHeap()->string_table();
|
| }
|
|
|
|
|
| @@ -915,13 +837,9 @@ bool Object::IsUnseededNumberDictionary() const {
|
| return IsDictionary();
|
| }
|
|
|
| +bool HeapObject::IsStringTable() const { return IsHashTable(); }
|
|
|
| -bool Object::IsStringTable() const {
|
| - return IsHashTable();
|
| -}
|
| -
|
| -
|
| -bool Object::IsNormalizedMapCache() const {
|
| +bool HeapObject::IsNormalizedMapCache() const {
|
| return NormalizedMapCache::IsNormalizedMapCache(this);
|
| }
|
|
|
| @@ -930,51 +848,34 @@ int NormalizedMapCache::GetIndex(Handle<Map> map) {
|
| return map->Hash() % NormalizedMapCache::kEntries;
|
| }
|
|
|
| -
|
| -bool NormalizedMapCache::IsNormalizedMapCache(const Object* obj) {
|
| +bool NormalizedMapCache::IsNormalizedMapCache(const HeapObject* obj) {
|
| if (!obj->IsFixedArray()) return false;
|
| if (FixedArray::cast(obj)->length() != NormalizedMapCache::kEntries) {
|
| return false;
|
| }
|
| #ifdef VERIFY_HEAP
|
| if (FLAG_verify_heap) {
|
| - reinterpret_cast<NormalizedMapCache*>(const_cast<Object*>(obj))->
|
| - NormalizedMapCacheVerify();
|
| + reinterpret_cast<NormalizedMapCache*>(const_cast<HeapObject*>(obj))
|
| + ->NormalizedMapCacheVerify();
|
| }
|
| #endif
|
| return true;
|
| }
|
|
|
| +bool HeapObject::IsCompilationCacheTable() const { return IsHashTable(); }
|
|
|
| -bool Object::IsCompilationCacheTable() const {
|
| - return IsHashTable();
|
| -}
|
| -
|
| -
|
| -bool Object::IsCodeCacheHashTable() const {
|
| - return IsHashTable();
|
| -}
|
| -
|
| -
|
| -bool Object::IsPolymorphicCodeCacheHashTable() const {
|
| - return IsHashTable();
|
| -}
|
| +bool HeapObject::IsCodeCacheHashTable() const { return IsHashTable(); }
|
|
|
| -
|
| -bool Object::IsMapCache() const {
|
| +bool HeapObject::IsPolymorphicCodeCacheHashTable() const {
|
| return IsHashTable();
|
| }
|
|
|
| +bool HeapObject::IsMapCache() const { return IsHashTable(); }
|
|
|
| -bool Object::IsObjectHashTable() const {
|
| - return IsHashTable();
|
| -}
|
| -
|
| +bool HeapObject::IsObjectHashTable() const { return IsHashTable(); }
|
|
|
| -bool Object::IsOrderedHashTable() const {
|
| - return IsHeapObject() &&
|
| - HeapObject::cast(this)->map() ==
|
| - HeapObject::cast(this)->GetHeap()->ordered_hash_table_map();
|
| +bool HeapObject::IsOrderedHashTable() const {
|
| + return map() == GetHeap()->ordered_hash_table_map();
|
| }
|
|
|
|
|
| @@ -992,40 +893,30 @@ bool Object::IsPrimitive() const {
|
| return IsSmi() || HeapObject::cast(this)->map()->IsPrimitiveMap();
|
| }
|
|
|
| -
|
| -bool Object::IsJSGlobalProxy() const {
|
| - bool result = IsHeapObject() &&
|
| - (HeapObject::cast(this)->map()->instance_type() ==
|
| - JS_GLOBAL_PROXY_TYPE);
|
| - DCHECK(!result ||
|
| - HeapObject::cast(this)->map()->is_access_check_needed());
|
| +bool HeapObject::IsJSGlobalProxy() const {
|
| + bool result = map()->instance_type() == JS_GLOBAL_PROXY_TYPE;
|
| + DCHECK(!result || map()->is_access_check_needed());
|
| return result;
|
| }
|
|
|
|
|
| TYPE_CHECKER(JSGlobalObject, JS_GLOBAL_OBJECT_TYPE)
|
|
|
| -
|
| -bool Object::IsUndetectableObject() const {
|
| - return IsHeapObject()
|
| - && HeapObject::cast(this)->map()->is_undetectable();
|
| +bool HeapObject::IsUndetectableObject() const {
|
| + return map()->is_undetectable();
|
| }
|
|
|
| -
|
| -bool Object::IsAccessCheckNeeded() const {
|
| - if (!IsHeapObject()) return false;
|
| +bool HeapObject::IsAccessCheckNeeded() const {
|
| if (IsJSGlobalProxy()) {
|
| const JSGlobalProxy* proxy = JSGlobalProxy::cast(this);
|
| JSGlobalObject* global = proxy->GetIsolate()->context()->global_object();
|
| return proxy->IsDetachedFrom(global);
|
| }
|
| - return HeapObject::cast(this)->map()->is_access_check_needed();
|
| + return map()->is_access_check_needed();
|
| }
|
|
|
| -
|
| -bool Object::IsStruct() const {
|
| - if (!IsHeapObject()) return false;
|
| - switch (HeapObject::cast(this)->map()->instance_type()) {
|
| +bool HeapObject::IsStruct() const {
|
| + switch (map()->instance_type()) {
|
| #define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return true;
|
| STRUCT_LIST(MAKE_STRUCT_CASE)
|
| #undef MAKE_STRUCT_CASE
|
| @@ -1033,56 +924,23 @@ bool Object::IsStruct() const {
|
| }
|
| }
|
|
|
| -
|
| -#define MAKE_STRUCT_PREDICATE(NAME, Name, name) \
|
| - bool Object::Is##Name() const { \
|
| - return Object::IsHeapObject() \
|
| - && HeapObject::cast(this)->map()->instance_type() == NAME##_TYPE; \
|
| +#define MAKE_STRUCT_PREDICATE(NAME, Name, name) \
|
| + bool Object::Is##Name() const { \
|
| + return IsHeapObject() && HeapObject::cast(this)->Is##Name(); \
|
| + } \
|
| + bool HeapObject::Is##Name() const { \
|
| + return map()->instance_type() == NAME##_TYPE; \
|
| }
|
| - STRUCT_LIST(MAKE_STRUCT_PREDICATE)
|
| +STRUCT_LIST(MAKE_STRUCT_PREDICATE)
|
| #undef MAKE_STRUCT_PREDICATE
|
|
|
| +#define MAKE_ODDBALL_PREDICATE(Name) \
|
| + bool HeapObject::Is##Name() const { \
|
| + return IsOddball() && Oddball::cast(this)->kind() == Oddball::k##Name; \
|
| + }
|
| +ODDBALL_LIST(MAKE_ODDBALL_PREDICATE)
|
|
|
| -bool Object::IsUndefined() const {
|
| - return IsOddball() && Oddball::cast(this)->kind() == Oddball::kUndefined;
|
| -}
|
| -
|
| -
|
| -bool Object::IsNull() const {
|
| - return IsOddball() && Oddball::cast(this)->kind() == Oddball::kNull;
|
| -}
|
| -
|
| -
|
| -bool Object::IsTheHole() const {
|
| - return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTheHole;
|
| -}
|
| -
|
| -
|
| -bool Object::IsException() const {
|
| - return IsOddball() && Oddball::cast(this)->kind() == Oddball::kException;
|
| -}
|
| -
|
| -
|
| -bool Object::IsUninitialized() const {
|
| - return IsOddball() && Oddball::cast(this)->kind() == Oddball::kUninitialized;
|
| -}
|
| -
|
| -
|
| -bool Object::IsTrue() const {
|
| - return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTrue;
|
| -}
|
| -
|
| -
|
| -bool Object::IsFalse() const {
|
| - return IsOddball() && Oddball::cast(this)->kind() == Oddball::kFalse;
|
| -}
|
| -
|
| -
|
| -bool Object::IsArgumentsMarker() const {
|
| - return IsOddball() && Oddball::cast(this)->kind() == Oddball::kArgumentMarker;
|
| -}
|
| -
|
| -
|
| +#undef MAKE_ODDBALL_PREDICATE
|
| double Object::Number() const {
|
| DCHECK(IsNumber());
|
| return IsSmi()
|
| @@ -6766,15 +6624,13 @@ bool JSObject::HasFixedTypedArrayElements() {
|
| return array->IsFixedTypedArrayBase();
|
| }
|
|
|
| -
|
| -#define FIXED_TYPED_ELEMENTS_CHECK(Type, type, TYPE, ctype, size) \
|
| -bool JSObject::HasFixed##Type##Elements() { \
|
| - HeapObject* array = elements(); \
|
| - DCHECK(array != NULL); \
|
| - if (!array->IsHeapObject()) \
|
| - return false; \
|
| - return array->map()->instance_type() == FIXED_##TYPE##_ARRAY_TYPE; \
|
| -}
|
| +#define FIXED_TYPED_ELEMENTS_CHECK(Type, type, TYPE, ctype, size) \
|
| + bool JSObject::HasFixed##Type##Elements() { \
|
| + HeapObject* array = elements(); \
|
| + DCHECK(array != NULL); \
|
| + if (!array->IsHeapObject()) return false; \
|
| + return array->map()->instance_type() == FIXED_##TYPE##_ARRAY_TYPE; \
|
| + }
|
|
|
| TYPED_ARRAYS(FIXED_TYPED_ELEMENTS_CHECK)
|
|
|
|
|