- 236
- 4
- 22
Добрый день всем. Вообщем, нужна помощь с ASM`ом. Мне иногда нужно полностью удалить вызов X метода (INVOKE_...) из метода, который я "исправляю". Чтобы это сделать, мне нужно узнать с какой инструкции началась загрузка данных в стек до вызова этого метода, дабы эти инструкции также стереть, иначе будут ошибки, что логично. Есть и похожие случаи, когда мне нужно обернуть вызов метода X в IF [, ибо я вообще дебил.)
Если кому интересно зачем мне этот бред - всё просто. Все мы знаем, что сейчас есть ни 1 и не 2 ядра для серверов, и каждое ядро по своему патчит методы (через
if(...) {вызов метода;}
], где опять же нужно знать с какой инструкции началась загрузка в стек, дабы их тоже обернуть в этот же IF. Есть ли уже встроенные методы-утилиты для поиска инструкций загрузки данных в стек при инвоке метода в самой ASM либе, или же только самому делать велосипед? Просто если самому такое пытаться сделать, уверен, что или крашнется сразу или будет работать "на соплях", ибо так просто явно не найти эти инструкции (Я предполагаю это нужно посчитать сколько аргументов требуется для вызова метода, а затем в обратном порядке искать инструкции, которые загружают эти данные из стека. Но ведь инструкции загрузки может и не быть, а будет лишь метод, который возвращает значение, а при вызове этого метода могут быть ещё нужны какие-либо параметры - как тогда посчитать что относится к "целевой загрузке" данных в стек, а что к "подцелевой" загрузке для вызова субметодов?... Возможно тут в помощь рекурсия, но я не на сколько сейчас эксперт в java байткоде, чтобы осилить такоеЕсли кому интересно зачем мне этот бред - всё просто. Все мы знаем, что сейчас есть ни 1 и не 2 ядра для серверов, и каждое ядро по своему патчит методы (через
-Dlegacy.debugClassLoading=true -Dlegacy.debugClassLoadingSave=true
я в термос ядре находил и вовсе не схожие с оригинальным кодом майнкрафта классы), а значит я не могу просто "посчитать" сколько там инструкций вызвалось до вызова нужного мне метода и эти инструкции циклом удалить, ибо тогда просто крашнутся эти ядра - нужен более надёжный способ, который соберёт инструкции, "привязанные" к инвоку метода. ( Я кнш понимаю, что ASM вещь такая, что на свой страх и риск, но без неё некоторые вещи не выполнимы даже через хуклибы, и хочется чтоб то что делаешь хоть как-то имело поддержку большинство ядер )