Cool... I wrote a similar little disassembler for ClojureCLR a few weeks ago:
https://github.com/aaronc/ClojureClrEx/blob/master/src/clojure/clr/ildasm.clj It uses Mono.Reflection to interpret the byte codes. On Saturday, March 30, 2013 9:06:25 AM UTC-4, Gary Trakhman wrote: > > I made a little proof of concept last night. You could always look at > bytecode that clojure emits in few ways, you can either hack the compiler > yourself, or force AOT in your project and use javap. The first approach > is a bit intrusive, and the second has a somewhat annoying turnaround time, > and won't work for any code that calls eval at runtime. > > This takes another approach. It uses java's Instrumentation stuff, to > provide a hook into all classloading past the point at which it's loaded, > where I store off all the bytes of defined classes into a big > ConcurrentHashMap. Then I use eclipse.jdt.core's disassembler > functionality to print out the bytecode. > > There's a nice lein-plugin that adds the dependency to your project and > looks itself up in order to add the appropriate -javaagent flag to your jvm > startup options. > > Now you can do something like this: > > user=> (require 'no.disassemble) > nil > > user=> (in-ns 'no.disassemble) > #<Namespace no.disassemble> > > no.disassemble=> (println (disassemble (fn []))) > // Compiled from NO_SOURCE_FILE (version 1.5 : 49.0, super bit) > public final class no.disassemble$eval1174$fn__1175 extends > clojure.lang.AFunction { > > // Method descriptor #7 ()V > // Stack: 0, Locals: 0 > public static {}; > 0 return > Line numbers: > [pc: 0, line: 1] > > // Method descriptor #7 ()V > // Stack: 1, Locals: 1 > public disassemble$eval1174$fn__1175(); > 0 aload_0 > 1 invokespecial clojure.lang.AFunction() [10] > 4 return > Line numbers: > [pc: 0, line: 1] > > // Method descriptor #12 ()Ljava/lang/Object; > // Stack: 1, Locals: 1 > public java.lang.Object invoke(); > 0 aconst_null > 1 areturn > Line numbers: > [pc: 0, line: 1] > Local variable table: > [pc: 0, pc: 1] local: this index: 0 type: java.lang.Object > > } > nil > no.disassemble=> > > > Potential use cases: > > Writing fast code faster. > Proving to newbies that clojure is not interpreted, further evidence of > eval's coolness. > Checking to make sure primitives are being used where you expect. > > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.