mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-08-02 12:50:55 +00:00
evaluator: cache native function resolution
This commit is contained in:
parent
e8766323ee
commit
3a43b56fcd
@ -3,20 +3,27 @@ package gay.pizza.pork.evaluator
|
||||
import gay.pizza.pork.ast.FunctionDefinition
|
||||
|
||||
class FunctionContext(val compilationUnitContext: CompilationUnitContext, val node: FunctionDefinition) : CallableFunction {
|
||||
private fun resolveMaybeNative(): CallableFunction? = if (node.native == null) {
|
||||
null
|
||||
} else {
|
||||
val native = node.native!!
|
||||
val nativeFunctionProvider =
|
||||
compilationUnitContext.evaluator.nativeFunctionProvider(native.form.id)
|
||||
nativeFunctionProvider.provideNativeFunction(native.definition.text)
|
||||
}
|
||||
|
||||
private val nativeCached by lazy { resolveMaybeNative() }
|
||||
|
||||
override fun call(arguments: Arguments): Any {
|
||||
if (nativeCached != null) {
|
||||
return nativeCached!!.call(arguments)
|
||||
}
|
||||
|
||||
val scope = compilationUnitContext.internalScope.fork()
|
||||
for ((index, argumentSymbol) in node.arguments.withIndex()) {
|
||||
scope.define(argumentSymbol.id, arguments.values[index])
|
||||
}
|
||||
|
||||
if (node.native != null) {
|
||||
val native = node.native!!
|
||||
val nativeFunctionProvider =
|
||||
compilationUnitContext.evaluator.nativeFunctionProvider(native.form.id)
|
||||
val nativeFunction = nativeFunctionProvider.provideNativeFunction(native.definition.text)
|
||||
return nativeFunction.call(arguments)
|
||||
}
|
||||
|
||||
if (node.block == null) {
|
||||
throw RuntimeException("Native or Block is required for FunctionDefinition")
|
||||
}
|
||||
|
10
examples/java-speed.pork
Normal file
10
examples/java-speed.pork
Normal file
@ -0,0 +1,10 @@
|
||||
import java java.lang.Math
|
||||
import java java.lang.System
|
||||
import java java.io.PrintStream
|
||||
|
||||
export func main() {
|
||||
while true {
|
||||
let pi = java_lang_Math_PI_get()
|
||||
println(pi)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user