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