Exemple #1
0
        public void GenerateDeserializePart(GenDeserializeContext context)
        {
            var g          = context.Generator;
            var count      = g.DeclareLocal(typeof(int));
            var collection = context.Member.IsReadOnly
                                ? context.Member
                                : g.DeclareLocal(_collectionType);

            g.BeginAssign(count);
            {
                g.Load(context.Reader);
                g.Call(MemberResolver.GetReadMethod("ReadVarInt32", typeof(int)));
            }
            g.EndAssign();

            g.If(() =>
            {
                g.Load(count);
                g.Load(0);
                return(BinaryOperator.LessThan);
            });
            {
                if (context.Member.IsReadOnly)
                {
                    context.GenerateRaiseInvalidData(_collectionType);
                }
                else
                {
                    g.BeginAssign(collection);
                    {
                        g.LoadDefaultOf(_collectionType);
                    }
                    g.EndAssign();
                }
            }
            g.Else();
            {
                if (!context.Member.IsReadOnly)
                {
                    g.BeginAssign(collection);
                    g.BeginNewObject(_ctor);
                    {
                        if (_ctorType == CtorType.Capacity)
                        {
                            g.Load(count);
                        }
                    }
                    g.EndNewObject();
                    g.EndAssign();
                }

                g.While(() =>
                {
                    g.Load(count);
                    g.Load(0);
                    return(BinaryOperator.GreaterThan);
                },
                        () =>
                {
                    var element = g.DeclareLocal(_elementType);

                    g.BeginScope();
                    {
                        var innerContext = context.CreateChild(g.CreateExpression(element));
                        _innerBuilder.GenerateDeserializePart(innerContext);
                    }
                    g.EndScope();

                    g.Load(collection);
                    g.BeginCall(_add);
                    {
                        g.Load(element);
                    }
                    g.EndCall();

                    g.BeginAssign(count);
                    {
                        g.Load(count);
                        g.Decrement();
                    }
                    g.EndAssign();
                });
            }
            g.EndIf();

            if (!context.Member.IsReadOnly)
            {
                g.BeginAssign(context.Member);
                {
                    g.Load(collection);
                }
                g.EndAssign();
            }
        }