maybe-handles-inl.h 3.94 KB
Newer Older
1 2 3 4
// 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.

5 6
#ifndef V8_HANDLES_MAYBE_HANDLES_INL_H_
#define V8_HANDLES_MAYBE_HANDLES_INL_H_
7

8
#include "src/handles/maybe-handles.h"
9

10
#include "src/handles/handles-inl.h"
11
#include "src/objects/maybe-object-inl.h"
12 13 14

namespace v8 {
namespace internal {
15

16
template <typename T>
17
MaybeHandle<T>::MaybeHandle(T object, Isolate* isolate)
18 19
    : MaybeHandle(handle(object, isolate)) {}

20 21 22 23
template <typename T>
MaybeHandle<T>::MaybeHandle(T object, LocalHeap* local_heap)
    : MaybeHandle(handle(object, local_heap)) {}

24
MaybeObjectHandle::MaybeObjectHandle(MaybeObject object, Isolate* isolate) {
25
  HeapObject heap_object;
26 27
  DCHECK(!object->IsCleared());
  if (object->GetHeapObjectIfWeak(&heap_object)) {
28 29 30
    handle_ = handle(heap_object, isolate);
    reference_type_ = HeapObjectReferenceType::WEAK;
  } else {
31
    handle_ = handle(object->cast<Object>(), isolate);
32 33 34 35
    reference_type_ = HeapObjectReferenceType::STRONG;
  }
}

36 37 38 39 40 41 42 43 44 45 46 47 48
MaybeObjectHandle::MaybeObjectHandle(MaybeObject object,
                                     LocalHeap* local_heap) {
  HeapObject heap_object;
  DCHECK(!object->IsCleared());
  if (object->GetHeapObjectIfWeak(&heap_object)) {
    handle_ = handle(heap_object, local_heap);
    reference_type_ = HeapObjectReferenceType::WEAK;
  } else {
    handle_ = handle(object->cast<Object>(), local_heap);
    reference_type_ = HeapObjectReferenceType::STRONG;
  }
}

49 50 51
MaybeObjectHandle::MaybeObjectHandle(Handle<Object> object)
    : reference_type_(HeapObjectReferenceType::STRONG), handle_(object) {}

52
MaybeObjectHandle::MaybeObjectHandle(Object object, Isolate* isolate)
53 54 55
    : reference_type_(HeapObjectReferenceType::STRONG),
      handle_(object, isolate) {}

56 57 58 59
MaybeObjectHandle::MaybeObjectHandle(Object object, LocalHeap* local_heap)
    : reference_type_(HeapObjectReferenceType::STRONG),
      handle_(object, local_heap) {}

60
MaybeObjectHandle::MaybeObjectHandle(Object object,
61 62 63 64 65 66 67 68 69 70 71 72
                                     HeapObjectReferenceType reference_type,
                                     Isolate* isolate)
    : reference_type_(reference_type), handle_(handle(object, isolate)) {}

MaybeObjectHandle::MaybeObjectHandle(Handle<Object> object,
                                     HeapObjectReferenceType reference_type)
    : reference_type_(reference_type), handle_(object) {}

MaybeObjectHandle MaybeObjectHandle::Weak(Handle<Object> object) {
  return MaybeObjectHandle(object, HeapObjectReferenceType::WEAK);
}

73
MaybeObjectHandle MaybeObjectHandle::Weak(Object object, Isolate* isolate) {
74 75 76
  return MaybeObjectHandle(object, HeapObjectReferenceType::WEAK, isolate);
}

77 78 79 80 81 82 83 84 85
bool MaybeObjectHandle::is_identical_to(const MaybeObjectHandle& other) const {
  Handle<Object> this_handle;
  Handle<Object> other_handle;
  return reference_type_ == other.reference_type_ &&
         handle_.ToHandle(&this_handle) ==
             other.handle_.ToHandle(&other_handle) &&
         this_handle.is_identical_to(other_handle);
}

86
MaybeObject MaybeObjectHandle::operator*() const {
87 88 89 90 91 92 93
  if (reference_type_ == HeapObjectReferenceType::WEAK) {
    return HeapObjectReference::Weak(*handle_.ToHandleChecked());
  } else {
    return MaybeObject::FromObject(*handle_.ToHandleChecked());
  }
}

94
MaybeObject MaybeObjectHandle::operator->() const {
95 96 97 98 99 100 101 102 103 104 105
  if (reference_type_ == HeapObjectReferenceType::WEAK) {
    return HeapObjectReference::Weak(*handle_.ToHandleChecked());
  } else {
    return MaybeObject::FromObject(*handle_.ToHandleChecked());
  }
}

Handle<Object> MaybeObjectHandle::object() const {
  return handle_.ToHandleChecked();
}

106
inline MaybeObjectHandle handle(MaybeObject object, Isolate* isolate) {
107 108 109
  return MaybeObjectHandle(object, isolate);
}

110 111 112 113
inline MaybeObjectHandle handle(MaybeObject object, LocalHeap* local_heap) {
  return MaybeObjectHandle(object, local_heap);
}

114 115 116
}  // namespace internal
}  // namespace v8

117
#endif  // V8_HANDLES_MAYBE_HANDLES_INL_H_