问题描述
我正在编写一种编译为 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 (将#修改为@)