From 60cf264468d4833fd2cb8b103b0fc29a17d55eec Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Mon, 1 Dec 2014 00:15:42 -0400 Subject: * Time to start compiling... --- src/lang/asm.clj | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/lang/asm.clj (limited to 'src/lang/asm.clj') diff --git a/src/lang/asm.clj b/src/lang/asm.clj new file mode 100644 index 000000000..9f8e542c4 --- /dev/null +++ b/src/lang/asm.clj @@ -0,0 +1,48 @@ +(ns lang.asm + (:import (org.objectweb.asm Opcodes + ClassWriter + MethodVisitor))) + +(defn write-file [file data] + (with-open [stream (java.io.BufferedOutputStream. (java.io.FileOutputStream. file))] + (.write stream data))) + +(comment + (let [class-data (let [cw (doto (new ClassWriter ClassWriter/COMPUTE_MAXS) + (.visit Opcodes/V1_5 (+ Opcodes/ACC_PUBLIC Opcodes/ACC_SUPER) + "hello_world" nil "java/lang/Object" nil))] + (doto (.visitMethod cw Opcodes/ACC_PUBLIC "" "()V" nil nil) + (.visitCode) + (.visitVarInsn Opcodes/ALOAD 0) + (.visitMethodInsn Opcodes/INVOKESPECIAL "java/lang/Object" "" "()V") + (.visitInsn Opcodes/RETURN) + (.visitMaxs 0 0) + (.visitEnd)) + (doto (.visitMethod cw (+ Opcodes/ACC_PUBLIC Opcodes/ACC_STATIC) "main" "([Ljava/lang/String;)V" nil nil) + (.visitCode) + (.visitFieldInsn Opcodes/GETSTATIC "java/lang/System" "out" "Ljava/io/PrintStream;") + (.visitLdcInsn "Hello, World!") + (.visitMethodInsn Opcodes/INVOKEVIRTUAL "java/io/PrintStream" "println" "(Ljava/lang/String;)V") + (.visitInsn Opcodes/RETURN) + (.visitMaxs 0 0) + (.visitEnd)) + (.visitEnd cw) + (.toByteArray cw))] + (write-file "hello_world.class" class-data)) + + + ) + +;; package asm; +;; public class HelloWorld { +;; public static void main(String[] args) { +;; System.out.println("Hello, World!"); +;; } +;; } + + + + + + + -- cgit v1.2.3