示例#1
0
        public void GenerateLoad(IILGen ilGenerator, Action <IILGen> pushReader, Action <IILGen> pushCtx, Action <IILGen> pushDescriptor, Type targetType)
        {
            pushReader(ilGenerator);
            Type typeRead;

            if (_signed)
            {
                ilGenerator.Call(() => default(AbstractBufferedReader).ReadVInt64());
                typeRead = typeof(long);
            }
            else
            {
                ilGenerator.Call(() => default(AbstractBufferedReader).ReadVUInt64());
                typeRead = typeof(ulong);
            }
            if (targetType == typeof(object))
            {
                ilGenerator.Do(pushDescriptor);
                if (_signed)
                {
                    ilGenerator.Newobj(() => new DynamicEnum(0L, null));
                }
                else
                {
                    ilGenerator.Newobj(() => new DynamicEnum(0UL, null));
                }
                ilGenerator.Castclass(typeof(object));
                return;
            }
            new DefaultTypeConvertorGenerator().GenerateConversion(typeRead, targetType.GetEnumUnderlyingType())(ilGenerator);
        }
示例#2
0
        void SaveListPrefixBytes(uint secondaryKeyIndex, IILGen ilGenerator, string methodName, ParameterInfo[] methodParameters,
                                 IDictionary <string, MethodInfo> apartFields)
        {
            var writerLoc = ilGenerator.DeclareLocal(typeof(ByteBufferWriter));

            ilGenerator
            .Newobj(() => new ByteBufferWriter())
            .Stloc(writerLoc);

            Action <IILGen> pushWriter = il => il.Ldloc(writerLoc);

            WriteShortPrefixIl(ilGenerator, pushWriter, ObjectDB.AllRelationsSKPrefix);
            //ByteBuffered.WriteVUInt32(RelationInfo.Id);
            WriteIdIl(ilGenerator, pushWriter, (int)_relationInfo.Id);
            //ByteBuffered.WriteVUInt32(skIndex);
            WriteIdIl(ilGenerator, pushWriter, (int)secondaryKeyIndex);

            var secondaryKeyFields = _relationInfo.ClientRelationVersionInfo.GetSecondaryKeyFields(secondaryKeyIndex);
            var paramCount         = methodParameters.Length - 1; //last param is key proposition

            SaveMethodParameters(ilGenerator, methodName, methodParameters, paramCount, apartFields,
                                 secondaryKeyFields, writerLoc);

            var dataGetter = typeof(ByteBufferWriter).GetProperty("Data").GetGetMethod(true);

            ilGenerator.Ldloc(writerLoc).Callvirt(dataGetter);
        }
示例#3
0
        public void GenerateLoad(IILGen ilGenerator, Action <IILGen> pushReader, Action <IILGen> pushCtx, Action <IILGen> pushDescriptor, Type targetType)
        {
            var localResult  = ilGenerator.DeclareLocal(targetType);
            var finish       = ilGenerator.DefineLabel();
            var noValue      = ilGenerator.DefineLabel();
            var itemType     = targetType.GetGenericArguments()[0];
            var nullableType = typeof(Nullable <>).MakeGenericType(itemType);

            if (!targetType.IsAssignableFrom(nullableType))
            {
                throw new NotSupportedException();
            }
            ilGenerator
            .Do(pushReader)
            .Callvirt(() => default(AbstractBufferedReader).ReadBool())
            .Brfalse(noValue);
            _itemDescriptor.GenerateLoadEx(ilGenerator, pushReader, pushCtx, il => il.Do(pushDescriptor).LdcI4(0).Callvirt(() => default(ITypeDescriptor).NestedType(0)), itemType, _convertorGenerator);
            ilGenerator
            .Newobj(nullableType.GetConstructor(new[] { itemType }))
            .Stloc(localResult)
            .BrS(finish)
            .Mark(noValue)
            .Ldloca(localResult)
            .InitObj(nullableType)
            .Mark(finish)
            .Ldloc(localResult);
        }
        public void GenerateLoad(IILGen ilGenerator, Action <IILGen> pushReader, Action <IILGen> pushCtx,
                                 Action <IILGen> pushDescriptor, Type targetType)
        {
            pushReader(ilGenerator);
            Type typeRead;

            if (_signed)
            {
                ilGenerator.Call(() => default(AbstractBufferedReader).ReadVInt64());
                typeRead = typeof(long);
            }
            else
            {
                ilGenerator.Call(() => default(AbstractBufferedReader).ReadVUInt64());
                typeRead = typeof(ulong);
            }

            if (targetType == typeof(object))
            {
                ilGenerator.Do(pushDescriptor);
                if (_signed)
                {
                    ilGenerator.Newobj(() => new DynamicEnum(0L, null));
                }
                else
                {
                    ilGenerator.Newobj(() => new DynamicEnum(0UL, null));
                }

                ilGenerator.Castclass(typeof(object));
                return;
            }

            var trueTargetType = targetType.IsEnum ? targetType.GetEnumUnderlyingType() : targetType;
            var conv           = _typeSerializers.ConvertorGenerator.GenerateConversion(typeRead, trueTargetType);

            if (conv == null)
            {
                throw new BTDBException("Don't know how to convert from " +
                                        typeRead.ToSimpleName() + " to " + targetType.ToSimpleName());
            }
            conv(ilGenerator);
        }
示例#5
0
        void SavePKListPrefixBytes(IILGen ilGenerator, string methodName, ParameterInfo[] methodParameters,
                                   IDictionary <string, MethodInfo> apartFields)
        {
            var writerLoc = ilGenerator.DeclareLocal(typeof(ByteBufferWriter));

            ilGenerator
            .Newobj(() => new ByteBufferWriter())
            .Stloc(writerLoc);

            Action <IILGen> pushWriter = il => il.Ldloc(writerLoc);

            WriteShortPrefixIl(ilGenerator, pushWriter, _relationInfo.Prefix);

            var keyFields  = _relationInfo.ClientRelationVersionInfo.GetPrimaryKeyFields();
            var paramCount = methodParameters.Length - 1; //last param is key proposition

            SaveMethodParameters(ilGenerator, methodName, methodParameters, paramCount, apartFields,
                                 keyFields, writerLoc);

            var dataGetter = typeof(ByteBufferWriter).GetProperty("Data").GetGetMethod(true);

            ilGenerator.Ldloc(writerLoc).Callvirt(dataGetter);
        }
示例#6
0
        void SaveKeyBytesAndCallMethod(IILGen ilGenerator, Type relationDBManipulatorType, string methodName,
                                       ParameterInfo[] methodParameters, Type methodReturnType,
                                       IDictionary <string, MethodInfo> apartFields)
        {
            var writerLoc = ilGenerator.DeclareLocal(typeof(ByteBufferWriter));

            ilGenerator.Newobj(() => new ByteBufferWriter());
            ilGenerator.Stloc(writerLoc);
            Action <IILGen> pushWriter = il => il.Ldloc(writerLoc);

            //arg0 = this = manipulator
            if (methodName.StartsWith("RemoveById"))
            {
                CreateMethodRemoveById(ilGenerator, relationDBManipulatorType, methodName, methodParameters, methodReturnType, apartFields, pushWriter, writerLoc);
            }
            else if (methodName.StartsWith("FindById"))
            {
                CreateMethodFindById(ilGenerator, relationDBManipulatorType, methodName, methodParameters, methodReturnType, apartFields, pushWriter, writerLoc);
            }
            else if (methodName.StartsWith("FindBy"))
            {
                CreateMethodFindBy(ilGenerator, relationDBManipulatorType, methodName, methodParameters, methodReturnType, apartFields, pushWriter, writerLoc);
            }
            else if (methodName == "ListById")
            {
                CreateMethodListById(ilGenerator, relationDBManipulatorType, methodName, methodParameters, apartFields, pushWriter, writerLoc);
            }
            else if (methodName == "Contains")
            {
                CreateMethodContains(ilGenerator, relationDBManipulatorType, methodParameters, apartFields, pushWriter, writerLoc);
            }
            else
            {
                throw new NotSupportedException();
            }
        }
示例#7
0
        public void Load(IILGen ilGenerator, Action <IILGen> pushReaderOrCtx)
        {
            var localResult  = ilGenerator.DeclareLocal(HandledType());
            var finish       = ilGenerator.DefineLabel();
            var noValue      = ilGenerator.DefineLabel();
            var itemType     = _type.GetGenericArguments()[0];
            var nullableType = typeof(Nullable <>).MakeGenericType(itemType);

            ilGenerator
            .Do(pushReaderOrCtx)
            .Callvirt(() => default(AbstractBufferedReader).ReadBool())
            .Brfalse(noValue);
            _itemHandler.Load(ilGenerator, pushReaderOrCtx);
            _typeConvertorGenerator.GenerateConversion(_itemHandler.HandledType(), itemType)(ilGenerator);
            ilGenerator
            .Newobj(nullableType.GetConstructor(new[] { itemType }))
            .Stloc(localResult)
            .BrS(finish)
            .Mark(noValue)
            .Ldloca(localResult)
            .InitObj(nullableType)
            .Mark(finish)
            .Ldloc(localResult);
        }
