Java-рекурсия с использованием инструкции jsr - PullRequest
4 голосов
/ 21 февраля 2011

Я использую Java-ассемблер Jasmin для компиляции игрушечного языка.Но когда я использую инструкцию jsr для возврата в подпрограмму и запускаю вывод Jasmin, используя java, я получаю ошибку «Рекурсивный вызов jsr entry».Вот код 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

1 Ответ

11 голосов
/ 21 февраля 2011

Рекурсивный jsr явно запрещен §4.8.2 спецификации JVM :

Никакая инструкция jsr или jsr_w не может использоваться для рекурсивного вызова подпрограммы, если эта подпрограммауже присутствует в цепочке вызовов подпрограммы.(Подпрограммы могут быть вложены при использовании конструкций try-finally из предложения finally. Для получения дополнительной информации о подпрограммах виртуальной машины Java см. § 4.9.6.)

Это в первую очередь для упрощения логикиверификатор байт-кода, чтобы он мог гарантировать, что соответствующее состояние сохранено и восстановлено в подпрограмме.

...