Use correct calling convention for API calls on MinGW
BUG=v8:950 Review URL: http://codereview.chromium.org/5699003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5958 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
c1d0baf3dd
commit
5bcfaa3391
@ -1216,25 +1216,28 @@ MaybeObject* MacroAssembler::TryTailCallRuntime(Runtime::FunctionId fid,
|
||||
}
|
||||
|
||||
|
||||
// If true, a Handle<T> passed by value is passed and returned by
|
||||
// using the location_ field directly. If false, it is passed and
|
||||
// returned as a pointer to a handle.
|
||||
#ifdef USING_BSD_ABI
|
||||
static const bool kPassHandlesDirectly = true;
|
||||
// If true, a Handle<T> returned by value from a function with cdecl calling
|
||||
// convention will be returned directly as a value of location_ field in a
|
||||
// register eax.
|
||||
// If false, it is returned as a pointer to a preallocated by caller memory
|
||||
// region. Pointer to this region should be passed to a function as an
|
||||
// implicit first argument.
|
||||
#if defined(USING_BSD_ABI) || defined(__MINGW32__)
|
||||
static const bool kReturnHandlesDirectly = true;
|
||||
#else
|
||||
static const bool kPassHandlesDirectly = false;
|
||||
static const bool kReturnHandlesDirectly = false;
|
||||
#endif
|
||||
|
||||
|
||||
Operand ApiParameterOperand(int index) {
|
||||
return Operand(esp, (index + (kPassHandlesDirectly ? 0 : 1)) * kPointerSize);
|
||||
return Operand(esp, (index + (kReturnHandlesDirectly ? 0 : 1)) * kPointerSize);
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::PrepareCallApiFunction(int argc, Register scratch) {
|
||||
if (kPassHandlesDirectly) {
|
||||
if (kReturnHandlesDirectly) {
|
||||
EnterApiExitFrame(argc);
|
||||
// When handles as passed directly we don't have to allocate extra
|
||||
// When handles are returned directly we don't have to allocate extra
|
||||
// space for and pass an out parameter.
|
||||
} else {
|
||||
// We allocate two additional slots: return value and pointer to it.
|
||||
@ -1279,7 +1282,7 @@ MaybeObject* MacroAssembler::TryCallApiFunctionAndReturn(ApiFunction* function,
|
||||
// Call the api function!
|
||||
call(function->address(), RelocInfo::RUNTIME_ENTRY);
|
||||
|
||||
if (!kPassHandlesDirectly) {
|
||||
if (!kReturnHandlesDirectly) {
|
||||
// The returned value is a pointer to the handle holding the result.
|
||||
// Dereference this to get to the location.
|
||||
mov(eax, Operand(eax, 0));
|
||||
|
Loading…
Reference in New Issue
Block a user