(;module: lux (lux (control monad) (data ["R" result] text/format) [macro #+ Monad "Lux/" Monad] [host #+ do-to]) (luxc ["&" base] (lang ["la" analysis] ["ls" synthesis]) ["&;" analyser] ["&;" synthesizer] (generator ["&;" common] (host ["$" jvm] (jvm ["$t" type] ["$d" def] ["$i" inst]))) )) (host;import java.lang.Object) (host;import java.lang.String) (host;import java.lang.reflect.Field (get [Object] Object)) (host;import (java.lang.Class a) (getField [String] Field)) (host;import org.objectweb.asm.Opcodes (#static ACC_PUBLIC int) (#static ACC_SUPER int) (#static ACC_FINAL int) (#static ACC_STATIC int) (#static PUTSTATIC int) (#static RETURN int) (#static V1_6 int) ) (host;import org.objectweb.asm.MethodVisitor (visitCode [] void) (visitEnd [] void) (visitLdcInsn [Object] void) (visitFieldInsn [int String String String] void) (visitInsn [int] void) (visitMaxs [int int] void)) (host;import org.objectweb.asm.FieldVisitor (visitEnd [] void)) (host;import org.objectweb.asm.ClassWriter (#static COMPUTE_MAXS int) (new [int]) (visit [int int String String String (Array String)] void) (visitEnd [] void) (visitField [int String String String Object] FieldVisitor) (visitMethod [int String String String (Array String)] MethodVisitor) (toByteArray [] Byte-Array)) (def: eval-field Text "_value") (def: $Object $;Type ($t;class "java.lang.Object" (list))) (def: #export (eval generator) (-> (Lux $;Inst) (Lux Top)) (do Monad [class-name (:: @ map %code (macro;gensym "eval")) valueI generator #let [writer (|> (do-to (ClassWriter.new ClassWriter.COMPUTE_MAXS) (ClassWriter.visit [&common;bytecode-version (i.+ Opcodes.ACC_PUBLIC Opcodes.ACC_SUPER) class-name (host;null) "java/lang/Object" (host;null)])) ($d;field #$;Public {#$;staticF true #$;finalF true #$;transientF false #$;volatileF false} eval-field $Object) ($d;method #$;Public {#$;staticM true #$;finalM false #$;synchronizedM false} "" ($t;method (list) #;None (list)) (|>. valueI ($i;PUTSTATIC class-name eval-field $Object) $i;RETURN))) bytecode (ClassWriter.toByteArray [] (do-to writer (ClassWriter.visitEnd [])))] _ (&common;store-class class-name bytecode) class (&common;load-class class-name)] (wrap (|> class (Class.getField [eval-field]) (Field.get (host;null))))))