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