Add basic support for calling C function pointers

Fix #739
This commit is contained in:
Svyatoslav Scherbina
2017-08-17 14:44:45 +03:00
committed by SvyatoslavScherbina
parent c848ee519d
commit 5586d29764
7 changed files with 270 additions and 11 deletions
+12
View File
@@ -1994,6 +1994,11 @@ kotlinNativeInterop {
flavor 'native'
}
cfunptr {
defFile 'interop/basics/cfunptr.def'
flavor 'native'
}
if (isMac()) {
opengl {
defFile '../../samples/opengl/src/main/c_interop/opengl.def'
@@ -2057,6 +2062,13 @@ task interop_bitfields(type: RunInteropKonanTest) {
interop = 'bitfields'
}
task interop_funptr(type: RunInteropKonanTest) {
disabled = (project.testTarget == 'wasm32') // No interop for wasm yet.
goldValue = "42\n17\n"
source = "interop/basics/funptr.kt"
interop = 'cfunptr'
}
task interop_echo_server(type: RunInteropKonanTest) {
disabled = (project.testTarget == 'wasm32') // No interop for wasm yet.
if (!isMac()) {
@@ -0,0 +1,44 @@
headerFilter = NOTHING
---
#include <stdio.h>
#include <stdlib.h>
typedef int (*atoiPtrType)(const char*);
static atoiPtrType getAtoiPtr() {
return &atoi;
}
static void __printInt(int x) {
printf("%d\n", x);
}
static void* __getPrintIntPtr() {
return &__printInt;
}
typedef void* (*getPrintIntPtrPtrType)(void);
static getPrintIntPtrPtrType getGetPrintIntPtrPtr() {
return &__getPrintIntPtr;
}
static double __add(double x, double y) {
return x + y;
}
typedef double (*addPtrType)(double, double);
static addPtrType getAddPtr() {
return &__add;
}
static int __doubleToInt(double x) {
return (int) x;
}
typedef int (*doubleToIntPtrType)(double);
static doubleToIntPtrType getDoubleToIntPtr() {
return &__doubleToInt;
}
@@ -0,0 +1,21 @@
import kotlinx.cinterop.*
import cfunptr.*
fun main(args: Array<String>) {
val atoiPtr = getAtoiPtr()!!
val getPrintIntPtrPtr = getGetPrintIntPtrPtr()!!
val printIntPtr = getPrintIntPtrPtr()!!.reinterpret<CFunction<(Int) -> Unit>>()
val fortyTwo = memScoped {
atoiPtr("42".cstr.getPointer(memScope))
}
printIntPtr(fortyTwo)
printIntPtr(
getDoubleToIntPtr()!!(
getAddPtr()!!(5.1, 12.2)
)
)
}