ASM (из ObjectWeb) неправильно вычисляет MaxStack, даже если установлен ClassWriter( COMPUTE_MAX + COMPUTE_STACK)
Я получаю ожидаемые ClassVerifyErrors при попытке загрузить класс, сгенерированный с помощью ASM. При дальнейшей проверке я вижу, что jvm верен и что метод, о котором идет речь, имеет недопустимое значение MAX_STACK. Странно то, что я использую автоматический расчет стека и максимальные локальные параметры, так что это не должно быть проблемой... Метод с недопустимым параметром очень прост, но в результате получается плохой байт-код.
Я написал класс с намеченным методом и сравнил свой класс, сгенерированный asm, с тем, что генерирует javac, и совпадение байтовых кодов с единственной ошибкой: максимальный стек равен 0, что неверно, в то время как javac устанавливает значение 2.
Я хотел бы избежать необходимости самостоятельно вычислять максимальный стек / локальных пользователей.
1 ответ
Расчет максимального стека и переменных может привести к неверным результатам, если байт-код недействителен. Вы можете убедиться в этом, запустив сгенерированный код через CheckClassAdapter.
Например,
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
// generate code into cw instance...
PrintWriter pw = new PrintWriter(System.out);
CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), true, pw);