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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.