IL Weaving - Mystery wrapped in an Enigma containing Frustration
Okay, here is another exampe of using Cecil, but I think that you can figure out what I think about having to deal with raw IL.
Feel free to figure out what this does, and why I would be interested in such a thing. BTW, in Boo to Boo, that sort of thing so painless. Having to deal with the raw IL takes all the fun out of it.
I know about Cecil.FlowControl, but as far as I can find, this is mostly (only?) for reading assemblies. I am looking for a way to have a reasonable AST over cecil. This is not scalable no matter how you cast it.
import Mono.Cecil
import Mono.Cecil.Cil
class DisposableAttribute(Attribute):
def Process(t as TypeDefinition):
disposed = FieldDefinition("___was_disposed",t.Module.Import(bool), FieldAttributes.Private)
t.Fields.Add(disposed)
t.Interfaces.Add( t.Module.Import(typeof(IDisposable)))
for method as MethodDefinition in t.Methods:
cil = method.Body.CilWorker
ins = method.Body.Instructions[0];
if method.Name=="Dispose":
cil.InsertBefore(ins,cil.Create(OpCodes.Ldarg_0))
cil.InsertBefore(ins,cil.Create(OpCodes.Ldc_I4_0))
cil.InsertBefore(ins,cil.Create(OpCodes.Stfld, disposed))
continue
wasDisposedLoc = VariableDefinition(t.Module.Import(bool))
method.Body.Variables.Add( wasDisposedLoc )
cil.InsertBefore(ins,cil.Create(OpCodes.Ldarg_0))
cil.InsertBefore(ins,cil.Create(OpCodes.Ldfld,disposed))
cil.InsertBefore(ins,cil.Create(OpCodes.Ldc_I4_0))
cil.InsertBefore(ins,cil.Create(OpCodes.Ceq))
cil.InsertBefore(ins,cil.Create(OpCodes.Stloc_0))
cil.InsertBefore(ins,cil.Create(OpCodes.Ldloc_0))
cil.InsertBefore(ins, cil.Create(OpCodes.Brtrue_S,ins))
cil.InsertBefore(ins,cil.Create(OpCodes.Ldstr, t.FullName))
cil.InsertBefore(ins,cil.Create(OpCodes.Newobj,
t.Module.Import(typeof(ObjectDisposedException).GetConstructors()[0]) ))
cil.InsertBefore(ins,cil.Create(OpCodes.Throw))
Chris, compiler!