Exemplo n.º 1
0
        Action <AbstractBufferedWriter, ITypeBinarySerializerContext, object> NewComplexSaver(ITypeDescriptor descriptor)
        {
            var method = ILBuilder.Instance.NewMethod <Action <AbstractBufferedWriter, ITypeBinarySerializerContext, object> >(descriptor.Name + "ComplexSaver");
            var il     = method.Generator;

            descriptor.GenerateSave(il, ilgen => ilgen.Ldarg(0), ilgen => ilgen.Ldarg(1), ilgen =>
            {
                ilgen.Ldarg(2);
                var type = descriptor.GetPreferredType();
                if (type != typeof(object))
                {
                    ilgen.UnboxAny(type);
                }
            }, descriptor.GetPreferredType());
            il.Ret();
            return(method.Create());
        }
Exemplo n.º 2
0
        Action <AbstractBufferedWriter, object> NewSimpleSaver(ITypeDescriptor descriptor)
        {
            if (descriptor.AnyOpNeedsCtx())
            {
                return(null);
            }
            var method = ILBuilder.Instance.NewMethod <Action <AbstractBufferedWriter, object> >(descriptor.Name + "SimpleSaver");
            var il     = method.Generator;

            descriptor.GenerateSave(il, ilgen => ilgen.Ldarg(0), null, ilgen =>
            {
                ilgen.Ldarg(1);
                var type = descriptor.GetPreferredType();
                if (type != typeof(object))
                {
                    ilgen.UnboxAny(type);
                }
            }, descriptor.GetPreferredType());
            il.Ret();
            return(method.Create());
        }
Exemplo n.º 3
0
 void InitFromItemDescriptor(ITypeDescriptor descriptor)
 {
     if (descriptor == _itemDescriptor && _name != null)
     {
         return;
     }
     _itemDescriptor = descriptor;
     if ((descriptor.Name?.Length ?? 0) == 0)
     {
         return;
     }
     _itemType = _itemDescriptor.GetPreferredType();
     Sealed    = _itemDescriptor.Sealed;
     Name      = $"Nullable<{_itemDescriptor.Name}>";
 }
Exemplo n.º 4
0
 public static void GenerateLoadEx(this ITypeDescriptor descriptor, IILGen ilGenerator,
                                   Action <IILGen> pushReader, Action <IILGen> pushCtx, Action <IILGen> pushDescriptor, Type asType,
                                   ITypeConvertorGenerator convertorGenerator)
 {
     if (descriptor.StoredInline)
     {
         if (descriptor.LoadNeedsHelpWithConversion && asType != typeof(object))
         {
             var origType = descriptor.GetPreferredType();
             descriptor.GenerateLoad(ilGenerator, pushReader, pushCtx, pushDescriptor, origType);
             if (origType != asType)
             {
                 var conv = convertorGenerator.GenerateConversion(origType, asType);
                 if (conv == null)
                 {
                     throw new BTDBException("Don't know how to convert " + descriptor.Name + " from " +
                                             origType.ToSimpleName() + " to " + asType.ToSimpleName());
                 }
                 conv(ilGenerator);
             }
         }
         else
         {
             descriptor.GenerateLoad(ilGenerator, pushReader, pushCtx, pushDescriptor, asType);
         }
     }
     else
     {
         ilGenerator
         .Do(pushCtx)
         .Do(pushReader)
         .Callvirt(typeof(ITypeBinaryDeserializerContext).GetMethod(nameof(ITypeBinaryDeserializerContext.LoadObject)) !);
         if (asType != typeof(object))
         {
             ilGenerator.Call(typeof(TypeDescriptorExtensions).GetMethod(nameof(IntelligentCast)) !
                              .MakeGenericMethod(asType));
         }
     }
 }
Exemplo n.º 5
0
 public Type LoadAsType(ITypeDescriptor descriptor, Type targetType)
 {
     return(descriptor.GetPreferredType(targetType) ?? NameToType(descriptor.Name) ?? typeof(object));
 }
Exemplo n.º 6
0
 public Type LoadAsType(ITypeDescriptor descriptor)
 {
     return(descriptor.GetPreferredType() ?? TypeNameMapper.ToType(descriptor.Name !) ?? typeof(object));
 }