| 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 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 | 189 |
| 190 | 190 |
| 191 DynamicContextAccess const& DynamicContextAccessOf(Operator const* op) { | 191 DynamicContextAccess const& DynamicContextAccessOf(Operator const* op) { |
| 192 DCHECK_EQ(IrOpcode::kJSLoadDynamicContext, op->opcode()); | 192 DCHECK_EQ(IrOpcode::kJSLoadDynamicContext, op->opcode()); |
| 193 return OpParameter<DynamicContextAccess>(op); | 193 return OpParameter<DynamicContextAccess>(op); |
| 194 } | 194 } |
| 195 | 195 |
| 196 | 196 |
| 197 bool operator==(LoadNamedParameters const& lhs, | 197 bool operator==(LoadNamedParameters const& lhs, |
| 198 LoadNamedParameters const& rhs) { | 198 LoadNamedParameters const& rhs) { |
| 199 return lhs.name() == rhs.name() && | 199 return lhs.name().location() == rhs.name().location() && |
| 200 lhs.language_mode() == rhs.language_mode() && | 200 lhs.language_mode() == rhs.language_mode() && |
| 201 lhs.feedback() == rhs.feedback(); | 201 lhs.feedback() == rhs.feedback(); |
| 202 } | 202 } |
| 203 | 203 |
| 204 | 204 |
| 205 bool operator!=(LoadNamedParameters const& lhs, | 205 bool operator!=(LoadNamedParameters const& lhs, |
| 206 LoadNamedParameters const& rhs) { | 206 LoadNamedParameters const& rhs) { |
| 207 return !(lhs == rhs); | 207 return !(lhs == rhs); |
| 208 } | 208 } |
| 209 | 209 |
| 210 | 210 |
| 211 size_t hash_value(LoadNamedParameters const& p) { | 211 size_t hash_value(LoadNamedParameters const& p) { |
| 212 return base::hash_combine(p.name(), p.language_mode(), p.feedback()); | 212 return base::hash_combine(p.name().location(), p.language_mode(), |
| 213 p.feedback()); |
| 213 } | 214 } |
| 214 | 215 |
| 215 | 216 |
| 216 std::ostream& operator<<(std::ostream& os, LoadNamedParameters const& p) { | 217 std::ostream& operator<<(std::ostream& os, LoadNamedParameters const& p) { |
| 217 return os << Brief(*p.name().handle()) << ", " << p.language_mode(); | 218 return os << Brief(*p.name()) << ", " << p.language_mode(); |
| 218 } | 219 } |
| 219 | 220 |
| 220 | 221 |
| 221 std::ostream& operator<<(std::ostream& os, LoadPropertyParameters const& p) { | 222 std::ostream& operator<<(std::ostream& os, LoadPropertyParameters const& p) { |
| 222 return os << p.language_mode(); | 223 return os << p.language_mode(); |
| 223 } | 224 } |
| 224 | 225 |
| 225 | 226 |
| 226 bool operator==(LoadPropertyParameters const& lhs, | 227 bool operator==(LoadPropertyParameters const& lhs, |
| 227 LoadPropertyParameters const& rhs) { | 228 LoadPropertyParameters const& rhs) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 248 | 249 |
| 249 | 250 |
| 250 const LoadNamedParameters& LoadNamedParametersOf(const Operator* op) { | 251 const LoadNamedParameters& LoadNamedParametersOf(const Operator* op) { |
| 251 DCHECK_EQ(IrOpcode::kJSLoadNamed, op->opcode()); | 252 DCHECK_EQ(IrOpcode::kJSLoadNamed, op->opcode()); |
| 252 return OpParameter<LoadNamedParameters>(op); | 253 return OpParameter<LoadNamedParameters>(op); |
| 253 } | 254 } |
| 254 | 255 |
| 255 | 256 |
| 256 bool operator==(LoadGlobalParameters const& lhs, | 257 bool operator==(LoadGlobalParameters const& lhs, |
| 257 LoadGlobalParameters const& rhs) { | 258 LoadGlobalParameters const& rhs) { |
| 258 return lhs.name() == rhs.name() && lhs.feedback() == rhs.feedback() && | 259 return lhs.name().location() == rhs.name().location() && |
| 260 lhs.feedback() == rhs.feedback() && |
| 259 lhs.typeof_mode() == rhs.typeof_mode() && | 261 lhs.typeof_mode() == rhs.typeof_mode() && |
| 260 lhs.slot_index() == rhs.slot_index(); | 262 lhs.slot_index() == rhs.slot_index(); |
| 261 } | 263 } |
| 262 | 264 |
| 263 | 265 |
| 264 bool operator!=(LoadGlobalParameters const& lhs, | 266 bool operator!=(LoadGlobalParameters const& lhs, |
| 265 LoadGlobalParameters const& rhs) { | 267 LoadGlobalParameters const& rhs) { |
| 266 return !(lhs == rhs); | 268 return !(lhs == rhs); |
| 267 } | 269 } |
| 268 | 270 |
| 269 | 271 |
| 270 size_t hash_value(LoadGlobalParameters const& p) { | 272 size_t hash_value(LoadGlobalParameters const& p) { |
| 271 return base::hash_combine(p.name(), p.typeof_mode(), p.slot_index()); | 273 return base::hash_combine(p.name().location(), p.typeof_mode(), |
| 274 p.slot_index()); |
| 272 } | 275 } |
| 273 | 276 |
| 274 | 277 |
| 275 std::ostream& operator<<(std::ostream& os, LoadGlobalParameters const& p) { | 278 std::ostream& operator<<(std::ostream& os, LoadGlobalParameters const& p) { |
| 276 return os << Brief(*p.name().handle()) << ", " << p.typeof_mode() | 279 return os << Brief(*p.name()) << ", " << p.typeof_mode() |
| 277 << ", slot: " << p.slot_index(); | 280 << ", slot: " << p.slot_index(); |
| 278 } | 281 } |
| 279 | 282 |
| 280 | 283 |
| 281 const LoadGlobalParameters& LoadGlobalParametersOf(const Operator* op) { | 284 const LoadGlobalParameters& LoadGlobalParametersOf(const Operator* op) { |
| 282 DCHECK_EQ(IrOpcode::kJSLoadGlobal, op->opcode()); | 285 DCHECK_EQ(IrOpcode::kJSLoadGlobal, op->opcode()); |
| 283 return OpParameter<LoadGlobalParameters>(op); | 286 return OpParameter<LoadGlobalParameters>(op); |
| 284 } | 287 } |
| 285 | 288 |
| 286 | 289 |
| 287 bool operator==(StoreGlobalParameters const& lhs, | 290 bool operator==(StoreGlobalParameters const& lhs, |
| 288 StoreGlobalParameters const& rhs) { | 291 StoreGlobalParameters const& rhs) { |
| 289 return lhs.language_mode() == rhs.language_mode() && | 292 return lhs.language_mode() == rhs.language_mode() && |
| 290 lhs.name() == rhs.name() && lhs.feedback() == rhs.feedback() && | 293 lhs.name().location() == rhs.name().location() && |
| 294 lhs.feedback() == rhs.feedback() && |
| 291 lhs.slot_index() == rhs.slot_index(); | 295 lhs.slot_index() == rhs.slot_index(); |
| 292 } | 296 } |
| 293 | 297 |
| 294 | 298 |
| 295 bool operator!=(StoreGlobalParameters const& lhs, | 299 bool operator!=(StoreGlobalParameters const& lhs, |
| 296 StoreGlobalParameters const& rhs) { | 300 StoreGlobalParameters const& rhs) { |
| 297 return !(lhs == rhs); | 301 return !(lhs == rhs); |
| 298 } | 302 } |
| 299 | 303 |
| 300 | 304 |
| 301 size_t hash_value(StoreGlobalParameters const& p) { | 305 size_t hash_value(StoreGlobalParameters const& p) { |
| 302 return base::hash_combine(p.language_mode(), p.name(), p.feedback(), | 306 return base::hash_combine(p.language_mode(), p.name().location(), |
| 303 p.slot_index()); | 307 p.feedback(), p.slot_index()); |
| 304 } | 308 } |
| 305 | 309 |
| 306 | 310 |
| 307 std::ostream& operator<<(std::ostream& os, StoreGlobalParameters const& p) { | 311 std::ostream& operator<<(std::ostream& os, StoreGlobalParameters const& p) { |
| 308 return os << p.language_mode() << ", " << Brief(*p.name().handle()) | 312 return os << p.language_mode() << ", " << Brief(*p.name()) |
| 309 << ", slot: " << p.slot_index(); | 313 << ", slot: " << p.slot_index(); |
| 310 } | 314 } |
| 311 | 315 |
| 312 | 316 |
| 313 const StoreGlobalParameters& StoreGlobalParametersOf(const Operator* op) { | 317 const StoreGlobalParameters& StoreGlobalParametersOf(const Operator* op) { |
| 314 DCHECK_EQ(IrOpcode::kJSStoreGlobal, op->opcode()); | 318 DCHECK_EQ(IrOpcode::kJSStoreGlobal, op->opcode()); |
| 315 return OpParameter<StoreGlobalParameters>(op); | 319 return OpParameter<StoreGlobalParameters>(op); |
| 316 } | 320 } |
| 317 | 321 |
| 318 | 322 |
| 319 bool operator==(StoreNamedParameters const& lhs, | 323 bool operator==(StoreNamedParameters const& lhs, |
| 320 StoreNamedParameters const& rhs) { | 324 StoreNamedParameters const& rhs) { |
| 321 return lhs.language_mode() == rhs.language_mode() && | 325 return lhs.language_mode() == rhs.language_mode() && |
| 322 lhs.name() == rhs.name() && lhs.feedback() == rhs.feedback(); | 326 lhs.name().location() == rhs.name().location() && |
| 327 lhs.feedback() == rhs.feedback(); |
| 323 } | 328 } |
| 324 | 329 |
| 325 | 330 |
| 326 bool operator!=(StoreNamedParameters const& lhs, | 331 bool operator!=(StoreNamedParameters const& lhs, |
| 327 StoreNamedParameters const& rhs) { | 332 StoreNamedParameters const& rhs) { |
| 328 return !(lhs == rhs); | 333 return !(lhs == rhs); |
| 329 } | 334 } |
| 330 | 335 |
| 331 | 336 |
| 332 size_t hash_value(StoreNamedParameters const& p) { | 337 size_t hash_value(StoreNamedParameters const& p) { |
| 333 return base::hash_combine(p.language_mode(), p.name(), p.feedback()); | 338 return base::hash_combine(p.language_mode(), p.name().location(), |
| 339 p.feedback()); |
| 334 } | 340 } |
| 335 | 341 |
| 336 | 342 |
| 337 std::ostream& operator<<(std::ostream& os, StoreNamedParameters const& p) { | 343 std::ostream& operator<<(std::ostream& os, StoreNamedParameters const& p) { |
| 338 return os << p.language_mode() << ", " << Brief(*p.name().handle()); | 344 return os << p.language_mode() << ", " << Brief(*p.name()); |
| 339 } | 345 } |
| 340 | 346 |
| 341 | 347 |
| 342 const StoreNamedParameters& StoreNamedParametersOf(const Operator* op) { | 348 const StoreNamedParameters& StoreNamedParametersOf(const Operator* op) { |
| 343 DCHECK_EQ(IrOpcode::kJSStoreNamed, op->opcode()); | 349 DCHECK_EQ(IrOpcode::kJSStoreNamed, op->opcode()); |
| 344 return OpParameter<StoreNamedParameters>(op); | 350 return OpParameter<StoreNamedParameters>(op); |
| 345 } | 351 } |
| 346 | 352 |
| 347 | 353 |
| 348 bool operator==(StorePropertyParameters const& lhs, | 354 bool operator==(StorePropertyParameters const& lhs, |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 | 558 |
| 553 const Operator* JSOperatorBuilder::CallConstruct(int arguments) { | 559 const Operator* JSOperatorBuilder::CallConstruct(int arguments) { |
| 554 return new (zone()) Operator1<int>( // -- | 560 return new (zone()) Operator1<int>( // -- |
| 555 IrOpcode::kJSCallConstruct, Operator::kNoProperties, // opcode | 561 IrOpcode::kJSCallConstruct, Operator::kNoProperties, // opcode |
| 556 "JSCallConstruct", // name | 562 "JSCallConstruct", // name |
| 557 arguments, 1, 1, 1, 1, 2, // counts | 563 arguments, 1, 1, 1, 1, 2, // counts |
| 558 arguments); // parameter | 564 arguments); // parameter |
| 559 } | 565 } |
| 560 | 566 |
| 561 | 567 |
| 562 const Operator* JSOperatorBuilder::LoadNamed(const Unique<Name>& name, | 568 const Operator* JSOperatorBuilder::LoadNamed(const Handle<Name>& name, |
| 563 const VectorSlotPair& feedback, | 569 const VectorSlotPair& feedback, |
| 564 LanguageMode language_mode) { | 570 LanguageMode language_mode) { |
| 565 LoadNamedParameters parameters(name, feedback, language_mode); | 571 LoadNamedParameters parameters(name, feedback, language_mode); |
| 566 return new (zone()) Operator1<LoadNamedParameters>( // -- | 572 return new (zone()) Operator1<LoadNamedParameters>( // -- |
| 567 IrOpcode::kJSLoadNamed, Operator::kNoProperties, // opcode | 573 IrOpcode::kJSLoadNamed, Operator::kNoProperties, // opcode |
| 568 "JSLoadNamed", // name | 574 "JSLoadNamed", // name |
| 569 2, 1, 1, 1, 1, 2, // counts | 575 2, 1, 1, 1, 1, 2, // counts |
| 570 parameters); // parameter | 576 parameters); // parameter |
| 571 } | 577 } |
| 572 | 578 |
| 573 | 579 |
| 574 const Operator* JSOperatorBuilder::LoadProperty(const VectorSlotPair& feedback, | 580 const Operator* JSOperatorBuilder::LoadProperty(const VectorSlotPair& feedback, |
| 575 LanguageMode language_mode) { | 581 LanguageMode language_mode) { |
| 576 LoadPropertyParameters parameters(feedback, language_mode); | 582 LoadPropertyParameters parameters(feedback, language_mode); |
| 577 return new (zone()) Operator1<LoadPropertyParameters>( // -- | 583 return new (zone()) Operator1<LoadPropertyParameters>( // -- |
| 578 IrOpcode::kJSLoadProperty, Operator::kNoProperties, // opcode | 584 IrOpcode::kJSLoadProperty, Operator::kNoProperties, // opcode |
| 579 "JSLoadProperty", // name | 585 "JSLoadProperty", // name |
| 580 3, 1, 1, 1, 1, 2, // counts | 586 3, 1, 1, 1, 1, 2, // counts |
| 581 parameters); // parameter | 587 parameters); // parameter |
| 582 } | 588 } |
| 583 | 589 |
| 584 | 590 |
| 585 const Operator* JSOperatorBuilder::StoreNamed(LanguageMode language_mode, | 591 const Operator* JSOperatorBuilder::StoreNamed(LanguageMode language_mode, |
| 586 const Unique<Name>& name, | 592 const Handle<Name>& name, |
| 587 const VectorSlotPair& feedback) { | 593 const VectorSlotPair& feedback) { |
| 588 StoreNamedParameters parameters(language_mode, feedback, name); | 594 StoreNamedParameters parameters(language_mode, feedback, name); |
| 589 return new (zone()) Operator1<StoreNamedParameters>( // -- | 595 return new (zone()) Operator1<StoreNamedParameters>( // -- |
| 590 IrOpcode::kJSStoreNamed, Operator::kNoProperties, // opcode | 596 IrOpcode::kJSStoreNamed, Operator::kNoProperties, // opcode |
| 591 "JSStoreNamed", // name | 597 "JSStoreNamed", // name |
| 592 3, 1, 1, 0, 1, 2, // counts | 598 3, 1, 1, 0, 1, 2, // counts |
| 593 parameters); // parameter | 599 parameters); // parameter |
| 594 } | 600 } |
| 595 | 601 |
| 596 | 602 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 607 | 613 |
| 608 const Operator* JSOperatorBuilder::DeleteProperty(LanguageMode language_mode) { | 614 const Operator* JSOperatorBuilder::DeleteProperty(LanguageMode language_mode) { |
| 609 return new (zone()) Operator1<LanguageMode>( // -- | 615 return new (zone()) Operator1<LanguageMode>( // -- |
| 610 IrOpcode::kJSDeleteProperty, Operator::kNoProperties, // opcode | 616 IrOpcode::kJSDeleteProperty, Operator::kNoProperties, // opcode |
| 611 "JSDeleteProperty", // name | 617 "JSDeleteProperty", // name |
| 612 2, 1, 1, 1, 1, 2, // counts | 618 2, 1, 1, 1, 1, 2, // counts |
| 613 language_mode); // parameter | 619 language_mode); // parameter |
| 614 } | 620 } |
| 615 | 621 |
| 616 | 622 |
| 617 const Operator* JSOperatorBuilder::LoadGlobal(const Unique<Name>& name, | 623 const Operator* JSOperatorBuilder::LoadGlobal(const Handle<Name>& name, |
| 618 const VectorSlotPair& feedback, | 624 const VectorSlotPair& feedback, |
| 619 TypeofMode typeof_mode, | 625 TypeofMode typeof_mode, |
| 620 int slot_index) { | 626 int slot_index) { |
| 621 LoadGlobalParameters parameters(name, feedback, typeof_mode, slot_index); | 627 LoadGlobalParameters parameters(name, feedback, typeof_mode, slot_index); |
| 622 return new (zone()) Operator1<LoadGlobalParameters>( // -- | 628 return new (zone()) Operator1<LoadGlobalParameters>( // -- |
| 623 IrOpcode::kJSLoadGlobal, Operator::kNoProperties, // opcode | 629 IrOpcode::kJSLoadGlobal, Operator::kNoProperties, // opcode |
| 624 "JSLoadGlobal", // name | 630 "JSLoadGlobal", // name |
| 625 3, 1, 1, 1, 1, 2, // counts | 631 3, 1, 1, 1, 1, 2, // counts |
| 626 parameters); // parameter | 632 parameters); // parameter |
| 627 } | 633 } |
| 628 | 634 |
| 629 | 635 |
| 630 const Operator* JSOperatorBuilder::StoreGlobal(LanguageMode language_mode, | 636 const Operator* JSOperatorBuilder::StoreGlobal(LanguageMode language_mode, |
| 631 const Unique<Name>& name, | 637 const Handle<Name>& name, |
| 632 const VectorSlotPair& feedback, | 638 const VectorSlotPair& feedback, |
| 633 int slot_index) { | 639 int slot_index) { |
| 634 StoreGlobalParameters parameters(language_mode, feedback, name, slot_index); | 640 StoreGlobalParameters parameters(language_mode, feedback, name, slot_index); |
| 635 return new (zone()) Operator1<StoreGlobalParameters>( // -- | 641 return new (zone()) Operator1<StoreGlobalParameters>( // -- |
| 636 IrOpcode::kJSStoreGlobal, Operator::kNoProperties, // opcode | 642 IrOpcode::kJSStoreGlobal, Operator::kNoProperties, // opcode |
| 637 "JSStoreGlobal", // name | 643 "JSStoreGlobal", // name |
| 638 4, 1, 1, 0, 1, 2, // counts | 644 4, 1, 1, 0, 1, 2, // counts |
| 639 parameters); // parameter | 645 parameters); // parameter |
| 640 } | 646 } |
| 641 | 647 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 const Operator* JSOperatorBuilder::CreateLiteralObject(int literal_flags) { | 717 const Operator* JSOperatorBuilder::CreateLiteralObject(int literal_flags) { |
| 712 return new (zone()) Operator1<int>( // -- | 718 return new (zone()) Operator1<int>( // -- |
| 713 IrOpcode::kJSCreateLiteralObject, Operator::kNoProperties, // opcode | 719 IrOpcode::kJSCreateLiteralObject, Operator::kNoProperties, // opcode |
| 714 "JSCreateLiteralObject", // name | 720 "JSCreateLiteralObject", // name |
| 715 3, 1, 1, 1, 1, 2, // counts | 721 3, 1, 1, 1, 1, 2, // counts |
| 716 literal_flags); // parameter | 722 literal_flags); // parameter |
| 717 } | 723 } |
| 718 | 724 |
| 719 | 725 |
| 720 const Operator* JSOperatorBuilder::CreateCatchContext( | 726 const Operator* JSOperatorBuilder::CreateCatchContext( |
| 721 const Unique<String>& name) { | 727 const Handle<String>& name) { |
| 722 return new (zone()) Operator1<Unique<String>>( // -- | 728 return new (zone()) Operator1<Handle<String>, Handle<String>::equal_to, |
| 729 Handle<String>::hash>( // -- |
| 723 IrOpcode::kJSCreateCatchContext, Operator::kNoProperties, // opcode | 730 IrOpcode::kJSCreateCatchContext, Operator::kNoProperties, // opcode |
| 724 "JSCreateCatchContext", // name | 731 "JSCreateCatchContext", // name |
| 725 2, 1, 1, 1, 1, 2, // counts | 732 2, 1, 1, 1, 1, 2, // counts |
| 726 name); // parameter | 733 name); // parameter |
| 727 } | 734 } |
| 728 | 735 |
| 729 } // namespace compiler | 736 } // namespace compiler |
| 730 } // namespace internal | 737 } // namespace internal |
| 731 } // namespace v8 | 738 } // namespace v8 |
| OLD | NEW |