ASM BasicInterpreter IllegalStateException

Oct 21 2020

Ich habe diese Frage hier auf SO gesehen und versuche, den Code aus der akzeptierten Antwort zu kompilieren. Leider erhalte ich in diesem Teil des Codes immer wieder eine IllegalStateException:

BasicInterpreter basic = new BasicInterpreter() {
        @Override public BasicValue newValue(Type type) {
            return type!=null && (type.getSort()==Type.OBJECT || type.getSort()==Type.ARRAY)?
                    new BasicValue(type): super.newValue(type);
        }
        @Override public BasicValue merge(BasicValue a, BasicValue b) {
            if(a.equals(b)) return a;
            if(a.isReference() && b.isReference())
                // this is the place to consider the actual type hierarchy if you want
                return BasicValue.REFERENCE_VALUE;
            return BasicValue.UNINITIALIZED_VALUE;
        }
    };

Mit der Stapelverfolgung:

Exception in thread "main" java.lang.IllegalStateException
    at org.objectweb.asm.tree.analysis.BasicInterpreter.<init>(BasicInterpreter.java:66)
    at ConstantTracker$1.<init>(ConstantTracker.java:48)
    at ConstantTracker.<init>(ConstantTracker.java:48)
    at HelloWorld.analyze(HelloWorld.java:37)
    at HelloWorld.main(HelloWorld.java:28)

Die Ausnahme wird hier in der BasicInterpreter- Klasse ausgelöst :

public BasicInterpreter() {
    super(/* latest api = */ ASM8);
    if (getClass() != BasicInterpreter.class) {
      throw new IllegalStateException(); // at this line
    }
  }

Ich habe versucht, den BasicInterpreter zu erben, erhalte aber immer wieder die gleiche Ausnahme.

class BasicInterpreterLocal extends BasicInterpreter{} // Throws an IllegalStateException

Ich habe es mit asm 7. *, 8. **, 9.0 versucht, aber nichts funktioniert.

Also, wo liegt das Problem?. Ich konnte es nicht finden.

Antworten

2 Holger Oct 21 2020 at 22:37

Wie in dieser Antwort erläutert , sollten Unterklassen den Konstruktor verwenden, der eine Bibliotheksversionsnummer akzeptiert, um die Kompatibilitätsstufe der ASM-Bibliothek zu bestimmen. Es scheint, dass Version 5 der ASM-Bibliothek, die der Code ursprünglich verwendete, diese Anforderung nicht überprüft hat. Sie verwenden jedoch eine neuere Version (anscheinend 8) der Bibliothek, die diese Regel erzwingt.

Ändern Sie den Code in

BasicInterpreter basic = new BasicInterpreter(Opcodes.ASM5) { // <- the crucial point
    @Override public BasicValue newValue(Type type) {
        return type!=null && (type.getSort()==Type.OBJECT || type.getSort()==Type.ARRAY)?
               new BasicValue(type): super.newValue(type);
    }
    @Override public BasicValue merge(BasicValue a, BasicValue b) {
        if(a.equals(b)) return a;
        if(a.isReference() && b.isReference())
            // this is the place to consider the actual type hierarchy if you want
            return BasicValue.REFERENCE_VALUE;
        return BasicValue.UNINITIALIZED_VALUE;
    }
};

um dies zu beheben. Ich werde auch die andere Antwort aktualisieren.