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 1227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1238 Handle<String> name, | 1238 Handle<String> name, |
1239 Label* miss) { | 1239 Label* miss) { |
1240 ASSERT(holder->IsGlobalObject()); | 1240 ASSERT(holder->IsGlobalObject()); |
1241 | 1241 |
1242 // Get the number of arguments. | 1242 // Get the number of arguments. |
1243 const int argc = arguments().immediate(); | 1243 const int argc = arguments().immediate(); |
1244 | 1244 |
1245 // Get the receiver from the stack. | 1245 // Get the receiver from the stack. |
1246 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 1246 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
1247 | 1247 |
1248 // If the object is the holder then we know that it's a global | |
1249 // object which can only happen for contextual calls. In this case, | |
1250 // the receiver cannot be a smi. | |
1251 if (!object.is_identical_to(holder)) { | |
1252 __ JumpIfSmi(edx, miss); | |
1253 } | |
1254 | 1248 |
1255 // Check that the maps haven't changed. | 1249 // Check that the maps haven't changed. |
| 1250 __ JumpIfSmi(edx, miss); |
1256 CheckPrototypes(object, edx, holder, ebx, eax, edi, name, miss); | 1251 CheckPrototypes(object, edx, holder, ebx, eax, edi, name, miss); |
1257 } | 1252 } |
1258 | 1253 |
1259 | 1254 |
1260 void CallStubCompiler::GenerateLoadFunctionFromCell( | 1255 void CallStubCompiler::GenerateLoadFunctionFromCell( |
1261 Handle<JSGlobalPropertyCell> cell, | 1256 Handle<JSGlobalPropertyCell> cell, |
1262 Handle<JSFunction> function, | 1257 Handle<JSFunction> function, |
1263 Label* miss) { | 1258 Label* miss) { |
1264 // Get the value from the cell. | 1259 // Get the value from the cell. |
1265 if (Serializer::enabled()) { | 1260 if (Serializer::enabled()) { |
(...skipping 1556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2822 Handle<JSGlobalPropertyCell> cell, | 2817 Handle<JSGlobalPropertyCell> cell, |
2823 Handle<String> name, | 2818 Handle<String> name, |
2824 bool is_dont_delete) { | 2819 bool is_dont_delete) { |
2825 // ----------- S t a t e ------------- | 2820 // ----------- S t a t e ------------- |
2826 // -- eax : receiver | 2821 // -- eax : receiver |
2827 // -- ecx : name | 2822 // -- ecx : name |
2828 // -- esp[0] : return address | 2823 // -- esp[0] : return address |
2829 // ----------------------------------- | 2824 // ----------------------------------- |
2830 Label miss; | 2825 Label miss; |
2831 | 2826 |
2832 // If the object is the holder then we know that it's a global | |
2833 // object which can only happen for contextual loads. In this case, | |
2834 // the receiver cannot be a smi. | |
2835 if (!object.is_identical_to(holder)) { | |
2836 __ JumpIfSmi(eax, &miss); | |
2837 } | |
2838 | |
2839 // Check that the maps haven't changed. | 2827 // Check that the maps haven't changed. |
| 2828 __ JumpIfSmi(eax, &miss); |
2840 CheckPrototypes(object, eax, holder, ebx, edx, edi, name, &miss); | 2829 CheckPrototypes(object, eax, holder, ebx, edx, edi, name, &miss); |
2841 | 2830 |
2842 // Get the value from the cell. | 2831 // Get the value from the cell. |
2843 if (Serializer::enabled()) { | 2832 if (Serializer::enabled()) { |
2844 __ mov(ebx, Immediate(cell)); | 2833 __ mov(ebx, Immediate(cell)); |
2845 __ mov(ebx, FieldOperand(ebx, JSGlobalPropertyCell::kValueOffset)); | 2834 __ mov(ebx, FieldOperand(ebx, JSGlobalPropertyCell::kValueOffset)); |
2846 } else { | 2835 } else { |
2847 __ mov(ebx, Operand::Cell(cell)); | 2836 __ mov(ebx, Operand::Cell(cell)); |
2848 } | 2837 } |
2849 | 2838 |
(...skipping 1197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4047 __ jmp(ic_slow, RelocInfo::CODE_TARGET); | 4036 __ jmp(ic_slow, RelocInfo::CODE_TARGET); |
4048 } | 4037 } |
4049 } | 4038 } |
4050 | 4039 |
4051 | 4040 |
4052 #undef __ | 4041 #undef __ |
4053 | 4042 |
4054 } } // namespace v8::internal | 4043 } } // namespace v8::internal |
4055 | 4044 |
4056 #endif // V8_TARGET_ARCH_IA32 | 4045 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |