while loop support, and native functions (including ffi!)

This commit is contained in:
2023-09-06 19:07:28 -07:00
parent ddff6cb365
commit 236f812caf
34 changed files with 467 additions and 115 deletions

10
ffi/build.gradle.kts Normal file
View 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")
}

View 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")
}
}