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

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