(.module: [lux (#- Type Definition) [abstract monad] [control ["p" parser ["s" code]]] [data [collection ["." list ("#/." functor)]]] [macro ["." code] [syntax (#+ syntax:)]] [host (#+ import:)] [world [binary (#+ Binary)]] [tool [compiler [reference (#+ Register)] [phase ["." generation]]]]]) ## [Host] (import: org/objectweb/asm/MethodVisitor) (import: org/objectweb/asm/ClassWriter) (import: #long org/objectweb/asm/Label (new [])) ## [Type] (type: #export Bound #Upper #Lower) (type: #export Primitive #Boolean #Byte #Short #Int #Long #Float #Double #Char) (type: #export #rec Generic (#Var Text) (#Wildcard (Maybe [Bound Generic])) (#Class Text (List Generic))) (type: #export Class [Text (List Generic)]) (type: #export Parameter [Text Class (List Class)]) (type: #export #rec Type (#Primitive Primitive) (#Generic Generic) (#Array Type)) (type: #export Method {#args (List Type) #return (Maybe Type) #exceptions (List Generic)}) (type: #export Def (-> ClassWriter ClassWriter)) (type: #export Inst (-> MethodVisitor MethodVisitor)) (type: #export Label org/objectweb/asm/Label) (type: #export Visibility #Public #Protected #Private #Default) (type: #export Version #V1_1 #V1_2 #V1_3 #V1_4 #V1_5 #V1_6 #V1_7 #V1_8) (type: #export ByteCode Binary) (type: #export Definition [Text ByteCode]) (type: #export Anchor [Label Register]) (type: #export Host (generation.Host Inst Definition)) (template [ ] [(type: #export ( ..Anchor Inst Definition))] [State generation.State] [Operation generation.Operation] [Phase generation.Phase] [Handler generation.Handler] [Bundle generation.Bundle] ) ## [Values] (syntax: (config: {type s.local-identifier} {none s.local-identifier} {++ s.local-identifier} {options (s.tuple (p.many s.local-identifier))}) (let [g!type (code.local-identifier type) g!none (code.local-identifier none) g!tags+ (list/map code.local-tag options) g!_left (code.local-identifier "_left") g!_right (code.local-identifier "_right") g!options+ (list/map (function (_ option) (` (def: (~' #export) (~ (code.local-identifier option)) (~ g!type) (|> (~ g!none) (set@ (~ (code.local-tag option)) #1))))) options)] (wrap (list& (` (type: (~' #export) (~ g!type) (~ (code.record (list/map (function (_ tag) [tag (` .Bit)]) g!tags+))))) (` (def: (~' #export) (~ g!none) (~ g!type) (~ (code.record (list/map (function (_ tag) [tag (` #0)]) g!tags+))))) (` (def: (~' #export) ((~ (code.local-identifier ++)) (~ g!_left) (~ g!_right)) (-> (~ g!type) (~ g!type) (~ g!type)) (~ (code.record (list/map (function (_ tag) [tag (` (or (get@ (~ tag) (~ g!_left)) (get@ (~ tag) (~ g!_right))))]) g!tags+))))) g!options+)))) ## Configs (config: Class-Config noneC ++C [finalC]) (config: Method-Config noneM ++M [finalM staticM synchronizedM strictM]) (config: Field-Config noneF ++F [finalF staticF transientF volatileF]) ## Labels (def: #export new-label (-> Any Label) (function (_ _) (org/objectweb/asm/Label::new))) (def: #export (simple-class name) (-> Text Class) [name (list)])