private static ObjectReader GetDelegate(Type type, FieldInfo[] fields, Serializer serializer) { var c = new IlCompiler <ObjectReader>(); var stream = c.Parameter <Stream>("stream"); var session = c.Parameter <DeserializerSession>("session"); var newExpression = c.NewObject(type); var target = c.Variable <object>("target"); var assignNewObjectToTarget = c.WriteVar(target, newExpression); c.Emit(assignNewObjectToTarget); var size = c.Constant(16); var buffer = c.Variable <byte[]>(DefaultCodeGenerator.PreallocatedByteBuffer); var bufferValue = c.Call(typeof(DeserializerSession).GetMethod("GetBuffer"), session, size); var assignBuffer = c.WriteVar(buffer, bufferValue); c.Emit(assignBuffer); var typedTarget = c.CastOrUnbox(target, type); foreach (var field in fields) { var s = serializer.GetSerializerByType(field.FieldType); var read = s.EmitReadValue(c, stream, session, field); var assignReadToField = c.WriteField(field, typedTarget, read); c.Emit(assignReadToField); } c.Emit(target); var readAllFields = c.Compile(); return(readAllFields); }
public void CanCallInstanceMethodOnParameter() { var c = new IlCompiler <Action <Dummy> >(); var param = c.Parameter <Dummy>("dummy"); c.EmitCall(SetBool, param); var a = c.Compile(); var dummy = new Dummy(); a(dummy); Assert.Equal(true, dummy.BoolField); }
public void CanCallStaticMethodUsingParameter() { var c = new IlCompiler <Action <Dummy> >(); var param = c.Parameter <Dummy>("dummy"); c.EmitStaticCall(SetStatic, param); var a = c.Compile(); var dummy = new Dummy(); a(dummy); Assert.Equal(true, dummy.BoolField); }
public void CanModifyParameter() { var c = new IlCompiler <Action <Dummy> >(); var param = c.Parameter <Dummy>("dummy"); var write = c.WriteField(BoolField, param, c.Constant(true)); c.Emit(write); var a = c.Compile(); var dummy = new Dummy(); a(dummy); Assert.Equal(true, dummy.BoolField); }