public void EmitRead(JITContext context) { LocalBuilder top = context.PeekTypeDef(); if (top != null) { context.ReadFieldBlob(); context.PushType(typeof(BlobReader)); } context.CreateType(targetType); context.PushType(targetType); context.PushTypeDef(context.PeekTop(targetType)); Label readField = context.CreateLabel(); Label cleanup = context.CreateLabel(); context.MarkLabel(readField); context.CanReadBytes(BlobReader.FieldHeaderLength); context.GotoWhenFalse(cleanup); context.ReadFieldHeader(); for (int i = 0; i < fields.Length; i++) { Label nextField = context.CreateLabel(); if (fields[i].PeekIntKey != -1) { context.EmitKeyPeekTest(fields[i].PeekIntKey, nextField); } else { context.EmitKeyTest(fields[i].ByteKey, nextField); } fields[i].Serializer.EmitRead(context); context.Goto(readField); context.MarkLabel(nextField); } context.SkipField(); context.Goto(readField); context.MarkLabel(cleanup); context.SkipSpare(); if (top != null) { context.DisposeReaderOnTop(); context.PopType(typeof(BlobReader)); } context.LoadLocal(context.PeekTypeDef()); context.PopTypeDef(); context.PopType(targetType); }
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()); 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 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 void EmitRead(JITContext context) { LocalBuilder top = context.PeekTypeDef(); if (top != null) { context.ReadFieldBlob(); context.PushType(typeof(BlobReader)); } context.CreateType(targetType); context.PushType(targetType); context.PushTypeDef(context.PeekTop(targetType)); Label readField = context.CreateLabel(); Label cleanup = context.CreateLabel(); context.MarkLabel(readField); context.CanReadBytes(BlobReader.FieldHeaderLength); context.GotoWhenFalse(cleanup); context.ReadFieldHeader(); for (int i = 0; i < fields.Length; i++) { Label nextField = context.CreateLabel(); if (fields[i].PeekIntKey != -1) { context.EmitKeyPeekTest(fields[i].PeekIntKey, nextField); } else { context.EmitKeyTest(fields[i].ByteKey, nextField); } fields[i].Serializer.EmitRead(context); context.Goto(readField); context.MarkLabel(nextField); } context.SkipField(); context.Goto(readField); context.MarkLabel(cleanup); context.SkipSpare(); if (top != null) { context.DisposeReaderOnTop(); context.PopType(typeof(BlobReader)); } context.LoadLocal(context.PeekTypeDef()); context.PopTypeDef(); context.PopType(targetType); }