mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-08-03 05:10:55 +00:00
implement java native type support
This commit is contained in:
parent
e86b800a7d
commit
60c7b2d4be
@ -1,7 +1,9 @@
|
|||||||
package gay.pizza.pork.evaluator
|
package gay.pizza.pork.evaluator
|
||||||
|
|
||||||
import gay.pizza.pork.ast.gen.ArgumentSpec
|
import gay.pizza.pork.ast.gen.ArgumentSpec
|
||||||
|
import gay.pizza.pork.execution.NativeFunction
|
||||||
import gay.pizza.pork.execution.NativeProvider
|
import gay.pizza.pork.execution.NativeProvider
|
||||||
|
import gay.pizza.pork.execution.NativeType
|
||||||
|
|
||||||
class AdaptedNativeProvider(val provider: NativeProvider) : ExpandedNativeProvider {
|
class AdaptedNativeProvider(val provider: NativeProvider) : ExpandedNativeProvider {
|
||||||
override fun provideNativeFunction(
|
override fun provideNativeFunction(
|
||||||
@ -12,4 +14,12 @@ class AdaptedNativeProvider(val provider: NativeProvider) : ExpandedNativeProvid
|
|||||||
val function = provider.provideNativeFunction(definitions)
|
val function = provider.provideNativeFunction(definitions)
|
||||||
return CallableFunction { args, _ -> function.invoke(args) }
|
return CallableFunction { args, _ -> function.invoke(args) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun provideNativeFunction(definitions: List<String>): NativeFunction {
|
||||||
|
return provider.provideNativeFunction(definitions)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun provideNativeType(definitions: List<String>): NativeType {
|
||||||
|
return provider.provideNativeType(definitions)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,12 @@
|
|||||||
package gay.pizza.pork.evaluator
|
package gay.pizza.pork.evaluator
|
||||||
|
|
||||||
import gay.pizza.pork.ast.gen.ArgumentSpec
|
import gay.pizza.pork.ast.gen.ArgumentSpec
|
||||||
|
import gay.pizza.pork.execution.NativeProvider
|
||||||
|
|
||||||
interface ExpandedNativeProvider {
|
interface ExpandedNativeProvider: NativeProvider {
|
||||||
fun provideNativeFunction(definitions: List<String>, arguments: List<ArgumentSpec>, inside: SlabContext): CallableFunction
|
fun provideNativeFunction(definitions: List<String>, arguments: List<ArgumentSpec>, inside: SlabContext): CallableFunction {
|
||||||
|
val function = provideNativeFunction(definitions)
|
||||||
|
return CallableFunction { arguments, _ -> function.invoke(arguments) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ import java java.lang.System
|
|||||||
import java java.io.PrintStream
|
import java java.io.PrintStream
|
||||||
|
|
||||||
export func main() {
|
export func main() {
|
||||||
|
println(java_lang_System)
|
||||||
let stream = java_lang_System_err_get()
|
let stream = java_lang_System_err_get()
|
||||||
java_io_PrintStream_println_string(stream, "Hello World")
|
java_io_PrintStream_println_string(stream, "Hello World")
|
||||||
let pi = java_lang_Math_PI_get()
|
let pi = java_lang_Math_PI_get()
|
||||||
|
@ -11,7 +11,18 @@ class JavaAutogen(val javaClass: Class<*>) {
|
|||||||
fun generateCompilationUnit(): CompilationUnit {
|
fun generateCompilationUnit(): CompilationUnit {
|
||||||
return CompilationUnit(
|
return CompilationUnit(
|
||||||
declarations = listOf(),
|
declarations = listOf(),
|
||||||
definitions = generateFunctionDefinitions()
|
definitions = generateFunctionDefinitions() + generateTypeDefinition()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun generateTypeDefinition(): TypeDefinition {
|
||||||
|
return TypeDefinition(
|
||||||
|
modifiers = DefinitionModifiers(export = true),
|
||||||
|
symbol = Symbol(prefix),
|
||||||
|
nativeTypeDescriptor = NativeTypeDescriptor(
|
||||||
|
form = Symbol("java"),
|
||||||
|
definitions = listOf(StringLiteral(javaClass.name)),
|
||||||
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,7 +61,9 @@ class JavaAutogen(val javaClass: Class<*>) {
|
|||||||
if (Modifier.isStatic(method.modifiers)) {
|
if (Modifier.isStatic(method.modifiers)) {
|
||||||
definitions[name] = function(name, parameterNames, form("static"))
|
definitions[name] = function(name, parameterNames, form("static"))
|
||||||
} else {
|
} else {
|
||||||
definitions[name] = function(name, parameterNames, form("virtual"))
|
val finalParameterNames = parameterNames.toMutableList()
|
||||||
|
finalParameterNames.add(0, "__instance")
|
||||||
|
definitions[name] = function(name, finalParameterNames, form("virtual"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
package gay.pizza.pork.ffi
|
package gay.pizza.pork.ffi
|
||||||
|
|
||||||
import gay.pizza.pork.ast.gen.ArgumentSpec
|
|
||||||
import gay.pizza.pork.evaluator.CallableFunction
|
|
||||||
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.NativeFunction
|
||||||
import gay.pizza.pork.execution.NativeProvider
|
import gay.pizza.pork.execution.NativeProvider
|
||||||
@ -14,25 +11,6 @@ import java.lang.invoke.MethodType
|
|||||||
class JavaNativeProvider : ExpandedNativeProvider, NativeProvider {
|
class JavaNativeProvider : ExpandedNativeProvider, NativeProvider {
|
||||||
private val lookup = MethodHandles.lookup()
|
private val lookup = MethodHandles.lookup()
|
||||||
|
|
||||||
override fun provideNativeFunction(
|
|
||||||
definitions: List<String>,
|
|
||||||
arguments: List<ArgumentSpec>,
|
|
||||||
inside: SlabContext
|
|
||||||
): CallableFunction {
|
|
||||||
val functionDefinition = JavaFunctionDefinition.parse(definitions)
|
|
||||||
val javaClass = lookupClass(functionDefinition.type)
|
|
||||||
val returnTypeClass = lookupClass(functionDefinition.returnType)
|
|
||||||
val parameterClasses = functionDefinition.parameters.map { lookupClass(it) }
|
|
||||||
val handle = mapKindToHandle(
|
|
||||||
functionDefinition.kind,
|
|
||||||
functionDefinition.symbol,
|
|
||||||
javaClass,
|
|
||||||
returnTypeClass,
|
|
||||||
parameterClasses
|
|
||||||
)
|
|
||||||
return CallableFunction { functionArguments, _ -> handle.invokeWithArguments(functionArguments) ?: None }
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun lookupClass(name: String): Class<*> = when (name) {
|
private fun lookupClass(name: String): Class<*> = when (name) {
|
||||||
"void" -> Void.TYPE
|
"void" -> Void.TYPE
|
||||||
"String" -> String::class.java
|
"String" -> String::class.java
|
||||||
@ -67,10 +45,23 @@ class JavaNativeProvider : ExpandedNativeProvider, NativeProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun provideNativeFunction(definitions: List<String>): NativeFunction {
|
override fun provideNativeFunction(definitions: List<String>): NativeFunction {
|
||||||
throw RuntimeException("Invalid Native Function Usage")
|
val functionDefinition = JavaFunctionDefinition.parse(definitions)
|
||||||
|
val javaClass = lookupClass(functionDefinition.type)
|
||||||
|
val returnTypeClass = lookupClass(functionDefinition.returnType)
|
||||||
|
val parameterClasses = functionDefinition.parameters.map { lookupClass(it) }
|
||||||
|
val handle = mapKindToHandle(
|
||||||
|
functionDefinition.kind,
|
||||||
|
functionDefinition.symbol,
|
||||||
|
javaClass,
|
||||||
|
returnTypeClass,
|
||||||
|
parameterClasses
|
||||||
|
)
|
||||||
|
return NativeFunction { functionArguments -> handle.invokeWithArguments(functionArguments) ?: None }
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun provideNativeType(definitions: List<String>): NativeType {
|
override fun provideNativeType(definitions: List<String>): NativeType {
|
||||||
throw RuntimeException("Invalid Native Type Usage")
|
val className = definitions[0]
|
||||||
|
val javaClass = Class.forName(className)
|
||||||
|
return JavaNativeType(javaClass)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
9
ffi/src/main/kotlin/gay/pizza/pork/ffi/JavaNativeType.kt
Normal file
9
ffi/src/main/kotlin/gay/pizza/pork/ffi/JavaNativeType.kt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package gay.pizza.pork.ffi
|
||||||
|
|
||||||
|
import gay.pizza.pork.execution.NativeType
|
||||||
|
|
||||||
|
class JavaNativeType(val wrappedJavaClass: Class<*>) : NativeType {
|
||||||
|
override fun value(): Any {
|
||||||
|
return wrappedJavaClass
|
||||||
|
}
|
||||||
|
}
|
@ -12,7 +12,9 @@ class ExternalSymbolUsageAnalyzer : FunctionLevelVisitor<Unit>() {
|
|||||||
|
|
||||||
override fun visitFunctionDefinition(node: FunctionDefinition) {
|
override fun visitFunctionDefinition(node: FunctionDefinition) {
|
||||||
for (argument in node.arguments) {
|
for (argument in node.arguments) {
|
||||||
visit(argument.typeSpec!!)
|
if (argument.typeSpec != null) {
|
||||||
|
visit(argument.typeSpec!!)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node.returnType != null) {
|
if (node.returnType != null) {
|
||||||
|
Loading…
Reference in New Issue
Block a user