void GenerateDynamic(Dictionary <Type, TypeData> map) { /* generate stubs */ foreach (var kvp in map) { var type = kvp.Key; var td = kvp.Value; if (!td.IsGenerated) { continue; } td.WriterMethodInfo = Yardımcılar.GenerateDynamicSerializerStub(type); td.ReaderMethodInfo = Yardımcılar.GenerateDynamicDeserializerStub(type); } var ctx = new CodeGenContext(map); /* generate bodies */ foreach (var kvp in map) { var type = kvp.Key; var td = kvp.Value; if (!td.IsGenerated) { continue; } var writerDm = (DynamicMethod)td.WriterMethodInfo; td.TypeSerializer.GenerateWriterMethod(type, ctx, writerDm.GetILGenerator()); var readerDm = (DynamicMethod)td.ReaderMethodInfo; td.TypeSerializer.GenerateReaderMethod(type, ctx, readerDm.GetILGenerator()); } var writer = (DynamicMethod)ctx.GetWriterMethodInfo(typeof(object)); var reader = (DynamicMethod)ctx.GetReaderMethodInfo(typeof(object)); m_serializerSwitch = (SerializerSwitch)writer.CreateDelegate(typeof(SerializerSwitch)); m_deserializerSwitch = (DeserializerSwitch)reader.CreateDelegate(typeof(DeserializerSwitch)); }
static Dictionary<Type, ushort> GenerateDynamic(Type[] types) { Dictionary<Type, TypeData> map = GenerateTypeData(types); var nonStaticTypes = map.Where(kvp => kvp.Value.IsDynamic).Select(kvp => kvp.Key); /* generate stubs */ foreach (var type in nonStaticTypes) { var dm = GenerateDynamicSerializerStub(type); map[type].WriterMethodInfo = dm; map[type].WriterILGen = dm.GetILGenerator(); } foreach (var type in nonStaticTypes) { var dm = GenerateDynamicDeserializerStub(type); map[type].ReaderMethodInfo = dm; map[type].ReaderILGen = dm.GetILGenerator(); } var serializerSwitchMethod = new DynamicMethod("SerializerSwitch", null, new Type[] { typeof(Stream), typeof(object) }, typeof(Serializer), true); serializerSwitchMethod.DefineParameter(1, ParameterAttributes.None, "stream"); serializerSwitchMethod.DefineParameter(2, ParameterAttributes.None, "value"); var serializerSwitchMethodInfo = serializerSwitchMethod; var deserializerSwitchMethod = new DynamicMethod("DeserializerSwitch", null, new Type[] { typeof(Stream), typeof(object).MakeByRefType() }, typeof(Serializer), true); deserializerSwitchMethod.DefineParameter(1, ParameterAttributes.None, "stream"); deserializerSwitchMethod.DefineParameter(2, ParameterAttributes.Out, "value"); var deserializerSwitchMethodInfo = deserializerSwitchMethod; var ctx = new CodeGenContext(map, serializerSwitchMethodInfo, deserializerSwitchMethodInfo); /* generate bodies */ foreach (var type in nonStaticTypes) GenerateSerializerBody(ctx, type, map[type].WriterILGen); foreach (var type in nonStaticTypes) GenerateDeserializerBody(ctx, type, map[type].ReaderILGen); var ilGen = serializerSwitchMethod.GetILGenerator(); GenerateSerializerSwitch(ctx, ilGen, map); s_serializerSwitch = (SerializerSwitch)serializerSwitchMethod.CreateDelegate(typeof(SerializerSwitch)); ilGen = deserializerSwitchMethod.GetILGenerator(); GenerateDeserializerSwitch(ctx, ilGen, map); s_deserializerSwitch = (DeserializerSwitch)deserializerSwitchMethod.CreateDelegate(typeof(DeserializerSwitch)); return map.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.TypeID); }
static Dictionary <Type, ushort> GenerateDynamic(Type[] types) { Dictionary <Type, TypeData> map = GenerateTypeData(types); var nonStaticTypes = map.Where(kvp => kvp.Value.IsDynamic).Select(kvp => kvp.Key); /* generate stubs */ foreach (var type in nonStaticTypes) { var dm = GenerateDynamicSerializerStub(type); map[type].WriterMethodInfo = dm; map[type].WriterILGen = dm.GetILGenerator(); } foreach (var type in nonStaticTypes) { var dm = GenerateDynamicDeserializerStub(type); map[type].ReaderMethodInfo = dm; map[type].ReaderILGen = dm.GetILGenerator(); } var serializerSwitchMethod = new DynamicMethod("SerializerSwitch", null, new Type[] { typeof(Stream), typeof(object) }, typeof(Serializer), true); serializerSwitchMethod.DefineParameter(1, ParameterAttributes.None, "stream"); serializerSwitchMethod.DefineParameter(2, ParameterAttributes.None, "value"); var serializerSwitchMethodInfo = serializerSwitchMethod; var deserializerSwitchMethod = new DynamicMethod("DeserializerSwitch", null, new Type[] { typeof(Stream), typeof(object).MakeByRefType() }, typeof(Serializer), true); deserializerSwitchMethod.DefineParameter(1, ParameterAttributes.None, "stream"); deserializerSwitchMethod.DefineParameter(2, ParameterAttributes.Out, "value"); var deserializerSwitchMethodInfo = deserializerSwitchMethod; var ctx = new CodeGenContext(map, serializerSwitchMethodInfo, deserializerSwitchMethodInfo); /* generate bodies */ foreach (var type in nonStaticTypes) { GenerateSerializerBody(ctx, type, map[type].WriterILGen); } foreach (var type in nonStaticTypes) { GenerateDeserializerBody(ctx, type, map[type].ReaderILGen); } var ilGen = serializerSwitchMethod.GetILGenerator(); GenerateSerializerSwitch(ctx, ilGen, map); s_serializerSwitch = (SerializerSwitch)serializerSwitchMethod.CreateDelegate(typeof(SerializerSwitch)); ilGen = deserializerSwitchMethod.GetILGenerator(); GenerateDeserializerSwitch(ctx, ilGen, map); s_deserializerSwitch = (DeserializerSwitch)deserializerSwitchMethod.CreateDelegate(typeof(DeserializerSwitch)); return(map.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.TypeID)); }
static void GenerateDynamic(Dictionary<Type, TypeData> map) { /* generate stubs */ foreach (var kvp in map) { var type = kvp.Key; var td = kvp.Value; if (!td.IsGenerated) continue; var writerDm = SerializerCodegen.GenerateDynamicSerializerStub(type); td.WriterMethodInfo = writerDm; td.WriterILGen = writerDm.GetILGenerator(); var readerDm = DeserializerCodegen.GenerateDynamicDeserializerStub(type); td.ReaderMethodInfo = readerDm; td.ReaderILGen = readerDm.GetILGenerator(); } var serializerSwitchMethod = new DynamicMethod("SerializerSwitch", null, new Type[] { typeof(Stream), typeof(object) }, typeof(Serializer), true); serializerSwitchMethod.DefineParameter(1, ParameterAttributes.None, "stream"); serializerSwitchMethod.DefineParameter(2, ParameterAttributes.None, "value"); var serializerSwitchMethodInfo = serializerSwitchMethod; var deserializerSwitchMethod = new DynamicMethod("DeserializerSwitch", null, new Type[] { typeof(Stream), typeof(object).MakeByRefType() }, typeof(Serializer), true); deserializerSwitchMethod.DefineParameter(1, ParameterAttributes.None, "stream"); deserializerSwitchMethod.DefineParameter(2, ParameterAttributes.Out, "value"); var deserializerSwitchMethodInfo = deserializerSwitchMethod; var ctx = new CodeGenContext(map, serializerSwitchMethodInfo, deserializerSwitchMethodInfo); /* generate bodies */ foreach (var kvp in map) { var type = kvp.Key; var td = kvp.Value; if (!td.IsGenerated) continue; td.TypeSerializer.GenerateWriterMethod(type, ctx, td.WriterILGen); td.TypeSerializer.GenerateReaderMethod(type, ctx, td.ReaderILGen); } var ilGen = serializerSwitchMethod.GetILGenerator(); SerializerCodegen.GenerateSerializerSwitch(ctx, ilGen, map); s_serializerSwitch = (SerializerSwitch)serializerSwitchMethod.CreateDelegate(typeof(SerializerSwitch)); ilGen = deserializerSwitchMethod.GetILGenerator(); DeserializerCodegen.GenerateDeserializerSwitch(ctx, ilGen, map); s_deserializerSwitch = (DeserializerSwitch)deserializerSwitchMethod.CreateDelegate(typeof(DeserializerSwitch)); }
static void GenerateDynamic(Dictionary <Type, TypeData> map) { /* generate stubs */ foreach (var kvp in map) { var type = kvp.Key; var td = kvp.Value; if (!td.IsGenerated) { continue; } var writerDm = SerializerCodegen.GenerateDynamicSerializerStub(type); td.WriterMethodInfo = writerDm; td.WriterILGen = writerDm.GetILGenerator(); var readerDm = DeserializerCodegen.GenerateDynamicDeserializerStub(type); td.ReaderMethodInfo = readerDm; td.ReaderILGen = readerDm.GetILGenerator(); } var serializerSwitchMethod = new DynamicMethod("SerializerSwitch", null, new Type[] { typeof(Stream), typeof(object) }, typeof(Serializer), true); serializerSwitchMethod.DefineParameter(1, ParameterAttributes.None, "stream"); serializerSwitchMethod.DefineParameter(2, ParameterAttributes.None, "value"); var serializerSwitchMethodInfo = serializerSwitchMethod; var deserializerSwitchMethod = new DynamicMethod("DeserializerSwitch", null, new Type[] { typeof(Stream), typeof(object).MakeByRefType() }, typeof(Serializer), true); deserializerSwitchMethod.DefineParameter(1, ParameterAttributes.None, "stream"); deserializerSwitchMethod.DefineParameter(2, ParameterAttributes.Out, "value"); var deserializerSwitchMethodInfo = deserializerSwitchMethod; var ctx = new CodeGenContext(map, serializerSwitchMethodInfo, deserializerSwitchMethodInfo); /* generate bodies */ foreach (var kvp in map) { var type = kvp.Key; var td = kvp.Value; if (!td.IsGenerated) { continue; } td.TypeSerializer.GenerateWriterMethod(type, ctx, td.WriterILGen); td.TypeSerializer.GenerateReaderMethod(type, ctx, td.ReaderILGen); } var ilGen = serializerSwitchMethod.GetILGenerator(); SerializerCodegen.GenerateSerializerSwitch(ctx, ilGen, map); s_serializerSwitch = (SerializerSwitch)serializerSwitchMethod.CreateDelegate(typeof(SerializerSwitch)); ilGen = deserializerSwitchMethod.GetILGenerator(); DeserializerCodegen.GenerateDeserializerSwitch(ctx, ilGen, map); s_deserializerSwitch = (DeserializerSwitch)deserializerSwitchMethod.CreateDelegate(typeof(DeserializerSwitch)); }
void GenerateDynamic(Dictionary<Type, TypeData> map) { /* generate stubs */ foreach (var kvp in map) { var type = kvp.Key; var td = kvp.Value; if (!td.IsGenerated) continue; td.WriterMethodInfo = Helpers.GenerateDynamicSerializerStub(type); td.ReaderMethodInfo = Helpers.GenerateDynamicDeserializerStub(type); } var ctx = new CodeGenContext(map); /* generate bodies */ foreach (var kvp in map) { var type = kvp.Key; var td = kvp.Value; if (!td.IsGenerated) continue; var writerDm = (DynamicMethod)td.WriterMethodInfo; td.TypeSerializer.GenerateWriterMethod(type, ctx, writerDm.GetILGenerator()); var readerDm = (DynamicMethod)td.ReaderMethodInfo; td.TypeSerializer.GenerateReaderMethod(type, ctx, readerDm.GetILGenerator()); } var writer = (DynamicMethod)ctx.GetWriterMethodInfo(typeof(object)); var reader = (DynamicMethod)ctx.GetReaderMethodInfo(typeof(object)); m_serializerSwitch = (SerializerSwitch)writer.CreateDelegate(typeof(SerializerSwitch)); m_deserializerSwitch = (DeserializerSwitch)reader.CreateDelegate(typeof(DeserializerSwitch)); }