OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 } | 460 } |
461 | 461 |
462 static void Clear(Isolate* isolate, Address address, Code* target); | 462 static void Clear(Isolate* isolate, Address address, Code* target); |
463 | 463 |
464 friend class IC; | 464 friend class IC; |
465 }; | 465 }; |
466 | 466 |
467 | 467 |
468 class StoreIC: public IC { | 468 class StoreIC: public IC { |
469 public: | 469 public: |
470 class StrictModeState: public BitField<StrictModeFlag, 1, 1> {}; | 470 class StrictModeState: public BitField<StrictMode, 1, 1> {}; |
471 static ExtraICState ComputeExtraICState(StrictModeFlag flag) { | 471 static ExtraICState ComputeExtraICState(StrictMode flag) { |
472 return StrictModeState::encode(flag); | 472 return StrictModeState::encode(flag); |
473 } | 473 } |
474 | 474 static StrictMode GetStrictMode(ExtraICState state) { |
475 static StrictModeFlag GetStrictMode(ExtraICState state) { | |
476 return StrictModeState::decode(state); | 475 return StrictModeState::decode(state); |
477 } | 476 } |
478 | 477 |
479 // For convenience, a statically declared encoding of strict mode extra | 478 // For convenience, a statically declared encoding of strict mode extra |
480 // IC state. | 479 // IC state. |
481 static const ExtraICState kStrictModeState = | 480 static const ExtraICState kStrictModeState = |
482 1 << StrictModeState::kShift; | 481 1 << StrictModeState::kShift; |
483 | 482 |
484 StoreIC(FrameDepth depth, Isolate* isolate) | 483 StoreIC(FrameDepth depth, Isolate* isolate) |
485 : IC(depth, isolate) { | 484 : IC(depth, isolate) { |
486 ASSERT(IsStoreStub()); | 485 ASSERT(IsStoreStub()); |
487 } | 486 } |
488 | 487 |
489 StrictModeFlag strict_mode() const { | 488 StrictMode strict_mode() const { |
490 return StrictModeState::decode(extra_ic_state()); | 489 return StrictModeState::decode(extra_ic_state()); |
491 } | 490 } |
492 | 491 |
493 // Code generators for stub routines. Only called once at startup. | 492 // Code generators for stub routines. Only called once at startup. |
494 static void GenerateSlow(MacroAssembler* masm); | 493 static void GenerateSlow(MacroAssembler* masm); |
495 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } | 494 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } |
496 static void GeneratePreMonomorphic(MacroAssembler* masm) { | 495 static void GeneratePreMonomorphic(MacroAssembler* masm) { |
497 GenerateMiss(masm); | 496 GenerateMiss(masm); |
498 } | 497 } |
499 static void GenerateMiss(MacroAssembler* masm); | 498 static void GenerateMiss(MacroAssembler* masm); |
500 static void GenerateMegamorphic(MacroAssembler* masm); | 499 static void GenerateMegamorphic(MacroAssembler* masm); |
501 static void GenerateNormal(MacroAssembler* masm); | 500 static void GenerateNormal(MacroAssembler* masm); |
502 static void GenerateRuntimeSetProperty(MacroAssembler* masm, | 501 static void GenerateRuntimeSetProperty(MacroAssembler* masm, |
503 StrictModeFlag strict_mode); | 502 StrictMode strict_mode); |
504 | 503 |
505 static Handle<Code> initialize_stub(Isolate* isolate, | 504 static Handle<Code> initialize_stub(Isolate* isolate, |
506 StrictModeFlag strict_mode); | 505 StrictMode strict_mode); |
507 | 506 |
508 MUST_USE_RESULT MaybeObject* Store( | 507 MUST_USE_RESULT MaybeObject* Store( |
509 Handle<Object> object, | 508 Handle<Object> object, |
510 Handle<String> name, | 509 Handle<String> name, |
511 Handle<Object> value, | 510 Handle<Object> value, |
512 JSReceiver::StoreFromKeyed store_mode = | 511 JSReceiver::StoreFromKeyed store_mode = |
513 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED); | 512 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED); |
514 | 513 |
515 protected: | 514 protected: |
516 virtual Code::Kind kind() const { return Code::STORE_IC; } | 515 virtual Code::Kind kind() const { return Code::STORE_IC; } |
517 virtual Handle<Code> megamorphic_stub(); | 516 virtual Handle<Code> megamorphic_stub(); |
518 | 517 |
519 // Stub accessors. | 518 // Stub accessors. |
520 virtual Handle<Code> generic_stub() const; | 519 virtual Handle<Code> generic_stub() const; |
521 | 520 |
522 virtual Handle<Code> slow_stub() const { | 521 virtual Handle<Code> slow_stub() const { |
523 return isolate()->builtins()->StoreIC_Slow(); | 522 return isolate()->builtins()->StoreIC_Slow(); |
524 } | 523 } |
525 | 524 |
526 virtual Handle<Code> pre_monomorphic_stub() { | 525 virtual Handle<Code> pre_monomorphic_stub() { |
527 return pre_monomorphic_stub(isolate(), strict_mode()); | 526 return pre_monomorphic_stub(isolate(), strict_mode()); |
528 } | 527 } |
529 | 528 |
530 static Handle<Code> pre_monomorphic_stub(Isolate* isolate, | 529 static Handle<Code> pre_monomorphic_stub(Isolate* isolate, |
531 StrictModeFlag strict_mode); | 530 StrictMode strict_mode); |
532 | 531 |
533 // Update the inline cache and the global stub cache based on the | 532 // Update the inline cache and the global stub cache based on the |
534 // lookup result. | 533 // lookup result. |
535 void UpdateCaches(LookupResult* lookup, | 534 void UpdateCaches(LookupResult* lookup, |
536 Handle<JSObject> receiver, | 535 Handle<JSObject> receiver, |
537 Handle<String> name, | 536 Handle<String> name, |
538 Handle<Object> value); | 537 Handle<Object> value); |
539 virtual Handle<Code> CompileHandler(LookupResult* lookup, | 538 virtual Handle<Code> CompileHandler(LookupResult* lookup, |
540 Handle<Object> object, | 539 Handle<Object> object, |
541 Handle<String> name, | 540 Handle<String> name, |
(...skipping 26 matching lines...) Expand all Loading... |
568 }; | 567 }; |
569 | 568 |
570 | 569 |
571 class KeyedStoreIC: public StoreIC { | 570 class KeyedStoreIC: public StoreIC { |
572 public: | 571 public: |
573 // ExtraICState bits (building on IC) | 572 // ExtraICState bits (building on IC) |
574 // ExtraICState bits | 573 // ExtraICState bits |
575 class ExtraICStateKeyedAccessStoreMode: | 574 class ExtraICStateKeyedAccessStoreMode: |
576 public BitField<KeyedAccessStoreMode, 2, 4> {}; // NOLINT | 575 public BitField<KeyedAccessStoreMode, 2, 4> {}; // NOLINT |
577 | 576 |
578 static ExtraICState ComputeExtraICState(StrictModeFlag flag, | 577 static ExtraICState ComputeExtraICState(StrictMode flag, |
579 KeyedAccessStoreMode mode) { | 578 KeyedAccessStoreMode mode) { |
580 return StrictModeState::encode(flag) | | 579 return StrictModeState::encode(flag) | |
581 ExtraICStateKeyedAccessStoreMode::encode(mode); | 580 ExtraICStateKeyedAccessStoreMode::encode(mode); |
582 } | 581 } |
583 | 582 |
584 static KeyedAccessStoreMode GetKeyedAccessStoreMode( | 583 static KeyedAccessStoreMode GetKeyedAccessStoreMode( |
585 ExtraICState extra_state) { | 584 ExtraICState extra_state) { |
586 return ExtraICStateKeyedAccessStoreMode::decode(extra_state); | 585 return ExtraICStateKeyedAccessStoreMode::decode(extra_state); |
587 } | 586 } |
588 | 587 |
589 KeyedStoreIC(FrameDepth depth, Isolate* isolate) | 588 KeyedStoreIC(FrameDepth depth, Isolate* isolate) |
590 : StoreIC(depth, isolate) { | 589 : StoreIC(depth, isolate) { |
591 ASSERT(target()->is_keyed_store_stub()); | 590 ASSERT(target()->is_keyed_store_stub()); |
592 } | 591 } |
593 | 592 |
594 MUST_USE_RESULT MaybeObject* Store(Handle<Object> object, | 593 MUST_USE_RESULT MaybeObject* Store(Handle<Object> object, |
595 Handle<Object> name, | 594 Handle<Object> name, |
596 Handle<Object> value); | 595 Handle<Object> value); |
597 | 596 |
598 // Code generators for stub routines. Only called once at startup. | 597 // Code generators for stub routines. Only called once at startup. |
599 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } | 598 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } |
600 static void GeneratePreMonomorphic(MacroAssembler* masm) { | 599 static void GeneratePreMonomorphic(MacroAssembler* masm) { |
601 GenerateMiss(masm); | 600 GenerateMiss(masm); |
602 } | 601 } |
603 static void GenerateMiss(MacroAssembler* masm); | 602 static void GenerateMiss(MacroAssembler* masm); |
604 static void GenerateSlow(MacroAssembler* masm); | 603 static void GenerateSlow(MacroAssembler* masm); |
605 static void GenerateRuntimeSetProperty(MacroAssembler* masm, | 604 static void GenerateRuntimeSetProperty(MacroAssembler* masm, |
606 StrictModeFlag strict_mode); | 605 StrictMode strict_mode); |
607 static void GenerateGeneric(MacroAssembler* masm, StrictModeFlag strict_mode); | 606 static void GenerateGeneric(MacroAssembler* masm, StrictMode strict_mode); |
608 static void GenerateSloppyArguments(MacroAssembler* masm); | 607 static void GenerateSloppyArguments(MacroAssembler* masm); |
609 | 608 |
610 protected: | 609 protected: |
611 virtual Code::Kind kind() const { return Code::KEYED_STORE_IC; } | 610 virtual Code::Kind kind() const { return Code::KEYED_STORE_IC; } |
612 | 611 |
613 virtual void UpdateMegamorphicCache(HeapType* type, Name* name, Code* code) {} | 612 virtual void UpdateMegamorphicCache(HeapType* type, Name* name, Code* code) {} |
614 | 613 |
615 virtual Handle<Code> pre_monomorphic_stub() { | 614 virtual Handle<Code> pre_monomorphic_stub() { |
616 return pre_monomorphic_stub(isolate(), strict_mode()); | 615 return pre_monomorphic_stub(isolate(), strict_mode()); |
617 } | 616 } |
618 static Handle<Code> pre_monomorphic_stub(Isolate* isolate, | 617 static Handle<Code> pre_monomorphic_stub(Isolate* isolate, |
619 StrictModeFlag strict_mode) { | 618 StrictMode strict_mode) { |
620 if (strict_mode == kStrictMode) { | 619 if (strict_mode == STRICT) { |
621 return isolate->builtins()->KeyedStoreIC_PreMonomorphic_Strict(); | 620 return isolate->builtins()->KeyedStoreIC_PreMonomorphic_Strict(); |
622 } else { | 621 } else { |
623 return isolate->builtins()->KeyedStoreIC_PreMonomorphic(); | 622 return isolate->builtins()->KeyedStoreIC_PreMonomorphic(); |
624 } | 623 } |
625 } | 624 } |
626 virtual Handle<Code> slow_stub() const { | 625 virtual Handle<Code> slow_stub() const { |
627 return isolate()->builtins()->KeyedStoreIC_Slow(); | 626 return isolate()->builtins()->KeyedStoreIC_Slow(); |
628 } | 627 } |
629 virtual Handle<Code> megamorphic_stub() { | 628 virtual Handle<Code> megamorphic_stub() { |
630 if (strict_mode() == kStrictMode) { | 629 if (strict_mode() == STRICT) { |
631 return isolate()->builtins()->KeyedStoreIC_Generic_Strict(); | 630 return isolate()->builtins()->KeyedStoreIC_Generic_Strict(); |
632 } else { | 631 } else { |
633 return isolate()->builtins()->KeyedStoreIC_Generic(); | 632 return isolate()->builtins()->KeyedStoreIC_Generic(); |
634 } | 633 } |
635 } | 634 } |
636 | 635 |
637 Handle<Code> StoreElementStub(Handle<JSObject> receiver, | 636 Handle<Code> StoreElementStub(Handle<JSObject> receiver, |
638 KeyedAccessStoreMode store_mode); | 637 KeyedAccessStoreMode store_mode); |
639 | 638 |
640 private: | 639 private: |
641 void set_target(Code* code) { | 640 void set_target(Code* code) { |
642 // Strict mode must be preserved across IC patching. | 641 // Strict mode must be preserved across IC patching. |
643 ASSERT(GetStrictMode(code->extra_ic_state()) == strict_mode()); | 642 ASSERT(GetStrictMode(code->extra_ic_state()) == strict_mode()); |
644 IC::set_target(code); | 643 IC::set_target(code); |
645 } | 644 } |
646 | 645 |
647 // Stub accessors. | 646 // Stub accessors. |
648 virtual Handle<Code> generic_stub() const { | 647 virtual Handle<Code> generic_stub() const { |
649 if (strict_mode() == kStrictMode) { | 648 if (strict_mode() == STRICT) { |
650 return isolate()->builtins()->KeyedStoreIC_Generic_Strict(); | 649 return isolate()->builtins()->KeyedStoreIC_Generic_Strict(); |
651 } else { | 650 } else { |
652 return isolate()->builtins()->KeyedStoreIC_Generic(); | 651 return isolate()->builtins()->KeyedStoreIC_Generic(); |
653 } | 652 } |
654 } | 653 } |
655 | 654 |
656 Handle<Code> sloppy_arguments_stub() { | 655 Handle<Code> sloppy_arguments_stub() { |
657 return isolate()->builtins()->KeyedStoreIC_SloppyArguments(); | 656 return isolate()->builtins()->KeyedStoreIC_SloppyArguments(); |
658 } | 657 } |
659 | 658 |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
906 DECLARE_RUNTIME_FUNCTION(MaybeObject*, ElementsTransitionAndStoreIC_Miss); | 905 DECLARE_RUNTIME_FUNCTION(MaybeObject*, ElementsTransitionAndStoreIC_Miss); |
907 DECLARE_RUNTIME_FUNCTION(MaybeObject*, BinaryOpIC_Miss); | 906 DECLARE_RUNTIME_FUNCTION(MaybeObject*, BinaryOpIC_Miss); |
908 DECLARE_RUNTIME_FUNCTION(MaybeObject*, BinaryOpIC_MissWithAllocationSite); | 907 DECLARE_RUNTIME_FUNCTION(MaybeObject*, BinaryOpIC_MissWithAllocationSite); |
909 DECLARE_RUNTIME_FUNCTION(MaybeObject*, CompareNilIC_Miss); | 908 DECLARE_RUNTIME_FUNCTION(MaybeObject*, CompareNilIC_Miss); |
910 DECLARE_RUNTIME_FUNCTION(MaybeObject*, ToBooleanIC_Miss); | 909 DECLARE_RUNTIME_FUNCTION(MaybeObject*, ToBooleanIC_Miss); |
911 | 910 |
912 | 911 |
913 } } // namespace v8::internal | 912 } } // namespace v8::internal |
914 | 913 |
915 #endif // V8_IC_H_ | 914 #endif // V8_IC_H_ |
OLD | NEW |