2 * Copyright (C) 2013, 2014 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 "DFGDesiredWriteBarriers.h"
31 #include "CodeBlock.h"
32 #include "JSCInlines.h"
34 namespace JSC
{ namespace DFG
{
36 DesiredWriteBarrier::DesiredWriteBarrier(Type type
, CodeBlock
* codeBlock
, unsigned index
, JSCell
* owner
)
39 , m_codeBlock(codeBlock
)
41 m_which
.index
= index
;
44 DesiredWriteBarrier::DesiredWriteBarrier(Type type
, CodeBlock
* codeBlock
, InlineCallFrame
* inlineCallFrame
, JSCell
* owner
)
47 , m_codeBlock(codeBlock
)
49 m_which
.inlineCallFrame
= inlineCallFrame
;
52 void DesiredWriteBarrier::trigger(VM
& vm
)
56 WriteBarrier
<Unknown
>& barrier
= m_codeBlock
->constants()[m_which
.index
];
57 barrier
.set(vm
, m_owner
, barrier
.get());
61 case InlineCallFrameExecutableType
: {
62 InlineCallFrame
* inlineCallFrame
= m_which
.inlineCallFrame
;
63 WriteBarrier
<ScriptExecutable
>& executable
= inlineCallFrame
->executable
;
64 executable
.set(vm
, m_owner
, executable
.get());
67 RELEASE_ASSERT_NOT_REACHED();
70 void DesiredWriteBarrier::visitChildren(SlotVisitor
& visitor
)
74 WriteBarrier
<Unknown
>& barrier
= m_codeBlock
->constants()[m_which
.index
];
75 visitor
.append(&barrier
);
79 case InlineCallFrameExecutableType
: {
80 InlineCallFrame
* inlineCallFrame
= m_which
.inlineCallFrame
;
81 WriteBarrier
<ScriptExecutable
>& executable
= inlineCallFrame
->executable
;
82 visitor
.append(&executable
);
85 RELEASE_ASSERT_NOT_REACHED();
88 DesiredWriteBarriers::DesiredWriteBarriers()
92 DesiredWriteBarriers::~DesiredWriteBarriers()
96 void DesiredWriteBarriers::trigger(VM
& vm
)
98 for (unsigned i
= 0; i
< m_barriers
.size(); i
++)
99 m_barriers
[i
].trigger(vm
);
102 void DesiredWriteBarriers::visitChildren(SlotVisitor
& visitor
)
104 for (unsigned i
= 0; i
< m_barriers
.size(); i
++)
105 m_barriers
[i
].visitChildren(visitor
);
108 } } // namespace JSC::DFG
110 #endif // ENABLE(DFG_JIT)