d718b4d82e43a2124fbf60661d0a25b59e76dc55
[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 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 IsEmpty:
159     case IsUndefined:
160     case IsBoolean:
161     case IsNumber:
162     case IsString:
163     case IsObject:
164     case IsObjectOrNull:
165     case IsFunction:
166     case IsRegExpObject:
167     case TypeOf:
168     case LogicalNot:
169     case ToPrimitive:
170     case ToString:
171     case CallStringConstructor:
172     case In:
173     case Jump:
174     case Branch:
175     case Switch:
176     case Return:
177     case TailCall:
178     case TailCallVarargs:
179     case Throw:
180     case CountExecution:
181     case ForceOSRExit:
182     case CheckWatchdogTimer:
183     case StringFromCharCode:
184     case Unreachable:
185     case ExtractOSREntryLocal:
186     case CheckTierUpInLoop:
187     case CheckTierUpAtReturn:
188     case CheckTierUpAndOSREnter:
189     case LoopHint:
190     case StoreBarrier:
191     case InvalidationPoint:
192     case NotifyWrite:
193     case CheckInBounds:
194     case ConstantStoragePointer:
195     case Check:
196     case CheckTypeInfoFlags:
197     case MultiGetByOffset:
198     case ValueRep:
199     case DoubleRep:
200     case Int52Rep:
201     case GetGetter:
202     case GetSetter:
203     case GetByVal:
204     case GetByValWithThis:
205     case GetIndexedPropertyStorage:
206     case GetArrayLength:
207     case ArrayPush:
208     case ArrayPop:
209     case StringCharAt:
210     case StringCharCodeAt:
211     case GetTypedArrayByteOffset:
212     case PutByValDirect:
213     case PutByVal:
214     case PutByValAlias:
215     case PutStructure:
216     case GetByOffset:
217     case GetGetterSetterByOffset:
218     case PutByOffset:
219     case GetEnumerableLength:
220     case HasGenericProperty:
221     case HasStructureProperty:
222     case HasIndexedProperty:
223     case GetDirectPname:
224     case FiatInt52:
225     case BooleanToNumber:
226     case CheckBadCell:
227     case BottomValue:
228     case PhantomNewObject:
229     case PhantomNewFunction:
230     case PhantomNewGeneratorFunction:
231     case PhantomCreateActivation:
232     case PhantomDirectArguments:
233     case PhantomClonedArguments:
234     case GetMyArgumentByVal:
235     case GetMyArgumentByValOutOfBounds:
236     case ForwardVarargs:
237     case PutHint:
238     case CheckStructureImmediate:
239     case PutStack:
240     case KillStack:
241     case GetStack:
242     case GetFromArguments:
243     case PutToArguments:
244     case CopyRest:
245     case LogShadowChickenPrologue:
246     case LogShadowChickenTail:
247     case GetDynamicVar:
248     case PutDynamicVar:
249     case ResolveScope:
250         return false;
251
252     case CreateActivation:
253     case CreateDirectArguments:
254     case CreateScopedArguments:
255     case CreateClonedArguments:
256     case ToThis:
257     case CreateThis:
258     case AllocatePropertyStorage:
259     case ReallocatePropertyStorage:
260     case Arrayify:
261     case ArrayifyToStructure:
262     case NewObject:
263     case NewArray:
264     case NewArrayWithSize:
265     case NewArrayBuffer:
266     case NewRegexp:
267     case NewStringObject:
268     case MakeRope:
269     case NewFunction:
270     case NewGeneratorFunction:
271     case NewTypedArray:
272     case ThrowReferenceError:
273     case GetPropertyEnumerator:
274     case GetEnumeratorStructurePname:
275     case GetEnumeratorGenericPname:
276     case ToIndexString:
277     case MaterializeNewObject:
278     case MaterializeCreateActivation:
279     case SetFunctionName:
280     case StrCat:
281     case StringReplace:
282     case StringReplaceRegExp:
283         return true;
284         
285     case MultiPutByOffset:
286         return node->multiPutByOffsetData().reallocatesStorage();
287
288     case LastNodeType:
289         RELEASE_ASSERT_NOT_REACHED();
290         return true;
291     }
292     
293     RELEASE_ASSERT_NOT_REACHED();
294     return true;
295 }
296
297 } } // namespace JSC::DFG
298
299 #endif // ENABLE(DFG_JIT)