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); }
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); }
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); }
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); }
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(); } }
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); }
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); } }
public void Init(IILGen ilGenerator, Action<IILGen> pushReaderCtx) { ilGenerator.Newobj(typeof(DBIndirect<>).MakeGenericType(_type).GetConstructor(Type.EmptyTypes)); }
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); }
public void Init(IILGen ilGenerator, Action <IILGen> pushReaderCtx) { ilGenerator.Newobj(typeof(DBIndirect <>).MakeGenericType(_type).GetConstructor(Type.EmptyTypes)); }
public static IILGen Newobj(this IILGen il, Expression <Action> expression) { var constructorInfo = (expression.Body as NewExpression).Constructor; return(il.Newobj(constructorInfo)); }
public static IILGen Newobj <T>(this IILGen il, Expression <Func <T> > expression) { var constructorInfo = ((NewExpression)expression.Body).Constructor; return(il.Newobj(constructorInfo)); }
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); } }