-
Notifications
You must be signed in to change notification settings - Fork 4
Open
Description
I want to integrate mocha into my model rendering mod ArmorStand.
To learn how to bind objects into mocha, I wrote a small test. However it failed when compiling molang into bytecode:
import team.unnamed.mocha.MochaEngine
import team.unnamed.mocha.runtime.binding.Binding
@Binding("plain")
class NoArgument(var offset: Int) {
@Binding("calc")
fun calc(): Double = offset.toDouble()
}
@Binding("offset")
class WithOffset(var offset: Int) {
@Binding("calc")
fun calc(value: Double): Double = value + offset.toDouble()
}
fun main() {
val engine = MochaEngine.createStandard()
val plain = NoArgument(0)
engine.bindInstance(NoArgument::class.java, plain, "plain")
val plainExpr = "plain.calc()"
val plainInterpreted = engine.prepareEval(plainExpr)
plain.offset = 3
println(plainInterpreted.evaluate())
plain.offset = 4
println(plainInterpreted.evaluate())
val plainCompiled = engine.compile(plainExpr)
plain.offset = 3
println(plainCompiled.evaluate())
plain.offset = 4
println(plainCompiled.evaluate())
val offset = WithOffset(0)
engine.bindInstance(WithOffset::class.java, offset, "offset")
val offsetExpr = "offset.calc(1)"
val offsetInterpreted = engine.prepareEval(offsetExpr)
offset.offset = 3
println(offsetInterpreted.evaluate())
offset.offset = 4
println(offsetInterpreted.evaluate())
val offsetCompiled = engine.compile(offsetExpr)
offset.offset = 3
println(offsetCompiled.evaluate())
offset.offset = 4
println(offsetCompiled.evaluate())
}Output:
INFO: Running command line: bazel-bin/mocha-test/mocha-test
3.0
4.0
3.0
4.0
4.0
5.0
Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
team/unnamed/mocha/runtime/MolangFunctionImpl_MochaFunction_evaluate_19977c0e2e9_d.evaluate()D @5: invokevirtual
Reason:
Type 'WithOffset' (current frame, stack[2]) is not assignable to double_2nd
Current Frame:
bci: @5
flags: { }
locals: { 'team/unnamed/mocha/runtime/MolangFunctionImpl_MochaFunction_evaluate_19977c0e2e9_d' }
stack: { double, double_2nd, 'WithOffset' }
Bytecode:
0000000: 0f2a b400 0cb6 0012 af
at java.base/java.lang.ClassLoader.defineClass0(Native Method)
at java.base/java.lang.System$2.defineClass(System.java:2394)
at java.base/java.lang.invoke.MethodHandles$Lookup$ClassDefiner.defineClass(MethodHandles.java:2505)
at java.base/java.lang.invoke.MethodHandles$Lookup$ClassDefiner.defineClass(MethodHandles.java:2480)
at java.base/java.lang.invoke.MethodHandles$Lookup.defineClass(MethodHandles.java:1865)
at javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:295)
at javassist.util.proxy.DefineClassHelper$Java11.defineClass(DefineClassHelper.java:48)
at javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:260)
at javassist.ClassPool.toClass(ClassPool.java:1240)
at team.unnamed.mocha.runtime.MolangCompiler.compile(MolangCompiler.java:291)
at team.unnamed.mocha.MochaEngineImpl.compile(MochaEngineImpl.java:186)
at team.unnamed.mocha.MochaEngine.compile(MochaEngine.java:267)
at team.unnamed.mocha.MochaEngine.compile(MochaEngine.java:281)
at MochaTestKt.main(MochaTest.kt:47)
at MochaTestKt.main(MochaTest.kt)
Metadata
Metadata
Assignees
Labels
No labels