| 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 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 823 | 823 |
| 824 // Stub never generated for non-global objects that require access | 824 // Stub never generated for non-global objects that require access |
| 825 // checks. | 825 // checks. |
| 826 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); | 826 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); |
| 827 | 827 |
| 828 // Perform map transition for the receiver if necessary. | 828 // Perform map transition for the receiver if necessary. |
| 829 if (details.type() == FIELD && | 829 if (details.type() == FIELD && |
| 830 object->map()->unused_property_fields() == 0) { | 830 object->map()->unused_property_fields() == 0) { |
| 831 // The properties must be extended before we can store the value. | 831 // The properties must be extended before we can store the value. |
| 832 // We jump to a runtime call that extends the properties array. | 832 // We jump to a runtime call that extends the properties array. |
| 833 __ pop(scratch1); // Return address. | 833 __ PopReturnAddressTo(scratch1); |
| 834 __ push(receiver_reg); | 834 __ push(receiver_reg); |
| 835 __ Push(transition); | 835 __ Push(transition); |
| 836 __ push(value_reg); | 836 __ push(value_reg); |
| 837 __ push(scratch1); | 837 __ PushReturnAddressFrom(scratch1); |
| 838 __ TailCallExternalReference( | 838 __ TailCallExternalReference( |
| 839 ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage), | 839 ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage), |
| 840 masm->isolate()), | 840 masm->isolate()), |
| 841 3, | 841 3, |
| 842 1); | 842 1); |
| 843 return; | 843 return; |
| 844 } | 844 } |
| 845 | 845 |
| 846 // Update the map of the object. | 846 // Update the map of the object. |
| 847 __ Move(scratch1, transition); | 847 __ Move(scratch1, transition); |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1277 GenerateTailCall(masm(), stub.GetCode(isolate())); | 1277 GenerateTailCall(masm(), stub.GetCode(isolate())); |
| 1278 } | 1278 } |
| 1279 } | 1279 } |
| 1280 | 1280 |
| 1281 | 1281 |
| 1282 void BaseLoadStubCompiler::GenerateLoadCallback( | 1282 void BaseLoadStubCompiler::GenerateLoadCallback( |
| 1283 Register reg, | 1283 Register reg, |
| 1284 Handle<ExecutableAccessorInfo> callback) { | 1284 Handle<ExecutableAccessorInfo> callback) { |
| 1285 // Insert additional parameters into the stack frame above return address. | 1285 // Insert additional parameters into the stack frame above return address. |
| 1286 ASSERT(!scratch4().is(reg)); | 1286 ASSERT(!scratch4().is(reg)); |
| 1287 __ pop(scratch4()); // Get return address to place it below. | 1287 __ PopReturnAddressTo(scratch4()); |
| 1288 | 1288 |
| 1289 __ push(receiver()); // receiver | 1289 __ push(receiver()); // receiver |
| 1290 __ push(reg); // holder | 1290 __ push(reg); // holder |
| 1291 if (heap()->InNewSpace(callback->data())) { | 1291 if (heap()->InNewSpace(callback->data())) { |
| 1292 __ Move(scratch1(), callback); | 1292 __ Move(scratch1(), callback); |
| 1293 __ push(FieldOperand(scratch1(), | 1293 __ push(FieldOperand(scratch1(), |
| 1294 ExecutableAccessorInfo::kDataOffset)); // data | 1294 ExecutableAccessorInfo::kDataOffset)); // data |
| 1295 } else { | 1295 } else { |
| 1296 __ Push(Handle<Object>(callback->data(), isolate())); | 1296 __ Push(Handle<Object>(callback->data(), isolate())); |
| 1297 } | 1297 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1317 Register accessor_info_arg = returns_handle ? r8 : rdx; | 1317 Register accessor_info_arg = returns_handle ? r8 : rdx; |
| 1318 Register name_arg = returns_handle ? rdx : rcx; | 1318 Register name_arg = returns_handle ? rdx : rcx; |
| 1319 #else | 1319 #else |
| 1320 Register getter_arg = rdx; | 1320 Register getter_arg = rdx; |
| 1321 Register accessor_info_arg = rsi; | 1321 Register accessor_info_arg = rsi; |
| 1322 Register name_arg = rdi; | 1322 Register name_arg = rdi; |
| 1323 #endif | 1323 #endif |
| 1324 | 1324 |
| 1325 ASSERT(!name_arg.is(scratch4())); | 1325 ASSERT(!name_arg.is(scratch4())); |
| 1326 __ movq(name_arg, rsp); | 1326 __ movq(name_arg, rsp); |
| 1327 __ push(scratch4()); // Restore return address. | 1327 __ PushReturnAddressFrom(scratch4()); |
| 1328 | 1328 |
| 1329 // v8::Arguments::values_ and handler for name. | 1329 // v8::Arguments::values_ and handler for name. |
| 1330 const int kStackSpace = PropertyCallbackArguments::kArgsLength + 1; | 1330 const int kStackSpace = PropertyCallbackArguments::kArgsLength + 1; |
| 1331 | 1331 |
| 1332 // Allocate v8::AccessorInfo in non-GCed stack space. | 1332 // Allocate v8::AccessorInfo in non-GCed stack space. |
| 1333 const int kArgStackSpace = 1; | 1333 const int kArgStackSpace = 1; |
| 1334 | 1334 |
| 1335 __ PrepareCallApiFunction(kArgStackSpace, returns_handle); | 1335 __ PrepareCallApiFunction(kArgStackSpace, returns_handle); |
| 1336 STATIC_ASSERT(PropertyCallbackArguments::kArgsLength == 6); | 1336 STATIC_ASSERT(PropertyCallbackArguments::kArgsLength == 6); |
| 1337 __ lea(rax, Operand(name_arg, 6 * kPointerSize)); | 1337 __ lea(rax, Operand(name_arg, 6 * kPointerSize)); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1437 __ pop(receiver()); | 1437 __ pop(receiver()); |
| 1438 } | 1438 } |
| 1439 | 1439 |
| 1440 // Leave the internal frame. | 1440 // Leave the internal frame. |
| 1441 } | 1441 } |
| 1442 | 1442 |
| 1443 GenerateLoadPostInterceptor(holder_reg, interceptor_holder, name, lookup); | 1443 GenerateLoadPostInterceptor(holder_reg, interceptor_holder, name, lookup); |
| 1444 } else { // !compile_followup_inline | 1444 } else { // !compile_followup_inline |
| 1445 // Call the runtime system to load the interceptor. | 1445 // Call the runtime system to load the interceptor. |
| 1446 // Check that the maps haven't changed. | 1446 // Check that the maps haven't changed. |
| 1447 __ pop(scratch2()); // save old return address | 1447 __ PopReturnAddressTo(scratch2()); |
| 1448 PushInterceptorArguments(masm(), receiver(), holder_reg, | 1448 PushInterceptorArguments(masm(), receiver(), holder_reg, |
| 1449 this->name(), interceptor_holder); | 1449 this->name(), interceptor_holder); |
| 1450 __ push(scratch2()); // restore old return address | 1450 __ PushReturnAddressFrom(scratch2()); |
| 1451 | 1451 |
| 1452 ExternalReference ref = ExternalReference( | 1452 ExternalReference ref = ExternalReference( |
| 1453 IC_Utility(IC::kLoadPropertyWithInterceptorForLoad), isolate()); | 1453 IC_Utility(IC::kLoadPropertyWithInterceptorForLoad), isolate()); |
| 1454 __ TailCallExternalReference(ref, 6, 1); | 1454 __ TailCallExternalReference(ref, 6, 1); |
| 1455 } | 1455 } |
| 1456 } | 1456 } |
| 1457 | 1457 |
| 1458 | 1458 |
| 1459 void CallStubCompiler::GenerateNameCheck(Handle<Name> name, Label* miss) { | 1459 void CallStubCompiler::GenerateNameCheck(Handle<Name> name, Label* miss) { |
| 1460 if (kind_ == Code::KEYED_CALL_IC) { | 1460 if (kind_ == Code::KEYED_CALL_IC) { |
| (...skipping 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2643 | 2643 |
| 2644 Handle<Code> StoreStubCompiler::CompileStoreCallback( | 2644 Handle<Code> StoreStubCompiler::CompileStoreCallback( |
| 2645 Handle<JSObject> object, | 2645 Handle<JSObject> object, |
| 2646 Handle<JSObject> holder, | 2646 Handle<JSObject> holder, |
| 2647 Handle<Name> name, | 2647 Handle<Name> name, |
| 2648 Handle<ExecutableAccessorInfo> callback) { | 2648 Handle<ExecutableAccessorInfo> callback) { |
| 2649 Label success; | 2649 Label success; |
| 2650 HandlerFrontend(object, receiver(), holder, name, &success); | 2650 HandlerFrontend(object, receiver(), holder, name, &success); |
| 2651 __ bind(&success); | 2651 __ bind(&success); |
| 2652 | 2652 |
| 2653 __ pop(scratch1()); // remove the return address | 2653 __ PopReturnAddressTo(scratch1()); |
| 2654 __ push(receiver()); | 2654 __ push(receiver()); |
| 2655 __ Push(callback); // callback info | 2655 __ Push(callback); // callback info |
| 2656 __ Push(name); | 2656 __ Push(name); |
| 2657 __ push(value()); | 2657 __ push(value()); |
| 2658 __ push(scratch1()); // restore return address | 2658 __ PushReturnAddressFrom(scratch1()); |
| 2659 | 2659 |
| 2660 // Do tail-call to the runtime system. | 2660 // Do tail-call to the runtime system. |
| 2661 ExternalReference store_callback_property = | 2661 ExternalReference store_callback_property = |
| 2662 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate()); | 2662 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate()); |
| 2663 __ TailCallExternalReference(store_callback_property, 4, 1); | 2663 __ TailCallExternalReference(store_callback_property, 4, 1); |
| 2664 | 2664 |
| 2665 // Return the generated code. | 2665 // Return the generated code. |
| 2666 return GetCode(kind(), Code::CALLBACKS, name); | 2666 return GetCode(kind(), Code::CALLBACKS, name); |
| 2667 } | 2667 } |
| 2668 | 2668 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2710 } | 2710 } |
| 2711 | 2711 |
| 2712 | 2712 |
| 2713 #undef __ | 2713 #undef __ |
| 2714 #define __ ACCESS_MASM(masm()) | 2714 #define __ ACCESS_MASM(masm()) |
| 2715 | 2715 |
| 2716 | 2716 |
| 2717 Handle<Code> StoreStubCompiler::CompileStoreInterceptor( | 2717 Handle<Code> StoreStubCompiler::CompileStoreInterceptor( |
| 2718 Handle<JSObject> object, | 2718 Handle<JSObject> object, |
| 2719 Handle<Name> name) { | 2719 Handle<Name> name) { |
| 2720 __ pop(scratch1()); // remove the return address | 2720 __ PopReturnAddressTo(scratch1()); |
| 2721 __ push(receiver()); | 2721 __ push(receiver()); |
| 2722 __ push(this->name()); | 2722 __ push(this->name()); |
| 2723 __ push(value()); | 2723 __ push(value()); |
| 2724 __ Push(Smi::FromInt(strict_mode())); | 2724 __ Push(Smi::FromInt(strict_mode())); |
| 2725 __ push(scratch1()); // restore return address | 2725 __ PushReturnAddressFrom(scratch1()); |
| 2726 | 2726 |
| 2727 // Do tail-call to the runtime system. | 2727 // Do tail-call to the runtime system. |
| 2728 ExternalReference store_ic_property = | 2728 ExternalReference store_ic_property = |
| 2729 ExternalReference(IC_Utility(IC::kStoreInterceptorProperty), isolate()); | 2729 ExternalReference(IC_Utility(IC::kStoreInterceptorProperty), isolate()); |
| 2730 __ TailCallExternalReference(store_ic_property, 4, 1); | 2730 __ TailCallExternalReference(store_ic_property, 4, 1); |
| 2731 | 2731 |
| 2732 // Return the generated code. | 2732 // Return the generated code. |
| 2733 return GetCode(kind(), Code::INTERCEPTOR, name); | 2733 return GetCode(kind(), Code::INTERCEPTOR, name); |
| 2734 } | 2734 } |
| 2735 | 2735 |
| (...skipping 778 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3514 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); | 3514 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); |
| 3515 } | 3515 } |
| 3516 } | 3516 } |
| 3517 | 3517 |
| 3518 | 3518 |
| 3519 #undef __ | 3519 #undef __ |
| 3520 | 3520 |
| 3521 } } // namespace v8::internal | 3521 } } // namespace v8::internal |
| 3522 | 3522 |
| 3523 #endif // V8_TARGET_ARCH_X64 | 3523 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |