Пример #1
0
        void IPartBuilder.GenerateFillPart(GenFillContext context)
        {
            var g = context.Generator;

            g.If(() =>
            {
                g.Load(context.NextIsNull);
                return(BinaryOperator.IsTrue);
            });
            {
                g.Load(context.Member, LoadOptions.ValueAsAddress);
                g.InitializeValue();
            }
            g.Else();
            {
                g.BeginAssign(context.Member);
                {
                    var value = g.DeclareLocal(_innerType);
                    context.InnerFill(_innerBuilder, g.CreateExpression(value));
                    g.BeginNewObject(_ctor);
                    {
                        g.Load(value);
                    }
                    g.EndNewObject();
                }
                g.EndAssign();
            }
            g.EndIf();
        }
Пример #2
0
        public void GenerateFillPart(GenFillContext context)
        {
            var g         = context.Generator;
            var primitive = g.CreateExpression(g.DeclareLocal(_targetType));

            context.InnerFill(_innerBuilder, primitive);

            GenerateConvert(g, _fromPrimitiveMethod, primitive, context.Member);
        }
Пример #3
0
        void IPartBuilder.GenerateFillPart(GenFillContext context)
        {
            var g = context.Generator;

            g.BeginAssign(context.Member);
            {
                g.Call(typeof(Guid).ResolveMethod("NewGuid"));
            }
            g.EndAssign();
        }
        public void GenerateFillPart(GenFillContext context)
        {
            var g = context.Generator;

            g.BeginAssign(context.Member);
            {
                g.BeginCall(_fillMethod);
                {
                    g.Load(context.FillArgs);
                }
                g.EndCall();
            }
            g.EndAssign();
        }
Пример #5
0
        public void GenerateFillPart(GenFillContext context)
        {
            var g = context.Generator;

            if (context.Member.IsReadOnly)
            {
                g.If(() =>
                {
                    g.Load(context.NextIsNull);
                    return(BinaryOperator.IsFalse);
                });
                {
                    GenerateFillCollection(context, context.Member);
                }
                g.EndIf();
            }
            else
            {
                g.If(() =>
                {
                    g.Load(context.NextIsNull);
                    return(BinaryOperator.IsTrue);
                });
                {
                    g.BeginAssign(context.Member);
                    {
                        g.LoadDefaultOf(_collectionType);
                    }
                    g.EndAssign();
                }
                g.Else();
                {
                    g.BeginAssign(context.Member);
                    g.BeginNewObject(_ctor);
                    {
                        if (_ctorType == CtorType.Capacity)
                        {
                            g.Load(1);
                        }
                    }
                    g.EndNewObject();
                    g.EndAssign();

                    GenerateFillCollection(context, context.Member);
                }
                g.EndIf();
            }
        }
Пример #6
0
        public void GenerateFillPart(GenFillContext context)
        {
            var g        = context.Generator;
            var property = typeof(FillArgs).ResolveProperty("Next" + _type.Name);

            if (property == null)
            {
                throw new MissingMemberException(typeof(FillArgs).Name, "Next" + _type.Name);
            }

            g.BeginAssign(context.Member);
            {
                g.Load(context.FillArgs);
                g.LoadProperty(property);
            }
            g.EndAssign();
        }
Пример #7
0
        public void GenerateFillPart(GenFillContext context)
        {
            if (_getRandomEnumValueMethod == null)
            {
                // todo - resolve method
                var methodDef = typeof(FillArgs).GetMethod("GetRandomEnumValue");
                _getRandomEnumValueMethod = methodDef.MakeGenericMethod(_type);
            }

            var g = context.Generator;

            g.BeginAssign(context.Member);
            {
                g.Load(context.FillArgs);
                g.Call(_getRandomEnumValueMethod);
            }
            g.EndAssign();
        }
        public void GenerateFillPart(GenFillContext context)
        {
            var g = context.Generator;

            var key   = g.CreateExpression(g.DeclareLocal(_keyType));
            var value = g.CreateExpression(g.DeclareLocal(_valueType));

            context.InnerFill(_keyBuilder, key);
            context.InnerFill(_valueBuilder, value);

            g.BeginAssign(context.Member);
            {
                g.BeginNewObject(_ctor);
                {
                    g.Load(key);
                    g.Load(value);
                }
                g.EndNewObject();
            }
            g.EndAssign();
        }
Пример #9
0
        void IPartBuilder.GenerateFillPart(GenFillContext context)
        {
            var g = context.Generator;

            g.If(() =>
            {
                g.Load(context.NextIsNull);
                return(BinaryOperator.IsTrue);
            });
            {
                g.BeginAssign(context.Member);
                {
                    g.LoadNull();
                }
                g.EndAssign();
            }
            g.Else();
            {
                var array   = g.DeclareLocal(context.Member.Type);
                var element = g.CreateExpression(g.DeclareLocal(_elementType));

                g.BeginAssign(array);
                g.BeginNewArray(_elementType);
                {
                    g.Load(context.NextCollectionSize);
                }
                g.EndNewArray();
                g.EndAssign();

                var i = g.DeclareLocal(typeof(int));
                g.BeginAssign(i);
                g.Load(0);
                g.EndAssign();

                g.While(() =>
                {
                    g.Load(i);
                    g.Load(array);
                    g.LoadMember("Length");
                    return(BinaryOperator.LessThan);
                }, () =>
                {
                    context.InnerFill(_elementBuilder, element);

                    g.Load(array);
                    g.BeginStoreElement();
                    {
                        g.Load(i);
                        g.Load(element);
                    }
                    g.EndStoreElement();

                    g.BeginAssign(i);
                    {
                        g.Load(i);
                        g.Increment();
                    }
                    g.EndAssign();
                });

                g.BeginAssign(context.Member);
                {
                    g.Load(array);
                }
                g.EndAssign();
            }
            g.EndIf();
        }
Пример #10
0
        public void GenerateFillPart(GenFillContext context)
        {
            var g = context.Generator;

            if (!context.Member.IsReadOnly)
            {
                context.Member.Initialize();
            }

            if (context.IsBaseType)
            {
                Debug.Assert(!_type.IsValueType, "Value types shouldn't be able to get here.");
                g.If(() =>
                {
                    g.Load(context.Member);
                    return(BinaryOperator.IsNull);
                });
                {
                    g.BeginNewObject(typeof(InvalidOperationException).GetConstructor(new[] { typeof(string) }));
                    {
                        g.Load("Base type not initialized before attempting to deserialize.");
                    }
                    g.EndNewObject();
                    g.Throw();
                }
                g.EndIf();
                g.BeginCall(_fillMethod);
                {
                    g.Load(context.Member, LoadOptions.Default);
                    g.Load(context.FillArgs);
                    g.Load((int)_flags);
                    g.Load(context.Part.FullName);
                }
                g.EndCall();
            }
            else
            {
                g.BeginScope();

                var member = context.Member.CanStore
                                        ? context.Member
                                        : g.DeclareLocal(context.Member.Type);

                member.Initialize();

                g.BeginCall(_fillMethodByRef);
                {
                    g.Load(member, LoadOptions.AnyAsAddress);
                    g.Load(context.FillArgs);
                    g.Load((int)_flags);
                    g.Load(context.Part.FullName);
                }
                g.EndCall();

                if (context.Member != member)
                {
                    g.BeginAssign(context.Member);
                    {
                        g.Load(member);
                    }
                    g.EndAssign();
                }

                g.EndScope();
            }
        }
Пример #11
0
        private void GenerateFillCollection(GenFillContext context, IVariable collection)
        {
            var g = context.Generator;

            var count   = g.DeclareLocal(typeof(int));
            var element = g.CreateExpression(g.DeclareLocal(_elementType));

            g.BeginAssign(count);
            g.Load(context.NextCollectionSize);
            g.EndAssign();

            g.While(() =>
            {
                g.Load(count);
                g.Load(0);
                return(BinaryOperator.GreaterThan);
            }, () =>
            {
                context.InnerFill(_innerBuilder, element);

                bool endIf = false;
                if (!_elementType.IsValueType)
                {
                    g.If(() =>
                    {
                        g.Load(element);
                        g.LoadNull();
                        return(BinaryOperator.AreNotEqual);
                    });
                    endIf = true;
                }
                else if (_elementType.IsGenericType && _elementType.GetGenericTypeDefinition() == typeof(KeyValuePair <,>))
                {
                    var keyType = _elementType.GetGenericArguments()[0];
                    if (!keyType.IsValueType)
                    {
                        g.If(() =>
                        {
                            g.Load(element, LoadOptions.ValueAsAddress);
                            g.LoadMember("Key");
                            g.LoadNull();
                            return(BinaryOperator.AreNotEqual);
                        });
                        endIf = true;
                    }
                }
                {
                    g.If(() =>
                    {
                        g.Load(collection);
                        g.BeginCall(_contains);
                        {
                            g.Load(element);
                        }
                        g.EndCall();
                        return(BinaryOperator.IsFalse);
                    });
                    {
                        g.Load(collection);
                        g.BeginCall(_add);
                        {
                            g.Load(element);
                        }
                        g.EndCall();
                    }
                    g.EndIf();
                }
                if (endIf)
                {
                    g.EndIf();
                }

                g.BeginAssign(count);
                {
                    g.Load(count);
                    g.Decrement();
                }
                g.EndAssign();
            });
        }
 public void GenerateFillPart(GenFillContext context)
 {
     context.GenerateSkippedWarning(true, "ICustomSerializable fields can't be filled");
 }
 public void GenerateFillPart(GenFillContext context)
 {
     context.GenerateSkippedWarning(true, "fields that use BinaryFormatter can't be filled");
 }
Пример #14
0
 public void GenerateFillPart(GenFillContext context)
 {
     context.GenerateSkippedWarning(false, "custom fields can't be filled");
 }