7c6090a782d42084f3dc691856af81fdd1d6fd24
[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 SkipScope:
99     case GetClosureRegisters:
100     case GetClosureVar:
101     case PutClosureVar:
102     case GetGlobalVar:
103     case PutGlobalVar:
104     case VariableWatchpoint:
105     case VarInjectionWatchpoint:
106     case CheckCell:
107     case AllocationProfileWatchpoint:
108     case RegExpExec:
109     case RegExpTest:
110     case CompareLess:
111     case CompareLessEq:
112     case CompareGreater:
113     case CompareGreaterEq:
114     case CompareEq:
115     case CompareEqConstant:
116     case CompareStrictEq:
117     case Call:
118     case Construct:
119     case NativeCall:
120     case NativeConstruct:
121     case Breakpoint:
122     case ProfileWillCall:
123     case ProfileDidCall:
124     case ProfileType:
125     case ProfileControlFlow:
126     case CheckHasInstance:
127     case InstanceOf:
128     case IsUndefined:
129     case IsBoolean:
130     case IsNumber:
131     case IsString:
132     case IsObject:
133     case IsFunction:
134     case TypeOf:
135     case LogicalNot:
136     case ToPrimitive:
137     case ToString:
138     case In:
139     case PhantomArguments:
140     case TearOffArguments:
141     case GetMyArgumentsLength:
142     case GetMyArgumentByVal:
143     case GetMyArgumentsLengthSafe:
144     case GetMyArgumentByValSafe:
145     case CheckArgumentsNotCreated:
146     case Jump:
147     case Branch:
148     case Switch:
149     case Return:
150     case Throw:
151     case CountExecution:
152     case ForceOSRExit:
153     case CheckWatchdogTimer:
154     case StringFromCharCode:
155     case Unreachable:
156     case ExtractOSREntryLocal:
157     case CheckTierUpInLoop:
158     case CheckTierUpAtReturn:
159     case CheckTierUpAndOSREnter:
160     case LoopHint:
161     case StoreBarrier:
162     case StoreBarrierWithNullCheck:
163     case InvalidationPoint:
164     case NotifyWrite:
165     case FunctionReentryWatchpoint:
166     case TypedArrayWatchpoint:
167     case CheckInBounds:
168     case ConstantStoragePointer:
169     case Check:
170     case MultiGetByOffset:
171     case ValueRep:
172     case DoubleRep:
173     case Int52Rep:
174     case GetGetter:
175     case GetSetter:
176     case GetByVal:
177     case GetIndexedPropertyStorage:
178     case GetArrayLength:
179     case ArrayPush:
180     case ArrayPop:
181     case StringCharAt:
182     case StringCharCodeAt:
183     case GetTypedArrayByteOffset:
184     case PutByValDirect:
185     case PutByVal:
186     case PutByValAlias:
187     case PutStructure:
188     case GetByOffset:
189     case GetGetterSetterByOffset:
190     case PutByOffset:
191     case GetEnumerableLength:
192     case HasGenericProperty:
193     case HasStructureProperty:
194     case HasIndexedProperty:
195     case GetDirectPname:
196     case FiatInt52:
197     case BooleanToNumber:
198     case CheckBadCell:
199     case BottomValue:
200     case PhantomNewObject:
201     case PutByOffsetHint:
202     case CheckStructureImmediate:
203     case PutStructureHint:
204     case PutLocal:
205     case KillLocal:
206         return false;
207
208     case CreateActivation:
209     case CreateArguments:
210     case ToThis:
211     case CreateThis:
212     case AllocatePropertyStorage:
213     case ReallocatePropertyStorage:
214     case Arrayify:
215     case ArrayifyToStructure:
216     case NewObject:
217     case NewArray:
218     case NewArrayWithSize:
219     case NewArrayBuffer:
220     case NewRegexp:
221     case NewStringObject:
222     case MakeRope:
223     case NewFunctionNoCheck:
224     case NewFunction:
225     case NewFunctionExpression:
226     case NewTypedArray:
227     case ThrowReferenceError:
228     case GetStructurePropertyEnumerator:
229     case GetGenericPropertyEnumerator:
230     case GetEnumeratorPname:
231     case ToIndexString:
232     case MaterializeNewObject:
233         return true;
234         
235     case MultiPutByOffset:
236         return node->multiPutByOffsetData().reallocatesStorage();
237
238     case LastNodeType:
239         RELEASE_ASSERT_NOT_REACHED();
240         return true;
241     }
242     
243     RELEASE_ASSERT_NOT_REACHED();
244     return true;
245 }
246
247 } } // namespace JSC::DFG
248
249 #endif // ENABLE(DFG_JIT)