ASM (из ObjectWeb) неправильно рассчитывает MaxStack, хотя установлен ClassWriter( COMPUTE_MAX + COMPUTE_STACK )

StackOverflow https://stackoverflow.com/questions/2235493

Вопрос

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

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

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

Это было полезно?

Решение

Вычисление максимального стека и переменных может привести к неправильным результатам, если байт-код недействителен.Вы можете убедиться в этом, запустив сгенерированный код через ЧекКлассАдаптер.

Например,

  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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top