// Copyright 2018 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_OBJECTS_MAYBE_OBJECT_INL_H_ #define V8_OBJECTS_MAYBE_OBJECT_INL_H_ #include "src/objects/maybe-object.h" #include "src/objects-inl.h" namespace v8 { namespace internal { bool MaybeObject::ToSmi(Smi** value) { if (HAS_SMI_TAG(this)) { *value = Smi::cast(reinterpret_cast<Object*>(this)); return true; } return false; } Smi* MaybeObject::ToSmi() { DCHECK(HAS_SMI_TAG(this)); return Smi::cast(reinterpret_cast<Object*>(this)); } bool MaybeObject::IsStrongOrWeakHeapObject() const { if (IsSmi() || IsClearedWeakHeapObject()) { return false; } return true; } bool MaybeObject::ToStrongOrWeakHeapObject(HeapObject** result) { if (IsSmi() || IsClearedWeakHeapObject()) { return false; } *result = GetHeapObject(); return true; } bool MaybeObject::ToStrongOrWeakHeapObject( HeapObject** result, HeapObjectReferenceType* reference_type) { if (IsSmi() || IsClearedWeakHeapObject()) { return false; } *reference_type = HasWeakHeapObjectTag(this) ? HeapObjectReferenceType::WEAK : HeapObjectReferenceType::STRONG; *result = GetHeapObject(); return true; } bool MaybeObject::IsStrongHeapObject() const { return !HasWeakHeapObjectTag(this) && !IsSmi(); } bool MaybeObject::ToStrongHeapObject(HeapObject** result) { if (!HasWeakHeapObjectTag(this) && !IsSmi()) { *result = reinterpret_cast<HeapObject*>(this); return true; } return false; } HeapObject* MaybeObject::ToStrongHeapObject() { DCHECK(IsStrongHeapObject()); return reinterpret_cast<HeapObject*>(this); } bool MaybeObject::IsWeakHeapObject() const { return HasWeakHeapObjectTag(this) && !IsClearedWeakHeapObject(); } bool MaybeObject::IsWeakOrClearedHeapObject() const { return HasWeakHeapObjectTag(this); } bool MaybeObject::ToWeakHeapObject(HeapObject** result) { if (HasWeakHeapObjectTag(this) && !IsClearedWeakHeapObject()) { *result = GetHeapObject(); return true; } return false; } HeapObject* MaybeObject::ToWeakHeapObject() { DCHECK(IsWeakHeapObject()); return GetHeapObject(); } HeapObject* MaybeObject::GetHeapObject() { DCHECK(!IsSmi()); DCHECK(!IsClearedWeakHeapObject()); return RemoveWeakHeapObjectMask(reinterpret_cast<HeapObjectReference*>(this)); } Object* MaybeObject::GetHeapObjectOrSmi() { if (IsSmi()) { return reinterpret_cast<Object*>(this); } return GetHeapObject(); } bool MaybeObject::IsObject() const { return IsSmi() || IsStrongHeapObject(); } Object* MaybeObject::ToObject() { DCHECK(!HasWeakHeapObjectTag(this)); return reinterpret_cast<Object*>(this); } MaybeObject* MaybeObject::MakeWeak(MaybeObject* object) { DCHECK(object->IsStrongOrWeakHeapObject()); return AddWeakHeapObjectMask(object); } } // namespace internal } // namespace v8 #endif // V8_OBJECTS_MAYBE_OBJECT_INL_H_