// 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_
|