mirror of
				https://github.com/GayPizzaSpecifications/pork.git
				synced 2025-11-03 17:39:38 +00:00 
			
		
		
		
	evaluator: introduce and expose scope tracking
This commit is contained in:
		@ -9,10 +9,11 @@ import gay.pizza.pork.frontend.ImportLocator
 | 
			
		||||
class CompilationUnitContext(
 | 
			
		||||
  val compilationUnit: CompilationUnit,
 | 
			
		||||
  val evaluator: Evaluator,
 | 
			
		||||
  rootScope: Scope
 | 
			
		||||
  rootScope: Scope,
 | 
			
		||||
  name: String = "unknown"
 | 
			
		||||
) {
 | 
			
		||||
  val internalScope = rootScope.fork()
 | 
			
		||||
  val externalScope = rootScope.fork()
 | 
			
		||||
  val internalScope = rootScope.fork("internal $name")
 | 
			
		||||
  val externalScope = rootScope.fork("external $name")
 | 
			
		||||
 | 
			
		||||
  private var initialized = false
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ class Evaluator(val world: World, val scope: Scope) {
 | 
			
		||||
    val unit = world.load(locator)
 | 
			
		||||
    val identity = world.stableIdentity(locator)
 | 
			
		||||
    val context = contexts.computeIfAbsent(identity) {
 | 
			
		||||
      CompilationUnitContext(unit, this, scope)
 | 
			
		||||
      CompilationUnitContext(unit, this, scope, name = "${locator.form} ${locator.path}")
 | 
			
		||||
    }
 | 
			
		||||
    context.initIfNeeded()
 | 
			
		||||
    return context
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,10 @@
 | 
			
		||||
package gay.pizza.pork.evaluator
 | 
			
		||||
 | 
			
		||||
class Scope(val parent: Scope? = null, inherits: List<Scope> = emptyList()) {
 | 
			
		||||
class Scope(
 | 
			
		||||
  val parent: Scope? = null,
 | 
			
		||||
  inherits: List<Scope> = emptyList(),
 | 
			
		||||
  val name: String? = null
 | 
			
		||||
) {
 | 
			
		||||
  private val inherited = inherits.toMutableList()
 | 
			
		||||
  private val variables = mutableMapOf<String, Any>()
 | 
			
		||||
 | 
			
		||||
@ -41,8 +45,8 @@ class Scope(val parent: Scope? = null, inherits: List<Scope> = emptyList()) {
 | 
			
		||||
    return value
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fun fork(): Scope =
 | 
			
		||||
    Scope(this)
 | 
			
		||||
  fun fork(name: String? = null): Scope =
 | 
			
		||||
    Scope(this, name = name)
 | 
			
		||||
 | 
			
		||||
  internal fun inherit(scope: Scope) {
 | 
			
		||||
    inherited.add(scope)
 | 
			
		||||
@ -55,5 +59,26 @@ class Scope(val parent: Scope? = null, inherits: List<Scope> = emptyList()) {
 | 
			
		||||
    return parent
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fun crawlScopePath(
 | 
			
		||||
    path: List<String> = mutableListOf(name ?: "unknown"),
 | 
			
		||||
    block: (String, List<String>) -> Unit
 | 
			
		||||
  ) {
 | 
			
		||||
    for (key in variables.keys) {
 | 
			
		||||
      block(key, path)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (inherit in inherited) {
 | 
			
		||||
      val mutablePath = path.toMutableList()
 | 
			
		||||
      mutablePath.add("inherit ${inherit.name ?: "unknown"}")
 | 
			
		||||
      inherit.crawlScopePath(mutablePath, block)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (parent != null) {
 | 
			
		||||
      val mutablePath = path.toMutableList()
 | 
			
		||||
      mutablePath.add("parent ${parent.name ?: "unknown"}")
 | 
			
		||||
      parent.crawlScopePath(mutablePath, block)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private object NotFound
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,13 +1,7 @@
 | 
			
		||||
import java java.lang.System
 | 
			
		||||
import java java.io.PrintStream
 | 
			
		||||
import java java.io.InputStreamReader
 | 
			
		||||
import java java.io.BufferedReader
 | 
			
		||||
 | 
			
		||||
export func main() {
 | 
			
		||||
  let input = java_lang_System_in_get()
 | 
			
		||||
  let reader = java_io_InputStreamReader_new_inputstream(input)
 | 
			
		||||
  let bufferedReader = java_io_BufferedReader_new_reader(reader)
 | 
			
		||||
  let line = java_io_BufferedReader_readLine(bufferedReader)
 | 
			
		||||
  let stream = java_lang_System_err_get()
 | 
			
		||||
  java_io_PrintStream_println_string(stream, line)
 | 
			
		||||
  java_io_PrintStream_println_string(stream, "Hello World")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -5,10 +5,7 @@ import com.github.ajalt.clikt.parameters.arguments.argument
 | 
			
		||||
import com.github.ajalt.clikt.parameters.options.flag
 | 
			
		||||
import com.github.ajalt.clikt.parameters.options.option
 | 
			
		||||
import gay.pizza.dough.fs.PlatformFsProvider
 | 
			
		||||
import gay.pizza.pork.evaluator.Arguments
 | 
			
		||||
import gay.pizza.pork.evaluator.CallableFunction
 | 
			
		||||
import gay.pizza.pork.evaluator.None
 | 
			
		||||
import gay.pizza.pork.evaluator.Scope
 | 
			
		||||
import gay.pizza.pork.evaluator.*
 | 
			
		||||
import gay.pizza.pork.ffi.JavaNativeProvider
 | 
			
		||||
import gay.pizza.pork.ffi.JnaNativeProvider
 | 
			
		||||
 | 
			
		||||
@ -16,6 +13,7 @@ class RunCommand : CliktCommand(help = "Run Program", name = "run") {
 | 
			
		||||
  val loop by option("--loop", help = "Loop Program").flag()
 | 
			
		||||
  val measure by option("--measure", help = "Measure Time").flag()
 | 
			
		||||
  val quiet by option("--quiet", help = "Silence Prints").flag()
 | 
			
		||||
  val dumpScope by option("--dump-scope", help = "Dump Scope").flag()
 | 
			
		||||
  val path by argument("file")
 | 
			
		||||
 | 
			
		||||
  override fun run() {
 | 
			
		||||
@ -36,6 +34,14 @@ class RunCommand : CliktCommand(help = "Run Program", name = "run") {
 | 
			
		||||
      addNativeFunctionProvider("java", JavaNativeProvider())
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    if (dumpScope) {
 | 
			
		||||
      val functionContext = main as FunctionContext
 | 
			
		||||
      val internalScope = functionContext.compilationUnitContext.internalScope
 | 
			
		||||
      internalScope.crawlScopePath { key, path ->
 | 
			
		||||
        println("[scope] $key [${path.joinToString(" -> ")}]")
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    maybeLoopAndMeasure(loop, measure) {
 | 
			
		||||
      main.call(Arguments(emptyList()))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user