// 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" #ifdef V8_COMPRESS_POINTERS #include "src/execution/isolate.h" #endif #include "src/objects/smi-inl.h" #include "src/objects/tagged-impl-inl.h" namespace v8 { namespace internal { // // MaybeObject implementation. // // static MaybeObject MaybeObject::FromSmi(Smi smi) { DCHECK(HAS_SMI_TAG(smi.ptr())); return MaybeObject(smi.ptr()); } // static MaybeObject MaybeObject::FromObject(Object object) { DCHECK(!HAS_WEAK_HEAP_OBJECT_TAG(object.ptr())); return MaybeObject(object.ptr()); } MaybeObject MaybeObject::MakeWeak(MaybeObject object) { DCHECK(object.IsStrongOrWeak()); return MaybeObject(object.ptr() | kWeakHeapObjectMask); } // // HeapObjectReference implementation. // HeapObjectReference::HeapObjectReference(Object object) : MaybeObject(object.ptr()) {} // static HeapObjectReference HeapObjectReference::Strong(Object object) { DCHECK(!object.IsSmi()); DCHECK(!HasWeakHeapObjectTag(object)); return HeapObjectReference(object); } // static HeapObjectReference HeapObjectReference::Weak(Object object) { DCHECK(!object.IsSmi()); DCHECK(!HasWeakHeapObjectTag(object)); return HeapObjectReference(object.ptr() | kWeakHeapObjectMask); } // static HeapObjectReference HeapObjectReference::ClearedValue(Isolate* isolate) { // Construct cleared weak ref value. Address raw_value = kClearedWeakHeapObjectLower32; #ifdef V8_COMPRESS_POINTERS // This is necessary to make pointer decompression computation also // suitable for cleared weak references. Address isolate_root = isolate->isolate_root(); raw_value |= isolate_root; DCHECK_EQ(raw_value & (~static_cast
(kClearedWeakHeapObjectLower32)), isolate_root); #endif // The rest of the code will check only the lower 32-bits. DCHECK_EQ(kClearedWeakHeapObjectLower32, static_cast