1// Copyright 2021 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_CPPGC_OBJECT_VIEW_H_
6#define V8_HEAP_CPPGC_OBJECT_VIEW_H_
7
8#include "include/v8config.h"
9#include "src/heap/cppgc/globals.h"
10#include "src/heap/cppgc/heap-object-header.h"
11#include "src/heap/cppgc/heap-page.h"
12
13namespace cppgc {
14namespace internal {
15
16// ObjectView allows accessing a header within the bounds of the actual object.
17// It is not exposed externally and does not keep the underlying object alive.
18template <AccessMode = AccessMode::kNonAtomic>
19class ObjectView final {
20 public:
21  V8_INLINE explicit ObjectView(const HeapObjectHeader& header);
22
23  V8_INLINE Address Start() const;
24  V8_INLINE ConstAddress End() const;
25  V8_INLINE size_t Size() const;
26
27 private:
28  const HeapObjectHeader& header_;
29  const BasePage* base_page_;
30  const bool is_large_object_;
31};
32
33template <AccessMode access_mode>
34ObjectView<access_mode>::ObjectView(const HeapObjectHeader& header)
35    : header_(header),
36      base_page_(
37          BasePage::FromPayload(const_cast<HeapObjectHeader*>(&header_))),
38      is_large_object_(header_.IsLargeObject<access_mode>()) {
39  DCHECK_EQ(Start() + Size(), End());
40}
41
42template <AccessMode access_mode>
43Address ObjectView<access_mode>::Start() const {
44  return header_.ObjectStart();
45}
46
47template <AccessMode access_mode>
48ConstAddress ObjectView<access_mode>::End() const {
49  return is_large_object_ ? LargePage::From(base_page_)->PayloadEnd()
50                          : header_.ObjectEnd();
51}
52
53template <AccessMode access_mode>
54size_t ObjectView<access_mode>::Size() const {
55  return is_large_object_ ? LargePage::From(base_page_)->ObjectSize()
56                          : header_.ObjectSize<access_mode>();
57}
58
59}  // namespace internal
60}  // namespace cppgc
61
62#endif  // V8_HEAP_CPPGC_OBJECT_VIEW_H_
63