2 * Copyright (C) 2013-2015 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. ``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.
27 #include "DFGDesiredWatchpoints.h"
31 #include "ArrayBufferNeuteringWatchpoint.h"
32 #include "CodeBlock.h"
33 #include "JSCInlines.h"
35 namespace JSC
{ namespace DFG
{
37 void ArrayBufferViewWatchpointAdaptor::add(
38 CodeBlock
* codeBlock
, JSArrayBufferView
* view
, Watchpoint
* watchpoint
)
40 ArrayBufferNeuteringWatchpoint
* neuteringWatchpoint
=
41 ArrayBufferNeuteringWatchpoint::create(*codeBlock
->vm());
42 neuteringWatchpoint
->set()->add(watchpoint
);
43 codeBlock
->addConstant(neuteringWatchpoint
);
44 codeBlock
->vm()->heap
.addReference(neuteringWatchpoint
, view
->buffer());
47 void InferredValueAdaptor::add(
48 CodeBlock
* codeBlock
, InferredValue
* inferredValue
, Watchpoint
* watchpoint
)
50 codeBlock
->addConstant(inferredValue
); // For common users, it doesn't really matter if it's weak or not. If references to it go away, we go away, too.
51 inferredValue
->add(watchpoint
);
54 DesiredWatchpoints::DesiredWatchpoints() { }
55 DesiredWatchpoints::~DesiredWatchpoints() { }
57 void DesiredWatchpoints::addLazily(WatchpointSet
* set
)
59 m_sets
.addLazily(set
);
62 void DesiredWatchpoints::addLazily(InlineWatchpointSet
& set
)
64 m_inlineSets
.addLazily(&set
);
67 void DesiredWatchpoints::addLazily(InferredValue
* inferredValue
)
69 m_inferredValues
.addLazily(inferredValue
);
72 void DesiredWatchpoints::addLazily(JSArrayBufferView
* view
)
74 m_bufferViews
.addLazily(view
);
77 bool DesiredWatchpoints::consider(Structure
* structure
)
79 if (!structure
->dfgShouldWatch())
81 addLazily(structure
->transitionWatchpointSet());
85 void DesiredWatchpoints::reallyAdd(CodeBlock
* codeBlock
, CommonData
& commonData
)
87 m_sets
.reallyAdd(codeBlock
, commonData
);
88 m_inlineSets
.reallyAdd(codeBlock
, commonData
);
89 m_inferredValues
.reallyAdd(codeBlock
, commonData
);
90 m_bufferViews
.reallyAdd(codeBlock
, commonData
);
93 bool DesiredWatchpoints::areStillValid() const
95 return m_sets
.areStillValid()
96 && m_inlineSets
.areStillValid()
97 && m_inferredValues
.areStillValid()
98 && m_bufferViews
.areStillValid();
101 } } // namespace JSC::DFG
103 #endif // ENABLE(DFG_JIT)