ASM COMPUTE_FRAMES If + 赋值错误
ASM COMPUTE_FRAMES Error with If + Assignment
我又一次遇到了 ASM 的问题,它是 COMPUTE_FRAMES
。每当我使用自定义编译器(下面的字节码)编译此代码时:
代码:
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
+ 赋值的组合导致了这个错误。
我的问题是我在 ClassWriter
实现中重写的 getCommonSuperClass
方法在这种情况下 return 被 null
了。由于 ASM 似乎将该方法的 return 值提供给某些 Item
构造函数/方法,后者 class (可以理解)与该值斗争并简单地崩溃。
检查 getCommonSuperClass
的 return 值并 returning java/lang/Object
时 null
解决了我的问题。
(只是回答这个问题,这样我就可以结束这个问题,*可能*面临类似问题的人知道他们需要检查他们的getCommonSuperClass
)
我又一次遇到了 ASM 的问题,它是 COMPUTE_FRAMES
。每当我使用自定义编译器(下面的字节码)编译此代码时:
代码:
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
+ 赋值的组合导致了这个错误。
我的问题是我在 ClassWriter
实现中重写的 getCommonSuperClass
方法在这种情况下 return 被 null
了。由于 ASM 似乎将该方法的 return 值提供给某些 Item
构造函数/方法,后者 class (可以理解)与该值斗争并简单地崩溃。
检查 getCommonSuperClass
的 return 值并 returning java/lang/Object
时 null
解决了我的问题。
(只是回答这个问题,这样我就可以结束这个问题,*可能*面临类似问题的人知道他们需要检查他们的getCommonSuperClass
)