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 <wtf/StdLibExtras.h>
29
30namespace JSC {
31
32class Heap;
33class HeapCell;
34class PreciseAllocation;
35class MarkedBlock;
36class WeakSet;
37class VM;
38
39typedef uint32_t HeapVersion;
40
41// This is how we abstract over either MarkedBlock& or PreciseAllocation&. Put things in here as you
42// find need for them.
43
44class CellContainer {
45public:
46 CellContainer()
47 : m_encodedPointer(0)
48 {
49 }
50
51 CellContainer(MarkedBlock& markedBlock)
52 : m_encodedPointer(bitwise_cast<uintptr_t>(&markedBlock))
53 {
54 }
55
56 CellContainer(PreciseAllocation& preciseAllocation)
57 : m_encodedPointer(bitwise_cast<uintptr_t>(&preciseAllocation) | isPreciseAllocationBit)
58 {
59 }
60
61 VM& vm() const;
62 Heap* heap() const;
63
64 explicit operator bool() const { return !!m_encodedPointer; }
65
66 bool isMarkedBlock() const { return m_encodedPointer && !(m_encodedPointer & isPreciseAllocationBit); }
67 bool isPreciseAllocation() const { return m_encodedPointer & isPreciseAllocationBit; }
68
69 MarkedBlock& markedBlock() const
70 {
71 ASSERT(isMarkedBlock());
72 return *bitwise_cast<MarkedBlock*>(m_encodedPointer);
73 }
74
75 PreciseAllocation& preciseAllocation() const
76 {
77 ASSERT(isPreciseAllocation());
78 return *bitwise_cast<PreciseAllocation*>(m_encodedPointer - isPreciseAllocationBit);
79 }
80
81 void aboutToMark(HeapVersion markingVersion);
82 bool areMarksStale() const;
83
84 bool isMarked(HeapCell*) const;
85 bool isMarked(HeapVersion markingVersion, HeapCell*) const;
86
87 bool isNewlyAllocated(HeapCell*) const;
88
89 void noteMarked();
90 void assertValidCell(VM&, HeapCell*) const;
91
92 size_t cellSize() const;
93
94 WeakSet& weakSet() const;
95
96private:
97 static constexpr uintptr_t isPreciseAllocationBit = 1;
98 uintptr_t m_encodedPointer;
99};
100
101} // namespace JSC
102
103