OLD | NEW |
---|---|
1 // Copyright 2014 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/js-operator.h" | 5 #include "src/compiler/js-operator.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "src/base/lazy-instance.h" | 9 #include "src/base/lazy-instance.h" |
10 #include "src/compiler/opcodes.h" | 10 #include "src/compiler/opcodes.h" |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
258 value_input_count, Operator::ZeroIfPure(properties), \ | 258 value_input_count, Operator::ZeroIfPure(properties), \ |
259 Operator::ZeroIfEliminatable(properties), \ | 259 Operator::ZeroIfEliminatable(properties), \ |
260 value_output_count, Operator::ZeroIfPure(properties), \ | 260 value_output_count, Operator::ZeroIfPure(properties), \ |
261 Operator::ZeroIfNoThrow(properties)) {} \ | 261 Operator::ZeroIfNoThrow(properties)) {} \ |
262 }; \ | 262 }; \ |
263 Name##Operator k##Name##Operator; | 263 Name##Operator k##Name##Operator; |
264 CACHED_OP_LIST(CACHED) | 264 CACHED_OP_LIST(CACHED) |
265 #undef CACHED | 265 #undef CACHED |
266 | 266 |
267 | 267 |
268 #define CACHED_WITH_STRONG(Name, properties, value_input_count, \ | 268 #define CACHED_WITH_LANGUAGE_MODE(Name, properties, value_input_count, \ |
269 value_output_count) \ | 269 value_output_count) \ |
270 template <LanguageMode kLanguageMode> \ | 270 template <LanguageMode kLanguageMode> \ |
271 struct Name##Operator final : public Operator1<LanguageMode> { \ | 271 struct Name##Operator final : public Operator1<LanguageMode> { \ |
272 Name##Operator() \ | 272 Name##Operator() \ |
273 : Operator1<LanguageMode>(IrOpcode::kJS##Name, properties, "JS" #Name, \ | 273 : Operator1<LanguageMode>( \ |
274 value_input_count, Operator::ZeroIfPure(properties), \ | 274 IrOpcode::kJS##Name, properties, "JS" #Name, value_input_count, \ |
275 Operator::ZeroIfEliminatable(properties), \ | 275 Operator::ZeroIfPure(properties), \ |
276 value_output_count, Operator::ZeroIfPure(properties), \ | 276 Operator::ZeroIfEliminatable(properties), value_output_count, \ |
277 Operator::ZeroIfNoThrow(properties), kLanguageMode) {} \ | 277 Operator::ZeroIfPure(properties), \ |
278 }; \ | 278 Operator::ZeroIfNoThrow(properties), kLanguageMode) {} \ |
279 Name##Operator<SLOPPY> k##Name##SloppyOperator; \ | 279 }; \ |
280 Name##Operator<SLOPPY> k##Name##SloppyOperator; \ | |
281 Name##Operator<STRICT> k##Name##StrictOperator; \ | |
conradw
2015/04/27 10:23:52
This change means that operators which behave iden
| |
280 Name##Operator<STRONG> k##Name##StrongOperator; | 282 Name##Operator<STRONG> k##Name##StrongOperator; |
281 CACHED_OP_LIST_WITH_LANGUAGE_MODE(CACHED_WITH_STRONG) | 283 CACHED_OP_LIST_WITH_LANGUAGE_MODE(CACHED_WITH_LANGUAGE_MODE) |
282 #undef CACHED_WITH_STRONG | 284 #undef CACHED_WITH_LANGUAGE_MODE |
283 | 285 |
284 | 286 |
285 template <LanguageMode kLanguageMode> | 287 template <LanguageMode kLanguageMode> |
286 struct StorePropertyOperator final : public Operator1<LanguageMode> { | 288 struct StorePropertyOperator final : public Operator1<LanguageMode> { |
287 StorePropertyOperator() | 289 StorePropertyOperator() |
288 : Operator1<LanguageMode>(IrOpcode::kJSStoreProperty, | 290 : Operator1<LanguageMode>(IrOpcode::kJSStoreProperty, |
289 Operator::kNoProperties, "JSStoreProperty", 3, | 291 Operator::kNoProperties, "JSStoreProperty", 3, |
290 1, 1, 0, 1, 2, kLanguageMode) {} | 292 1, 1, 0, 1, 2, kLanguageMode) {} |
291 }; | 293 }; |
292 StorePropertyOperator<SLOPPY> kStorePropertySloppyOperator; | 294 StorePropertyOperator<SLOPPY> kStorePropertySloppyOperator; |
(...skipping 10 matching lines...) Expand all Loading... | |
303 | 305 |
304 | 306 |
305 #define CACHED(Name, properties, value_input_count, value_output_count) \ | 307 #define CACHED(Name, properties, value_input_count, value_output_count) \ |
306 const Operator* JSOperatorBuilder::Name() { \ | 308 const Operator* JSOperatorBuilder::Name() { \ |
307 return &cache_.k##Name##Operator; \ | 309 return &cache_.k##Name##Operator; \ |
308 } | 310 } |
309 CACHED_OP_LIST(CACHED) | 311 CACHED_OP_LIST(CACHED) |
310 #undef CACHED | 312 #undef CACHED |
311 | 313 |
312 | 314 |
313 #define CACHED_WITH_STRONG(Name, properties, value_input_count, \ | 315 #define CACHED_WITH_LANGUAGE_MODE(Name, properties, value_input_count, \ |
314 value_output_count) \ | 316 value_output_count) \ |
315 const Operator* JSOperatorBuilder::Name(LanguageMode language_mode) { \ | 317 const Operator* JSOperatorBuilder::Name(LanguageMode language_mode) { \ |
316 if (is_strong(language_mode)) { \ | 318 switch (language_mode) { \ |
317 return &cache_.k##Name##StrongOperator; \ | 319 case SLOPPY: \ |
318 } else { \ | 320 return &cache_.k##Name##SloppyOperator; \ |
319 return &cache_.k##Name##SloppyOperator; \ | 321 case STRICT: \ |
322 return &cache_.k##Name##StrictOperator; \ | |
323 case STRONG: \ | |
324 return &cache_.k##Name##StrongOperator; \ | |
325 case STRONG_BIT: \ | |
326 break; /* %*!%^$#@ */ \ | |
320 } \ | 327 } \ |
321 UNREACHABLE(); \ | 328 UNREACHABLE(); \ |
322 return nullptr; \ | 329 return nullptr; \ |
323 } | 330 } |
324 CACHED_OP_LIST_WITH_LANGUAGE_MODE(CACHED_WITH_STRONG) | 331 CACHED_OP_LIST_WITH_LANGUAGE_MODE(CACHED_WITH_LANGUAGE_MODE) |
325 #undef CACHED_WITH_STRONG | 332 #undef CACHED_WITH_LANGUAGE_MODE |
326 | 333 |
327 | 334 |
328 const Operator* JSOperatorBuilder::CallFunction(size_t arity, | 335 const Operator* JSOperatorBuilder::CallFunction(size_t arity, |
329 CallFunctionFlags flags) { | 336 CallFunctionFlags flags) { |
330 CallFunctionParameters parameters(arity, flags); | 337 CallFunctionParameters parameters(arity, flags); |
331 return new (zone()) Operator1<CallFunctionParameters>( // -- | 338 return new (zone()) Operator1<CallFunctionParameters>( // -- |
332 IrOpcode::kJSCallFunction, Operator::kNoProperties, // opcode | 339 IrOpcode::kJSCallFunction, Operator::kNoProperties, // opcode |
333 "JSCallFunction", // name | 340 "JSCallFunction", // name |
334 parameters.arity(), 1, 1, 1, 1, 2, // inputs/outputs | 341 parameters.arity(), 1, 1, 1, 1, 2, // inputs/outputs |
335 parameters); // parameter | 342 parameters); // parameter |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
442 return new (zone()) Operator1<Unique<String>>( // -- | 449 return new (zone()) Operator1<Unique<String>>( // -- |
443 IrOpcode::kJSCreateCatchContext, Operator::kNoProperties, // opcode | 450 IrOpcode::kJSCreateCatchContext, Operator::kNoProperties, // opcode |
444 "JSCreateCatchContext", // name | 451 "JSCreateCatchContext", // name |
445 2, 1, 1, 1, 1, 2, // counts | 452 2, 1, 1, 1, 1, 2, // counts |
446 name); // parameter | 453 name); // parameter |
447 } | 454 } |
448 | 455 |
449 } // namespace compiler | 456 } // namespace compiler |
450 } // namespace internal | 457 } // namespace internal |
451 } // namespace v8 | 458 } // namespace v8 |
OLD | NEW |