Java SDK includes javap bytecode disassembler. And you can compile Java
without creating project structure.
$ emacs Test.java
$ javac Test.java
$ javap -c Test
<bytecode output goes here>
Results:
public class Test {
public static String hello() {
final StringBuilder sb = new StringBuilder();
sb.append("Hello, ");
sb.append("world");
return sb.toString();
}
}
compiles to:
public static java.lang.String hello();
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
7: astore_0
8: aload_0
9: ldc #4; //String Hello,
11: invokevirtual #5; //Method
java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
14: pop
15: aload_0
16: ldc #6; //String world
18: invokevirtual #5; //Method
java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: pop
22: aload_0
23: invokevirtual #7; //Method
java/lang/StringBuilder.toString:()Ljava/lang/String;
26: areturn
}
public class Test {
public static String hello() {
final Object sb = new StringBuilder();
((StringBuilder)sb).append("Hello, ");
((StringBuilder)sb).append("world");
return ((StringBuilder)sb).toString();
}
}
compiles to:
public static java.lang.String hello();
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
7: astore_0
8: aload_0
9: checkcast #2; //class java/lang/StringBuilder
12: ldc #4; //String Hello,
14: invokevirtual #5; //Method
java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: pop
18: aload_0
19: checkcast #2; //class java/lang/StringBuilder
22: ldc #6; //String world
24: invokevirtual #5; //Method
java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
27: pop
28: aload_0
29: checkcast #2; //class java/lang/StringBuilder
32: invokevirtual #7; //Method
java/lang/StringBuilder.toString:()Ljava/lang/String;
35: areturn
}
(defn hello []
(let [^StringBuilder sb (StringBuilder.)]
(.append sb "Hello, ")
(.append sb "world")
(.toString sb)))
compiled using Clojure 1.2:
public java.lang.Object invoke() throws java.lang.Exception;
Code:
0: new #43; //class java/lang/StringBuilder
3: dup
4: invokespecial #44; //Method java/lang/StringBuilder."<init>":()V
7: astore_1
8: aload_1
9: checkcast #43; //class java/lang/StringBuilder
12: ldc #46; //String Hello,
14: checkcast #48; //class java/lang/String
17: invokevirtual #52; //Method
java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: pop
21: aload_1
22: checkcast #43; //class java/lang/StringBuilder
25: ldc #54; //String world
27: checkcast #48; //class java/lang/String
30: invokevirtual #52; //Method
java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
33: pop
34: aload_1
35: aconst_null
36: astore_1
37: checkcast #43; //class java/lang/StringBuilder
40: invokevirtual #58; //Method
java/lang/StringBuilder.toString:()Ljava/lang/String;
43: areturn
}
So the bytecode generated by the Clojure AOT compiler has checkcast
instructions similar to the second Java sample.
--
Mikhail
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en