b26e0a5f383a00a02ebf28e18557923949abf772
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGDoesGC.cpp
1 /*
2  * Copyright (C) 2014, 2015 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 #include "config.h"
27 #include "DFGDoesGC.h"
28
29 #if ENABLE(DFG_JIT)
30
31 #include "DFGClobberize.h"
32 #include "DFGGraph.h"
33 #include "DFGNode.h"
34 #include "Operations.h"
35
36 namespace JSC { namespace DFG {
37
38 bool doesGC(Graph& graph, Node* node)
39 {
40     if (clobbersHeap(graph, node))
41         return true;
42     
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
45     // put them anywhere.
46     switch (node->op()) {
47     case JSConstant:
48     case DoubleConstant:
49     case Int52Constant:
50     case Identity:
51     case GetCallee:
52     case GetArgumentCount:
53     case GetRestLength:
54     case GetLocal:
55     case SetLocal:
56     case MovHint:
57     case ZombieHint:
58     case ExitOK:
59     case Phantom:
60     case Upsilon:
61     case Phi:
62     case Flush:
63     case PhantomLocal:
64     case GetLocalUnlinked:
65     case SetArgument:
66     case BitAnd:
67     case BitOr:
68     case BitXor:
69     case BitLShift:
70     case BitRShift:
71     case BitURShift:
72     case ValueToInt32:
73     case UInt32ToNumber:
74     case DoubleAsInt32:
75     case ArithAdd:
76     case ArithClz32:
77     case ArithSub:
78     case ArithNegate:
79     case ArithMul:
80     case ArithIMul:
81     case ArithDiv:
82     case ArithMod:
83     case ArithAbs:
84     case ArithMin:
85     case ArithMax:
86     case ArithPow:
87     case ArithSqrt:
88     case ArithRound:
89     case ArithFRound:
90     case ArithSin:
91     case ArithCos:
92     case ArithLog:
93     case ValueAdd:
94     case GetById:
95     case GetByIdFlush:
96     case PutById:
97     case PutByIdFlush:
98     case PutByIdDirect:
99     case PutGetterById:
100     case PutSetterById:
101     case PutGetterSetterById:
102     case PutGetterByVal:
103     case PutSetterByVal:
104     case CheckStructure:
105     case GetExecutable:
106     case GetButterfly:
107     case GetButterflyReadOnly:
108     case CheckArray:
109     case GetScope:
110     case LoadArrowFunctionThis:
111     case SkipScope:
112     case GetClosureVar:
113     case PutClosureVar:
114     case GetGlobalVar:
115     case GetGlobalLexicalVariable:
116     case PutGlobalVariable:
117     case VarInjectionWatchpoint:
118     case CheckCell:
119     case CheckNotEmpty:
120     case CheckIdent:
121     case RegExpExec:
122     case RegExpTest:
123     case CompareLess:
124     case CompareLessEq:
125     case CompareGreater:
126     case CompareGreaterEq:
127     case CompareEq:
128     case CompareStrictEq:
129     case Call:
130     case TailCallInlinedCaller:
131     case Construct:
132     case CallVarargs:
133     case TailCallVarargsInlinedCaller:
134     case ConstructVarargs:
135     case LoadVarargs:
136     case CallForwardVarargs:
137     case ConstructForwardVarargs:
138     case TailCallForwardVarargs:
139     case TailCallForwardVarargsInlinedCaller:
140     case Breakpoint:
141     case ProfileWillCall:
142     case ProfileDidCall:
143     case ProfileType:
144     case ProfileControlFlow:
145     case CheckHasInstance:
146     case InstanceOf:
147     case IsUndefined:
148     case IsBoolean:
149     case IsNumber:
150     case IsString:
151     case IsObject:
152     case IsObjectOrNull:
153     case IsFunction:
154     case TypeOf:
155     case LogicalNot:
156     case ToPrimitive:
157     case ToString:
158     case CallStringConstructor:
159     case In:
160     case Jump:
161     case Branch:
162     case Switch:
163     case Return:
164     case TailCall:
165     case TailCallVarargs:
166     case Throw:
167     case CountExecution:
168     case ForceOSRExit:
169     case CheckWatchdogTimer:
170     case StringFromCharCode:
171     case Unreachable:
172     case ExtractOSREntryLocal:
173     case CheckTierUpInLoop:
174     case CheckTierUpAtReturn:
175     case CheckTierUpAndOSREnter:
176     case CheckTierUpWithNestedTriggerAndOSREnter:
177     case LoopHint:
178     case StoreBarrier:
179     case InvalidationPoint:
180     case NotifyWrite:
181     case CheckInBounds:
182     case ConstantStoragePointer:
183     case Check:
184     case MultiGetByOffset:
185     case ValueRep:
186     case DoubleRep:
187     case Int52Rep:
188     case GetGetter:
189     case GetSetter:
190     case GetByVal:
191     case GetIndexedPropertyStorage:
192     case GetArrayLength:
193     case ArrayPush:
194     case ArrayPop:
195     case StringCharAt:
196     case StringCharCodeAt:
197     case GetTypedArrayByteOffset:
198     case PutByValDirect:
199     case PutByVal:
200     case PutByValAlias:
201     case PutStructure:
202     case GetByOffset:
203     case GetGetterSetterByOffset:
204     case PutByOffset:
205     case GetEnumerableLength:
206     case HasGenericProperty:
207     case HasStructureProperty:
208     case HasIndexedProperty:
209     case GetDirectPname:
210     case FiatInt52:
211     case BooleanToNumber:
212     case CheckBadCell:
213     case BottomValue:
214     case PhantomNewObject:
215     case PhantomNewFunction:
216     case PhantomCreateActivation:
217     case PhantomDirectArguments:
218     case PhantomClonedArguments:
219     case GetMyArgumentByVal:
220     case ForwardVarargs:
221     case PutHint:
222     case CheckStructureImmediate:
223     case PutStack:
224     case KillStack:
225     case GetStack:
226     case GetFromArguments:
227     case PutToArguments:
228     case CopyRest:
229         return false;
230
231     case CreateActivation:
232     case CreateDirectArguments:
233     case CreateScopedArguments:
234     case CreateClonedArguments:
235     case ToThis:
236     case CreateThis:
237     case AllocatePropertyStorage:
238     case ReallocatePropertyStorage:
239     case Arrayify:
240     case ArrayifyToStructure:
241     case NewObject:
242     case NewArray:
243     case NewArrayWithSize:
244     case NewArrayBuffer:
245     case NewRegexp:
246     case NewStringObject:
247     case MakeRope:
248     case NewArrowFunction:
249     case NewFunction:
250     case NewTypedArray:
251     case ThrowReferenceError:
252     case GetPropertyEnumerator:
253     case GetEnumeratorStructurePname:
254     case GetEnumeratorGenericPname:
255     case ToIndexString:
256     case MaterializeNewObject:
257     case MaterializeCreateActivation:
258     case StrCat:
259         return true;
260         
261     case MultiPutByOffset:
262         return node->multiPutByOffsetData().reallocatesStorage();
263
264     case LastNodeType:
265         RELEASE_ASSERT_NOT_REACHED();
266         return true;
267     }
268     
269     RELEASE_ASSERT_NOT_REACHED();
270     return true;
271 }
272
273 } } // namespace JSC::DFG
274
275 #endif // ENABLE(DFG_JIT)