2

I'm playing with jasmin and I try to launch my .class file, which is supposed to perform simple string concatenation. My jasmin source looks like this:

.class public default_class
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
.limit locals 1
.limit stack 1
invokestatic main_65428301()I
return
.end method
.method public static main_65428301()I
.limit locals 1
.limit stack 100
new java/lang/String
dup
ldc "foo"
invokestatic java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String;
invokespecial java/lang/StringBuilder(Ljava/lang/String;)V
ldc "bar"
invokevirtual java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java/lang/String.toString()V
astore_0
iconst_0
ireturn
.end method

Now I'm able to run java -jar jasmin.jar and I get default_class.class. However, when I try to launch it like java default_class I get an error:

Exception in thread "main" java.lang.VerifyError: (class: default_class, method: main_65428301 signature: ()I) Illegal use of nonvirtual function call

What should I change in my assembly to get this to work?

k_wisniewski
  • 2,439
  • 3
  • 24
  • 31

2 Answers2

1

In JVM, to create the object you have to first use new instruction and then call <init> method (constructor). You do not create new StringBuilder and call the wrong constructor name (should be java/lang/StringBuilder/<init>(Ljava/lang/String;)V).

I also see no reason to do:

new java/lang/String
dup

or

invokestatic java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String;
zch
  • 14,931
  • 2
  • 41
  • 49
  • I tried to mimic what eclipse do in similar situation, but thanks for pointing this out. Anyway I'd like to know what's wrong with invocation of my second main-like method, because that's what error message suggest – k_wisniewski Jan 05 '13 at 14:19
  • 1
    @k_wisniewski, In my opinion it refers to `invokespecial java/lang/StringBuilder(Ljava/lang/String;)V`, which is inside `(class: default_class, method: main_65428301 signature: ()I)` – zch Jan 05 '13 at 14:24
  • OK, I got rid of this problem now – k_wisniewski Jan 06 '13 at 12:01
0

"The new instruction does not completely create a new instance; instance initialization is not completed until an instance initialization method has been invoked on the uninitialized instance."

Hot Licks
  • 47,103
  • 17
  • 93
  • 151