| 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 473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 STATIC_ASSERT(kFastApiCallArguments == 6); | 484 STATIC_ASSERT(kFastApiCallArguments == 6); |
| 485 __ lea(rbx, Operand(rsp, kFastApiCallArguments * kPointerSize)); | 485 __ lea(rbx, Operand(rsp, kFastApiCallArguments * kPointerSize)); |
| 486 | 486 |
| 487 // Function address is a foreign pointer outside V8's heap. | 487 // Function address is a foreign pointer outside V8's heap. |
| 488 Address function_address = v8::ToCData<Address>(api_call_info->callback()); | 488 Address function_address = v8::ToCData<Address>(api_call_info->callback()); |
| 489 bool returns_handle = | 489 bool returns_handle = |
| 490 !CallbackTable::ReturnsVoid(masm->isolate(), function_address); | 490 !CallbackTable::ReturnsVoid(masm->isolate(), function_address); |
| 491 | 491 |
| 492 #if defined(__MINGW64__) | 492 #if defined(__MINGW64__) |
| 493 Register arguments_arg = rcx; | 493 Register arguments_arg = rcx; |
| 494 Register callback_arg = rdx; |
| 494 #elif defined(_WIN64) | 495 #elif defined(_WIN64) |
| 495 // Win64 uses first register--rcx--for returned value. | 496 // Win64 uses first register--rcx--for returned value. |
| 496 Register arguments_arg = returns_handle ? rdx : rcx; | 497 Register arguments_arg = returns_handle ? rdx : rcx; |
| 498 Register callback_arg = returns_handle ? r8 : rdx; |
| 497 #else | 499 #else |
| 498 Register arguments_arg = rdi; | 500 Register arguments_arg = rdi; |
| 501 Register callback_arg = rsi; |
| 499 #endif | 502 #endif |
| 500 | 503 |
| 501 // Allocate the v8::Arguments structure in the arguments' space since | 504 // Allocate the v8::Arguments structure in the arguments' space since |
| 502 // it's not controlled by GC. | 505 // it's not controlled by GC. |
| 503 const int kApiStackSpace = 4; | 506 const int kApiStackSpace = 4; |
| 504 | 507 |
| 505 __ PrepareCallApiFunction(kApiStackSpace, returns_handle); | 508 __ PrepareCallApiFunction(kApiStackSpace, returns_handle); |
| 506 | 509 |
| 507 __ movq(StackSpaceOperand(0), rbx); // v8::Arguments::implicit_args_. | 510 __ movq(StackSpaceOperand(0), rbx); // v8::Arguments::implicit_args_. |
| 508 __ addq(rbx, Immediate(argc * kPointerSize)); | 511 __ addq(rbx, Immediate(argc * kPointerSize)); |
| 509 __ movq(StackSpaceOperand(1), rbx); // v8::Arguments::values_. | 512 __ movq(StackSpaceOperand(1), rbx); // v8::Arguments::values_. |
| 510 __ Set(StackSpaceOperand(2), argc); // v8::Arguments::length_. | 513 __ Set(StackSpaceOperand(2), argc); // v8::Arguments::length_. |
| 511 // v8::Arguments::is_construct_call_. | 514 // v8::Arguments::is_construct_call_. |
| 512 __ Set(StackSpaceOperand(3), 0); | 515 __ Set(StackSpaceOperand(3), 0); |
| 513 | 516 |
| 514 // v8::InvocationCallback's argument. | 517 // v8::InvocationCallback's argument. |
| 515 __ lea(arguments_arg, StackSpaceOperand(0)); | 518 __ lea(arguments_arg, StackSpaceOperand(0)); |
| 516 | 519 |
| 520 Address thunk_address = returns_handle |
| 521 ? FUNCTION_ADDR(&InvokeInvocationCallback) |
| 522 : FUNCTION_ADDR(&InvokeFunctionCallback); |
| 523 |
| 517 __ CallApiFunctionAndReturn(function_address, | 524 __ CallApiFunctionAndReturn(function_address, |
| 525 thunk_address, |
| 526 callback_arg, |
| 518 argc + kFastApiCallArguments + 1, | 527 argc + kFastApiCallArguments + 1, |
| 519 returns_handle, | 528 returns_handle, |
| 520 kFastApiCallArguments + 1); | 529 kFastApiCallArguments + 1); |
| 521 } | 530 } |
| 522 | 531 |
| 523 | 532 |
| 524 class CallInterceptorCompiler BASE_EMBEDDED { | 533 class CallInterceptorCompiler BASE_EMBEDDED { |
| 525 public: | 534 public: |
| 526 CallInterceptorCompiler(StubCompiler* stub_compiler, | 535 CallInterceptorCompiler(StubCompiler* stub_compiler, |
| 527 const ParameterCount& arguments, | 536 const ParameterCount& arguments, |
| (...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1311 __ PushAddress(ExternalReference::isolate_address(isolate())); | 1320 __ PushAddress(ExternalReference::isolate_address(isolate())); |
| 1312 __ push(name()); // name | 1321 __ push(name()); // name |
| 1313 // Save a pointer to where we pushed the arguments pointer. This will be | 1322 // Save a pointer to where we pushed the arguments pointer. This will be |
| 1314 // passed as the const ExecutableAccessorInfo& to the C++ callback. | 1323 // passed as the const ExecutableAccessorInfo& to the C++ callback. |
| 1315 | 1324 |
| 1316 Address getter_address = v8::ToCData<Address>(callback->getter()); | 1325 Address getter_address = v8::ToCData<Address>(callback->getter()); |
| 1317 bool returns_handle = | 1326 bool returns_handle = |
| 1318 !CallbackTable::ReturnsVoid(isolate(), getter_address); | 1327 !CallbackTable::ReturnsVoid(isolate(), getter_address); |
| 1319 | 1328 |
| 1320 #if defined(__MINGW64__) | 1329 #if defined(__MINGW64__) |
| 1330 Register getter_arg = r8; |
| 1321 Register accessor_info_arg = rdx; | 1331 Register accessor_info_arg = rdx; |
| 1322 Register name_arg = rcx; | 1332 Register name_arg = rcx; |
| 1323 #elif defined(_WIN64) | 1333 #elif defined(_WIN64) |
| 1324 // Win64 uses first register--rcx--for returned value. | 1334 // Win64 uses first register--rcx--for returned value. |
| 1335 Register getter_arg = returns_handle ? r9 : r8; |
| 1325 Register accessor_info_arg = returns_handle ? r8 : rdx; | 1336 Register accessor_info_arg = returns_handle ? r8 : rdx; |
| 1326 Register name_arg = returns_handle ? rdx : rcx; | 1337 Register name_arg = returns_handle ? rdx : rcx; |
| 1327 #else | 1338 #else |
| 1339 Register getter_arg = rdx; |
| 1328 Register accessor_info_arg = rsi; | 1340 Register accessor_info_arg = rsi; |
| 1329 Register name_arg = rdi; | 1341 Register name_arg = rdi; |
| 1330 #endif | 1342 #endif |
| 1331 | 1343 |
| 1332 ASSERT(!name_arg.is(scratch2())); | 1344 ASSERT(!name_arg.is(scratch2())); |
| 1333 __ movq(name_arg, rsp); | 1345 __ movq(name_arg, rsp); |
| 1334 __ push(scratch2()); // Restore return address. | 1346 __ push(scratch2()); // Restore return address. |
| 1335 | 1347 |
| 1336 // v8::Arguments::values_ and handler for name. | 1348 // v8::Arguments::values_ and handler for name. |
| 1337 const int kStackSpace = PropertyCallbackArguments::kArgsLength + 1; | 1349 const int kStackSpace = PropertyCallbackArguments::kArgsLength + 1; |
| 1338 | 1350 |
| 1339 // Allocate v8::AccessorInfo in non-GCed stack space. | 1351 // Allocate v8::AccessorInfo in non-GCed stack space. |
| 1340 const int kArgStackSpace = 1; | 1352 const int kArgStackSpace = 1; |
| 1341 | 1353 |
| 1342 __ PrepareCallApiFunction(kArgStackSpace, returns_handle); | 1354 __ PrepareCallApiFunction(kArgStackSpace, returns_handle); |
| 1343 STATIC_ASSERT(PropertyCallbackArguments::kArgsLength == 6); | 1355 STATIC_ASSERT(PropertyCallbackArguments::kArgsLength == 6); |
| 1344 __ lea(rax, Operand(name_arg, 6 * kPointerSize)); | 1356 __ lea(rax, Operand(name_arg, 6 * kPointerSize)); |
| 1345 | 1357 |
| 1346 // v8::AccessorInfo::args_. | 1358 // v8::AccessorInfo::args_. |
| 1347 __ movq(StackSpaceOperand(0), rax); | 1359 __ movq(StackSpaceOperand(0), rax); |
| 1348 | 1360 |
| 1349 // The context register (rsi) has been saved in PrepareCallApiFunction and | 1361 // The context register (rsi) has been saved in PrepareCallApiFunction and |
| 1350 // could be used to pass arguments. | 1362 // could be used to pass arguments. |
| 1351 __ lea(accessor_info_arg, StackSpaceOperand(0)); | 1363 __ lea(accessor_info_arg, StackSpaceOperand(0)); |
| 1352 | 1364 |
| 1365 Address thunk_address = returns_handle |
| 1366 ? FUNCTION_ADDR(&InvokeAccessorGetter) |
| 1367 : FUNCTION_ADDR(&InvokeAccessorGetterCallback); |
| 1368 |
| 1353 __ CallApiFunctionAndReturn(getter_address, | 1369 __ CallApiFunctionAndReturn(getter_address, |
| 1370 thunk_address, |
| 1371 getter_arg, |
| 1354 kStackSpace, | 1372 kStackSpace, |
| 1355 returns_handle, | 1373 returns_handle, |
| 1356 5); | 1374 5); |
| 1357 } | 1375 } |
| 1358 | 1376 |
| 1359 | 1377 |
| 1360 void BaseLoadStubCompiler::GenerateLoadConstant(Handle<JSFunction> value) { | 1378 void BaseLoadStubCompiler::GenerateLoadConstant(Handle<JSFunction> value) { |
| 1361 // Return the constant value. | 1379 // Return the constant value. |
| 1362 __ LoadHeapObject(rax, value); | 1380 __ LoadHeapObject(rax, value); |
| 1363 __ ret(0); | 1381 __ ret(0); |
| (...skipping 2122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3486 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); | 3504 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); |
| 3487 } | 3505 } |
| 3488 } | 3506 } |
| 3489 | 3507 |
| 3490 | 3508 |
| 3491 #undef __ | 3509 #undef __ |
| 3492 | 3510 |
| 3493 } } // namespace v8::internal | 3511 } } // namespace v8::internal |
| 3494 | 3512 |
| 3495 #endif // V8_TARGET_ARCH_X64 | 3513 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |