Example #1
0
        public static BlobDeserializer BuildDeserializer(IBlobSerializer source)
        {
            JITContext ctx = new JITContext(source.ExpectedType);

            source.EmitRead(ctx);
            ctx.Return();

            return((BlobDeserializer)ctx.method.CreateDelegate(typeof(BlobDeserializer)));
        }
Example #2
0
        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));
        }
Example #4
0
        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));
        }
Example #5
0
        public static BlobDeserializer BuildDeserializer(IBlobSerializer source)
        {
            JITContext ctx = new JITContext(source.ExpectedType);

            source.EmitRead(ctx);
            ctx.Return();

            return (BlobDeserializer)ctx.method.CreateDelegate(typeof(BlobDeserializer));
        }