Skip to content

Bytecode in compiled class failed to pass verify when calling methods with argument #29

@fifth-light

Description

@fifth-light

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions