2 * Copyright (C) 2014, 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 "DFGDoesGC.h"
31 #include "DFGClobberize.h"
34 #include "Operations.h"
36 namespace JSC
{ namespace DFG
{
38 bool doesGC(Graph
& graph
, Node
* node
)
40 if (clobbersHeap(graph
, node
))
43 // Now consider nodes that don't clobber the world but that still may GC. This includes all
44 // nodes. By convention we put world-clobbering nodes in the block of "false" cases but we can
52 case GetArgumentCount
:
62 case GetLocalUnlinked
:
107 case VarInjectionWatchpoint
:
115 case CompareGreaterEq
:
117 case CompareEqConstant
:
118 case CompareStrictEq
:
122 case ConstructVarargs
:
124 case CallForwardVarargs
:
125 case ConstructForwardVarargs
:
127 case NativeConstruct
:
129 case ProfileWillCall
:
132 case ProfileControlFlow
:
133 case CheckHasInstance
:
146 case CallStringConstructor
:
155 case CheckWatchdogTimer
:
156 case StringFromCharCode
:
158 case ExtractOSREntryLocal
:
159 case CheckTierUpInLoop
:
160 case CheckTierUpAtReturn
:
161 case CheckTierUpAndOSREnter
:
162 case CheckTierUpWithNestedTriggerAndOSREnter
:
165 case InvalidationPoint
:
168 case ConstantStoragePointer
:
170 case MultiGetByOffset
:
177 case GetIndexedPropertyStorage
:
182 case StringCharCodeAt
:
183 case GetTypedArrayByteOffset
:
189 case GetGetterSetterByOffset
:
191 case GetEnumerableLength
:
192 case HasGenericProperty
:
193 case HasStructureProperty
:
194 case HasIndexedProperty
:
197 case BooleanToNumber
:
200 case PhantomNewObject
:
201 case PhantomNewFunction
:
202 case PhantomCreateActivation
:
203 case PhantomDirectArguments
:
204 case PhantomClonedArguments
:
205 case GetMyArgumentByVal
:
208 case CheckStructureImmediate
:
212 case GetFromArguments
:
216 case CreateActivation
:
217 case CreateDirectArguments
:
218 case CreateScopedArguments
:
219 case CreateClonedArguments
:
222 case AllocatePropertyStorage
:
223 case ReallocatePropertyStorage
:
225 case ArrayifyToStructure
:
228 case NewArrayWithSize
:
231 case NewStringObject
:
235 case ThrowReferenceError
:
236 case GetPropertyEnumerator
:
237 case GetEnumeratorStructurePname
:
238 case GetEnumeratorGenericPname
:
240 case MaterializeNewObject
:
241 case MaterializeCreateActivation
:
244 case MultiPutByOffset
:
245 return node
->multiPutByOffsetData().reallocatesStorage();
248 RELEASE_ASSERT_NOT_REACHED();
252 RELEASE_ASSERT_NOT_REACHED();
256 } } // namespace JSC::DFG
258 #endif // ENABLE(DFG_JIT)