[JSC] Handle new_async_func / new_async_func_exp in DFG / FTL
[WebKit-https.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 ArithTan:
98     case ArithLog:
99     case ValueAdd:
100     case TryGetById:
101     case GetById:
102     case GetByIdFlush:
103     case GetByIdWithThis:
104     case PutById:
105     case PutByIdFlush:
106     case PutByIdWithThis:
107     case PutByValWithThis:
108     case PutByIdDirect:
109     case PutGetterById:
110     case PutSetterById:
111     case PutGetterSetterById:
112     case PutGetterByVal:
113     case PutSetterByVal:
114     case DefineDataProperty:
115     case DefineAccessorProperty:
116     case DeleteById:
117     case DeleteByVal:
118     case CheckStructure:
119     case GetExecutable:
120     case GetButterfly:
121     case CheckDOM:
122     case CheckArray:
123     case GetScope:
124     case SkipScope:
125     case GetGlobalObject:
126     case GetClosureVar:
127     case PutClosureVar:
128     case GetRegExpObjectLastIndex:
129     case SetRegExpObjectLastIndex:
130     case RecordRegExpCachedResult:
131     case GetGlobalVar:
132     case GetGlobalLexicalVariable:
133     case PutGlobalVariable:
134     case CheckCell:
135     case CheckNotEmpty:
136     case CheckStringIdent:
137     case RegExpExec:
138     case RegExpTest:
139     case CompareLess:
140     case CompareLessEq:
141     case CompareGreater:
142     case CompareGreaterEq:
143     case CompareEq:
144     case CompareStrictEq:
145     case CompareEqPtr:
146     case Call:
147     case DirectCall:
148     case TailCallInlinedCaller:
149     case DirectTailCallInlinedCaller:
150     case Construct:
151     case DirectConstruct:
152     case CallVarargs:
153     case CallEval:
154     case TailCallVarargsInlinedCaller:
155     case ConstructVarargs:
156     case LoadVarargs:
157     case CallForwardVarargs:
158     case ConstructForwardVarargs:
159     case TailCallForwardVarargs:
160     case TailCallForwardVarargsInlinedCaller:
161     case ProfileType:
162     case ProfileControlFlow:
163     case OverridesHasInstance:
164     case InstanceOf:
165     case InstanceOfCustom:
166     case IsEmpty:
167     case IsUndefined:
168     case IsBoolean:
169     case IsNumber:
170     case IsObject:
171     case IsObjectOrNull:
172     case IsFunction:
173     case IsCellWithType:
174     case IsTypedArrayView:
175     case TypeOf:
176     case LogicalNot:
177     case ToPrimitive:
178     case ToNumber:
179     case ToString:
180     case CallStringConstructor:
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 CheckWatchdogTimer:
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 ArrayPush:
224     case ArrayPop:
225     case StringCharAt:
226     case StringCharCodeAt:
227     case GetTypedArrayByteOffset:
228     case PutByValDirect:
229     case PutByVal:
230     case PutByValAlias:
231     case PutStructure:
232     case GetByOffset:
233     case GetGetterSetterByOffset:
234     case PutByOffset:
235     case GetEnumerableLength:
236     case HasGenericProperty:
237     case HasStructureProperty:
238     case HasIndexedProperty:
239     case GetDirectPname:
240     case FiatInt52:
241     case BooleanToNumber:
242     case CheckBadCell:
243     case BottomValue:
244     case PhantomNewObject:
245     case PhantomNewFunction:
246     case PhantomNewGeneratorFunction:
247     case PhantomNewAsyncFunction:
248     case PhantomCreateActivation:
249     case PhantomDirectArguments:
250     case PhantomCreateRest:
251     case PhantomClonedArguments:
252     case GetMyArgumentByVal:
253     case GetMyArgumentByValOutOfBounds:
254     case ForwardVarargs:
255     case PutHint:
256     case CheckStructureImmediate:
257     case PutStack:
258     case KillStack:
259     case GetStack:
260     case GetFromArguments:
261     case PutToArguments:
262     case GetArgument:
263     case LogShadowChickenPrologue:
264     case LogShadowChickenTail:
265     case GetDynamicVar:
266     case PutDynamicVar:
267     case ResolveScope:
268         return false;
269
270     case CreateActivation:
271     case CreateDirectArguments:
272     case CreateScopedArguments:
273     case CreateClonedArguments:
274     case CallObjectConstructor:
275     case ToThis:
276     case CreateThis:
277     case AllocatePropertyStorage:
278     case ReallocatePropertyStorage:
279     case Arrayify:
280     case ArrayifyToStructure:
281     case NewObject:
282     case NewArray:
283     case NewArrayWithSpread:
284     case Spread:
285     case NewArrayWithSize:
286     case NewArrayBuffer:
287     case NewRegexp:
288     case NewStringObject:
289     case MakeRope:
290     case NewFunction:
291     case NewGeneratorFunction:
292     case NewAsyncFunction:
293     case NewTypedArray:
294     case ThrowStaticError:
295     case GetPropertyEnumerator:
296     case GetEnumeratorStructurePname:
297     case GetEnumeratorGenericPname:
298     case ToIndexString:
299     case MaterializeNewObject:
300     case MaterializeCreateActivation:
301     case SetFunctionName:
302     case StrCat:
303     case StringReplace:
304     case StringReplaceRegExp:
305     case CreateRest:
306     case ToLowerCase:
307     case CallDOMGetter:
308     case CallDOM:
309         return true;
310         
311     case MultiPutByOffset:
312         return node->multiPutByOffsetData().reallocatesStorage();
313
314     case LastNodeType:
315         RELEASE_ASSERT_NOT_REACHED();
316         return true;
317     }
318     
319     RELEASE_ASSERT_NOT_REACHED();
320     return true;
321 }
322
323 } } // namespace JSC::DFG
324
325 #endif // ENABLE(DFG_JIT)