Fix calling function pointers with FP arguments on arm32

This commit is contained in:
Svyatoslav Scherbina
2017-10-25 11:55:04 +03:00
committed by SvyatoslavScherbina
parent 043e6c54ca
commit 73379a6d59
3 changed files with 43 additions and 23 deletions
+12 -5
View File
@@ -61,9 +61,9 @@ ffi_type* convertFfiTypeKindToType(FfiTypeKind typeKind) {
extern "C" {
void Kotlin_Interop_callWithVarargs(void* codePtr, void* returnValuePtr, FfiTypeKind returnTypeKind,
void Kotlin_Interop_callFunctionPointer(void* codePtr, void* returnValuePtr, FfiTypeKind returnTypeKind,
void** arguments, intptr_t* argumentTypeKinds,
int fixedArgumentsNumber, int totalArgumentsNumber) {
int totalArgumentsNumber, int variadicArgumentsNumber) {
#ifdef KONAN_NO_FFI
RuntimeAssert(false, "Vararg calls are not supported on this platform");
#else
@@ -72,11 +72,18 @@ void Kotlin_Interop_callWithVarargs(void* codePtr, void* returnValuePtr, FfiType
for (int i = 0; i < totalArgumentsNumber; ++i) {
argumentTypes[i] = convertFfiTypeKindToType((FfiTypeKind) argumentTypeKinds[i]);
}
ffi_type* returnType = convertFfiTypeKindToType(returnTypeKind);
ffi_cif cif;
ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI,
fixedArgumentsNumber, totalArgumentsNumber,
convertFfiTypeKindToType(returnTypeKind), argumentTypes);
if (variadicArgumentsNumber < 0) {
// Non-variadic.
ffi_prep_cif(&cif, FFI_DEFAULT_ABI, totalArgumentsNumber, returnType, argumentTypes);
} else {
int fixedArgumentsNumber = totalArgumentsNumber - variadicArgumentsNumber;
ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI,
fixedArgumentsNumber, totalArgumentsNumber,
returnType, argumentTypes);
}
ffi_call(&cif, (void (*)())codePtr, returnValuePtr, arguments);
#endif