Проблема: У меня есть метод, который компилирует более 8000 байт байт-кода Java. У HotSpot есть волшебный предел, который делает JIT не ударом для методов, которые превышают 8000 байт. (Да, разумно иметь огромный метод. Это цикл токенатора.) Метод находится в библиотеке, и я не хочу, чтобы пользователям библиотеки приходилось настраивать HotSpot для деактивации магического предела.
Наблюдение. Декомпиляция байт-кода показывает, что Eclipse Java Compiler генерирует много бессмысленных gotos. (javac еще хуже). То есть есть gotos, которые доступны только от прыжков. Очевидно, что прыжок, прыгающий на goto, должен вместо этого прыгать прямо там, где прыжки goto и goto должны быть устранены.
Вопрос: Есть ли оптимизатор байт-кода для файлов классов Java 5, который выравнивает бессмысленные цепи прыжков, а затем удаляет ненужные gotos?
Изменить: Я имею в виду такие шаблоны, как:
8698: goto 8548
8701: goto 0
Очевидно, что второй goto может быть достигнут только прыжком до 8701, который также может быть прямым прыжком в 0.
Во втором исследовании этот сомнительный шаблон более распространен:
4257: if_icmpne 4263
4260: goto 8704
4263: aload_0
Если, очевидно, хотелось бы, чтобы компилятор изменил "не равное" сравнение на "равное" сравнение, перешел на 8704 и исключил goto.