1/*
2 * Copyright (C) 2016-2019 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#include "CellContainer.h"
29#include "HeapCell.h"
30#include "PreciseAllocation.h"
31#include "VM.h"
32
33namespace JSC {
34
35ALWAYS_INLINE bool HeapCell::isPreciseAllocation() const
36{
37 return PreciseAllocation::isPreciseAllocation(const_cast<HeapCell*>(this));
38}
39
40ALWAYS_INLINE CellContainer HeapCell::cellContainer() const
41{
42 if (isPreciseAllocation())
43 return preciseAllocation();
44 return markedBlock();
45}
46
47ALWAYS_INLINE MarkedBlock& HeapCell::markedBlock() const
48{
49 return *MarkedBlock::blockFor(this);
50}
51
52ALWAYS_INLINE PreciseAllocation& HeapCell::preciseAllocation() const
53{
54 return *PreciseAllocation::fromCell(const_cast<HeapCell*>(this));
55}
56
57ALWAYS_INLINE Heap* HeapCell::heap() const
58{
59 return &vm().heap;
60}
61
62ALWAYS_INLINE VM& HeapCell::vm() const
63{
64 if (isPreciseAllocation())
65 return preciseAllocation().vm();
66 return markedBlock().vm();
67}
68
69ALWAYS_INLINE size_t HeapCell::cellSize() const
70{
71 if (isPreciseAllocation())
72 return preciseAllocation().cellSize();
73 return markedBlock().cellSize();
74}
75
76ALWAYS_INLINE CellAttributes HeapCell::cellAttributes() const
77{
78 if (isPreciseAllocation())
79 return preciseAllocation().attributes();
80 return markedBlock().attributes();
81}
82
83ALWAYS_INLINE DestructionMode HeapCell::destructionMode() const
84{
85 return cellAttributes().destruction;
86}
87
88ALWAYS_INLINE HeapCell::Kind HeapCell::cellKind() const
89{
90 return cellAttributes().cellKind;
91}
92
93ALWAYS_INLINE Subspace* HeapCell::subspace() const
94{
95 if (isPreciseAllocation())
96 return preciseAllocation().subspace();
97 return markedBlock().subspace();
98}
99
100} // namespace JSC
101
102