java.lang.VerifyError:在分支目标 32 处需要堆栈图帧

问题描述

我正在编写一种编译为 java 的编程语言,当我尝试在有条件语句的情况下运行生成代码时,出现以下错误 java.lang.VerifyError: Expecting a stackmap frame at branch target 32 我的完整代码(kotlin)是:

val cw = ClassWriter(ClassWriter.COmpuTE_MAXS)
   cw.visit(
      Opcodes.V1_8,Opcodes.ACC_PUBLIC,name,null,"java/lang/Object",null
   )
   cw.visitSource("$name.len",null)

   val mv = cw.visitMethod(
      Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC,"main","([Ljava/lang/String;)V",null
   )

   mv.visitCode()

   mv.visitTypeInsn(Opcodes.NEW,"java/util/Scanner")
   mv.visitInsn(Opcodes.DUP)
   mv.visitFieldInsn(
      Opcodes.GETSTATIC,"java/lang/System","in","Ljava/io/InputStream;"
   )
   mv.visitMethodInsn(
      Opcodes.INVOKESPECIAL,"java/util/Scanner","<init>","(Ljava/io/InputStream;)V",false
   )
   mv.visitvarInsn(Opcodes.ASTORE,1)
   val labels = mutablelistof<Label>()
   for (i in program) {
      val label = Label()
      labels.add(label)
   }
   labels.add(Label())
   program.forEachIndexed { i,instruction ->
      val label = labels[i]
      mv.visitLabel(label)
      mv.visitLineNumber(i + 1,label)
      when (instruction) {
         Parser.Op.Input -> {
            mv.visitvarInsn(Opcodes.ALOAD,1)
            mv.visitMethodInsn(
               Opcodes.INVOKEVIRTUAL,"next","()Ljava/lang/String;",false
            )
            mv.visitInsn(Opcodes.ICONST_0)
            mv.visitMethodInsn(
               Opcodes.INVOKEVIRTUAL,"java/lang/String","charat","(I)C",false
            )
         }
         Parser.Op.Add -> {
            mv.visitInsn(Opcodes.IADD)
         }
         Parser.Op.Sub -> {
            mv.visitInsn(Opcodes.ISUB)
         }
         Parser.Op.Cond -> {
            mv.visitJumpInsn(Opcodes.IFEQ,labels[i+2])
         }
         Parser.Op.Dup -> {
            mv.visitInsn(Opcodes.DUP)
         }
         Parser.Op.OutN -> {
            mv.visitFieldInsn(
               Opcodes.GETSTATIC,"out","Ljava/io/PrintStream;"
            )
            mv.visitInsn(Opcodes.SWAP)
            mv.visitMethodInsn(
               Opcodes.INVOKEVIRTUAL,"java/io/PrintStream","print","(I)V",false
            )
         }
         else -> {
            if (instruction is Parser.Op.Push) {
               mv.visitLdcInsn(instruction.value)
            }
         }
      }
   }
   mv.visitLabel(labels.last())
   mv.visitInsn(Opcodes.RETURN)

   mv.visitMaxs(0,0)
   mv.visitEnd()

   cw.visitEnd()

   val bytes = cw.toByteArray()
   try {
      val fos = FileOutputStream("$name.class")
      fos.write(bytes)
   } catch (ex: IOException) {
      ex.printstacktrace()
   }

文件下载:https://github.com/LengthLang/LengthJVM/raw/master/Hello.class 我还没有实现我的语言的所有说明。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)