mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-08-03 13:11:32 +00:00
while loop support, and native functions (including ffi!)
This commit is contained in:
10
ffi/build.gradle.kts
Normal file
10
ffi/build.gradle.kts
Normal file
@ -0,0 +1,10 @@
|
||||
plugins {
|
||||
id("gay.pizza.pork.module")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
api(project(":evaluator"))
|
||||
|
||||
implementation(project(":common"))
|
||||
implementation("net.java.dev.jna:jna:5.13.0")
|
||||
}
|
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