mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-08-04 05:31:33 +00:00
while loop support, and native functions (including ffi!)
This commit is contained in:
26
ffi/src/main/kotlin/gay/pizza/pork/ffi/JnaNativeProvider.kt
Normal file
26
ffi/src/main/kotlin/gay/pizza/pork/ffi/JnaNativeProvider.kt
Normal file
@ -0,0 +1,26 @@
|
||||
package gay.pizza.pork.ffi
|
||||
|
||||
import com.sun.jna.Function
|
||||
import gay.pizza.pork.evaluator.CallableFunction
|
||||
import gay.pizza.pork.evaluator.NativeFunctionProvider
|
||||
|
||||
class JnaNativeProvider : NativeFunctionProvider {
|
||||
override fun provideNativeFunction(definition: String): CallableFunction {
|
||||
val (libraryName, functionSymbol, returnType, _) =
|
||||
definition.split(":", limit = 3)
|
||||
val function = Function.getFunction(libraryName, functionSymbol)
|
||||
return CallableFunction {
|
||||
return@CallableFunction invoke(function, it.values.toTypedArray(), returnType)
|
||||
}
|
||||
}
|
||||
|
||||
private fun invoke(function: Function, values: Array<Any>, type: String): Any = when (type) {
|
||||
"void*" -> function.invokePointer(values)
|
||||
"int" -> function.invokeInt(values)
|
||||
"long" -> function.invokeLong(values)
|
||||
"float" -> function.invokeFloat(values)
|
||||
"double" -> function.invokeDouble(values)
|
||||
"void" -> function.invokeVoid(values)
|
||||
else -> throw RuntimeException("Unsupported ffi return type: $type")
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user