我使用Jasmin Java汇编程序编译玩具语言。但是当我使用jsr指令递归回子程序,并使用java运行Jasmin的输出时,我收到错误“递归调用jsr条目”。这是Jasmin代码(它是计算5!(我已经省略了类定义;所有这些都在主方法体中)):
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
答案 0 :(得分:11)
§4.8.2 of the JVM spec明确禁止递归jsr:
如果子例程已存在于子例程调用链中,则不能使用jsr或jsr_w指令递归调用子例程。 (当在finally子句中使用try-finally结构时,子例程可以嵌套。有关Java虚拟机子例程的更多信息,请参阅§4.9.6。)
这主要是为了简化字节码验证器的逻辑,以便确保在子例程中保存和恢复适当的状态。