public static BlobDeserializer BuildDeserializer(IBlobSerializer source) { JITContext ctx = new JITContext(source.ExpectedType); source.EmitRead(ctx); ctx.Return(); return((BlobDeserializer)ctx.method.CreateDelegate(typeof(BlobDeserializer))); }
public void EmitRead(JITContext context) { context.LoadLocal(context.PeekTypeDef()); if (from is ListSerializer || from is DictionarySerializer) { context.CreateType(field.FieldType); context.PushType(field.FieldType); context.PushTypeDef(context.PeekTop(field.FieldType)); context.LoadLocal(context.PeekTop(field.FieldType)); context.StoreField(field); from.EmitRead(context); context.PopTypeDef(); context.PopType(field.FieldType); } else { from.EmitRead(context); context.StoreField(field); } }
public void EmitRead(JITContext context) { context.ReadFieldBlob(); context.PushType(typeof(BlobReader)); Label readField = context.CreateLabel(); Label cleanup = context.CreateLabel(); context.MarkLabel(readField); context.CanReadBytes(BlobReader.FieldHeaderLength); context.GotoWhenFalse(cleanup); context.ReadFieldHeader(); context.LoadLocal(context.PeekTypeDef()); switch (Type.GetTypeCode(leftType)) { case TypeCode.Int32: context.LoadByteKey(); context.LoadIntConstant(0); context.BitConvertTo("Int32"); break; case TypeCode.String: context.PushUTF8Encoding(); context.LoadByteKey(); context.LoadIntConstant(0); context.GetFieldKeyBytes(); context.ByteConvertToString(); break; default: throw new NotImplementedException(); } from.EmitRead(context); context.EmitCall(add); context.Goto(readField); context.MarkLabel(cleanup); context.SkipSpare(); context.DisposeReaderOnTop(); context.PopType(typeof(BlobReader)); }
public void EmitRead(JITContext context) { context.ReadFieldBlob(); context.PushType(typeof(BlobReader)); Label readField = context.CreateLabel(); Label cleanup = context.CreateLabel(); context.MarkLabel(readField); context.CanReadBytes(BlobReader.FieldHeaderLength); context.GotoWhenFalse(cleanup); context.ReadFieldHeader(); context.LoadLocal(context.PeekTypeDef()); // is this a safe optimization? if (from.ExpectedType.IsValueType) { context.LoadByteKey(); context.LoadIntConstant(0); context.BitConvertTo("Int32"); context.EmitCall(add); context.Goto(readField); } else { from.EmitRead(context); context.EmitCall(add); context.Goto(readField); } context.MarkLabel(cleanup); context.SkipSpare(); context.DisposeReaderOnTop(); context.PopType(typeof(BlobReader)); }
public static BlobDeserializer BuildDeserializer(IBlobSerializer source) { JITContext ctx = new JITContext(source.ExpectedType); source.EmitRead(ctx); ctx.Return(); return (BlobDeserializer)ctx.method.CreateDelegate(typeof(BlobDeserializer)); }