ASM (из ObjectWeb) неправильно вычисляет MaxStack, даже если установлен ClassWriter (COMPUTE_MAX + COMPUTE_STACK) - PullRequest
1 голос
/ 10 февраля 2010

Я получаю ожидаемые ошибки ClassVerifyErrors при попытке загрузить класс, созданный мной с использованием ASM. При дальнейшей проверке я вижу, что jvm корректен и что метод, о котором идет речь, имеет недопустимое значение MAX_STACK. Странно то, что я использую автоматический расчет стека и максимальные локальные параметры, так что это не должно быть проблемой ... Метод с неверной опцией очень прост, но в результате получается неправильный байт-код.

Я написал класс с намеченным методом и сравнил свой класс, сгенерированный asm, с тем, что генерирует javac, и совпадение байтовых кодов с единственной ошибкой: максимальный стек равен 0, что неверно, в то время как javac устанавливает значение 2.

Я бы хотел избежать необходимости самостоятельно рассчитывать максимальный стек / локальных пользователей.

1 Ответ

6 голосов
/ 10 февраля 2010

Максимальный расчет стека и переменных может привести к неверным результатам, если байт-код недействителен. Вы можете убедиться в этом, запустив сгенерированный код через 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);
...