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)); }