blob: fa3cd8c14ff380b024156b2f0455c2b0a84ccf97 [file] [log] [blame]
// 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_