Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 43e3d22

Browse files
committed
merge 3.4 (#23042)
2 parents 9020a9a + 07abcf5 commit 43e3d22

1 file changed

Lines changed: 30 additions & 18 deletions

File tree

  • Modules/_ctypes/libffi/src/x86

Modules/_ctypes/libffi/src/x86/ffi.c

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -331,10 +331,11 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
331331
extern int
332332
ffi_call_win64(void (*)(char *, extended_cif *), extended_cif *,
333333
unsigned, unsigned, unsigned *, void (*fn)(void));
334-
#else
334+
#elif defined(X86_WIN32)
335335
extern void
336336
ffi_call_win32(void (*)(char *, extended_cif *), extended_cif *,
337337
unsigned, unsigned, unsigned, unsigned *, void (*fn)(void));
338+
#else
338339
extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
339340
unsigned, unsigned, unsigned *, void (*fn)(void));
340341
#endif
@@ -376,16 +377,9 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
376377
ffi_call_win64(ffi_prep_args, &ecif, cif->bytes,
377378
cif->flags, ecif.rvalue, fn);
378379
break;
379-
#else
380-
#ifndef X86_WIN32
381-
case FFI_SYSV:
382-
ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue,
383-
fn);
384-
break;
385-
#else
380+
#elif defined(X86_WIN32)
386381
case FFI_SYSV:
387382
case FFI_MS_CDECL:
388-
#endif
389383
case FFI_STDCALL:
390384
ffi_call_win32(ffi_prep_args, &ecif, cif->abi, cif->bytes, cif->flags,
391385
ecif.rvalue, fn);
@@ -419,6 +413,11 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
419413
ecif.rvalue, fn);
420414
}
421415
break;
416+
#else
417+
case FFI_SYSV:
418+
ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue,
419+
fn);
420+
break;
422421
#endif
423422
default:
424423
FFI_ASSERT(0);
@@ -787,28 +786,36 @@ ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *fake_avalue)
787786
/* If the return value is a struct and we don't have a return */
788787
/* value address then we need to make one */
789788

789+
#ifdef X86_WIN64
790+
if (rvalue == NULL
791+
&& cif->flags == FFI_TYPE_STRUCT
792+
&& cif->rtype->size != 1 && cif->rtype->size != 2
793+
&& cif->rtype->size != 4 && cif->rtype->size != 8)
794+
{
795+
ecif.rvalue = alloca((cif->rtype->size + 0xF) & ~0xF);
796+
}
797+
#else
790798
if (rvalue == NULL
791799
&& (cif->flags == FFI_TYPE_STRUCT
792800
|| cif->flags == FFI_TYPE_MS_STRUCT))
793801
{
794802
ecif.rvalue = alloca(cif->rtype->size);
795803
}
804+
#endif
796805
else
797806
ecif.rvalue = rvalue;
798807

799808

800809
switch (cif->abi)
801810
{
802-
#ifndef X86_WIN32
803-
case FFI_SYSV:
804-
ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags,
805-
ecif.rvalue, fn);
811+
#ifdef X86_WIN64
812+
case FFI_WIN64:
813+
ffi_call_win64(ffi_prep_args_raw, &ecif, cif->bytes,
814+
cif->flags, ecif.rvalue, fn);
806815
break;
807-
#else
816+
#elif defined(X86_WIN32)
808817
case FFI_SYSV:
809818
case FFI_MS_CDECL:
810-
#endif
811-
#ifndef X86_WIN64
812819
case FFI_STDCALL:
813820
ffi_call_win32(ffi_prep_args_raw, &ecif, cif->abi, cif->bytes, cif->flags,
814821
ecif.rvalue, fn);
@@ -835,13 +842,18 @@ ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *fake_avalue)
835842
++passed_regs;
836843
}
837844
if (passed_regs < 2 && abi == FFI_FASTCALL)
838-
cif->abi = abi = FFI_THISCALL;
845+
abi = FFI_THISCALL;
839846
if (passed_regs < 1 && abi == FFI_THISCALL)
840-
cif->abi = abi = FFI_STDCALL;
847+
abi = FFI_STDCALL;
841848
ffi_call_win32(ffi_prep_args_raw, &ecif, abi, cif->bytes, cif->flags,
842849
ecif.rvalue, fn);
843850
}
844851
break;
852+
#else
853+
case FFI_SYSV:
854+
ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ecif.rvalue,
855+
fn);
856+
break;
845857
#endif
846858
default:
847859
FFI_ASSERT(0);

0 commit comments

Comments
 (0)