1 // Copyright 2018 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_OBJECTS_MAYBE_OBJECT_INL_H_ 6 #define V8_OBJECTS_MAYBE_OBJECT_INL_H_ 7 8 #include "src/objects/maybe-object.h" 9 10 #include "include/v8.h" 11 #include "src/globals.h" 12 13 namespace v8 { 14 namespace internal { 15 ToSmi(Smi ** value)16bool MaybeObject::ToSmi(Smi** value) { 17 if (HAS_SMI_TAG(this)) { 18 *value = Smi::cast(reinterpret_cast<Object*>(this)); 19 return true; 20 } 21 return false; 22 } 23 ToSmi()24Smi* MaybeObject::ToSmi() { 25 DCHECK(HAS_SMI_TAG(this)); 26 return Smi::cast(reinterpret_cast<Object*>(this)); 27 } 28 IsStrongOrWeakHeapObject()29bool MaybeObject::IsStrongOrWeakHeapObject() { 30 if (IsSmi() || IsClearedWeakHeapObject()) { 31 return false; 32 } 33 return true; 34 } 35 ToStrongOrWeakHeapObject(HeapObject ** result)36bool MaybeObject::ToStrongOrWeakHeapObject(HeapObject** result) { 37 if (IsSmi() || IsClearedWeakHeapObject()) { 38 return false; 39 } 40 *result = GetHeapObject(); 41 return true; 42 } 43 ToStrongOrWeakHeapObject(HeapObject ** result,HeapObjectReferenceType * reference_type)44bool MaybeObject::ToStrongOrWeakHeapObject( 45 HeapObject** result, HeapObjectReferenceType* reference_type) { 46 if (IsSmi() || IsClearedWeakHeapObject()) { 47 return false; 48 } 49 *reference_type = HasWeakHeapObjectTag(this) 50 ? HeapObjectReferenceType::WEAK 51 : HeapObjectReferenceType::STRONG; 52 *result = GetHeapObject(); 53 return true; 54 } 55 IsStrongHeapObject()56bool MaybeObject::IsStrongHeapObject() { 57 return !HasWeakHeapObjectTag(this) && !IsSmi(); 58 } 59 ToStrongHeapObject(HeapObject ** result)60bool MaybeObject::ToStrongHeapObject(HeapObject** result) { 61 if (!HasWeakHeapObjectTag(this) && !IsSmi()) { 62 *result = reinterpret_cast<HeapObject*>(this); 63 return true; 64 } 65 return false; 66 } 67 ToStrongHeapObject()68HeapObject* MaybeObject::ToStrongHeapObject() { 69 DCHECK(IsStrongHeapObject()); 70 return reinterpret_cast<HeapObject*>(this); 71 } 72 IsWeakHeapObject()73bool MaybeObject::IsWeakHeapObject() { 74 return HasWeakHeapObjectTag(this) && !IsClearedWeakHeapObject(); 75 } 76 IsWeakOrClearedHeapObject()77bool MaybeObject::IsWeakOrClearedHeapObject() { 78 return HasWeakHeapObjectTag(this); 79 } 80 ToWeakHeapObject(HeapObject ** result)81bool MaybeObject::ToWeakHeapObject(HeapObject** result) { 82 if (HasWeakHeapObjectTag(this) && !IsClearedWeakHeapObject()) { 83 *result = GetHeapObject(); 84 return true; 85 } 86 return false; 87 } 88 ToWeakHeapObject()89HeapObject* MaybeObject::ToWeakHeapObject() { 90 DCHECK(IsWeakHeapObject()); 91 return GetHeapObject(); 92 } 93 GetHeapObject()94HeapObject* MaybeObject::GetHeapObject() { 95 DCHECK(!IsSmi()); 96 DCHECK(!IsClearedWeakHeapObject()); 97 return RemoveWeakHeapObjectMask(reinterpret_cast<HeapObjectReference*>(this)); 98 } 99 GetHeapObjectOrSmi()100Object* MaybeObject::GetHeapObjectOrSmi() { 101 if (IsSmi()) { 102 return reinterpret_cast<Object*>(this); 103 } 104 return GetHeapObject(); 105 } 106 ToObject()107Object* MaybeObject::ToObject() { 108 DCHECK(!HasWeakHeapObjectTag(this)); 109 return reinterpret_cast<Object*>(this); 110 } 111 MakeWeak(MaybeObject * object)112MaybeObject* MaybeObject::MakeWeak(MaybeObject* object) { 113 DCHECK(object->IsStrongOrWeakHeapObject()); 114 return AddWeakHeapObjectMask(object); 115 } 116 117 } // namespace internal 118 } // namespace v8 119 120 #endif // V8_OBJECTS_MAYBE_OBJECT_INL_H_ 121