1// Copyright 2022 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_HEAP_ALLOCATION_RESULT_H_
6#define V8_HEAP_ALLOCATION_RESULT_H_
7
8#include "src/common/globals.h"
9#include "src/objects/heap-object.h"
10#include "src/objects/objects.h"
11#include "src/objects/smi.h"
12
13namespace v8 {
14namespace internal {
15
16enum class AllocationOrigin {
17  kGeneratedCode = 0,
18  kRuntime = 1,
19  kGC = 2,
20  kFirstAllocationOrigin = kGeneratedCode,
21  kLastAllocationOrigin = kGC,
22  kNumberOfAllocationOrigins = kLastAllocationOrigin + 1
23};
24
25// The result of an allocation attempt. Either represents a successful
26// allocation that can be turned into an object or a failed attempt.
27class AllocationResult final {
28 public:
29  static AllocationResult Failure() { return AllocationResult(); }
30
31  static AllocationResult FromObject(HeapObject heap_object) {
32    return AllocationResult(heap_object);
33  }
34
35  // Empty constructor creates a failed result. The callsite determines which
36  // GC to invoke based on the requested allocation.
37  AllocationResult() = default;
38
39  bool IsFailure() const { return object_.is_null(); }
40
41  template <typename T>
42  bool To(T* obj) const {
43    if (IsFailure()) return false;
44    *obj = T::cast(object_);
45    return true;
46  }
47
48  HeapObject ToObjectChecked() const {
49    CHECK(!IsFailure());
50    return HeapObject::cast(object_);
51  }
52
53  HeapObject ToObject() const {
54    DCHECK(!IsFailure());
55    return HeapObject::cast(object_);
56  }
57
58  Address ToAddress() const {
59    DCHECK(!IsFailure());
60    return HeapObject::cast(object_).address();
61  }
62
63 private:
64  explicit AllocationResult(HeapObject heap_object) : object_(heap_object) {}
65
66  HeapObject object_;
67};
68
69STATIC_ASSERT(sizeof(AllocationResult) == kSystemPointerSize);
70
71}  // namespace internal
72}  // namespace v8
73
74#endif  // V8_HEAP_ALLOCATION_RESULT_H_
75