fix game of life support in evaluator

This commit is contained in:
Alex Zenla 2024-12-01 04:13:24 -05:00
parent 4ec5624be4
commit 6e225aab88
No known key found for this signature in database
GPG Key ID: 067B238899B51269
6 changed files with 25 additions and 4 deletions

1
.gitignore vendored
View File

@ -8,3 +8,4 @@ out/
/.fleet/* /.fleet/*
.DS_Store .DS_Store
.intellijPlatform .intellijPlatform
.kotlin/

View File

@ -11,7 +11,11 @@ class EvaluatorProvider(val world: World) : ExecutionContextProvider {
override fun prepare(importLocator: ImportLocator, entryPointSymbol: Symbol, nativeRegistry: NativeRegistry): ExecutionContext { override fun prepare(importLocator: ImportLocator, entryPointSymbol: Symbol, nativeRegistry: NativeRegistry): ExecutionContext {
val evaluator = Evaluator(world) val evaluator = Evaluator(world)
nativeRegistry.forEachProvider { form, provider -> 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) val slab = evaluator.slabContext(importLocator)
slab.finalizeScope() slab.finalizeScope()

View File

@ -34,7 +34,7 @@ class InternalNativeProvider(val quiet: Boolean = false) : NativeProvider {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val list = arguments[0] as MutableList<Any> val list = arguments[0] as MutableList<Any>
val value = arguments[2] val value = arguments[2]
list[(arguments.at<Number>(0)).toInt()] = value list[(arguments.at<Number>(1)).toInt()] = value
return value return value
} }

View File

@ -5,12 +5,14 @@ import com.kenai.jffi.Function
import gay.pizza.pork.ast.gen.ArgumentSpec import gay.pizza.pork.ast.gen.ArgumentSpec
import gay.pizza.pork.evaluator.* import gay.pizza.pork.evaluator.*
import gay.pizza.pork.execution.ArgumentList 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 gay.pizza.pork.execution.None
import kotlin.io.path.Path import kotlin.io.path.Path
import kotlin.io.path.absolutePathString import kotlin.io.path.absolutePathString
import kotlin.io.path.exists import kotlin.io.path.exists
class FfiNativeProvider : ExpandedNativeProvider { class FfiNativeProvider : ExpandedNativeProvider, NativeProvider {
private val internalFunctions = mutableMapOf<String, (ArgumentList) -> Any>( private val internalFunctions = mutableMapOf<String, (ArgumentList) -> Any>(
"ffiStructDefine" to ::ffiStructDefine, "ffiStructDefine" to ::ffiStructDefine,
"ffiStructAllocate" to ::ffiStructAllocate, "ffiStructAllocate" to ::ffiStructAllocate,
@ -208,6 +210,10 @@ class FfiNativeProvider : ExpandedNativeProvider {
return structType.read(address, 0) return structType.read(address, 0)
} }
override fun provideNativeFunction(definitions: List<String>): NativeFunction {
throw RuntimeException("Invalid Native Function Usage")
}
companion object { companion object {
fun typeConversion(type: FfiType): Type = when (type) { fun typeConversion(type: FfiType): Type = when (type) {
FfiPrimitiveType.UnsignedByte -> Type.UINT8 FfiPrimitiveType.UnsignedByte -> Type.UINT8

View File

@ -4,11 +4,13 @@ import gay.pizza.pork.ast.gen.ArgumentSpec
import gay.pizza.pork.evaluator.CallableFunction import gay.pizza.pork.evaluator.CallableFunction
import gay.pizza.pork.evaluator.SlabContext import gay.pizza.pork.evaluator.SlabContext
import gay.pizza.pork.evaluator.ExpandedNativeProvider 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 gay.pizza.pork.execution.None
import java.lang.invoke.MethodHandles import java.lang.invoke.MethodHandles
import java.lang.invoke.MethodType import java.lang.invoke.MethodType
class JavaNativeProvider : ExpandedNativeProvider { class JavaNativeProvider : ExpandedNativeProvider, NativeProvider {
private val lookup = MethodHandles.lookup() private val lookup = MethodHandles.lookup()
override fun provideNativeFunction( override fun provideNativeFunction(
@ -62,4 +64,8 @@ class JavaNativeProvider : ExpandedNativeProvider {
"static-setter" -> lookup.findStaticSetter(javaClass, symbol, returnType) "static-setter" -> lookup.findStaticSetter(javaClass, symbol, returnType)
else -> throw RuntimeException("Unknown Handle Kind: $kind") else -> throw RuntimeException("Unknown Handle Kind: $kind")
} }
override fun provideNativeFunction(definitions: List<String>): NativeFunction {
throw RuntimeException("Invalid Native Function Usage")
}
} }

View File

@ -10,6 +10,8 @@ import gay.pizza.dough.fs.PlatformFsProvider
import gay.pizza.pork.ast.gen.Symbol import gay.pizza.pork.ast.gen.Symbol
import gay.pizza.pork.execution.InternalNativeProvider import gay.pizza.pork.execution.InternalNativeProvider
import gay.pizza.pork.execution.NativeRegistry 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.ExecutionType
import gay.pizza.pork.minimal.FileTool 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 tool = FileTool(PlatformFsProvider.resolve(path))
val nativeRegistry = NativeRegistry() val nativeRegistry = NativeRegistry()
nativeRegistry.add("internal", InternalNativeProvider(quiet = quiet)) nativeRegistry.add("internal", InternalNativeProvider(quiet = quiet))
nativeRegistry.add("java", JavaNativeProvider())
nativeRegistry.add("ffi", FfiNativeProvider())
val main = tool.createExecutionContext(executionType, Symbol("main"), nativeRegistry) val main = tool.createExecutionContext(executionType, Symbol("main"), nativeRegistry)
maybeLoopAndMeasure(loop, measure) { maybeLoopAndMeasure(loop, measure) {
main.execute() main.execute()