Weird VerifyError
Nikolas Nehmer <[email protected]>
| Newsgroups | gmane.comp.java.objectweb.asm |
|---|---|
| Message-ID | <[email protected]> |
Hi all,
I have the following problem. This is the sample code:
public class Demo {
InnerClass i;
Demo() {
i = new InnerClass();
}
public static void main(String[] args) {
Demo demo = new Demo();
}
class InnerClass {
}
}
Without any instrumentation (of course) this code works. If I add my
instrumentation, that basically logs the old value of variable
assignements, I encounter a java.lang.VerifyError: Expecting to find
object/array on stack. To give you an impression the resulting bytecode
is attached. From a stack point of view imho the example should work.
And indeed the example does work if I add the following changes:
public class Demo {
public static void main(String[] args) {
MyComponent comp = new MyComponent();
}
}
public class MyComponent2 {
InnerClass i;
public MyComponent2() {
i = new InnerClass();
}
static class InnerClass {}
}
The interesting point is, before I updated my Java Version from 6.10 to
6.21 today, the second example also failed with exactly the same
VerifyError message. So obviously the second case was considered a bug
in the verifier. Attached you'll find the bytecode for my problem case.
I highlighted the code area that the verifier doesn't seem to like ;-)
Obviously the only case that doesn't work (in Java 6.21) is the case
where everything is mashed up in the main class. I don't know if this is
my error, or again a problem in the verifier. Btw. if I change the inner
class to be static, the example works again. What do you guys think?
Best regards
Nikolas
// class version 50.0 (50)
// access flags 0x21
public class de/kl/uni/cs/nehmer/test2/Demo {
// compiled from: Demo.java
// access flags 0x0
INNERCLASS de/kl/uni/cs/nehmer/test2/Demo$InnerClass de/kl/uni/cs/nehmer/test2/Demo InnerClass
// access flags 0x0
Lde/kl/uni/cs/nehmer/test2/Demo$InnerClass; i
// access flags 0x0
<init>()V
TRYCATCHBLOCK L0 L1 L1 null
L0
L2
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.methodCall ()V
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.localVariableStart ()V
LINENUMBER 7 L2
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
L3
* LINENUMBER 8 L3
ALOAD 0
NEW de/kl/uni/cs/nehmer/test2/Demo$InnerClass
DUP
ALOAD 0
INVOKESPECIAL de/kl/uni/cs/nehmer/test2/Demo$InnerClass.<init> (Lde/kl/uni/cs/nehmer/test2/Demo;)V
SWAP
DUP
DUP
GETFIELD de/kl/uni/cs/nehmer/test2/Demo.i : Lde/kl/uni/cs/nehmer/test2/Demo$InnerClass;
LDC "i"
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.logInstanceVariableAssignement (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/String;)V
SWAP
PUTFIELD de/kl/uni/cs/nehmer/test2/Demo.i : Lde/kl/uni/cs/nehmer/test2/Demo$InnerClass;*
L4
LINENUMBER 9 L4
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.methodReturn ()V
RETURN
L1
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.methodReturn ()V
ATHROW
L5
LOCALVARIABLE this Lde/kl/uni/cs/nehmer/test2/Demo; L2 L5 0
MAXSTACK = 4
MAXLOCALS = 1
// access flags 0x9
public static main([Ljava/lang/String;)V
TRYCATCHBLOCK L0 L1 L1 null
L0
L2
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.methodCall ()V
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.localVariableStart ()V
LINENUMBER 13 L2
NEW de/kl/uni/cs/nehmer/test2/Demo
ACONST_NULL
ASTORE 1
DUP
INVOKESPECIAL de/kl/uni/cs/nehmer/test2/Demo.<init> ()V
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.getStackFrameCounter ()I
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.getStackFrameActualityCounter ()I
LDC 1
ALOAD 1
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.logLocalVariableAssignement (IIILjava/lang/Object;)V
ASTORE 1
L3
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.localVariableStart ()V
LINENUMBER 15 L3
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.methodReturn ()V
RETURN
L1
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.methodReturn ()V
ATHROW
L4
LOCALVARIABLE args [Ljava/lang/String; L2 L4 0
LOCALVARIABLE demo Lde/kl/uni/cs/nehmer/test2/Demo; L3 L4 1
MAXSTACK = 2
MAXLOCALS = 2
}
// class version 50.0 (50)
// access flags 0x20
class de/kl/uni/cs/nehmer/test2/Demo$InnerClass {
// compiled from: Demo.java
// access flags 0x0
INNERCLASS de/kl/uni/cs/nehmer/test2/Demo$InnerClass de/kl/uni/cs/nehmer/test2/Demo InnerClass
// access flags 0x1010
final Lde/kl/uni/cs/nehmer/test2/Demo; this$0
// access flags 0x0
<init>(Lde/kl/uni/cs/nehmer/test2/Demo;)V
TRYCATCHBLOCK L0 L1 L1 null
L0
L2
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.methodCall ()V
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.localVariableStart ()V
LINENUMBER 17 L2
ALOAD 0
ALOAD 1
SWAP
DUP
DUP
GETFIELD de/kl/uni/cs/nehmer/test2/Demo$InnerClass.this$0 : Lde/kl/uni/cs/nehmer/test2/Demo;
LDC "this$0"
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.logInstanceVariableAssignement (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/String;)V
SWAP
PUTFIELD de/kl/uni/cs/nehmer/test2/Demo$InnerClass.this$0 : Lde/kl/uni/cs/nehmer/test2/Demo;
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.methodReturn ()V
RETURN
L1
INVOKESTATIC de/kl/uni/cs/nehmer/setup/log/Logger.methodReturn ()V
ATHROW
L3
LOCALVARIABLE this Lde/kl/uni/cs/nehmer/test2/Demo$InnerClass; L2 L3 0
MAXSTACK = 2
MAXLOCALS = 2
}
message-footer.txt
(text/plain, 238 B)
-- You receive this message as a subscriber of the [email protected] mailing list. To unsubscribe: mailto:[email protected] For general help: mailto:[email protected]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws