v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
operator-properties.cc
Go to the documentation of this file.
1// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
10#include "src/runtime/runtime.h"
11
12namespace v8 {
13namespace internal {
14namespace compiler {
15
16// static
18 IrOpcode::Value opcode = static_cast<IrOpcode::Value>(op->opcode());
19 return IrOpcode::IsJsOpcode(opcode);
20}
21
22// static
25 IrOpcode::Value const opcode = static_cast<IrOpcode::Value>(op->opcode());
26 switch (opcode) {
27#define CASE(Name, ...) case IrOpcode::k##Name:
28 // Binary/unary operators, calls and constructor calls only
29 // need the context to generate exceptions or lookup fields
30 // on the native context, so passing any context is fine.
35#undef CASE
36 case IrOpcode::kJSCloneObject:
37 case IrOpcode::kJSCreate:
38 case IrOpcode::kJSCreateLiteralArray:
39 case IrOpcode::kJSCreateEmptyLiteralArray:
40 case IrOpcode::kJSCreateLiteralObject:
41 case IrOpcode::kJSCreateEmptyLiteralObject:
42 case IrOpcode::kJSCreateArrayFromIterable:
43 case IrOpcode::kJSCreateLiteralRegExp:
44 case IrOpcode::kJSGetTemplateObject:
45 case IrOpcode::kJSForInEnumerate:
46 case IrOpcode::kJSForInNext:
47 case IrOpcode::kJSForInPrepare:
48 case IrOpcode::kJSGeneratorRestoreContext:
49 case IrOpcode::kJSGeneratorRestoreContinuation:
50 case IrOpcode::kJSGeneratorRestoreInputOrDebugPos:
51 case IrOpcode::kJSGeneratorRestoreRegister:
52 case IrOpcode::kJSGetSuperConstructor:
53 case IrOpcode::kJSLoadGlobal:
54 case IrOpcode::kJSLoadMessage:
55 case IrOpcode::kJSStackCheck:
56 case IrOpcode::kJSStoreMessage:
57 case IrOpcode::kJSGetIterator:
58 return false;
59
60 case IrOpcode::kJSCallRuntime:
62
63 case IrOpcode::kJSCreateArguments:
64 // For mapped arguments we need to access slots of context-allocated
65 // variables if there's aliasing with formal parameters.
67
68 case IrOpcode::kJSCreateBlockContext:
69 case IrOpcode::kJSCreateClosure:
70 case IrOpcode::kJSCreateFunctionContext:
71 case IrOpcode::kJSCreateGeneratorObject:
72 case IrOpcode::kJSCreateCatchContext:
73 case IrOpcode::kJSCreateWithContext:
74 case IrOpcode::kJSDebugger:
75 case IrOpcode::kJSDefineKeyedOwnProperty:
76 case IrOpcode::kJSDeleteProperty:
77 case IrOpcode::kJSGeneratorStore:
78 case IrOpcode::kJSGetImportMeta:
79 case IrOpcode::kJSHasProperty:
80 case IrOpcode::kJSHasContextExtension:
81 case IrOpcode::kJSLoadContext:
82 case IrOpcode::kJSLoadScriptContext:
83 case IrOpcode::kJSLoadModule:
84 case IrOpcode::kJSLoadNamed:
85 case IrOpcode::kJSLoadNamedFromSuper:
86 case IrOpcode::kJSLoadProperty:
87 case IrOpcode::kJSStoreContext:
88 case IrOpcode::kJSStoreScriptContext:
89 case IrOpcode::kJSDefineKeyedOwnPropertyInLiteral:
90 case IrOpcode::kJSStoreGlobal:
91 case IrOpcode::kJSStoreInArrayLiteral:
92 case IrOpcode::kJSStoreModule:
93 case IrOpcode::kJSSetNamedProperty:
94 case IrOpcode::kJSDefineNamedOwnProperty:
95 case IrOpcode::kJSSetKeyedProperty:
96 case IrOpcode::kJSFindNonDefaultConstructorOrConstruct:
97 return true;
98
99 case IrOpcode::kJSAsyncFunctionEnter:
100 case IrOpcode::kJSAsyncFunctionReject:
101 case IrOpcode::kJSAsyncFunctionResolve:
102 case IrOpcode::kJSCreateArrayIterator:
103 case IrOpcode::kJSCreateAsyncFunctionObject:
104 case IrOpcode::kJSCreateBoundFunction:
105 case IrOpcode::kJSCreateCollectionIterator:
106 case IrOpcode::kJSCreateIterResultObject:
107 case IrOpcode::kJSCreateStringIterator:
108 case IrOpcode::kJSCreateKeyValueArray:
109 case IrOpcode::kJSCreateObject:
110 case IrOpcode::kJSCreateStringWrapper:
111 case IrOpcode::kJSCreatePromise:
112 case IrOpcode::kJSCreateTypedArray:
113 case IrOpcode::kJSCreateArray:
114 case IrOpcode::kJSFulfillPromise:
115 case IrOpcode::kJSObjectIsArray:
116 case IrOpcode::kJSPerformPromiseThen:
117 case IrOpcode::kJSPromiseResolve:
118 case IrOpcode::kJSRegExpTest:
119 case IrOpcode::kJSRejectPromise:
120 case IrOpcode::kJSResolvePromise:
121 // These operators aren't introduced by BytecodeGraphBuilder and
122 // thus we don't bother checking them. If you ever introduce one
123 // of these early in the BytecodeGraphBuilder make sure to check
124 // whether they are context-sensitive.
125 break;
126
127#define CASE(Name) case IrOpcode::k##Name:
128 // Non-JavaScript operators don't have a notion of "context".
135 break;
136#undef CASE
137 }
138 UNREACHABLE();
139}
140
141// static
143 switch (op->opcode()) {
144 case IrOpcode::kCheckpoint:
145 case IrOpcode::kFrameState:
146 return true;
147 case IrOpcode::kJSCallRuntime: {
150 }
151
152 // Strict equality cannot lazily deoptimize.
153 case IrOpcode::kJSStrictEqual:
154 return false;
155
156 // Generator creation cannot call back into arbitrary JavaScript.
157 case IrOpcode::kJSCreateGeneratorObject:
158 return false;
159
160 // Binary operations
161 case IrOpcode::kJSAdd:
162 case IrOpcode::kJSSubtract:
163 case IrOpcode::kJSMultiply:
164 case IrOpcode::kJSDivide:
165 case IrOpcode::kJSModulus:
166 case IrOpcode::kJSExponentiate:
167
168 // Bitwise operations
169 case IrOpcode::kJSBitwiseOr:
170 case IrOpcode::kJSBitwiseXor:
171 case IrOpcode::kJSBitwiseAnd:
172
173 // Shift operations
174 case IrOpcode::kJSShiftLeft:
175 case IrOpcode::kJSShiftRight:
176 case IrOpcode::kJSShiftRightLogical:
177
178 // Compare operations
179 case IrOpcode::kJSEqual:
180 case IrOpcode::kJSGreaterThan:
181 case IrOpcode::kJSGreaterThanOrEqual:
182 case IrOpcode::kJSLessThan:
183 case IrOpcode::kJSLessThanOrEqual:
184 case IrOpcode::kJSHasProperty:
185 case IrOpcode::kJSHasInPrototypeChain:
186 case IrOpcode::kJSInstanceOf:
187 case IrOpcode::kJSOrdinaryHasInstance:
188
189 // Object operations
190 case IrOpcode::kJSCreate:
191 case IrOpcode::kJSCreateArguments:
192 case IrOpcode::kJSCreateArray:
193 case IrOpcode::kJSCreateTypedArray:
194 case IrOpcode::kJSCreateLiteralArray:
195 case IrOpcode::kJSCreateArrayFromIterable:
196 case IrOpcode::kJSCreateLiteralObject:
197 case IrOpcode::kJSCreateLiteralRegExp:
198 case IrOpcode::kJSCreateObject:
199 case IrOpcode::kJSCloneObject:
200
201 // Property access operations
202 case IrOpcode::kJSDeleteProperty:
203 case IrOpcode::kJSLoadGlobal:
204 case IrOpcode::kJSLoadNamed:
205 case IrOpcode::kJSLoadNamedFromSuper:
206 case IrOpcode::kJSLoadProperty:
207 case IrOpcode::kJSDefineKeyedOwnPropertyInLiteral:
208 case IrOpcode::kJSStoreInArrayLiteral:
209 case IrOpcode::kJSStoreGlobal:
210 case IrOpcode::kJSSetNamedProperty:
211 case IrOpcode::kJSDefineNamedOwnProperty:
212 case IrOpcode::kJSSetKeyedProperty:
213 case IrOpcode::kJSDefineKeyedOwnProperty:
214
215 // Conversions
216 case IrOpcode::kJSToLength:
217 case IrOpcode::kJSToName:
218 case IrOpcode::kJSToNumber:
219 case IrOpcode::kJSToNumberConvertBigInt:
220 case IrOpcode::kJSToBigInt:
221 case IrOpcode::kJSToBigIntConvertNumber:
222 case IrOpcode::kJSToNumeric:
223 case IrOpcode::kJSToObject:
224 case IrOpcode::kJSToString:
225 case IrOpcode::kJSParseInt:
226
227 // Call operations
228 case IrOpcode::kJSConstructForwardVarargs:
229 case IrOpcode::kJSConstruct:
230 case IrOpcode::kJSConstructWithArrayLike:
231 case IrOpcode::kJSConstructWithSpread:
232 case IrOpcode::kJSConstructForwardAllArgs:
233 case IrOpcode::kJSCallForwardVarargs:
234 case IrOpcode::kJSCall:
235 case IrOpcode::kJSCallWithArrayLike:
236 case IrOpcode::kJSCallWithSpread:
237#if V8_ENABLE_WEBASSEMBLY
238 case IrOpcode::kJSWasmCall:
239#endif // V8_ENABLE_WEBASSEMBLY
240
241 // Misc operations
242 case IrOpcode::kJSAsyncFunctionEnter:
243 case IrOpcode::kJSAsyncFunctionReject:
244 case IrOpcode::kJSAsyncFunctionResolve:
245 case IrOpcode::kJSForInEnumerate:
246 case IrOpcode::kJSForInNext:
247 case IrOpcode::kJSStackCheck:
248 case IrOpcode::kJSDebugger:
249 case IrOpcode::kJSGetSuperConstructor:
250 case IrOpcode::kJSFindNonDefaultConstructorOrConstruct:
251 case IrOpcode::kJSBitwiseNot:
252 case IrOpcode::kJSDecrement:
253 case IrOpcode::kJSIncrement:
254 case IrOpcode::kJSNegate:
255 case IrOpcode::kJSPromiseResolve:
256 case IrOpcode::kJSRejectPromise:
257 case IrOpcode::kJSResolvePromise:
258 case IrOpcode::kJSPerformPromiseThen:
259 case IrOpcode::kJSObjectIsArray:
260 case IrOpcode::kJSRegExpTest:
261 case IrOpcode::kJSGetImportMeta:
262
263 // Iterator protocol operations
264 case IrOpcode::kJSGetIterator:
265 return true;
266
267 default:
268 return false;
269 }
270}
271
272
273// static
279
280
281// static
283 Operator::Opcode const opcode = op->opcode();
284 return opcode == IrOpcode::kStart || opcode == IrOpcode::kEnd ||
285 opcode == IrOpcode::kDead || opcode == IrOpcode::kLoop ||
286 opcode == IrOpcode::kMerge || opcode == IrOpcode::kIfTrue ||
287 opcode == IrOpcode::kIfFalse || opcode == IrOpcode::kIfSuccess ||
288 opcode == IrOpcode::kIfException || opcode == IrOpcode::kIfValue ||
289 opcode == IrOpcode::kIfDefault;
290}
291
292} // namespace compiler
293} // namespace internal
294} // namespace v8
static bool NeedsExactContext(FunctionId id)
Definition runtime.cc:93
static bool IsJsOpcode(Value value)
Definition opcodes.h:1364
static bool NeedsFrameStateInput(Runtime::FunctionId function)
Definition linkage.cc:385
static int GetTotalInputCount(const Operator *op)
static bool IsBasicBlockBegin(const Operator *op)
static int GetContextInputCount(const Operator *op)
static bool HasContextInput(const Operator *op)
static bool HasFrameStateInput(const Operator *op)
static bool NeedsExactContext(const Operator *op)
static int GetFrameStateInputCount(const Operator *op)
constexpr Opcode opcode() const
Definition operator.h:75
const CallRuntimeParameters & CallRuntimeParametersOf(const Operator *op)
CreateArgumentsType const & CreateArgumentsTypeOf(const Operator *op)
#define MACHINE_SIMD256_OP_LIST(V)
Definition opcodes.h:1159
#define JS_SIMPLE_UNOP_LIST(V)
Definition opcodes.h:152
#define MACHINE_OP_LIST(V)
Definition opcodes.h:773
#define SIMPLIFIED_OP_LIST(V)
Definition opcodes.h:600
#define CONTROL_OP_LIST(V)
Definition opcodes.h:13
#define COMMON_OP_LIST(V)
Definition opcodes.h:88
#define JS_SIMPLE_BINOP_LIST(V)
Definition opcodes.h:124
#define MACHINE_SIMD128_OP_LIST(V)
Definition opcodes.h:879
#define JS_CONSTRUCT_OP_LIST(V)
Definition opcodes.h:219
#define JS_CALL_OP_LIST(V)
Definition opcodes.h:212
#define DCHECK(condition)
Definition logging.h:482
#define IF_WASM(V,...)
Definition macros.h:472