private IEnumerable <Instruction> StoreStringInEventData(BodyBuilder builder, VariableDefinition item, ParameterDefinition param)
        {
            var pinned  = builder.DeclareLocal(module.TypeSystem.String.MakePinnedType());
            var pointer = builder.DeclareLocal(module.TypeSystem.Char.MakePointerType());

            yield return(Instruction.Create(OpCodes.Ldarg, param));

            yield return(Instruction.Create(OpCodes.Stloc, pinned));

            yield return(Instruction.Create(OpCodes.Ldloc, pinned));

            yield return(Instruction.Create(OpCodes.Conv_I));

            yield return(Instruction.Create(OpCodes.Stloc, pointer));

            var isnull = builder.DefineLabel();

            yield return(Instruction.Create(OpCodes.Ldloc, pointer));

            yield return(Instruction.Create(OpCodes.Brfalse, isnull));

            yield return(Instruction.Create(OpCodes.Ldloc, pointer));

            yield return(Instruction.Create(OpCodes.Call, module.ImportReference(RuntimeHelpers_OffsetToStringData_Get)));

            yield return(Instruction.Create(OpCodes.Add));

            yield return(Instruction.Create(OpCodes.Stloc, pointer));

            yield return(isnull);

            yield return(Instruction.Create(OpCodes.Ldloc, item));

            yield return(Instruction.Create(OpCodes.Ldloc, pointer));

            yield return(Instruction.Create(OpCodes.Call, module.ImportReference(IntPtr_Op_Explicit)));

            yield return(Instruction.Create(OpCodes.Call, typeDefs.EventDataSetDataPointer));

            yield return(Instruction.Create(OpCodes.Ldnull));

            yield return(Instruction.Create(OpCodes.Stloc, pinned));

            // data[].Size = (SringArg.Length + 1) * 2
            yield return(Instruction.Create(OpCodes.Ldloc, item));

            yield return(Instruction.Create(OpCodes.Ldarg, param));

            yield return(Instruction.Create(OpCodes.Callvirt, module.ImportReference(String_Length_Get)));

            yield return(Instruction.Create(OpCodes.Ldc_I4_1));

            yield return(Instruction.Create(OpCodes.Add));

            yield return(Instruction.Create(OpCodes.Ldc_I4_2));

            yield return(Instruction.Create(OpCodes.Mul));

            yield return(Instruction.Create(OpCodes.Call, typeDefs.EventDataSetSize));
        }
        private IEnumerable <Instruction> StoreBoolInEventData(BodyBuilder builder, VariableDefinition item, ParameterDefinition param)
        {
            var temp  = builder.DeclareLocal(module.TypeSystem.Int32, reusable: true);
            var @true = builder.DefineLabel();
            var @next = builder.DefineLabel();

            // var temp = param ? 1 : 0;
            yield return(Instruction.Create(OpCodes.Ldarg, param));

            yield return(Instruction.Create(OpCodes.Brtrue, @true));

            yield return(Instruction.Create(OpCodes.Ldc_I4_0));

            yield return(Instruction.Create(OpCodes.Br, @next));

            yield return(@true);

            yield return(Instruction.Create(OpCodes.Ldc_I4_1));

            yield return(@next);

            yield return(Instruction.Create(OpCodes.Stloc, temp));

            ////> item->Data = &temp;
            yield return(Instruction.Create(OpCodes.Ldloc, item));

            yield return(Instruction.Create(OpCodes.Ldloca, temp));

            yield return(Instruction.Create(OpCodes.Conv_U));

            yield return(Instruction.Create(OpCodes.Call, module.ImportReference(IntPtr_Op_Explicit)));

            yield return(Instruction.Create(OpCodes.Call, typeDefs.EventDataSetDataPointer));

            ////> item->Size = 4;
            yield return(Instruction.Create(OpCodes.Ldloc, item));

            yield return(Instruction.Create(OpCodes.Ldc_I4_4));

            yield return(Instruction.Create(OpCodes.Call, typeDefs.EventDataSetSize));
        }
        public IEnumerable <Instruction> Emit(BodyBuilder builder, MethodDefinition method, TraceMethod metadata)
        {
            log.Warn($"Using WriteEventCore fallback for {method}");

            var parameters = method.Parameters;
            var count      = parameters.Count;

            var data = builder.DeclareLocal(typeDefs.EventDataRef.MakePointerType());
            var item = builder.DeclareLocal(typeDefs.EventDataRef.MakePointerType());

            ////> EventData* data = stackalloc EventData[4];
            yield return(Instruction.Create(OpCodes.Ldc_I4, count));

            yield return(Instruction.Create(OpCodes.Conv_U));

            yield return(Instruction.Create(OpCodes.Sizeof, typeDefs.EventDataRef));

            yield return(Instruction.Create(OpCodes.Mul_Ovf_Un));

            yield return(Instruction.Create(OpCodes.Localloc));

            yield return(Instruction.Create(OpCodes.Stloc, data));

            ////> EventData* item = data
            yield return(Instruction.Create(OpCodes.Ldloc, data));

            yield return(Instruction.Create(OpCodes.Stloc, item));

            var first = true;

            foreach (var p in parameters)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    ////> item ++;
                    yield return(Instruction.Create(OpCodes.Ldloc, item));

                    yield return(Instruction.Create(OpCodes.Sizeof, typeDefs.EventDataRef));

                    yield return(Instruction.Create(OpCodes.Add));

                    yield return(Instruction.Create(OpCodes.Stloc, item));
                }

                ////> item->DataPointer = ...
                ////> item->Size = ...
                var emitter = emitters[ResolveFullName(p)];

                foreach (var i in emitter(builder, item, p))
                {
                    yield return(i);
                }
            }

            yield return(Instruction.Create(OpCodes.Ldarg_0));

            yield return(Instruction.Create(OpCodes.Ldc_I4, metadata.Id));

            yield return(Instruction.Create(OpCodes.Ldc_I4, count));

            yield return(Instruction.Create(OpCodes.Ldloc, data));

            yield return(Instruction.Create(OpCodes.Call, typeDefs.WriteEventCore));
        }