1 // Copyright 2018 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_OBJECTS_MAYBE_OBJECT_INL_H_
6 #define V8_OBJECTS_MAYBE_OBJECT_INL_H_
7 
8 #include "src/objects/maybe-object.h"
9 
10 #include "include/v8.h"
11 #include "src/globals.h"
12 
13 namespace v8 {
14 namespace internal {
15 
ToSmi(Smi ** value)16 bool MaybeObject::ToSmi(Smi** value) {
17   if (HAS_SMI_TAG(this)) {
18     *value = Smi::cast(reinterpret_cast<Object*>(this));
19     return true;
20   }
21   return false;
22 }
23 
ToSmi()24 Smi* MaybeObject::ToSmi() {
25   DCHECK(HAS_SMI_TAG(this));
26   return Smi::cast(reinterpret_cast<Object*>(this));
27 }
28 
IsStrongOrWeakHeapObject()29 bool MaybeObject::IsStrongOrWeakHeapObject() {
30   if (IsSmi() || IsClearedWeakHeapObject()) {
31     return false;
32   }
33   return true;
34 }
35 
ToStrongOrWeakHeapObject(HeapObject ** result)36 bool MaybeObject::ToStrongOrWeakHeapObject(HeapObject** result) {
37   if (IsSmi() || IsClearedWeakHeapObject()) {
38     return false;
39   }
40   *result = GetHeapObject();
41   return true;
42 }
43 
ToStrongOrWeakHeapObject(HeapObject ** result,HeapObjectReferenceType * reference_type)44 bool MaybeObject::ToStrongOrWeakHeapObject(
45     HeapObject** result, HeapObjectReferenceType* reference_type) {
46   if (IsSmi() || IsClearedWeakHeapObject()) {
47     return false;
48   }
49   *reference_type = HasWeakHeapObjectTag(this)
50                         ? HeapObjectReferenceType::WEAK
51                         : HeapObjectReferenceType::STRONG;
52   *result = GetHeapObject();
53   return true;
54 }
55 
IsStrongHeapObject()56 bool MaybeObject::IsStrongHeapObject() {
57   return !HasWeakHeapObjectTag(this) && !IsSmi();
58 }
59 
ToStrongHeapObject(HeapObject ** result)60 bool MaybeObject::ToStrongHeapObject(HeapObject** result) {
61   if (!HasWeakHeapObjectTag(this) && !IsSmi()) {
62     *result = reinterpret_cast<HeapObject*>(this);
63     return true;
64   }
65   return false;
66 }
67 
ToStrongHeapObject()68 HeapObject* MaybeObject::ToStrongHeapObject() {
69   DCHECK(IsStrongHeapObject());
70   return reinterpret_cast<HeapObject*>(this);
71 }
72 
IsWeakHeapObject()73 bool MaybeObject::IsWeakHeapObject() {
74   return HasWeakHeapObjectTag(this) && !IsClearedWeakHeapObject();
75 }
76 
IsWeakOrClearedHeapObject()77 bool MaybeObject::IsWeakOrClearedHeapObject() {
78   return HasWeakHeapObjectTag(this);
79 }
80 
ToWeakHeapObject(HeapObject ** result)81 bool MaybeObject::ToWeakHeapObject(HeapObject** result) {
82   if (HasWeakHeapObjectTag(this) && !IsClearedWeakHeapObject()) {
83     *result = GetHeapObject();
84     return true;
85   }
86   return false;
87 }
88 
ToWeakHeapObject()89 HeapObject* MaybeObject::ToWeakHeapObject() {
90   DCHECK(IsWeakHeapObject());
91   return GetHeapObject();
92 }
93 
GetHeapObject()94 HeapObject* MaybeObject::GetHeapObject() {
95   DCHECK(!IsSmi());
96   DCHECK(!IsClearedWeakHeapObject());
97   return RemoveWeakHeapObjectMask(reinterpret_cast<HeapObjectReference*>(this));
98 }
99 
GetHeapObjectOrSmi()100 Object* MaybeObject::GetHeapObjectOrSmi() {
101   if (IsSmi()) {
102     return reinterpret_cast<Object*>(this);
103   }
104   return GetHeapObject();
105 }
106 
ToObject()107 Object* MaybeObject::ToObject() {
108   DCHECK(!HasWeakHeapObjectTag(this));
109   return reinterpret_cast<Object*>(this);
110 }
111 
MakeWeak(MaybeObject * object)112 MaybeObject* MaybeObject::MakeWeak(MaybeObject* object) {
113   DCHECK(object->IsStrongOrWeakHeapObject());
114   return AddWeakHeapObjectMask(object);
115 }
116 
117 }  // namespace internal
118 }  // namespace v8
119 
120 #endif  // V8_OBJECTS_MAYBE_OBJECT_INL_H_
121