blob: c01e3f6b04599d2f82bed72a8c658fd084b39ae8 [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 "include/v8.h"
#include "src/globals.h"
namespace v8 {
namespace internal {
bool MaybeObject::IsSmi(Smi** value) {
if (HAS_SMI_TAG(this)) {
*value = Smi::cast(reinterpret_cast<Object*>(this));
return true;
}
return false;
}
bool MaybeObject::IsStrongOrWeakHeapObject() {
if (IsSmi() || IsClearedWeakHeapObject()) {
return false;
}
return true;
}
bool MaybeObject::ToStrongOrWeakHeapObject(HeapObject** result) {
if (IsSmi() || IsClearedWeakHeapObject()) {
return false;
}
*result = GetHeapObject();
return true;
}
bool MaybeObject::IsStrongHeapObject() {
return !Internals::HasWeakHeapObjectTag(this) && !IsSmi();
}
bool MaybeObject::ToStrongHeapObject(HeapObject** result) {
if (!Internals::HasWeakHeapObjectTag(this) && !IsSmi()) {
*result = reinterpret_cast<HeapObject*>(this);
return true;
}
return false;
}
bool MaybeObject::IsWeakHeapObject() {
return Internals::HasWeakHeapObjectTag(this) && !IsClearedWeakHeapObject();
}
bool MaybeObject::ToWeakHeapObject(HeapObject** result) {
if (Internals::HasWeakHeapObjectTag(this) && !IsClearedWeakHeapObject()) {
*result = GetHeapObject();
return true;
}
return false;
}
HeapObject* MaybeObject::GetHeapObject() {
DCHECK(!IsSmi());
DCHECK(!IsClearedWeakHeapObject());
return Internals::RemoveWeakHeapObjectMask(
reinterpret_cast<HeapObjectReference*>(this));
}
} // namespace internal
} // namespace v8
#endif // V8_OBJECTS_MAYBE_OBJECT_INL_H_