diff --git a/.gitignore b/.gitignore index c7a7ebe..c4af998 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ out/ /.fleet/* .DS_Store .intellijPlatform +.kotlin/ diff --git a/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/EvaluatorProvider.kt b/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/EvaluatorProvider.kt index 9aa4c1f..ff6a6c3 100644 --- a/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/EvaluatorProvider.kt +++ b/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/EvaluatorProvider.kt @@ -11,7 +11,11 @@ class EvaluatorProvider(val world: World) : ExecutionContextProvider { override fun prepare(importLocator: ImportLocator, entryPointSymbol: Symbol, nativeRegistry: NativeRegistry): ExecutionContext { val evaluator = Evaluator(world) nativeRegistry.forEachProvider { form, provider -> - evaluator.addNativeProvider(form, AdaptedNativeProvider(provider)) + if (provider is ExpandedNativeProvider) { + evaluator.addNativeProvider(form, provider) + } else { + evaluator.addNativeProvider(form, AdaptedNativeProvider(provider)) + } } val slab = evaluator.slabContext(importLocator) slab.finalizeScope() diff --git a/execution/src/main/kotlin/gay/pizza/pork/execution/InternalNativeProvider.kt b/execution/src/main/kotlin/gay/pizza/pork/execution/InternalNativeProvider.kt index 7048214..a816e04 100644 --- a/execution/src/main/kotlin/gay/pizza/pork/execution/InternalNativeProvider.kt +++ b/execution/src/main/kotlin/gay/pizza/pork/execution/InternalNativeProvider.kt @@ -34,7 +34,7 @@ class InternalNativeProvider(val quiet: Boolean = false) : NativeProvider { @Suppress("UNCHECKED_CAST") val list = arguments[0] as MutableList val value = arguments[2] - list[(arguments.at(0)).toInt()] = value + list[(arguments.at(1)).toInt()] = value return value } diff --git a/ffi/src/main/kotlin/gay/pizza/pork/ffi/FfiNativeProvider.kt b/ffi/src/main/kotlin/gay/pizza/pork/ffi/FfiNativeProvider.kt index a82d1c6..4f23b67 100644 --- a/ffi/src/main/kotlin/gay/pizza/pork/ffi/FfiNativeProvider.kt +++ b/ffi/src/main/kotlin/gay/pizza/pork/ffi/FfiNativeProvider.kt @@ -5,12 +5,14 @@ import com.kenai.jffi.Function import gay.pizza.pork.ast.gen.ArgumentSpec import gay.pizza.pork.evaluator.* import gay.pizza.pork.execution.ArgumentList +import gay.pizza.pork.execution.NativeFunction +import gay.pizza.pork.execution.NativeProvider import gay.pizza.pork.execution.None import kotlin.io.path.Path import kotlin.io.path.absolutePathString import kotlin.io.path.exists -class FfiNativeProvider : ExpandedNativeProvider { +class FfiNativeProvider : ExpandedNativeProvider, NativeProvider { private val internalFunctions = mutableMapOf Any>( "ffiStructDefine" to ::ffiStructDefine, "ffiStructAllocate" to ::ffiStructAllocate, @@ -208,6 +210,10 @@ class FfiNativeProvider : ExpandedNativeProvider { return structType.read(address, 0) } + override fun provideNativeFunction(definitions: List): NativeFunction { + throw RuntimeException("Invalid Native Function Usage") + } + companion object { fun typeConversion(type: FfiType): Type = when (type) { FfiPrimitiveType.UnsignedByte -> Type.UINT8 diff --git a/ffi/src/main/kotlin/gay/pizza/pork/ffi/JavaNativeProvider.kt b/ffi/src/main/kotlin/gay/pizza/pork/ffi/JavaNativeProvider.kt index 09ee76a..4836314 100644 --- a/ffi/src/main/kotlin/gay/pizza/pork/ffi/JavaNativeProvider.kt +++ b/ffi/src/main/kotlin/gay/pizza/pork/ffi/JavaNativeProvider.kt @@ -4,11 +4,13 @@ import gay.pizza.pork.ast.gen.ArgumentSpec import gay.pizza.pork.evaluator.CallableFunction import gay.pizza.pork.evaluator.SlabContext import gay.pizza.pork.evaluator.ExpandedNativeProvider +import gay.pizza.pork.execution.NativeFunction +import gay.pizza.pork.execution.NativeProvider import gay.pizza.pork.execution.None import java.lang.invoke.MethodHandles import java.lang.invoke.MethodType -class JavaNativeProvider : ExpandedNativeProvider { +class JavaNativeProvider : ExpandedNativeProvider, NativeProvider { private val lookup = MethodHandles.lookup() override fun provideNativeFunction( @@ -62,4 +64,8 @@ class JavaNativeProvider : ExpandedNativeProvider { "static-setter" -> lookup.findStaticSetter(javaClass, symbol, returnType) else -> throw RuntimeException("Unknown Handle Kind: $kind") } + + override fun provideNativeFunction(definitions: List): NativeFunction { + throw RuntimeException("Invalid Native Function Usage") + } } diff --git a/tool/src/main/kotlin/gay/pizza/pork/tool/RunCommand.kt b/tool/src/main/kotlin/gay/pizza/pork/tool/RunCommand.kt index 14440b2..536bf1d 100644 --- a/tool/src/main/kotlin/gay/pizza/pork/tool/RunCommand.kt +++ b/tool/src/main/kotlin/gay/pizza/pork/tool/RunCommand.kt @@ -10,6 +10,8 @@ import gay.pizza.dough.fs.PlatformFsProvider import gay.pizza.pork.ast.gen.Symbol import gay.pizza.pork.execution.InternalNativeProvider import gay.pizza.pork.execution.NativeRegistry +import gay.pizza.pork.ffi.FfiNativeProvider +import gay.pizza.pork.ffi.JavaNativeProvider import gay.pizza.pork.minimal.ExecutionType import gay.pizza.pork.minimal.FileTool @@ -26,6 +28,8 @@ class RunCommand : CliktCommand(help = "Run Program", name = "run") { val tool = FileTool(PlatformFsProvider.resolve(path)) val nativeRegistry = NativeRegistry() nativeRegistry.add("internal", InternalNativeProvider(quiet = quiet)) + nativeRegistry.add("java", JavaNativeProvider()) + nativeRegistry.add("ffi", FfiNativeProvider()) val main = tool.createExecutionContext(executionType, Symbol("main"), nativeRegistry) maybeLoopAndMeasure(loop, measure) { main.execute()