示例#8
0
 public void GenerateLoad(IILGen ilGenerator, Action <IILGen> pushReader, Action <IILGen> pushCtx, Action <IILGen> pushDescriptor, Type targetType)
 {
     if (targetType == typeof(object))
     {
         var resultLoc  = ilGenerator.DeclareLocal(typeof(DynamicObject), "result");
         var labelNoCtx = ilGenerator.DefineLabel();
         ilGenerator
         .Do(pushDescriptor)
         .Castclass(typeof(ObjectTypeDescriptor))
         .Newobj(typeof(DynamicObject).GetConstructor(new[] { typeof(ObjectTypeDescriptor) }))
         .Stloc(resultLoc)
         .Do(pushCtx)
         .BrfalseS(labelNoCtx)
         .Do(pushCtx)
         .Ldloc(resultLoc)
         .Callvirt(() => default(ITypeBinaryDeserializerContext).AddBackRef(null))
         .Mark(labelNoCtx);
         var idx = 0;
         foreach (var pair in _fields)
         {
             var idxForCapture = idx;
             ilGenerator.Ldloc(resultLoc);
             ilGenerator.LdcI4(idx);
             pair.Value.GenerateLoadEx(ilGenerator, pushReader, pushCtx,
                                       il =>
                                       il.Do(pushDescriptor)
                                       .LdcI4(idxForCapture)
                                       .Callvirt(() => default(ITypeDescriptor).NestedType(0)), typeof(object), _typeSerializers.ConvertorGenerator);
             ilGenerator.Callvirt(() => default(DynamicObject).SetFieldByIdxFast(0, null));
             idx++;
         }
         ilGenerator
         .Ldloc(resultLoc)
         .Castclass(typeof(object));
     }
     else
     {
         var resultLoc  = ilGenerator.DeclareLocal(targetType, "result");
         var labelNoCtx = ilGenerator.DefineLabel();
         ilGenerator
         .Newobj(targetType.GetConstructor(Type.EmptyTypes))
         .Stloc(resultLoc)
         .Do(pushCtx)
         .BrfalseS(labelNoCtx)
         .Do(pushCtx)
         .Ldloc(resultLoc)
         .Callvirt(() => default(ITypeBinaryDeserializerContext).AddBackRef(null))
         .Mark(labelNoCtx);
         var props = targetType.GetProperties();
         for (var idx = 0; idx < _fields.Count; idx++)
         {
             var idxForCapture = idx;
             var pair          = _fields[idx];
             var prop          = props.FirstOrDefault(p => GetPersitentName(p) == pair.Key);
             if (prop == null || !_typeSerializers.IsSafeToLoad(prop.PropertyType))
             {
                 pair.Value.GenerateSkipEx(ilGenerator, pushReader, pushCtx);
                 continue;
             }
             ilGenerator.Ldloc(resultLoc);
             pair.Value.GenerateLoadEx(ilGenerator, pushReader, pushCtx,
                                       il => il.Do(pushDescriptor).LdcI4(idxForCapture).Callvirt(() => default(ITypeDescriptor).NestedType(0)),
                                       prop.PropertyType, _typeSerializers.ConvertorGenerator);
             ilGenerator.Callvirt(prop.GetSetMethod());
         }
         ilGenerator.Ldloc(resultLoc);
     }
 }
示例#9
0
 public void Init(IILGen ilGenerator, Action<IILGen> pushReaderCtx)
 {
     ilGenerator.Newobj(typeof(DBIndirect<>).MakeGenericType(_type).GetConstructor(Type.EmptyTypes));
 }
示例#10
0
 public void GenerateLoad(IILGen ilGenerator, Action<IILGen> pushReader, Action<IILGen> pushCtx, Action<IILGen> pushDescriptor, Type targetType)
 {
     pushReader(ilGenerator);
     Type typeRead;
     if (_signed)
     {
         ilGenerator.Call(() => default(AbstractBufferedReader).ReadVInt64());
         typeRead = typeof(long);
     }
     else
     {
         ilGenerator.Call(() => default(AbstractBufferedReader).ReadVUInt64());
         typeRead = typeof(ulong);
     }
     if (targetType == typeof(object))
     {
         ilGenerator.Do(pushDescriptor);
         if (_signed)
         {
             ilGenerator.Newobj(() => new DynamicEnum(0L, null));
         }
         else
         {
             ilGenerator.Newobj(() => new DynamicEnum(0UL, null));
         }
         ilGenerator.Castclass(typeof(object));
         return;
     }
     new DefaultTypeConvertorGenerator().GenerateConversion(typeRead, targetType.GetEnumUnderlyingType())(ilGenerator);
 }
