ASM: Как найти тип объекта, содержащегося в ALOAD

Enthought Traits имеет модуль, который работает достаточно хорошо для этого. https://traits.readthedocs.org/en/4.3.0/_modules/traits/util/refresh.html

Он перезагрузит любой измененный модуль и обновлять другие модули и объекты, которые его используют. Он не работает большую часть времени с методами __very_private__ и может захлебываться от наследования классов, но это избавляет меня от сумасшедшего времени от необходимости перезапуска приложения-хозяина при написании PyQt guis или материала, который запускается внутри таких программ, как Maya или Nuke. Это не работает, возможно, в 20-30% случаев, но это все еще невероятно полезно.

Пакет Enthoughtht не перезагружает файлы в тот момент, когда они меняются - вы должны называть это явно - но это не должно " t быть все, что трудно реализовать, если вам это действительно нужно

1
задан Cody Gray 3 March 2019 в 12:48
поделиться

2 ответа

Инструкция ALOAD содержит числовой аргумент, который сообщает, какую локальную переменную она загружает. Как только мы получим это, мы посмотрим в methodnode.localVariables (что вы уже печатали на экране), чтобы найти правильный.

Итак, один из способов - сначала выяснить, какой класс представляет инструкции ALOAD. Вы можете выполнить поиск в Google, например, « aload extends abstractinsnnode site: asm.ow2.io », чтобы найти * InsnNode для использования. Ответ для ALOAD - VarInsnNode . Он, безусловно, содержит поле int var, в котором содержится номер локальной переменной, которую он загружает. Оно должно соответствовать полю int index в списке LocalVariableNode. Однако один и тот же индекс может быть повторно использован для различных целей в одном и том же методе, поэтому вам также необходимо убедиться, что ваша инструкция находится между инструкциями LabelNode, указанными в инструкциях LabelNode start и LabelNode end в LocalVariableNode. Самый простой способ сделать это - просто использовать BasicAnalyer, как рекомендовано @Holger в его комментарии к ответу @Antimony . Таким образом, вы получаете связанный объект Frame для вашего VarInsnNode и делаете frame.getStack(((VarInsnNode) abstractNode).var), чтобы получить описание переменной для инструкции ALOAD.

0
ответ дан Jonas Berlin 3 March 2019 в 12:48
поделиться

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

0
ответ дан Antimony 3 March 2019 в 12:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: