caf30e36a26004606e5e1e15acdf2182c1887d36
[WebKit.git] / Source / JavaScriptCore / dfg / DFGDoesGC.cpp
1 /*
2  * Copyright (C) 2014-2016 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 LazyJSConstant:
51     case Identity:
52     case GetCallee:
53     case GetArgumentCountIncludingThis:
54     case GetRestLength:
55     case GetLocal:
56     case SetLocal:
57     case MovHint:
58     case ZombieHint:
59     case ExitOK:
60     case Phantom:
61     case Upsilon:
62     case Phi:
63     case Flush:
64     case PhantomLocal:
65     case GetLocalUnlinked:
66     case SetArgument:
67     case BitAnd:
68     case BitOr:
69     case BitXor:
70     case BitLShift:
71     case BitRShift:
72     case BitURShift:
73     case ValueToInt32:
74     case UInt32ToNumber:
75     case DoubleAsInt32:
76     case ArithAdd:
77     case ArithClz32:
78     case ArithSub:
79     case ArithNegate:
80     case ArithMul:
81     case ArithIMul:
82     case ArithDiv:
83     case ArithMod:
84     case ArithAbs:
85     case ArithMin:
86     case ArithMax:
87     case ArithPow:
88     case ArithSqrt:
89     case ArithRandom:
90     case ArithRound:
91     case ArithFloor:
92     case ArithCeil:
93     case ArithTrunc:
94     case ArithFRound:
95     case ArithSin:
96     case ArithCos:
97     case ArithLog:
98     case ValueAdd:
99     case TryGetById:
100     case GetById:
101     case GetByIdFlush:
102     case GetByIdWithThis:
103     case PutById:
104     case PutByIdFlush:
105     case PutByIdWithThis:
106     case PutByValWithThis:
107     case PutByIdDirect:
108     case PutGetterById:
109     case PutSetterById:
110     case PutGetterSetterById:
111     case PutGetterByVal:
112     case PutSetterByVal:
113     case DeleteById:
114     case DeleteByVal:
115     case CheckStructure:
116     case GetExecutable:
117     case GetButterfly:
118     case CheckArray:
119     case GetScope:
120     case SkipScope:
121     case GetGlobalObject:
122     case GetClosureVar:
123     case PutClosureVar:
124     case GetRegExpObjectLastIndex:
125     case SetRegExpObjectLastIndex:
126     case RecordRegExpCachedResult:
127     case GetGlobalVar:
128     case GetGlobalLexicalVariable:
129     case PutGlobalVariable:
130     case VarInjectionWatchpoint:
131     case CheckCell:
132     case CheckNotEmpty:
133     case CheckIdent:
134     case RegExpExec:
135     case RegExpTest:
136     case CompareLess:
137     case CompareLessEq:
138     case CompareGreater:
139     case CompareGreaterEq:
140     case CompareEq:
141     case CompareStrictEq:
142     case Call:
143     case TailCallInlinedCaller:
144     case Construct:
145     case CallVarargs:
146     case TailCallVarargsInlinedCaller:
147     case ConstructVarargs:
148     case LoadVarargs:
149     case CallForwardVarargs:
150     case ConstructForwardVarargs:
151     case TailCallForwardVarargs:
152     case TailCallForwardVarargsInlinedCaller:
153     case ProfileType:
154     case ProfileControlFlow:
155     case OverridesHasInstance:
156     case InstanceOf:
157     case InstanceOfCustom:
158     case IsJSArray:
159     case IsEmpty:
160     case IsUndefined:
161     case IsBoolean:
162     case IsNumber:
163     case IsString:
164     case IsObject:
165     case IsObjectOrNull:
166     case IsFunction:
167     case IsRegExpObject:
168     case IsTypedArrayView:
169     case TypeOf:
170     case LogicalNot:
171     case ToPrimitive:
172     case ToNumber:
173     case ToString:
174     case CallStringConstructor:
175     case In:
176     case Jump:
177     case Branch:
178     case Switch:
179     case Return:
180     case TailCall:
181     case TailCallVarargs:
182     case Throw:
183     case CountExecution:
184     case ForceOSRExit:
185     case CheckWatchdogTimer:
186     case StringFromCharCode:
187     case Unreachable:
188     case ExtractOSREntryLocal:
189     case CheckTierUpInLoop:
190     case CheckTierUpAtReturn:
191     case CheckTierUpAndOSREnter:
192     case LoopHint:
193     case StoreBarrier:
194     case InvalidationPoint:
195     case NotifyWrite:
196     case CheckInBounds:
197     case ConstantStoragePointer:
198     case Check:
199     case CheckTypeInfoFlags:
200     case MultiGetByOffset:
201     case ValueRep:
202     case DoubleRep:
203     case Int52Rep:
204     case GetGetter:
205     case GetSetter:
206     case GetByVal:
207     case GetByValWithThis:
208     case GetIndexedPropertyStorage:
209     case GetArrayLength:
210     case ArrayPush:
211     case ArrayPop:
212     case StringCharAt:
213     case StringCharCodeAt:
214     case GetTypedArrayByteOffset:
215     case PutByValDirect:
216     case PutByVal:
217     case PutByValAlias:
218     case PutStructure:
219     case GetByOffset:
220     case GetGetterSetterByOffset:
221     case PutByOffset:
222     case GetEnumerableLength:
223     case HasGenericProperty:
224     case HasStructureProperty:
225     case HasIndexedProperty:
226     case GetDirectPname:
227     case FiatInt52:
228     case BooleanToNumber:
229     case CheckBadCell:
230     case BottomValue:
231     case PhantomNewObject:
232     case PhantomNewFunction:
233     case PhantomNewGeneratorFunction:
234     case PhantomCreateActivation:
235     case PhantomDirectArguments:
236     case PhantomClonedArguments:
237     case GetMyArgumentByVal:
238     case GetMyArgumentByValOutOfBounds:
239     case ForwardVarargs:
240     case PutHint:
241     case CheckStructureImmediate:
242     case PutStack:
243     case KillStack:
244     case GetStack:
245     case GetFromArguments:
246     case PutToArguments:
247     case CopyRest:
248     case LogShadowChickenPrologue:
249     case LogShadowChickenTail:
250     case GetDynamicVar:
251     case PutDynamicVar:
252     case ResolveScope:
253         return false;
254
255     case CreateActivation:
256     case CreateDirectArguments:
257     case CreateScopedArguments:
258     case CreateClonedArguments:
259     case CallObjectConstructor:
260     case ToThis:
261     case CreateThis:
262     case AllocatePropertyStorage:
263     case ReallocatePropertyStorage:
264     case Arrayify:
265     case ArrayifyToStructure:
266     case NewObject:
267     case NewArray:
268     case NewArrayWithSize:
269     case NewArrayBuffer:
270     case NewRegexp:
271     case NewStringObject:
272     case MakeRope:
273     case NewFunction:
274     case NewGeneratorFunction:
275     case NewTypedArray:
276     case ThrowReferenceError:
277     case GetPropertyEnumerator:
278     case GetEnumeratorStructurePname:
279     case GetEnumeratorGenericPname:
280     case ToIndexString:
281     case MaterializeNewObject:
282     case MaterializeCreateActivation:
283     case SetFunctionName:
284     case StrCat:
285     case StringReplace:
286     case StringReplaceRegExp:
287         return true;
288         
289     case MultiPutByOffset:
290         return node->multiPutByOffsetData().reallocatesStorage();
291
292     case LastNodeType:
293         RELEASE_ASSERT_NOT_REACHED();
294         return true;
295     }
296     
297     RELEASE_ASSERT_NOT_REACHED();
298     return true;
299 }
300
301 } } // namespace JSC::DFG
302
303 #endif // ENABLE(DFG_JIT)