ASM BasicInterpreter IllegalStateException

Oct 21 2020

Bu soruyu burada SO'da gördüm ve kabul edilen cevaptan kodu derlemeye çalışıyorum. Maalesef, Kodun bu bölümünde IllegalStateException alıyorum:

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;
        }
    };

Yığın izleme ile:

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)

Buradaki istisna, BasicInterpreter sınıfında ortaya çıkar:

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

BasicInterpreter'ı devralmaya çalıştım ama aynı istisnayı almaya devam ediyorum.

class BasicInterpreterLocal extends BasicInterpreter{} // Throws an IllegalStateException

ASM 7. *, 8. **, 9.0 ile denedim ama hiçbir şey çalışmıyor.

Peki sorun nedir? Ben bulamadım.

Yanıtlar

2 Holger Oct 21 2020 at 22:37

Bu cevapta açıklandığı gibi , alt sınıflar ASM kitaplığının uyumluluk düzeyini belirlemek için kitaplık sürüm numarasını kabul eden kurucuyu kullanmalıdır. Görünüşe göre, kodun başlangıçta kullandığı ASM kitaplığının 5. sürümü bu gereksinimi kontrol etmedi. Ancak bu kuralı uygulayan kütüphanenin daha yeni bir sürümünü (görünüşe göre 8) kullanıyorsunuz.

Kodu şu şekilde değiştirin:

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;
    }
};

bunu düzeltmek için. Diğer yanıtı da güncelleyeceğim.