(;module: lux (lux (control [monad #+ do]) (concurrency ["A" atom]) (data ["R" result] [text] text/format (coll ["d" dict] [array #+ Array])) [macro #+ Monad] [host #+ jvm-import do-to object] [io]) (luxc ["&" base] (generator ["&&;" common]) )) (jvm-import java.lang.reflect.AccessibleObject (setAccessible [boolean] void)) (jvm-import java.lang.reflect.Method (invoke [Object (Array Object)] #try Object)) (jvm-import (java.lang.Class a) (getDeclaredMethod [String (Array (Class Object))] #try Method)) (jvm-import java.lang.Object (getClass [] (Class Object))) (jvm-import java.lang.Integer (#static TYPE (Class Integer))) (jvm-import java.lang.ClassLoader) (def: ClassLoader::defineClass Method (case (Class.getDeclaredMethod ["defineClass" (|> (host;array (Class Object) +4) (host;array-write +0 (:! (Class Object) (host;class-for String))) (host;array-write +1 (Object.getClass [] (host;array byte +0))) (host;array-write +2 (:! (Class Object) Integer.TYPE)) (host;array-write +3 (:! (Class Object) Integer.TYPE)))] (host;class-for java.lang.ClassLoader)) (#R;Success method) (do-to method (AccessibleObject.setAccessible [true])) (#R;Error error) (error! error))) (def: (define-class class-name byte-code loader) (-> Text &&common;Bytecode ClassLoader (R;Result Object)) (Method.invoke [loader (array;from-list (list (:! Object class-name) (:! Object byte-code) (:! Object (host;l2i 0)) (:! Object (host;l2i (nat-to-int (host;array-length byte-code))))))] ClassLoader::defineClass)) (def: (fetch-byte-code class-name store) (-> Text &&common;Class-Store (Maybe &&common;Bytecode)) (|> store A;get io;run (d;get class-name))) (def: (memory-class-loader store) (-> &&common;Class-Store ClassLoader) (object ClassLoader [] [] (ClassLoader (findClass [class-name String]) Class (case (fetch-byte-code class-name store) (#;Some bytecode) (case (define-class class-name bytecode (:! ClassLoader _jvm_this)) (#R;Success class) (:!! class) (#R;Error error) (error! (format "Class definiton error: " class-name "\n" error))) #;None (error! (format "Class not found: " class-name)))))) (def: #export (init-host _) (-> Top &&common;Host) (let [store (: &&common;Class-Store (A;atom (d;new text;Hash)))] {#&&common;loader (memory-class-loader store) #&&common;store store}))