language-cil 0.2.2 → 0.3.1
raw patch · 5 files changed
+232/−186 lines, 5 filesdep ~bool-extrasPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: bool-extras
API changes (from Hackage documentation)
- Language.Cil.Analysis: instance Ast Assembly
- Language.Cil.Analysis: instance Ast ClassDecl
- Language.Cil.Analysis: instance Ast MethodDef
- Language.Cil.Analysis: instance Ast TypeDef
- Language.Cil.Analysis: instructions :: Ast a => a -> [Instr]
- Language.Cil.Pretty: instance Pretty Alignment
- Language.Cil.Pretty: instance Pretty Assembly
- Language.Cil.Pretty: instance Pretty AssemblyRef
- Language.Cil.Pretty: instance Pretty CallConv
- Language.Cil.Pretty: instance Pretty ClassAttr
- Language.Cil.Pretty: instance Pretty ClassDecl
- Language.Cil.Pretty: instance Pretty Directive
- Language.Cil.Pretty: instance Pretty FieldAttr
- Language.Cil.Pretty: instance Pretty FieldDef
- Language.Cil.Pretty: instance Pretty GenParam
- Language.Cil.Pretty: instance Pretty Instr
- Language.Cil.Pretty: instance Pretty Local
- Language.Cil.Pretty: instance Pretty MethAttr
- Language.Cil.Pretty: instance Pretty MethodDecl
- Language.Cil.Pretty: instance Pretty MethodDef
- Language.Cil.Pretty: instance Pretty OpCode
- Language.Cil.Pretty: instance Pretty ParamAttr
- Language.Cil.Pretty: instance Pretty Parameter
- Language.Cil.Pretty: instance Pretty PrimitiveType
- Language.Cil.Pretty: instance Pretty TypeDef
- Language.Cil.Pretty: instance Pretty TypeSpec
- Language.Cil.Syntax: Instr :: Instr -> MethodDecl
- Language.Cil.Syntax: LabOpCode :: Label -> OpCode -> Instr
- Language.Cil.Syntax: assemblyName :: OpCode -> AssemblyName
- Language.Cil.Syntax: callConv :: OpCode -> [CallConv]
- Language.Cil.Syntax: data Instr
- Language.Cil.Syntax: fieldName :: OpCode -> FieldName
- Language.Cil.Syntax: fieldType :: OpCode -> PrimitiveType
- Language.Cil.Syntax: instance Show Alignment
- Language.Cil.Syntax: instance Show Assembly
- Language.Cil.Syntax: instance Show AssemblyRef
- Language.Cil.Syntax: instance Show CallConv
- Language.Cil.Syntax: instance Show ClassAttr
- Language.Cil.Syntax: instance Show ClassDecl
- Language.Cil.Syntax: instance Show Directive
- Language.Cil.Syntax: instance Show FieldAttr
- Language.Cil.Syntax: instance Show FieldDef
- Language.Cil.Syntax: instance Show GenParam
- Language.Cil.Syntax: instance Show Instr
- Language.Cil.Syntax: instance Show Local
- Language.Cil.Syntax: instance Show MethAttr
- Language.Cil.Syntax: instance Show MethodDecl
- Language.Cil.Syntax: instance Show MethodDef
- Language.Cil.Syntax: instance Show OpCode
- Language.Cil.Syntax: instance Show ParamAttr
- Language.Cil.Syntax: instance Show Parameter
- Language.Cil.Syntax: instance Show PrimitiveType
- Language.Cil.Syntax: instance Show TypeDef
- Language.Cil.Syntax: instance Show TypeSpec
- Language.Cil.Syntax: methodName :: OpCode -> MethodName
- Language.Cil.Syntax: paramTypes :: OpCode -> [PrimitiveType]
- Language.Cil.Syntax: returnType :: OpCode -> PrimitiveType
- Language.Cil.Syntax: typeName :: OpCode -> TypeName
+ Language.Cil.Analysis: instance Language.Cil.Analysis.Ast Language.Cil.Syntax.Assembly
+ Language.Cil.Analysis: instance Language.Cil.Analysis.Ast Language.Cil.Syntax.ClassDecl
+ Language.Cil.Analysis: instance Language.Cil.Analysis.Ast Language.Cil.Syntax.MethodDef
+ Language.Cil.Analysis: instance Language.Cil.Analysis.Ast Language.Cil.Syntax.TypeDef
+ Language.Cil.Analysis: opcodes :: Ast a => a -> [OpCode]
+ Language.Cil.Build: castclass :: PrimitiveType -> MethodDecl
+ Language.Cil.Build: ldarga :: Offset -> MethodDecl
+ Language.Cil.Build: ldargaN :: DottedName -> MethodDecl
+ Language.Cil.Build: ldftn_instance :: PrimitiveType -> AssemblyName -> TypeName -> MethodName -> [PrimitiveType] -> MethodDecl
+ Language.Cil.Build: ldtoken :: PrimitiveType -> MethodDecl
+ Language.Cil.Build: switch :: [Label] -> MethodDecl
+ Language.Cil.Build: unbox_any :: PrimitiveType -> MethodDecl
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.Alignment
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.Assembly
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.AssemblyRef
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.CallConv
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.ClassAttr
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.ClassDecl
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.Directive
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.FieldAttr
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.FieldDef
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.GenParam
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.Local
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.MethAttr
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.MethodDecl
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.MethodDef
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.OpCode
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.ParamAttr
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.Parameter
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.PrimitiveType
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.TypeDef
+ Language.Cil.Pretty: instance Language.Cil.Pretty.Pretty Language.Cil.Syntax.TypeSpec
+ Language.Cil.Syntax: Array :: PrimitiveType -> PrimitiveType
+ Language.Cil.Syntax: Castclass :: PrimitiveType -> OpCode
+ Language.Cil.Syntax: FaInitOnly :: FieldAttr
+ Language.Cil.Syntax: GenericReferenceTypeInstance :: AssemblyName -> TypeName -> [PrimitiveType] -> PrimitiveType
+ Language.Cil.Syntax: Label :: Label -> MethodDecl
+ Language.Cil.Syntax: Ldarga :: Offset -> OpCode
+ Language.Cil.Syntax: LdargaN :: DottedName -> OpCode
+ Language.Cil.Syntax: Ldtoken :: PrimitiveType -> OpCode
+ Language.Cil.Syntax: Switch :: [Label] -> OpCode
+ Language.Cil.Syntax: Unbox_any :: PrimitiveType -> OpCode
+ Language.Cil.Syntax: [assemblyName] :: OpCode -> AssemblyName
+ Language.Cil.Syntax: [callConv] :: OpCode -> [CallConv]
+ Language.Cil.Syntax: [fieldName] :: OpCode -> FieldName
+ Language.Cil.Syntax: [fieldType] :: OpCode -> PrimitiveType
+ Language.Cil.Syntax: [methodName] :: OpCode -> MethodName
+ Language.Cil.Syntax: [paramTypes] :: OpCode -> [PrimitiveType]
+ Language.Cil.Syntax: [returnType] :: OpCode -> PrimitiveType
+ Language.Cil.Syntax: [typeName] :: OpCode -> TypeName
+ Language.Cil.Syntax: instance GHC.Classes.Eq Language.Cil.Syntax.MethAttr
+ Language.Cil.Syntax: instance GHC.Classes.Eq Language.Cil.Syntax.PrimitiveType
+ Language.Cil.Syntax: instance GHC.Classes.Ord Language.Cil.Syntax.PrimitiveType
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.Alignment
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.Assembly
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.AssemblyRef
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.CallConv
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.ClassAttr
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.ClassDecl
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.Directive
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.FieldAttr
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.FieldDef
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.GenParam
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.Local
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.MethAttr
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.MethodDecl
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.MethodDef
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.OpCode
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.ParamAttr
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.Parameter
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.PrimitiveType
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.TypeDef
+ Language.Cil.Syntax: instance GHC.Show.Show Language.Cil.Syntax.TypeSpec
- Language.Cil.Build: label :: Label -> MethodDecl -> MethodDecl
+ Language.Cil.Build: label :: Label -> MethodDecl
- Language.Cil.Syntax: Ldftn :: PrimitiveType -> AssemblyName -> TypeName -> MethodName -> [PrimitiveType] -> OpCode
+ Language.Cil.Syntax: Ldftn :: [CallConv] -> PrimitiveType -> AssemblyName -> TypeName -> MethodName -> [PrimitiveType] -> OpCode
- Language.Cil.Syntax: OpCode :: OpCode -> Instr
+ Language.Cil.Syntax: OpCode :: OpCode -> MethodDecl
Files
- language-cil.cabal +2/−2
- src/Language/Cil/Analysis.hs +11/−11
- src/Language/Cil/Build.hs +175/−150
- src/Language/Cil/Pretty.hs +28/−10
- src/Language/Cil/Syntax.hs +16/−13
language-cil.cabal view
@@ -1,5 +1,5 @@ name: language-cil-version: 0.2.2+version: 0.3.1 homepage: https://github.com/tomlokhorst/language-cil synopsis: Manipulating Common Intermediate Language AST description: Language-Cil is a Haskell library for manipulating CIL@@ -27,7 +27,7 @@ library hs-source-dirs: src build-depends: base > 3 && < 5,- bool-extras >= 0.3.0 && < 0.4+ bool-extras >= 0.4.0 && < 0.5 exposed-modules: Language.Cil Language.Cil.Analysis Language.Cil.Build
src/Language/Cil/Analysis.hs view
@@ -3,28 +3,28 @@ -- module Language.Cil.Analysis (- instructions+ opcodes ) where import Language.Cil.Syntax class Ast a where- -- A concatenated list of all instructions.- instructions :: a -> [Instr]+ -- A concatenated list of all opcodes.+ opcodes :: a -> [OpCode] instance Ast Assembly where- instructions (Assembly _ _ td) = concatMap instructions td+ opcodes (Assembly _ _ td) = concatMap opcodes td instance Ast TypeDef where- instructions (Class _ _ _ _ cd) = concatMap instructions cd- instructions (GenericClass _ _ _ cd) = concatMap instructions cd+ opcodes (Class _ _ _ _ cd) = concatMap opcodes cd+ opcodes (GenericClass _ _ _ cd) = concatMap opcodes cd instance Ast ClassDecl where- instructions (FieldDef _) = []- instructions (MethodDef md) = instructions md- instructions (TypeDef td) = instructions td+ opcodes (FieldDef _) = []+ opcodes (MethodDef md) = opcodes md+ opcodes (TypeDef td) = opcodes td instance Ast MethodDef where- instructions (Constructor _ _ _ md) = [ i | Instr i <- md ]- instructions (Method _ _ _ _ md) = [ i | Instr i <- md ]+ opcodes (Constructor _ _ _ md) = [ o | OpCode o <- md ]+ opcodes (Method _ _ _ _ md) = [ o | OpCode o <- md ]
src/Language/Cil/Build.hs view
@@ -12,7 +12,7 @@ , localsInit , maxStack - -- * mdecl functions+ -- * OpCode functions , add , add_ovf , add_ovf_un@@ -29,6 +29,7 @@ , brtrue , call , callvirt+ , castclass , ceq , cgt , ckfinite@@ -39,6 +40,8 @@ , isinst , ldarg , ldargN+ , ldarga+ , ldargaN , ldc_i4 , ldc_i8 , ldc_r4@@ -60,6 +63,7 @@ , ldfld , ldflda , ldftn+ , ldftn_instance , ldind_i , ldind_i1 , ldind_i2@@ -80,6 +84,7 @@ , ldsfld , ldsflda , ldstr+ , ldtoken , mul , mul_ovf , mul_ovf_un@@ -119,12 +124,14 @@ , sub , sub_ovf , sub_ovf_un+ , switch , tail , tailcall , throw , unaligned , unalignedPtr , unbox+ , unbox_any , volatile , volatilePtr , xor@@ -166,384 +173,405 @@ maxStack x = Directive (MaxStack x) --- mdecl functions+-- OpCode functions add :: MethodDecl-add = mdecl $ Add+add = OpCode $ Add add_ovf :: MethodDecl-add_ovf = mdecl $ Add_ovf+add_ovf = OpCode $ Add_ovf add_ovf_un :: MethodDecl-add_ovf_un = mdecl $ Add_ovf_un+add_ovf_un = OpCode $ Add_ovf_un and :: MethodDecl-and = mdecl $ And+and = OpCode $ And beq :: Label -> MethodDecl-beq = mdecl . Beq+beq = OpCode . Beq bge :: Label -> MethodDecl-bge = mdecl . Bge+bge = OpCode . Bge bgt :: Label -> MethodDecl-bgt = mdecl . Bgt+bgt = OpCode . Bgt ble :: Label -> MethodDecl-ble = mdecl . Ble+ble = OpCode . Ble blt :: Label -> MethodDecl-blt = mdecl . Blt+blt = OpCode . Blt box :: PrimitiveType -> MethodDecl-box = mdecl . Box+box = OpCode . Box unbox :: PrimitiveType -> MethodDecl-unbox = mdecl . Unbox+unbox = OpCode . Unbox +unbox_any :: PrimitiveType -> MethodDecl+unbox_any = OpCode . Unbox_any+ br :: Label -> MethodDecl-br = mdecl . Br+br = OpCode . Br break :: MethodDecl-break = mdecl $ Break+break = OpCode $ Break brfalse :: Label -> MethodDecl-brfalse = mdecl . Brfalse+brfalse = OpCode . Brfalse brtrue :: Label -> MethodDecl-brtrue = mdecl . Brtrue+brtrue = OpCode . Brtrue call :: [CallConv] -> PrimitiveType -> AssemblyName -> TypeName -> MethodName -> [PrimitiveType] -> MethodDecl-call ccs p l t m ps = mdecl $ Call ccs p l t m ps+call ccs p l t m ps = OpCode $ Call ccs p l t m ps callvirt :: PrimitiveType -> AssemblyName -> TypeName -> MethodName -> [PrimitiveType] -> MethodDecl-callvirt p l t m ps = mdecl $ CallVirt p l t m ps+callvirt p l t m ps = OpCode $ CallVirt p l t m ps +castclass :: PrimitiveType -> MethodDecl+castclass = OpCode . Castclass+ ceq, cgt, clt :: MethodDecl-ceq = mdecl $ Ceq-cgt = mdecl $ Cgt-clt = mdecl $ Clt+ceq = OpCode $ Ceq+cgt = OpCode $ Cgt+clt = OpCode $ Clt ckfinite :: MethodDecl-ckfinite = mdecl $ Ckfinite+ckfinite = OpCode $ Ckfinite dup :: MethodDecl-dup = mdecl $ Dup+dup = OpCode $ Dup div :: MethodDecl-div = mdecl $ Div+div = OpCode $ Div div_un :: MethodDecl-div_un = mdecl $ Div_un+div_un = OpCode $ Div_un isinst :: TypeName -> MethodDecl-isinst = mdecl . Isinst+isinst = OpCode . Isinst ldarg :: Offset -> MethodDecl-ldarg 0 = mdecl $ Ldarg_0-ldarg 1 = mdecl $ Ldarg_1-ldarg 2 = mdecl $ Ldarg_2-ldarg 3 = mdecl $ Ldarg_3-ldarg x = mdecl $ Ldarg x+ldarg 0 = OpCode $ Ldarg_0+ldarg 1 = OpCode $ Ldarg_1+ldarg 2 = OpCode $ Ldarg_2+ldarg 3 = OpCode $ Ldarg_3+ldarg x = OpCode $ Ldarg x ldargN :: DottedName -> MethodDecl-ldargN = mdecl . LdargN+ldargN = OpCode . LdargN +ldarga :: Offset -> MethodDecl+ldarga = OpCode . Ldarga++ldargaN :: DottedName -> MethodDecl+ldargaN = OpCode . LdargaN+ ldc_i4 :: Integer -> MethodDecl-ldc_i4 (-1) = mdecl $ Ldc_i4_m1-ldc_i4 0 = mdecl $ Ldc_i4_0-ldc_i4 1 = mdecl $ Ldc_i4_1-ldc_i4 2 = mdecl $ Ldc_i4_2-ldc_i4 3 = mdecl $ Ldc_i4_3-ldc_i4 4 = mdecl $ Ldc_i4_4-ldc_i4 5 = mdecl $ Ldc_i4_5-ldc_i4 6 = mdecl $ Ldc_i4_6-ldc_i4 7 = mdecl $ Ldc_i4_7-ldc_i4 8 = mdecl $ Ldc_i4_8-ldc_i4 x = mdecl $ if -127 <= x && x <= 128+ldc_i4 (-1) = OpCode $ Ldc_i4_m1+ldc_i4 0 = OpCode $ Ldc_i4_0+ldc_i4 1 = OpCode $ Ldc_i4_1+ldc_i4 2 = OpCode $ Ldc_i4_2+ldc_i4 3 = OpCode $ Ldc_i4_3+ldc_i4 4 = OpCode $ Ldc_i4_4+ldc_i4 5 = OpCode $ Ldc_i4_5+ldc_i4 6 = OpCode $ Ldc_i4_6+ldc_i4 7 = OpCode $ Ldc_i4_7+ldc_i4 8 = OpCode $ Ldc_i4_8+ldc_i4 x = OpCode $ if -127 <= x && x <= 128 then Ldc_i4_s (fromInteger x) else Ldc_i4 x ldc_i8 :: Integer -> MethodDecl-ldc_i8 = mdecl . Ldc_i8+ldc_i8 = OpCode . Ldc_i8 ldc_r4 :: Float -> MethodDecl-ldc_r4 = mdecl . Ldc_r4+ldc_r4 = OpCode . Ldc_r4 ldc_r8 :: Double -> MethodDecl-ldc_r8 = mdecl . Ldc_r8+ldc_r8 = OpCode . Ldc_r8 ldchar :: Char -> MethodDecl ldchar c = ldc_i4 (toInteger $ ord c) ldelem_i :: MethodDecl-ldelem_i = mdecl $ Ldelem_i+ldelem_i = OpCode $ Ldelem_i ldelem_i1 :: MethodDecl-ldelem_i1 = mdecl $ Ldelem_i1+ldelem_i1 = OpCode $ Ldelem_i1 ldelem_i2 :: MethodDecl-ldelem_i2 = mdecl $ Ldelem_i2+ldelem_i2 = OpCode $ Ldelem_i2 ldelem_i4 :: MethodDecl-ldelem_i4 = mdecl $ Ldelem_i4+ldelem_i4 = OpCode $ Ldelem_i4 ldelem_i8 :: MethodDecl-ldelem_i8 = mdecl $ Ldelem_i8+ldelem_i8 = OpCode $ Ldelem_i8 ldelem_u1 :: MethodDecl-ldelem_u1 = mdecl $ Ldelem_u1+ldelem_u1 = OpCode $ Ldelem_u1 ldelem_u2 :: MethodDecl-ldelem_u2 = mdecl $ Ldelem_u2+ldelem_u2 = OpCode $ Ldelem_u2 ldelem_u4 :: MethodDecl-ldelem_u4 = mdecl $ Ldelem_u4+ldelem_u4 = OpCode $ Ldelem_u4 ldelem_u8 :: MethodDecl-ldelem_u8 = mdecl $ Ldelem_u8+ldelem_u8 = OpCode $ Ldelem_u8 ldelem_r4 :: MethodDecl-ldelem_r4 = mdecl $ Ldelem_r4+ldelem_r4 = OpCode $ Ldelem_r4 ldelem_r8 :: MethodDecl-ldelem_r8 = mdecl $ Ldelem_r8+ldelem_r8 = OpCode $ Ldelem_r8 ldelem_ref :: MethodDecl-ldelem_ref = mdecl $ Ldelem_ref+ldelem_ref = OpCode $ Ldelem_ref ldelema :: MethodDecl-ldelema = mdecl $ Ldelema+ldelema = OpCode $ Ldelema ldfld :: PrimitiveType -> AssemblyName -> TypeName -> FieldName -> MethodDecl-ldfld p a t f = mdecl $ Ldfld p a t f+ldfld p a t f = OpCode $ Ldfld p a t f ldflda :: PrimitiveType -> AssemblyName -> TypeName -> FieldName -> MethodDecl-ldflda p a t f = mdecl $ Ldflda p a t f+ldflda p a t f = OpCode $ Ldflda p a t f +ldftn_ :: [CallConv] -> PrimitiveType -> AssemblyName -> TypeName -> MethodName -> [PrimitiveType] -> MethodDecl+ldftn_ cc p a t m ps = OpCode $ Ldftn cc p a t m ps+ ldftn :: PrimitiveType -> AssemblyName -> TypeName -> MethodName -> [PrimitiveType] -> MethodDecl-ldftn p a t m ps = mdecl $ Ldftn p a t m ps+ldftn = ldftn_ [] +ldftn_instance :: PrimitiveType -> AssemblyName -> TypeName -> MethodName -> [PrimitiveType] -> MethodDecl+ldftn_instance = ldftn_ [CcInstance]+ ldind_i :: MethodDecl-ldind_i = mdecl $ Ldind_i+ldind_i = OpCode $ Ldind_i ldind_i1 :: MethodDecl-ldind_i1 = mdecl $ Ldind_i1+ldind_i1 = OpCode $ Ldind_i1 ldind_i2 :: MethodDecl-ldind_i2 = mdecl $ Ldind_i2+ldind_i2 = OpCode $ Ldind_i2 ldind_i4 :: MethodDecl-ldind_i4 = mdecl $ Ldind_i4+ldind_i4 = OpCode $ Ldind_i4 ldind_i8 :: MethodDecl-ldind_i8 = mdecl $ Ldind_i8+ldind_i8 = OpCode $ Ldind_i8 ldind_r4 :: MethodDecl-ldind_r4 = mdecl $ Ldind_r4+ldind_r4 = OpCode $ Ldind_r4 ldind_r8 :: MethodDecl-ldind_r8 = mdecl $ Ldind_r8+ldind_r8 = OpCode $ Ldind_r8 ldind_ref :: MethodDecl-ldind_ref = mdecl $ Ldind_ref+ldind_ref = OpCode $ Ldind_ref ldind_u1 :: MethodDecl-ldind_u1 = mdecl $ Ldind_u1+ldind_u1 = OpCode $ Ldind_u1 ldind_u2 :: MethodDecl-ldind_u2 = mdecl $ Ldind_u2+ldind_u2 = OpCode $ Ldind_u2 ldind_u4 :: MethodDecl-ldind_u4 = mdecl $ Ldind_u4+ldind_u4 = OpCode $ Ldind_u4 ldlen :: MethodDecl-ldlen = mdecl $ Ldlen+ldlen = OpCode $ Ldlen ldloc :: Offset -> MethodDecl-ldloc 0 = mdecl $ Ldloc_0-ldloc 1 = mdecl $ Ldloc_1-ldloc 2 = mdecl $ Ldloc_2-ldloc 3 = mdecl $ Ldloc_3-ldloc x = mdecl $ Ldloc x+ldloc 0 = OpCode $ Ldloc_0+ldloc 1 = OpCode $ Ldloc_1+ldloc 2 = OpCode $ Ldloc_2+ldloc 3 = OpCode $ Ldloc_3+ldloc x = OpCode $ Ldloc x ldlocN :: LocalName -> MethodDecl-ldlocN nm = mdecl $ LdlocN nm+ldlocN nm = OpCode $ LdlocN nm ldloca :: Offset -> MethodDecl-ldloca = mdecl . Ldloca+ldloca = OpCode . Ldloca ldlocaN :: LocalName -> MethodDecl-ldlocaN nm = mdecl $ LdlocaN nm+ldlocaN nm = OpCode $ LdlocaN nm ldnull :: MethodDecl-ldnull = mdecl $ Ldnull+ldnull = OpCode $ Ldnull ldsfld :: PrimitiveType -> AssemblyName -> TypeName -> FieldName -> MethodDecl-ldsfld p a t f = mdecl $ Ldsfld p a t f+ldsfld p a t f = OpCode $ Ldsfld p a t f ldsflda :: PrimitiveType -> AssemblyName -> TypeName -> FieldName -> MethodDecl-ldsflda p a t f = mdecl $ Ldsflda p a t f+ldsflda p a t f = OpCode $ Ldsflda p a t f ldstr :: String -> MethodDecl-ldstr = mdecl . Ldstr+ldstr = OpCode . Ldstr +ldtoken :: PrimitiveType -> MethodDecl+ldtoken = OpCode . Ldtoken+ mul :: MethodDecl-mul = mdecl $ Mul+mul = OpCode $ Mul mul_ovf :: MethodDecl-mul_ovf = mdecl $ Mul_ovf+mul_ovf = OpCode $ Mul_ovf mul_ovf_un :: MethodDecl-mul_ovf_un = mdecl $ Mul_ovf_un+mul_ovf_un = OpCode $ Mul_ovf_un neg :: MethodDecl-neg = mdecl $ Neg+neg = OpCode $ Neg newarr :: PrimitiveType -> MethodDecl-newarr t = mdecl $ Newarr t+newarr t = OpCode $ Newarr t -- | Creates a new object. -- Note that this function assumes the constructor returns Void. -- If this is not the case, call the Newobj constructor manually. newobj :: AssemblyName -> TypeName -> [PrimitiveType] -> MethodDecl-newobj a t ps = mdecl $ Newobj Void a t ps+newobj a t ps = OpCode $ Newobj Void a t ps nop :: MethodDecl-nop = mdecl $ Nop+nop = OpCode $ Nop not :: MethodDecl-not = mdecl $ Not+not = OpCode $ Not or :: MethodDecl-or = mdecl $ Or+or = OpCode $ Or pop :: MethodDecl-pop = mdecl $ Pop+pop = OpCode $ Pop rem :: MethodDecl-rem = mdecl $ Rem+rem = OpCode $ Rem rem_un :: MethodDecl-rem_un = mdecl $ Rem_un+rem_un = OpCode $ Rem_un ret :: MethodDecl-ret = mdecl $ Ret+ret = OpCode $ Ret shl :: MethodDecl-shl = mdecl $ Shl+shl = OpCode $ Shl shr :: MethodDecl-shr = mdecl $ Shr+shr = OpCode $ Shr shr_un :: MethodDecl-shr_un = mdecl $ Shr_un+shr_un = OpCode $ Shr_un stelem_i :: MethodDecl-stelem_i = mdecl $ Stelem_i+stelem_i = OpCode $ Stelem_i stelem_i1 :: MethodDecl-stelem_i1 = mdecl $ Stelem_i1+stelem_i1 = OpCode $ Stelem_i1 stelem_i2 :: MethodDecl-stelem_i2 = mdecl $ Stelem_i2+stelem_i2 = OpCode $ Stelem_i2 stelem_i4 :: MethodDecl-stelem_i4 = mdecl $ Stelem_i4+stelem_i4 = OpCode $ Stelem_i4 stelem_i8 :: MethodDecl-stelem_i8 = mdecl $ Stelem_i8+stelem_i8 = OpCode $ Stelem_i8 stelem_r4 :: MethodDecl-stelem_r4 = mdecl $ Stelem_r4+stelem_r4 = OpCode $ Stelem_r4 stelem_r8 :: MethodDecl-stelem_r8 = mdecl $ Stelem_r8+stelem_r8 = OpCode $ Stelem_r8 stelem_ref :: MethodDecl-stelem_ref = mdecl $ Stelem_ref+stelem_ref = OpCode $ Stelem_ref stfld :: PrimitiveType -> AssemblyName -> TypeName -> FieldName -> MethodDecl-stfld p a t f = mdecl $ Stfld p a t f+stfld p a t f = OpCode $ Stfld p a t f stind_i :: MethodDecl-stind_i = mdecl $ Stind_i+stind_i = OpCode $ Stind_i stind_i1 :: MethodDecl-stind_i1 = mdecl $ Stind_i1+stind_i1 = OpCode $ Stind_i1 stind_i2 :: MethodDecl-stind_i2 = mdecl $ Stind_i2+stind_i2 = OpCode $ Stind_i2 stind_i4 :: MethodDecl-stind_i4 = mdecl $ Stind_i4+stind_i4 = OpCode $ Stind_i4 stind_i8 :: MethodDecl-stind_i8 = mdecl $ Stind_i8+stind_i8 = OpCode $ Stind_i8 stind_r4 :: MethodDecl-stind_r4 = mdecl $ Stind_r4+stind_r4 = OpCode $ Stind_r4 stind_r8 :: MethodDecl-stind_r8 = mdecl $ Stind_r8+stind_r8 = OpCode $ Stind_r8 stind_ref :: MethodDecl-stind_ref = mdecl $ Stind_ref+stind_ref = OpCode $ Stind_ref stloc :: Offset -> MethodDecl-stloc 0 = mdecl $ Stloc_0-stloc 1 = mdecl $ Stloc_1-stloc 2 = mdecl $ Stloc_2-stloc 3 = mdecl $ Stloc_3-stloc x = mdecl $ Stloc x+stloc 0 = OpCode $ Stloc_0+stloc 1 = OpCode $ Stloc_1+stloc 2 = OpCode $ Stloc_2+stloc 3 = OpCode $ Stloc_3+stloc x = OpCode $ Stloc x stlocN :: LocalName -> MethodDecl-stlocN nm = mdecl $ StlocN nm+stlocN nm = OpCode $ StlocN nm stsfld :: PrimitiveType -> AssemblyName -> TypeName -> FieldName -> MethodDecl-stsfld p a t f = mdecl $ Stsfld p a t f+stsfld p a t f = OpCode $ Stsfld p a t f sub :: MethodDecl-sub = mdecl $ Sub+sub = OpCode $ Sub sub_ovf :: MethodDecl-sub_ovf = mdecl $ Sub_ovf+sub_ovf = OpCode $ Sub_ovf sub_ovf_un :: MethodDecl-sub_ovf_un = mdecl $ Sub_ovf_un+sub_ovf_un = OpCode $ Sub_ovf_un +switch :: [Label] -> MethodDecl+switch = OpCode . Switch+ tail :: MethodDecl-tail = mdecl $ Tail+tail = OpCode $ Tail tailcall :: MethodDecl -> MethodDecl-tailcall (Instr (OpCode oc)) = Instr (OpCode (Tailcall oc))-tailcall _ = error $ "Language.Cil.Build.tailcall: Can't tailcall supplied argument"+tailcall (OpCode oc) = OpCode (Tailcall oc)+tailcall _ = error $ "Language.Cil.Build.tailcall: Can't tailcall supplied argument" throw :: MethodDecl-throw = mdecl $ Throw+throw = OpCode $ Throw unaligned :: Alignment -> MethodDecl-unaligned a = mdecl $ Unaligned a+unaligned a = OpCode $ Unaligned a unalignedPtr :: Alignment -> MethodDecl -> MethodDecl-unalignedPtr a (Instr (OpCode oc)) | supportsUnaligned oc = mdecl $ UnalignedPtr a oc-unalignedPtr _ _ = error $ "Language.Cil.Build.unalignedPtr: Supplied argument doesn't require alignment"+unalignedPtr a (OpCode oc) | supportsUnaligned oc = OpCode $ UnalignedPtr a oc+unalignedPtr _ _ = error $ "Language.Cil.Build.unalignedPtr: Supplied argument doesn't require alignment" volatile :: MethodDecl-volatile = mdecl $ Volatile+volatile = OpCode $ Volatile volatilePtr :: MethodDecl -> MethodDecl-volatilePtr (Instr (OpCode oc)) | supportsVolatile oc = mdecl $ VolatilePtr oc-volatilePtr _ = error $ "Language.Cil.Build.volatilePtr: Supplied argument cannot be marked volatile"+volatilePtr (OpCode oc) | supportsVolatile oc = OpCode $ VolatilePtr oc+volatilePtr _ = error $ "Language.Cil.Build.volatilePtr: Supplied argument cannot be marked volatile" xor :: MethodDecl-xor = mdecl $ Xor+xor = OpCode $ Xor -- Helper functions -mdecl :: OpCode -> MethodDecl-mdecl i = Instr $ OpCode i- supportsUnaligned :: OpCode -> Bool supportsUnaligned (VolatilePtr oc) = supportsPrefix oc supportsUnaligned oc = supportsPrefix oc@@ -585,12 +613,9 @@ -- Convenient AST functions --- | Relabel a labelled mdecl with a new label.-label :: Label -> MethodDecl -> MethodDecl-label l (Instr (LabOpCode _ oc)) = Instr $ LabOpCode l oc-label l (Instr (OpCode oc)) = Instr $ LabOpCode l oc-label _ _ = error $ "Language.Cil.Build.label: "- ++ "Can't label non-Instrs."+-- | Relabel a labelled MethodDecl with a new label.+label :: Label -> MethodDecl+label l = Label l comment :: String -> MethodDecl comment s = Comment s
src/Language/Cil/Pretty.hs view
@@ -99,16 +99,19 @@ pr (FaPublic) = ("public" ++) pr (FaPrivate) = ("private" ++) pr (FaAssembly) = ("assembly" ++)+ pr (FaInitOnly) = ("initonly" ++) instance Pretty MethodDef where pr (Constructor mas t ps ms) = ident . (".method " ++)- . prList mas . pr t . sp . (".ctor(" ++)+ . prList mas . pr t . sp . (ctorName ++) . foldr (.) id (intersperse (", " ++) (map pr ps)) . (") cil managed\n" ++) . ident . ("{\n" ++) . foldr (\m s -> pr m . s) id ms . ident . ("}\n" ++)+ where ctorName = if static then ".cctor(" else ".ctor("+ static = MaStatic `elem` mas pr (Method mas t n ps ms) = ident . (".method " ++) . prList mas@@ -138,13 +141,10 @@ instance Pretty MethodDecl where pr (Directive d) = pr d- pr (Instr i) = pr i+ pr (Label l) = ident . (l ++) . (":" ++) . nl+ pr (OpCode oc) = ident . ident . pr oc . nl pr (Comment s) = ident . ident . ("// " ++) . (s ++) . nl -instance Pretty Instr where- pr (OpCode oc) = ident . ident . pr oc . nl- pr (LabOpCode l oc) = ident . (l ++) . (":" ++) . nl- . ident . ident . pr oc . nl instance Pretty Directive where pr (EntryPoint) = ident . ident . (".entrypoint" ++) . nl@@ -179,6 +179,7 @@ . prCall a c m ps pr (CallVirt t a c m ps) = ("callvirt instance " ++) . prsp t . sp . prCall a c m ps+ pr (Castclass t) = ("castclass " ++) . pr t pr (Ceq) = ("ceq" ++) pr (Cgt) = ("cgt" ++) pr (Ckfinite) = ("ckfinite" ++)@@ -193,6 +194,8 @@ pr (Ldarg_2) = ("ldarg.2 " ++) pr (Ldarg_3) = ("ldarg.3 " ++) pr (LdargN nm) = ("ldarg " ++) . prName nm+ pr (Ldarga x) = ("ldarga " ++) . shows x+ pr (LdargaN nm) = ("ldarga " ++) . prName nm pr (Ldc_i4 x) = ("ldc.i4 " ++) . shows x pr (Ldc_i4_0) = ("ldc.i4.0 " ++) pr (Ldc_i4_1) = ("ldc.i4.1 " ++) @@ -220,7 +223,7 @@ pr (Ldelem_ref) = ("ldelem.ref " ++) pr (Ldfld t a c f) = ("ldfld " ++) . pr t . sp . prFld a c f pr (Ldflda t a c f) = ("ldflda " ++) . pr t . sp . prFld a c f- pr (Ldftn t a c m ps) = ("ldftn " ++) . pr t . sp . prCall a c m ps+ pr (Ldftn cc t a c m ps) = ("ldftn " ++) . prList cc . pr t . sp . prCall a c m ps pr (Ldind_i) = ("ldind.i " ++) pr (Ldind_i1) = ("ldind.i1 " ++) pr (Ldind_i2) = ("ldind.i2 " ++)@@ -245,6 +248,7 @@ pr (Ldsfld t a c f) = ("ldsfld " ++) . pr t . sp . prFld a c f pr (Ldsflda t a c f) = ("ldsflda " ++) . pr t . sp . prFld a c f pr (Ldstr s) = ("ldstr " ++) . shows s+ pr (Ldtoken t) = ("ldtoken " ++) . prTypeToken t pr (Mul) = ("mul" ++) pr (Mul_ovf) = ("mul.ovf" ++) pr (Mul_ovf_un) = ("mul.ovf.un" ++)@@ -287,12 +291,14 @@ pr (Sub) = ("sub" ++) pr (Sub_ovf) = ("sub.ovf" ++) pr (Sub_ovf_un) = ("sub.ovf.un" ++)+ pr (Switch labels) = (("switch (" ++ intercalate ", " labels ++ ")") ++) pr (Tail) = ("tail." ++) pr (Tailcall opcode) = ("tail. " ++) . pr opcode pr (Throw) = ("throw" ++) pr (Unaligned a) = ("unaligned. " ++) . pr a pr (UnalignedPtr a opcode) = ("unaligned. " ++) . pr a . sp . pr opcode pr (Unbox t) = ("unbox " ++) . pr t+ pr (Unbox_any t) = ("unbox.any " ++) . pr t pr (Volatile) = ("volatile." ++) pr (VolatilePtr opcode) = ("volatile. " ++) . pr opcode pr (Xor) = ("xor" ++)@@ -330,9 +336,20 @@ . foldr (.) id (intersperse (", " ++) (map pr ps)) . (")" ++) +prTypeToken :: PrimitiveType -> ShowS+prTypeToken (ValueType a c) = prAssembly a . prName c+prTypeToken (ReferenceType a c) = prAssembly a . prName c+prTypeToken t = pr t+ prAssembly :: DottedName -> ShowS prAssembly a = bool (("[" ++) . prName a . ("]" ++)) id (a == "") +prGenericTypeName :: TypeName -> [a] -> (a -> ShowS) -> ShowS+prGenericTypeName n args prArg =+ prName n+ . ("`" ++) . shows (length args)+ . ("<" ++) . foldr (.) id (intersperse ("," ++) (map prArg args)) . (">" ++)+ instance Pretty PrimitiveType where pr Void = ("void" ++) pr Bool = ("bool" ++)@@ -341,16 +358,17 @@ pr Int32 = ("int32" ++) pr Int64 = ("int64" ++) pr Float32 = ("float32" ++)- pr Double64 = ("double64" ++)+ pr Double64 = ("float64" ++) pr IntPtr = ("native int" ++) pr String = ("string" ++) pr Object = ("object" ++) pr (ValueType a c) = ("valuetype " ++) . prAssembly a . prName c pr (ReferenceType a c) = ("class " ++ ) . prAssembly a . prName c- pr (GenericReferenceType a c gs) = prAssembly a . prName c . ("`" ++) . shows (length gs)- . ("<" ++) . foldr (.) id (intersperse ("," ++) (map ((("!" ++) .) . prName) gs)) . (">" ++)+ pr (GenericReferenceType a c gs) = prAssembly a . prGenericTypeName c gs ((("!" ++) .) . prName)+ pr (GenericReferenceTypeInstance a c ts) = ("class " ++) . prAssembly a . prGenericTypeName c ts pr pr (GenericType x) = ("!" ++) . shows x pr (ByRef pt) = pr pt . ("&" ++)+ pr (Array et) = pr et . ("[]" ++) instance Pretty Alignment where pr ByteAligned = ("1" ++)
src/Language/Cil/Syntax.hs view
@@ -30,7 +30,6 @@ , Parameter (..) , ParamAttr (..) , MethodDecl (..)- , Instr (..) , Directive (..) , Local (..) , Label@@ -124,6 +123,7 @@ | FaPublic | FaPrivate | FaAssembly+ | FaInitOnly deriving Show -- | Primitive types in CIL.@@ -142,9 +142,11 @@ | ValueType AssemblyName TypeName | ReferenceType AssemblyName TypeName | GenericReferenceType AssemblyName TypeName [GenParamName]+ | GenericReferenceTypeInstance AssemblyName TypeName [PrimitiveType] | ByRef PrimitiveType | GenericType Offset- deriving Show+ | Array PrimitiveType+ deriving (Eq, Ord, Show) -- | A specification of pointer alignment. data Alignment@@ -167,7 +169,7 @@ | MaAssembly | MaVirtual | MaHidebysig- deriving Show+ deriving (Show, Eq) -- | A formal parameter to a method. data Parameter@@ -184,8 +186,9 @@ -- | Method declarations, i.e. the body of a method. data MethodDecl = Directive Directive- | Instr Instr- | Comment String+ | Label Label+ | OpCode OpCode+ | Comment String deriving Show -- | Directive meta data for method definitions.@@ -200,13 +203,6 @@ = Local PrimitiveType LocalName deriving Show --- | Single instruction in method definition.--- Either an OpCode or a labelled OpCode.-data Instr- = LabOpCode Label OpCode- | OpCode OpCode- deriving Show- -- | CIL OpCodes inside a method definition. -- See <http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes_fields.aspx> -- for a more complete list with documentation.@@ -240,6 +236,7 @@ , methodName :: MethodName -- ^ Name of the method. , paramTypes :: [PrimitiveType] -- ^ Types of the formal parameters of the method. } -- ^ Pops /n/ values, calls specified virtual method, pushes return value. (where /n/ is the number of formal parameters of the method).+ | Castclass PrimitiveType -- ^ Pops 1 value, attempts to cast it to the specified type. If this succeeds, pushes the cast value. Otherwise throws an InvalidCastException. | Ceq -- ^ Pops 2 values, if they are equal, pushes 1 to stack; otherwise, pushes 0. | Cgt -- ^ Pops 2 values and compares them. | Ckfinite -- ^ Pops a float or double. Throws an ArithmeticException if the popped value is NaN or +/- infinity. Pushes the popped value.@@ -254,6 +251,8 @@ | Ldarg_2 -- ^ Loads 2th argument to current method onto stack. | Ldarg_3 -- ^ Loads 3th argument to current method onto stack. | LdargN DottedName -- ^ Loads named argument to current method onto stack.+ | Ldarga Offset -- ^ Loads address of the /n/-th argument to current method onto stack.+ | LdargaN DottedName -- ^ Loads address of the named argument to current method onto stack. | Ldc_i4 Integer -- ^ Loads the supplied 32-bit integer onto the stack. | Ldc_i4_0 -- ^ Loads the value 0 onto the stack. | Ldc_i4_1 -- ^ Loads the value 1 onto the stack.@@ -295,7 +294,8 @@ , fieldName :: FieldName -- ^ Name of the field. } -- ^ Pops object reference, find address of specified field on the object, pushes address to the stack. | Ldftn - { returnType :: PrimitiveType -- ^ Return type of the method.+ { callConv :: [CallConv] -- ^ Method is associated with class or instance.+ , returnType :: PrimitiveType -- ^ Return type of the method. , assemblyName :: AssemblyName -- ^ Name of the assembly where the method resides. , typeName :: TypeName -- ^ Name of the type of which the method is a member. , methodName :: MethodName -- ^ Name of the method.@@ -335,6 +335,7 @@ , fieldName :: FieldName -- ^ Name of the field. } -- ^ Pops type reference, find address of specified field on the type, pushes address to the stack. | Ldstr String -- ^ Pushes an object reference to the specified string constant.+ | Ldtoken PrimitiveType -- ^ Pushes the RuntimeTypeHandle of the specified type. | Mul -- ^ Pops 2 values, multiplies the values, pushes result. | Mul_ovf -- ^ Pops 2 values, multiplies the values with a signed overflow check, pushes result. | Mul_ovf_un -- ^ Pops 2 values, multiplies the values with an unsigned overflow check, pushes result.@@ -393,12 +394,14 @@ | Sub -- ^ Pops 2 values, subtracts second value from the first value, pushes result. | Sub_ovf -- ^ Pops 2 values, subtracts second value from the first value with a signed overflow check, pushes result. | Sub_ovf_un -- ^ Pops 2 values, subtracts second value from the first value with an unsigned overflow check, pushes result.+ | Switch [Label] -- ^ Pops an unsigned integer value and transfers control to label with matching index. | Tail -- ^ Performs subsequent call as a tail call, by replacing current stack frame with callee stack frame. | Tailcall OpCode -- ^ Performs provided call as a tail call, by replacing current stack frame with callee stack frame. | Throw -- ^ Pops an object reference from the stack and throws it as an exception. | Unaligned Alignment -- ^ Performs subsequent load or store operation under a weaker-than-usual alignment precondition. | UnalignedPtr Alignment OpCode -- ^ Performs provided load or store operation under a weaker-than-usual alignment precondition. | Unbox PrimitiveType -- ^ Pops 1 value, unboxes object reference, pushes value type.+ | Unbox_any PrimitiveType -- ^ Pops 1 value, unboxes and loads value, equivalent to unbox followed by ldobj | Volatile -- ^ Marks subsequent pointer reference as volatile, i.e. the value it points at can be modified from another thread. | VolatilePtr OpCode -- ^ Marks provided pointer reference as volatile, i.e. the value it points at can be modified from another thread. | Xor -- ^ Pops 2 values, do bitwise XOR between the values, pushes result.