OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 1796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1807 Load(node->else_expression(), typeof_state()); | 1807 Load(node->else_expression(), typeof_state()); |
1808 } | 1808 } |
1809 } | 1809 } |
1810 | 1810 |
1811 exit.Bind(); | 1811 exit.Bind(); |
1812 } | 1812 } |
1813 | 1813 |
1814 | 1814 |
1815 void CodeGenerator::VisitSlot(Slot* node) { | 1815 void CodeGenerator::VisitSlot(Slot* node) { |
1816 Comment cmnt(masm_, "[ Slot"); | 1816 Comment cmnt(masm_, "[ Slot"); |
1817 LoadFromSlot(node, typeof_state()); | 1817 LoadFromSlotCheckForArguments(node, typeof_state()); |
1818 } | 1818 } |
1819 | 1819 |
1820 | 1820 |
1821 void CodeGenerator::VisitVariableProxy(VariableProxy* node) { | 1821 void CodeGenerator::VisitVariableProxy(VariableProxy* node) { |
1822 Comment cmnt(masm_, "[ VariableProxy"); | 1822 Comment cmnt(masm_, "[ VariableProxy"); |
1823 Variable* var = node->var(); | 1823 Variable* var = node->var(); |
1824 Expression* expr = var->rewrite(); | 1824 Expression* expr = var->rewrite(); |
1825 if (expr != NULL) { | 1825 if (expr != NULL) { |
1826 Visit(expr); | 1826 Visit(expr); |
1827 } else { | 1827 } else { |
(...skipping 2008 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3836 // because it will always be a context slot. | 3836 // because it will always be a context slot. |
3837 ASSERT(slot->type() == Slot::CONTEXT); | 3837 ASSERT(slot->type() == Slot::CONTEXT); |
3838 Result temp = allocator_->Allocate(); | 3838 Result temp = allocator_->Allocate(); |
3839 ASSERT(temp.is_valid()); | 3839 ASSERT(temp.is_valid()); |
3840 __ movq(temp.reg(), SlotOperand(slot, temp.reg())); | 3840 __ movq(temp.reg(), SlotOperand(slot, temp.reg())); |
3841 frame_->Push(&temp); | 3841 frame_->Push(&temp); |
3842 } | 3842 } |
3843 } | 3843 } |
3844 | 3844 |
3845 | 3845 |
| 3846 void CodeGenerator::LoadFromSlotCheckForArguments(Slot* slot, |
| 3847 TypeofState state) { |
| 3848 LoadFromSlot(slot, state); |
| 3849 |
| 3850 // Bail out quickly if we're not using lazy arguments allocation. |
| 3851 if (ArgumentsMode() != LAZY_ARGUMENTS_ALLOCATION) return; |
| 3852 |
| 3853 // ... or if the slot isn't a non-parameter arguments slot. |
| 3854 if (slot->type() == Slot::PARAMETER || !slot->is_arguments()) return; |
| 3855 |
| 3856 // Pop the loaded value from the stack. |
| 3857 Result value = frame_->Pop(); |
| 3858 |
| 3859 // If the loaded value is a constant, we know if the arguments |
| 3860 // object has been lazily loaded yet. |
| 3861 if (value.is_constant()) { |
| 3862 if (value.handle()->IsTheHole()) { |
| 3863 Result arguments = StoreArgumentsObject(false); |
| 3864 frame_->Push(&arguments); |
| 3865 } else { |
| 3866 frame_->Push(&value); |
| 3867 } |
| 3868 return; |
| 3869 } |
| 3870 |
| 3871 // The loaded value is in a register. If it is the sentinel that |
| 3872 // indicates that we haven't loaded the arguments object yet, we |
| 3873 // need to do it now. |
| 3874 JumpTarget exit; |
| 3875 __ Cmp(value.reg(), Factory::the_hole_value()); |
| 3876 frame_->Push(&value); |
| 3877 exit.Branch(not_equal); |
| 3878 Result arguments = StoreArgumentsObject(false); |
| 3879 frame_->SetElementAt(0, &arguments); |
| 3880 exit.Bind(); |
| 3881 } |
| 3882 |
| 3883 |
3846 void CodeGenerator::StoreToSlot(Slot* slot, InitState init_state) { | 3884 void CodeGenerator::StoreToSlot(Slot* slot, InitState init_state) { |
3847 // TODO(X64): Enable more types of slot. | 3885 // TODO(X64): Enable more types of slot. |
3848 | 3886 |
3849 if (slot->type() == Slot::LOOKUP) { | 3887 if (slot->type() == Slot::LOOKUP) { |
3850 ASSERT(slot->var()->is_dynamic()); | 3888 ASSERT(slot->var()->is_dynamic()); |
3851 | 3889 |
3852 // For now, just do a runtime call. Since the call is inevitable, | 3890 // For now, just do a runtime call. Since the call is inevitable, |
3853 // we eagerly sync the virtual frame so we can directly push the | 3891 // we eagerly sync the virtual frame so we can directly push the |
3854 // arguments into place. | 3892 // arguments into place. |
3855 frame_->SyncRange(0, frame_->element_count() - 1); | 3893 frame_->SyncRange(0, frame_->element_count() - 1); |
(...skipping 1189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5045 void Reference::GetValue(TypeofState typeof_state) { | 5083 void Reference::GetValue(TypeofState typeof_state) { |
5046 ASSERT(!cgen_->in_spilled_code()); | 5084 ASSERT(!cgen_->in_spilled_code()); |
5047 ASSERT(cgen_->HasValidEntryRegisters()); | 5085 ASSERT(cgen_->HasValidEntryRegisters()); |
5048 ASSERT(!is_illegal()); | 5086 ASSERT(!is_illegal()); |
5049 MacroAssembler* masm = cgen_->masm(); | 5087 MacroAssembler* masm = cgen_->masm(); |
5050 switch (type_) { | 5088 switch (type_) { |
5051 case SLOT: { | 5089 case SLOT: { |
5052 Comment cmnt(masm, "[ Load from Slot"); | 5090 Comment cmnt(masm, "[ Load from Slot"); |
5053 Slot* slot = expression_->AsVariableProxy()->AsVariable()->slot(); | 5091 Slot* slot = expression_->AsVariableProxy()->AsVariable()->slot(); |
5054 ASSERT(slot != NULL); | 5092 ASSERT(slot != NULL); |
5055 cgen_->LoadFromSlot(slot, typeof_state); | 5093 cgen_->LoadFromSlotCheckForArguments(slot, typeof_state); |
5056 break; | 5094 break; |
5057 } | 5095 } |
5058 | 5096 |
5059 case NAMED: { | 5097 case NAMED: { |
5060 // TODO(1241834): Make sure that it is safe to ignore the | 5098 // TODO(1241834): Make sure that it is safe to ignore the |
5061 // distinction between expressions in a typeof and not in a | 5099 // distinction between expressions in a typeof and not in a |
5062 // typeof. If there is a chance that reference errors can be | 5100 // typeof. If there is a chance that reference errors can be |
5063 // thrown below, we must distinguish between the two kinds of | 5101 // thrown below, we must distinguish between the two kinds of |
5064 // loads (typeof expression loads must not throw a reference | 5102 // loads (typeof expression loads must not throw a reference |
5065 // error). | 5103 // error). |
(...skipping 1634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6700 int CompareStub::MinorKey() { | 6738 int CompareStub::MinorKey() { |
6701 // Encode the two parameters in a unique 16 bit value. | 6739 // Encode the two parameters in a unique 16 bit value. |
6702 ASSERT(static_cast<unsigned>(cc_) < (1 << 15)); | 6740 ASSERT(static_cast<unsigned>(cc_) < (1 << 15)); |
6703 return (static_cast<unsigned>(cc_) << 1) | (strict_ ? 1 : 0); | 6741 return (static_cast<unsigned>(cc_) << 1) | (strict_ ? 1 : 0); |
6704 } | 6742 } |
6705 | 6743 |
6706 | 6744 |
6707 #undef __ | 6745 #undef __ |
6708 | 6746 |
6709 } } // namespace v8::internal | 6747 } } // namespace v8::internal |
OLD | NEW |