4

我正在使用 Jasmin Java 汇编器来编译玩具语言。但是,当我使用 jsr 指令递归回子程序并使用 java 运行 Jasmin 的输出时,我收到错误“递归调用 jsr 条目”。这是 Jasmin 代码(它正在计算 5!(我省略了类定义;所有这些都在 main 方法体中)):

f:
   swap
   istore 2
   iload 2
   ifeq label0
   iload 2
   iload 2
   ldc 1
   isub
   jsr f
   istore 1
   istore 2
   iload 1
   iload 2
   imul
   goto label1
label0:
   ldc 1
label1:
   swap
   astore 0
   ret 0
main:
   ldc 5
   jsr f
   istore 1
   iload 1
4

1 回答 1

11

JVM 规范的 §4.8.2明确禁止递归 jsr :

如果子例程已经存在于子例程调用链中,则不能使用 jsr 或 jsr_w 指令递归调用子例程。(在 finally 子句中使用 try-finally 结构时,可以嵌套子例程。有关 Java 虚拟机子例程的更多信息,请参阅第 4.9.6 节。)

这主要是为了简化字节码验证器的逻辑,以便它可以确保在子程序中保存和恢复适当的状态。

于 2011-02-21T20:58:52.840 回答