示例#11
0
 public void Init(IILGen ilGenerator, Action <IILGen> pushReaderCtx)
 {
     ilGenerator.Newobj(typeof(DBIndirect <>).MakeGenericType(_type).GetConstructor(Type.EmptyTypes));
 }
示例#12
0
        public static IILGen Newobj(this IILGen il, Expression <Action> expression)
        {
            var constructorInfo = (expression.Body as NewExpression).Constructor;

            return(il.Newobj(constructorInfo));
        }
示例#13
0
        public static IILGen Newobj <T>(this IILGen il, Expression <Func <T> > expression)
        {
            var constructorInfo = ((NewExpression)expression.Body).Constructor;

            return(il.Newobj(constructorInfo));
        }
示例#14
0
 public void GenerateLoad(IILGen ilGenerator, Action<IILGen> pushReader, Action<IILGen> pushCtx, Action<IILGen> pushDescriptor, Type targetType)
 {
     if (targetType == typeof(object))
     {
         var resultLoc = ilGenerator.DeclareLocal(typeof(DynamicObject), "result");
         var labelNoCtx = ilGenerator.DefineLabel();
         ilGenerator
             .Do(pushDescriptor)
             .Castclass(typeof(ObjectTypeDescriptor))
             .Newobj(typeof(DynamicObject).GetConstructor(new[] { typeof(ObjectTypeDescriptor) }))
             .Stloc(resultLoc)
             .Do(pushCtx)
             .BrfalseS(labelNoCtx)
             .Do(pushCtx)
             .Ldloc(resultLoc)
             .Callvirt(() => default(ITypeBinaryDeserializerContext).AddBackRef(null))
             .Mark(labelNoCtx);
         var idx = 0;
         foreach (var pair in _fields)
         {
             var idxForCapture = idx;
             ilGenerator.Ldloc(resultLoc);
             ilGenerator.LdcI4(idx);
             pair.Value.GenerateLoadEx(ilGenerator, pushReader, pushCtx,
                 il =>
                     il.Do(pushDescriptor)
                         .LdcI4(idxForCapture)
                         .Callvirt(() => default(ITypeDescriptor).NestedType(0)), typeof(object), _typeSerializers.ConvertorGenerator);
             ilGenerator.Callvirt(() => default(DynamicObject).SetFieldByIdxFast(0, null));
             idx++;
         }
         ilGenerator
             .Ldloc(resultLoc)
             .Castclass(typeof(object));
     }
     else
     {
         var resultLoc = ilGenerator.DeclareLocal(targetType, "result");
         var labelNoCtx = ilGenerator.DefineLabel();
         ilGenerator
             .Newobj(targetType.GetConstructor(Type.EmptyTypes))
             .Stloc(resultLoc)
             .Do(pushCtx)
             .BrfalseS(labelNoCtx)
             .Do(pushCtx)
             .Ldloc(resultLoc)
             .Callvirt(() => default(ITypeBinaryDeserializerContext).AddBackRef(null))
             .Mark(labelNoCtx);
         var props = targetType.GetProperties();
         for (var idx = 0; idx < _fields.Count; idx++)
         {
             var idxForCapture = idx;
             var pair = _fields[idx];
             var prop = props.FirstOrDefault(p => GetPersitentName(p) == pair.Key);
             if (prop == null || !_typeSerializers.IsSafeToLoad(prop.PropertyType))
             {
                 pair.Value.GenerateSkipEx(ilGenerator, pushReader, pushCtx);
                 continue;
             }
             ilGenerator.Ldloc(resultLoc);
             pair.Value.GenerateLoadEx(ilGenerator, pushReader, pushCtx,
                                     il => il.Do(pushDescriptor).LdcI4(idxForCapture).Callvirt(() => default(ITypeDescriptor).NestedType(0)),
                                     prop.PropertyType, _typeSerializers.ConvertorGenerator);
             ilGenerator.Callvirt(prop.GetSetMethod());
         }
         ilGenerator.Ldloc(resultLoc);
     }
 }