2015-05-14 55 views
1

我再次遇到了ASM問題,它是COMPUTE_FRAMES。每當我編譯此代碼與我的自定義編譯器(以下字節碼):ASM COMPUTE_FRAMES出現If +分配錯誤

代碼

Random random = Random() 
int i = 10 
Object i1 = i 

if (i == 10) i1 = "a"; 

println "test" 

字節碼

public static void main(java.lang.String[]); 
descriptor: ([Ljava/lang/String;)V 
flags: ACC_PUBLIC, ACC_STATIC 
Code: 
    stack=0, locals=0, args_size=1 
    0: invokestatic #14     // InterfaceMethod dyvil/lang/Random.apply:()Ldyvil/lang/Random; 
    3: astore_1  
    4: bipush  10 
    6: istore_2  
    7: iload_2  
    8: invokestatic #19     // Method dyvil/lang/Int.apply:(I)Ldyvil/lang/Int; 
    11: astore_3  
    12: iload_2  
    13: bipush  10 
    15: if_icmpne  21 
    18: ldc   #21     // String a 
    20: astore_3  
    21: ldc   #23     // String test 
    23: invokestatic #29     // Method dyvil/lang/Predef.println:(Ljava/lang/String;)V 
    26: return   
    LocalVariableTable: 
    Start Length Slot Name Signature 
     0  26  3 i1 Ljava/lang/Object; 
     0  26  1 random Ldyvil/lang/Random; 
     0  26  2  i I 
     0  26  0 args [Ljava/lang/String; 
MethodParameters: 
    Name       Flags 
    args       

ASM導致在visitMaxs(0, 0)此錯誤:

java.lang.NullPointerException 
    at org.objectweb.asm.Item.a(Unknown Source) 
    at org.objectweb.asm.ClassWriter.c(Unknown Source) 
    at org.objectweb.asm.ClassWriter.a(Unknown Source) 
    at org.objectweb.asm.Frame.a(Unknown Source) 
    at org.objectweb.asm.Frame.a(Unknown Source) 
    at org.objectweb.asm.MethodWriter.visitMaxs(Unknown Source) 

不幸的是,由於ASM的創建者堅持要對其進行混淆(-.-),所以我無法弄清楚確切的問題在這裏。我嘗試刪除if語句(留下任務)並用一個簡單的方法調用替換賦值,但兩種替代方法都不會導致任何錯誤並且完美工作。這只是if +賦值的組合,似乎是導致此錯誤的原因。

+0

ASM混淆?我昨天剛剛下載了源代碼,所以或許這就是要走的路。 –

+0

我也有源代碼鏈接,但由於堆棧跟蹤使用二進制文件,所以它被混淆了。 – Clashsoft

+0

只需將源代碼文件導入源文件夾(或者單獨的項目文件),然後刪除二進制文件依賴項。 –

回答

1

我的問題是,在我的ClassWriter實施中,我覆蓋的getCommonSuperClass方法在這種情況下返回null。由於ASM似乎將該方法的返回值提供給某些構造函數/方法,所以後一類(可以理解)與值發生衝突並且簡單地崩潰。

檢查返回值getCommonSuperClass並返回java/lang/Object當它是null爲我解決了問題。

(只是回答這,所以我可以關閉誰*威力*面臨着類似的問題的問題和人都知道,他們需要檢查他們的getCommonSuperClass