global: a working virtual machine for some of the use cases. APIs and validation still WIP.

This commit is contained in:
2023-11-21 22:18:05 -08:00
parent 0a2d029c5c
commit 6211ad4ff1
53 changed files with 434 additions and 182 deletions

View File

@ -10,6 +10,7 @@ dependencies {
api(project(":parser"))
api(project(":frontend"))
api(project(":evaluator"))
api(project(":vm"))
api(project(":stdlib"))
api(project(":ffi"))
implementation(project(":common"))

View File

@ -0,0 +1,11 @@
package gay.pizza.pork.minimal
import gay.pizza.pork.evaluator.EvaluatorProvider
import gay.pizza.pork.execution.ExecutionContextProvider
import gay.pizza.pork.frontend.World
import gay.pizza.pork.vm.VirtualMachineProvider
enum class ExecutionType(val id: String, val create: (World) -> ExecutionContextProvider) {
Evaluator("evaluator", { world -> EvaluatorProvider(world) }),
VirtualMachine("virtual-machine", { world -> VirtualMachineProvider(world) })
}

View File

@ -2,8 +2,13 @@ package gay.pizza.pork.minimal
import gay.pizza.pork.ast.gen.CompilationUnit
import gay.pizza.pork.ast.gen.NodeVisitor
import gay.pizza.pork.ast.gen.Symbol
import gay.pizza.pork.ast.gen.visit
import gay.pizza.pork.evaluator.*
import gay.pizza.pork.execution.ExecutionContext
import gay.pizza.pork.execution.ExecutionContextProvider
import gay.pizza.pork.execution.InternalNativeProvider
import gay.pizza.pork.execution.NativeRegistry
import gay.pizza.pork.ffi.FfiNativeProvider
import gay.pizza.pork.ffi.JavaAutogenContentSource
import gay.pizza.pork.ffi.JavaNativeProvider
@ -36,20 +41,13 @@ abstract class Tool {
fun <T> visit(visitor: NodeVisitor<T>): T = visitor.visit(parse())
fun loadMainFunction(setupEvaluator: Evaluator.() -> Unit = {}): CallableFunction {
val world = buildWorld()
val evaluator = Evaluator(world)
setupEvaluator(evaluator)
val resultingScope = evaluator.evaluate(rootImportLocator)
return resultingScope.value("main") as CallableFunction
}
fun createExecutionContextProvider(type: ExecutionType): ExecutionContextProvider =
type.create(buildWorld())
fun loadMainFunctionStandard(quiet: Boolean = false): CallableFunction =
loadMainFunction(setupEvaluator = {
addNativeProvider("internal", InternalNativeProvider(quiet = quiet))
addNativeProvider("ffi", FfiNativeProvider())
addNativeProvider("java", JavaNativeProvider())
})
fun createExecutionContext(type: ExecutionType, symbol: Symbol, nativeRegistry: NativeRegistry): ExecutionContext {
val executionContextProvider = createExecutionContextProvider(type)
return executionContextProvider.prepare(rootImportLocator, symbol, nativeRegistry)
}
fun buildWorld(): World {
val fileContentSource = createContentSource()
@ -59,9 +57,4 @@ abstract class Tool {
dynamicImportSource.addContentSource("java", JavaAutogenContentSource)
return World(dynamicImportSource)
}
fun run(quiet: Boolean = false) {
val main = loadMainFunctionStandard(quiet = quiet)
main.call(emptyList(), CallStack())
}
}

View File

@ -1,7 +1,10 @@
package gay.pizza.pork.minimal
import gay.pizza.dough.fs.PlatformFsProvider
import gay.pizza.pork.ast.gen.Symbol
import gay.pizza.pork.evaluator.Scope
import gay.pizza.pork.execution.InternalNativeProvider
import gay.pizza.pork.execution.NativeRegistry
import kotlin.system.exitProcess
fun main(args: Array<String>) {
@ -11,5 +14,12 @@ fun main(args: Array<String>) {
}
val path = PlatformFsProvider.resolve(args[0])
val tool = FileTool(path)
tool.run()
val nativeRegistry = NativeRegistry()
nativeRegistry.add("internal", InternalNativeProvider(quiet = false))
val main = tool.createExecutionContext(
ExecutionType.Evaluator,
Symbol("main"),
nativeRegistry
)
main.execute()
}