d81978b76c96dc5dea9cfab84d6eca34efae018d
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGDoesGC.cpp
1 /*
2  * Copyright (C) 2014 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 "DFGGraph.h"
32 #include "DFGNode.h"
33 #include "Operations.h"
34
35 namespace JSC { namespace DFG {
36
37 bool doesGC(Graph& graph, Node* node)
38 {
39     if (graph.clobbersWorld(node))
40         return true;
41     
42     // Now consider nodes that don't clobber the world but that still may GC. This includes all
43     // nodes. By convention we put world-clobbering nodes in the block of "false" cases but we can
44     // put them anywhere.
45     switch (node->op()) {
46     case JSConstant:
47     case DoubleConstant:
48     case Int52Constant:
49     case Identity:
50     case GetCallee:
51     case GetLocal:
52     case SetLocal:
53     case MovHint:
54     case ZombieHint:
55     case GetArgument:
56     case Phantom:
57     case HardPhantom:
58     case Upsilon:
59     case Phi:
60     case Flush:
61     case PhantomLocal:
62     case GetLocalUnlinked:
63     case SetArgument:
64     case BitAnd:
65     case BitOr:
66     case BitXor:
67     case BitLShift:
68     case BitRShift:
69     case BitURShift:
70     case ValueToInt32:
71     case UInt32ToNumber:
72     case DoubleAsInt32:
73     case ArithAdd:
74     case ArithSub:
75     case ArithNegate:
76     case ArithMul:
77     case ArithIMul:
78     case ArithDiv:
79     case ArithMod:
80     case ArithAbs:
81     case ArithMin:
82     case ArithMax:
83     case ArithSqrt:
84     case ArithFRound:
85     case ArithSin:
86     case ArithCos:
87     case ValueAdd:
88     case GetById:
89     case GetByIdFlush:
90     case PutById:
91     case PutByIdFlush:
92     case PutByIdDirect:
93     case CheckStructure:
94     case GetExecutable:
95     case GetButterfly:
96     case CheckArray:
97     case GetScope:
98     case GetMyScope:
99     case SkipScope:
100     case GetClosureRegisters:
101     case GetClosureVar:
102     case PutClosureVar:
103     case GetGlobalVar:
104     case PutGlobalVar:
105     case VariableWatchpoint:
106     case VarInjectionWatchpoint:
107     case CheckCell:
108     case AllocationProfileWatchpoint:
109     case RegExpExec:
110     case RegExpTest:
111     case CompareLess:
112     case CompareLessEq:
113     case CompareGreater:
114     case CompareGreaterEq:
115     case CompareEq:
116     case CompareEqConstant:
117     case CompareStrictEq:
118     case Call:
119     case Construct:
120     case NativeCall:
121     case NativeConstruct:
122     case ProfiledCall:
123     case ProfiledConstruct:
124     case Breakpoint:
125     case ProfileWillCall:
126     case ProfileDidCall:
127     case CheckHasInstance:
128     case InstanceOf:
129     case IsUndefined:
130     case IsBoolean:
131     case IsNumber:
132     case IsString:
133     case IsObject:
134     case IsFunction:
135     case TypeOf:
136     case LogicalNot:
137     case ToPrimitive:
138     case ToString:
139     case In:
140     case TearOffActivation:
141     case PhantomArguments:
142     case TearOffArguments:
143     case GetMyArgumentsLength:
144     case GetMyArgumentByVal:
145     case GetMyArgumentsLengthSafe:
146     case GetMyArgumentByValSafe:
147     case CheckArgumentsNotCreated:
148     case Jump:
149     case Branch:
150     case Switch:
151     case Return:
152     case Throw:
153     case CountExecution:
154     case ForceOSRExit:
155     case CheckWatchdogTimer:
156     case StringFromCharCode:
157     case Unreachable:
158     case ExtractOSREntryLocal:
159     case CheckTierUpInLoop:
160     case CheckTierUpAtReturn:
161     case CheckTierUpAndOSREnter:
162     case LoopHint:
163     case StoreBarrier:
164     case StoreBarrierWithNullCheck:
165     case InvalidationPoint:
166     case NotifyWrite:
167     case FunctionReentryWatchpoint:
168     case TypedArrayWatchpoint:
169     case CheckInBounds:
170     case ConstantStoragePointer:
171     case Check:
172     case MultiGetByOffset:
173     case ValueRep:
174     case DoubleRep:
175     case Int52Rep:
176     case GetGetter:
177     case GetSetter:
178     case GetByVal:
179     case GetIndexedPropertyStorage:
180     case GetArrayLength:
181     case ArrayPush:
182     case ArrayPop:
183     case StringCharAt:
184     case StringCharCodeAt:
185     case GetTypedArrayByteOffset:
186     case PutByValDirect:
187     case PutByVal:
188     case PutByValAlias:
189     case PutStructure:
190     case GetByOffset:
191     case GetGetterSetterByOffset:
192     case PutByOffset:
193     case GetEnumerableLength:
194     case HasGenericProperty:
195     case HasStructureProperty:
196     case HasIndexedProperty:
197     case GetDirectPname:
198     case FiatInt52:
199     case BooleanToNumber:
200     case CheckBadCell:
201     case BottomValue:
202     case PhantomNewObject:
203     case PutByOffsetHint:
204     case CheckStructureImmediate:
205     case PutStructureHint:
206     case PutLocal:
207     case KillLocal:
208         return false;
209
210     case CreateActivation:
211     case CreateArguments:
212     case ToThis:
213     case CreateThis:
214     case AllocatePropertyStorage:
215     case ReallocatePropertyStorage:
216     case Arrayify:
217     case ArrayifyToStructure:
218     case NewObject:
219     case NewArray:
220     case NewArrayWithSize:
221     case NewArrayBuffer:
222     case NewRegexp:
223     case NewStringObject:
224     case MakeRope:
225     case NewFunctionNoCheck:
226     case NewFunction:
227     case NewFunctionExpression:
228     case NewTypedArray:
229     case ThrowReferenceError:
230     case GetStructurePropertyEnumerator:
231     case GetGenericPropertyEnumerator:
232     case GetEnumeratorPname:
233     case ToIndexString:
234     case MaterializeNewObject:
235         return true;
236         
237     case MultiPutByOffset:
238         return node->multiPutByOffsetData().reallocatesStorage();
239
240     case LastNodeType:
241         RELEASE_ASSERT_NOT_REACHED();
242         return true;
243     }
244     
245     RELEASE_ASSERT_NOT_REACHED();
246     return true;
247 }
248
249 } } // namespace JSC::DFG
250
251 #endif // ENABLE(DFG_JIT)