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

Reply via email to