как получить maxLocals по основным API в ASM - PullRequest
0 голосов
/ 28 мая 2019

Я хочу получить maxLocals для хранения данных , как

int index = mv.visitLocalVariable(name, desc, null, start, end, ++maxLocals);

на tree api, this.nextLocals = methodNode.maxLocals;, но основные API, ничего.

Внедрить в, метод ошибкивокруг biz ~.

вот так:

@Test
    public void testCode() {
        hooK hook = StatisGet.get(1L);
        hook.into();
        try {
            //biz
            hook.out();
        } catch (Throwable e) {
            hook.error(e);
        }
    }

теперь я могу успешно вводить байт-код, но solt иногда ошибается, потому что я не могу получить maxLocal.

1 Ответ

2 голосов
/ 28 мая 2019

Предполагая, что «Core API» означает «API-интерфейс посетителя», для MethodVisitor используется метод visitMaxs, который будет вызываться с максимальным стеком и номерами локальных переменных.

Но есть одна загвоздка; этот метод будет вызываться после других методов посетителя. Таким образом, вы не можете использовать это число заранее, чтобы найти неиспользованную локальную переменную.

Решением является использование адаптера LocalVariablesSorter, если вы считаете его частью «Базового API». Он позволяет вам вызывать newLocal, когда вам нужна свободная локальная переменная, и сообщит вам номер следующей переменной, с которой до сих пор не сталкивался. Затем он запомнит номер и, если при продолжении посещения исходного кода встретится с конфликтующими номерами переменных, перенумерует эти номера переменных, чтобы разрешить конфликт.

Вы должны заботиться только о том, чтобы вызывать методы посетителя для исходного метода посетителя (писателя), когда имеете дело с введенным кодом, поскольку методы посетителя в LocalVariablesSorter будут вызываться для исходного код и преобразуется. См. Также этот ответ и этот ответ .

...