| 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 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 Register name, | 372 Register name, |
| 373 Handle<JSObject> holder_obj) { | 373 Handle<JSObject> holder_obj) { |
| 374 __ push(name); | 374 __ push(name); |
| 375 Handle<InterceptorInfo> interceptor(holder_obj->GetNamedInterceptor()); | 375 Handle<InterceptorInfo> interceptor(holder_obj->GetNamedInterceptor()); |
| 376 ASSERT(!masm->isolate()->heap()->InNewSpace(*interceptor)); | 376 ASSERT(!masm->isolate()->heap()->InNewSpace(*interceptor)); |
| 377 __ Move(kScratchRegister, interceptor); | 377 __ Move(kScratchRegister, interceptor); |
| 378 __ push(kScratchRegister); | 378 __ push(kScratchRegister); |
| 379 __ push(receiver); | 379 __ push(receiver); |
| 380 __ push(holder); | 380 __ push(holder); |
| 381 __ push(FieldOperand(kScratchRegister, InterceptorInfo::kDataOffset)); | 381 __ push(FieldOperand(kScratchRegister, InterceptorInfo::kDataOffset)); |
| 382 __ movq(kScratchRegister, ExternalReference::isolate_address()); | 382 __ PushAddress(ExternalReference::isolate_address()); |
| 383 __ push(kScratchRegister); | |
| 384 } | 383 } |
| 385 | 384 |
| 386 | 385 |
| 387 static void CompileCallLoadPropertyWithInterceptor( | 386 static void CompileCallLoadPropertyWithInterceptor( |
| 388 MacroAssembler* masm, | 387 MacroAssembler* masm, |
| 389 Register receiver, | 388 Register receiver, |
| 390 Register holder, | 389 Register holder, |
| 391 Register name, | 390 Register name, |
| 392 Handle<JSObject> holder_obj) { | 391 Handle<JSObject> holder_obj) { |
| 393 PushInterceptorArguments(masm, receiver, holder, name, holder_obj); | 392 PushInterceptorArguments(masm, receiver, holder, name, holder_obj); |
| (...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1003 __ pop(scratch2); // Get return address to place it below. | 1002 __ pop(scratch2); // Get return address to place it below. |
| 1004 | 1003 |
| 1005 __ push(receiver); // receiver | 1004 __ push(receiver); // receiver |
| 1006 __ push(reg); // holder | 1005 __ push(reg); // holder |
| 1007 if (heap()->InNewSpace(callback->data())) { | 1006 if (heap()->InNewSpace(callback->data())) { |
| 1008 __ Move(scratch1, callback); | 1007 __ Move(scratch1, callback); |
| 1009 __ push(FieldOperand(scratch1, AccessorInfo::kDataOffset)); // data | 1008 __ push(FieldOperand(scratch1, AccessorInfo::kDataOffset)); // data |
| 1010 } else { | 1009 } else { |
| 1011 __ Push(Handle<Object>(callback->data())); | 1010 __ Push(Handle<Object>(callback->data())); |
| 1012 } | 1011 } |
| 1013 __ movq(kScratchRegister, ExternalReference::isolate_address()); | 1012 __ PushAddress(ExternalReference::isolate_address()); // isolate |
| 1014 __ push(kScratchRegister); // isolate | |
| 1015 __ push(name_reg); // name | 1013 __ push(name_reg); // name |
| 1016 // Save a pointer to where we pushed the arguments pointer. | 1014 // Save a pointer to where we pushed the arguments pointer. |
| 1017 // This will be passed as the const AccessorInfo& to the C++ callback. | 1015 // This will be passed as the const AccessorInfo& to the C++ callback. |
| 1018 | 1016 |
| 1019 #ifdef _WIN64 | 1017 #ifdef _WIN64 |
| 1020 // Win64 uses first register--rcx--for returned value. | 1018 // Win64 uses first register--rcx--for returned value. |
| 1021 Register accessor_info_arg = r8; | 1019 Register accessor_info_arg = r8; |
| 1022 Register name_arg = rdx; | 1020 Register name_arg = rdx; |
| 1023 #else | 1021 #else |
| 1024 Register accessor_info_arg = rsi; | 1022 Register accessor_info_arg = rsi; |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1179 ASSERT(callback->getter() != NULL); | 1177 ASSERT(callback->getter() != NULL); |
| 1180 | 1178 |
| 1181 // Tail call to runtime. | 1179 // Tail call to runtime. |
| 1182 // Important invariant in CALLBACKS case: the code above must be | 1180 // Important invariant in CALLBACKS case: the code above must be |
| 1183 // structured to never clobber |receiver| register. | 1181 // structured to never clobber |receiver| register. |
| 1184 __ pop(scratch2); // return address | 1182 __ pop(scratch2); // return address |
| 1185 __ push(receiver); | 1183 __ push(receiver); |
| 1186 __ push(holder_reg); | 1184 __ push(holder_reg); |
| 1187 __ Move(holder_reg, callback); | 1185 __ Move(holder_reg, callback); |
| 1188 __ push(FieldOperand(holder_reg, AccessorInfo::kDataOffset)); | 1186 __ push(FieldOperand(holder_reg, AccessorInfo::kDataOffset)); |
| 1189 __ movq(kScratchRegister, ExternalReference::isolate_address()); | 1187 __ PushAddress(ExternalReference::isolate_address()); |
| 1190 __ push(kScratchRegister); | |
| 1191 __ push(holder_reg); | 1188 __ push(holder_reg); |
| 1192 __ push(name_reg); | 1189 __ push(name_reg); |
| 1193 __ push(scratch2); // restore return address | 1190 __ push(scratch2); // restore return address |
| 1194 | 1191 |
| 1195 ExternalReference ref = | 1192 ExternalReference ref = |
| 1196 ExternalReference(IC_Utility(IC::kLoadCallbackProperty), | 1193 ExternalReference(IC_Utility(IC::kLoadCallbackProperty), |
| 1197 isolate()); | 1194 isolate()); |
| 1198 __ TailCallExternalReference(ref, 6, 1); | 1195 __ TailCallExternalReference(ref, 6, 1); |
| 1199 } | 1196 } |
| 1200 } else { // !compile_followup_inline | 1197 } else { // !compile_followup_inline |
| (...skipping 2622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3823 __ jmp(ic_slow, RelocInfo::CODE_TARGET); | 3820 __ jmp(ic_slow, RelocInfo::CODE_TARGET); |
| 3824 } | 3821 } |
| 3825 } | 3822 } |
| 3826 | 3823 |
| 3827 | 3824 |
| 3828 #undef __ | 3825 #undef __ |
| 3829 | 3826 |
| 3830 } } // namespace v8::internal | 3827 } } // namespace v8::internal |
| 3831 | 3828 |
| 3832 #endif // V8_TARGET_ARCH_X64 | 3829 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |