mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-08-03 21:21:33 +00:00
global: a working virtual machine for some of the use cases. APIs and validation still WIP.
This commit is contained in:
@ -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"))
|
||||
|
@ -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) })
|
||||
}
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
|
Reference in New Issue
Block a user