When you Create an Instruction that is either InlineBrTarget or ShortInlineBrTarget, you must give it another Instruction to branch to.
So you have to call: Create (OpCodes.Brtrue, target) Where target is the instruction to branch to if you have true on the stack. On Sat, Jan 9, 2010 at 7:01 AM, Michael Kohout <[email protected]> wrote: > here's a little test function I'm trying to do. It should operate like > this: > public void Methodname() > { > if{this.fieldName<0) {System.Console.WriteLine("hello zero")} > } > here's where I try and generate this: > (fun (worker:CilWorker)-> > > worker.Append (worker.Create( OpCodes.Ldc_I4_0 )) > worker.Append (worker.Create( OpCodes.Ldarg_0 )) > worker.Append (worker.Create( OpCodes.Ldfld, field)) > worker.Append (worker.Create( OpCodes.Clt )) > let jump = worker.Create( OpCodes.Brtrue ) > worker.Append(jump) > worker.Append(worker.Create(OpCodes.Ldstr, "hello zero")) > > let mi = (typeof<System.Console>).GetMethod("WriteLine", > [|typeof<string>|]) in let methodRef:MethodReference = > builder.GetMethodReference(mi) > worker.Append(worker.Create(OpCodes.Call, methodRef) ) > let e = worker.Create( OpCodes.Ret) > worker.Append(e) > jump.Operand <- e > ) > You might notice that set the jump instruction operand at the end, after > I've generated my return opcode. However this isn't working. The stack > trace starts with "System.ArgumentException: opcode". What am I doing > wrong? > thanks > Mike > -- > -- > mono-cecil > -- Jb Evain <[email protected]>
-- -- mono-cecil
