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);
Другие вопросы по тегам