2
* Copyright (C) 2011 Apple Inc. All rights reserved.
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions
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.
13
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23
* THE POSSIBILITY OF SUCH DAMAGE.
27
#include "HandleSet.h"
29
#include "HeapRootVisitor.h"
34
HandleSet::HandleSet(JSGlobalData* globalData)
35
: m_globalData(globalData)
41
void HandleSet::grow()
43
Node* block = m_blockStack.grow();
44
for (int i = m_blockStack.blockLength - 1; i >= 0; --i) {
45
Node* node = &block[i];
46
new (NotNull, node) Node(this);
47
m_freeList.push(node);
51
void HandleSet::visitStrongHandles(HeapRootVisitor& heapRootVisitor)
53
Node* end = m_strongList.end();
54
for (Node* node = m_strongList.begin(); node != end; node = node->next()) {
55
#if ENABLE(GC_VALIDATION)
56
if (!isLiveNode(node))
59
heapRootVisitor.visit(node->slot());
63
void HandleSet::writeBarrier(HandleSlot slot, const JSValue& value)
65
// Forbid assignment to handles during the finalization phase, since it would violate many GC invariants.
66
// File a bug with stack trace if you hit this.
70
if (!value == !*slot && slot->isCell() == value.isCell())
73
Node* node = toNode(slot);
74
#if ENABLE(GC_VALIDATION)
75
if (!isLiveNode(node))
78
SentinelLinkedList<Node>::remove(node);
79
if (!value || !value.isCell()) {
80
m_immediateList.push(node);
84
m_strongList.push(node);
85
#if ENABLE(GC_VALIDATION)
86
if (!isLiveNode(node))
91
unsigned HandleSet::protectedGlobalObjectCount()
94
Node* end = m_strongList.end();
95
for (Node* node = m_strongList.begin(); node != end; node = node->next()) {
96
JSValue value = *node->slot();
97
if (value.isObject() && asObject(value.asCell())->isGlobalObject())
103
#if ENABLE(GC_VALIDATION) || !ASSERT_DISABLED
104
bool HandleSet::isLiveNode(Node* node)
106
if (node->prev()->next() != node)
108
if (node->next()->prev() != node)