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 771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
782 __ bind(label); | 782 __ bind(label); |
783 __ mov(this->name(), Immediate(name)); | 783 __ mov(this->name(), Immediate(name)); |
784 } | 784 } |
785 } | 785 } |
786 | 786 |
787 | 787 |
788 // Generate code to check that a global property cell is empty. Create | 788 // Generate code to check that a global property cell is empty. Create |
789 // the property cell at compilation time if no cell exists for the | 789 // the property cell at compilation time if no cell exists for the |
790 // property. | 790 // property. |
791 void StubCompiler::GenerateCheckPropertyCell(MacroAssembler* masm, | 791 void StubCompiler::GenerateCheckPropertyCell(MacroAssembler* masm, |
792 Handle<GlobalObject> global, | 792 Handle<JSGlobalObject> global, |
793 Handle<Name> name, | 793 Handle<Name> name, |
794 Register scratch, | 794 Register scratch, |
795 Label* miss) { | 795 Label* miss) { |
796 Handle<PropertyCell> cell = | 796 Handle<PropertyCell> cell = |
797 GlobalObject::EnsurePropertyCell(global, name); | 797 JSGlobalObject::EnsurePropertyCell(global, name); |
798 ASSERT(cell->value()->IsTheHole()); | 798 ASSERT(cell->value()->IsTheHole()); |
799 Handle<Oddball> the_hole = masm->isolate()->factory()->the_hole_value(); | 799 Handle<Oddball> the_hole = masm->isolate()->factory()->the_hole_value(); |
800 if (Serializer::enabled()) { | 800 if (Serializer::enabled()) { |
801 __ mov(scratch, Immediate(cell)); | 801 __ mov(scratch, Immediate(cell)); |
802 __ cmp(FieldOperand(scratch, PropertyCell::kValueOffset), | 802 __ cmp(FieldOperand(scratch, PropertyCell::kValueOffset), |
803 Immediate(the_hole)); | 803 Immediate(the_hole)); |
804 } else { | 804 } else { |
805 __ cmp(Operand::ForCell(cell), Immediate(the_hole)); | 805 __ cmp(Operand::ForCell(cell), Immediate(the_hole)); |
806 } | 806 } |
807 __ j(not_equal, miss); | 807 __ j(not_equal, miss); |
808 } | 808 } |
809 | 809 |
810 | 810 |
811 void StoreStubCompiler::GenerateNegativeHolderLookup( | 811 void StoreStubCompiler::GenerateNegativeHolderLookup( |
812 MacroAssembler* masm, | 812 MacroAssembler* masm, |
813 Handle<JSObject> holder, | 813 Handle<JSObject> holder, |
814 Register holder_reg, | 814 Register holder_reg, |
815 Handle<Name> name, | 815 Handle<Name> name, |
816 Label* miss) { | 816 Label* miss) { |
817 if (holder->IsJSGlobalObject()) { | 817 if (holder->IsJSGlobalObject()) { |
818 GenerateCheckPropertyCell( | 818 GenerateCheckPropertyCell( |
819 masm, Handle<GlobalObject>::cast(holder), name, scratch1(), miss); | 819 masm, Handle<JSGlobalObject>::cast(holder), name, scratch1(), miss); |
820 } else if (!holder->HasFastProperties() && !holder->IsJSGlobalProxy()) { | 820 } else if (!holder->HasFastProperties() && !holder->IsJSGlobalProxy()) { |
821 GenerateDictionaryNegativeLookup( | 821 GenerateDictionaryNegativeLookup( |
822 masm, miss, holder_reg, name, scratch1(), scratch2()); | 822 masm, miss, holder_reg, name, scratch1(), scratch2()); |
823 } | 823 } |
824 } | 824 } |
825 | 825 |
826 | 826 |
827 // Receiver_reg is preserved on jumps to miss_label, but may be destroyed if | 827 // Receiver_reg is preserved on jumps to miss_label, but may be destroyed if |
828 // store is successful. | 828 // store is successful. |
829 void StoreStubCompiler::GenerateStoreTransition(MacroAssembler* masm, | 829 void StoreStubCompiler::GenerateStoreTransition(MacroAssembler* masm, |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1119 | 1119 |
1120 | 1120 |
1121 void StubCompiler::GenerateCheckPropertyCells(MacroAssembler* masm, | 1121 void StubCompiler::GenerateCheckPropertyCells(MacroAssembler* masm, |
1122 Handle<JSObject> object, | 1122 Handle<JSObject> object, |
1123 Handle<JSObject> holder, | 1123 Handle<JSObject> holder, |
1124 Handle<Name> name, | 1124 Handle<Name> name, |
1125 Register scratch, | 1125 Register scratch, |
1126 Label* miss) { | 1126 Label* miss) { |
1127 Handle<JSObject> current = object; | 1127 Handle<JSObject> current = object; |
1128 while (!current.is_identical_to(holder)) { | 1128 while (!current.is_identical_to(holder)) { |
1129 if (current->IsGlobalObject()) { | 1129 if (current->IsJSGlobalObject()) { |
1130 GenerateCheckPropertyCell(masm, | 1130 GenerateCheckPropertyCell(masm, |
1131 Handle<GlobalObject>::cast(current), | 1131 Handle<JSGlobalObject>::cast(current), |
1132 name, | 1132 name, |
1133 scratch, | 1133 scratch, |
1134 miss); | 1134 miss); |
1135 } | 1135 } |
1136 current = Handle<JSObject>(JSObject::cast(current->GetPrototype())); | 1136 current = Handle<JSObject>(JSObject::cast(current->GetPrototype())); |
1137 } | 1137 } |
1138 } | 1138 } |
1139 | 1139 |
1140 | 1140 |
1141 void StubCompiler::GenerateTailCall(MacroAssembler* masm, Handle<Code> code) { | 1141 void StubCompiler::GenerateTailCall(MacroAssembler* masm, Handle<Code> code) { |
(...skipping 1874 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3016 // Return the generated code. | 3016 // Return the generated code. |
3017 return GetICCode( | 3017 return GetICCode( |
3018 kind(), Code::NORMAL, factory()->empty_string(), POLYMORPHIC); | 3018 kind(), Code::NORMAL, factory()->empty_string(), POLYMORPHIC); |
3019 } | 3019 } |
3020 | 3020 |
3021 | 3021 |
3022 Handle<Code> LoadStubCompiler::CompileLoadNonexistent( | 3022 Handle<Code> LoadStubCompiler::CompileLoadNonexistent( |
3023 Handle<JSObject> object, | 3023 Handle<JSObject> object, |
3024 Handle<JSObject> last, | 3024 Handle<JSObject> last, |
3025 Handle<Name> name, | 3025 Handle<Name> name, |
3026 Handle<GlobalObject> global) { | 3026 Handle<JSGlobalObject> global) { |
3027 Label success; | 3027 Label success; |
3028 | 3028 |
3029 NonexistentHandlerFrontend(object, last, name, &success, global); | 3029 NonexistentHandlerFrontend(object, last, name, &success, global); |
3030 | 3030 |
3031 __ bind(&success); | 3031 __ bind(&success); |
3032 // Return undefined if maps of the full prototype chain are still the | 3032 // Return undefined if maps of the full prototype chain are still the |
3033 // same and no global property with this name contains a value. | 3033 // same and no global property with this name contains a value. |
3034 __ mov(eax, isolate()->factory()->undefined_value()); | 3034 __ mov(eax, isolate()->factory()->undefined_value()); |
3035 __ ret(0); | 3035 __ ret(0); |
3036 | 3036 |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3241 // ----------------------------------- | 3241 // ----------------------------------- |
3242 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_MissForceGeneric); | 3242 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_MissForceGeneric); |
3243 } | 3243 } |
3244 | 3244 |
3245 | 3245 |
3246 #undef __ | 3246 #undef __ |
3247 | 3247 |
3248 } } // namespace v8::internal | 3248 } } // namespace v8::internal |
3249 | 3249 |
3250 #endif // V8_TARGET_ARCH_IA32 | 3250 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |