ASM инжект в конструктор

Версия Minecraft
1.7.10
API
Forge
236
4
22
Всем привет. Нужна помощь по ASM. Вообщем проблема заключается в том, что нельзя вставить код до вызова this() / super() конструктора в конструкторе, а значит нужно найти "конец" вызова этого конструктора. (Основная моя цель - вставить код в начало конструктора, тобишь после вызова this() / super()). По началу я подумал, что всё просто - нужно лишь итератором пройтись и найти самую первую инструкцию с опкодом INVOKESPECIAL и name.equlas("<init>). Но не всё так просто, как показалось.... Бывают редкие случаи с "дополнительными" вызовами методов внутри super/this инициализации конструктора. Вот к примеру:

Java:
public class TestClass {
    private int d = 13;
    private TestClass f;

    public TestClass(String s, int i, int y) {
        this(new TestClass(), s);
        f = new TestClass();
    }

    public TestClass(String s, int i, String d) {
        this(new TestClass(), new TestClass(s), testf());
        f = new TestClass();
        f = new TestClass(new String(d));
    }

    private static String testf() {
        return "в";
    }

    public TestClass() {

    }

}
Да, тут примеры явно не лучшие, т.к. скорее всего именно такой код нигде мы не встретим. Но создание и передачу обжекта в this/super или ретурна из статик метода - запросто. Если смотреть на такой код со стороны ASM ByteCode Viewer, то сразу идей, как задетектить конец this/super инициализации конструктора - нет. Особенно с примером, где за инициализацией идёт присвоение new обжеков в филды. Ведь хоть в инициализацию, хоть после неё - инстанции классов создаются через опкод NEW и INVOKESPECIAL <init> (а также подгрузка в стек данных для аргументов конструктора, если они есть).
Помогите, пожалуйста, придумать, как мне найти INVOKESPECIAL инструкцию, которая является "концом" вызова this() / super() в конструкторе (тобишь чтобы я мог за этой инструкцией вставлять свой код). @GloomyFolken подключаю тебя сразу к этой теме, т.к. уверен, что ты знаешь как это решить, ибо вроде как твоя либа позволяет инжектить код в начало не только методов но и конструкторов (именно то, что сейчас мне нужно)
 
236
4
22
Я не пойму, хуки для дол*****?
Мне надо делать то, что не поддерживает хуклиба от глуми, по этому и прошу помощи с поиском "конца" вызова супер/зис конструктора, дабы не получился краш с Bad type operand из-за выполнения кода до вызова конструктора
 
808
3
124
Если мне не изменяет память, я не заморачивался и вставлял байт-код до вызова другого конструктора. Это легально, если не делать return. Простого способа определить где заканчивается вызов другого конструктора нет, держи срачик на эту тему: Determining in the bytecode where is the super() method call all constructors must do on the JVM
 
236
4
22
Если мне не изменяет память, я не заморачивался и вставлял байт-код до вызова другого конструктора. Это легально, если не делать return.
Хмм, можно примерчик вставки кода в старт конструктора?
 
Сверху