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
значение здесь, long
s потребляют 2 слота стека (фактически каждое 64-битное значение (кроме указателей) потребляет 2 слота стека), поэтому вы должны установить здесь максимальный размер стека 2.
Stack size too large
просто говорит вам, что ваш метод потребляет больше слотов стека, как указано в дескрипторе метода.