VerifyError: слишком большой размер стека (что это значит?)

Я довольно новичок в байт-коде Java. Я использую BCEL для генерации байт-кода, но я получаю сообщение об ошибке, когда пытаюсь использовать сгенерированный код. (Оглядываясь назад, кажется, что ObjectWeb ASM более продвинутый и используется чаще, чем BCEL.)

Вот сообщение об ошибке:

Exception in thread "main" java.lang.VerifyError: 
(class: cb/io/FileDescriptor, method: set 
 signature: (I)J) 
Stack size too large

Вот метод:

// Method descriptor #4 (I)J
// Stack: 0, Locals: 1
private static long set(int arg1);
  0  lconst_0
  1  lreturn
    Local variable table:
      [pc: 0, pc: 2] local: arg1 index: 0 type: int

Из того, что я понимаю, таблица локальных переменных верна, потому что она соответствует входному параметру. Я не добавил переменную this, потому что метод статический.

Если я не ошибаюсь, lconst_0 загружает длинное значение 0 в стек, а lreturn использует это значение и возвращает его.

Что я делаю неправильно? Достаточно ли здесь информации, чтобы рассказать?

Спасибо!

1 ответ

Решение

Вы должны объявить максимальный размер стека, который вы используете для каждого метода Java. Например, ASM может автоматически вычислять значения, что избавляет вас от многих проблем. Максимальный размер стека - это абсолютное максимальное количество слотов, которые вы используете в методе (сразу, не накапливается). Расчеты могут быть очень сложными при выполнении ветвления.

Вы загружаете long значение здесь, longs потребляют 2 слота стека (фактически каждое 64-битное значение (кроме указателей) потребляет 2 слота стека), поэтому вы должны установить здесь максимальный размер стека 2.

Stack size too large просто говорит вам, что ваш метод потребляет больше слотов стека, как указано в дескрипторе метода.

Другие вопросы по тегам