Ejemplo n.º 1
0
        public void Pop(bool success)
        {
            Debug.Assert(_count > 0);

            if (!success)
            {
                // Check if we need to initialize the continuation.
                if (_continuationCount == 0)
                {
                    if (_count == 1)
                    {
                        // No need for a continuation since there is only one stack frame.
                        _continuationCount = 1;
                    }
                    else
                    {
                        AddCurrent();
                        _count--;
                        _continuationCount = _count;
                        _count--;
                        Current = _previous[_count - 1];
                    }

                    return;
                }

                if (_continuationCount == 1)
                {
                    // No need for a pop since there is only one stack frame.
                    Debug.Assert(_count == 1);
                    return;
                }

                // Update the list entry to the current value.
                _previous[_count - 1] = Current;

                Debug.Assert(_count > 0);
            }
            else
            {
                Debug.Assert(_continuationCount == 0);
            }

            if (_count > 1)
            {
                Current = _previous[--_count - 1];
            }

            SetConstructorArgumentState();
        }
Ejemplo n.º 2
0
        public void Push(BinaryTypeInfo typeInfo)
        {
            if (_continuationCount == 0)
            {
                if (_count == 0)
                {
                    // The first stack frame is held in Current.
                    Current.BinaryTypeInfo = typeInfo;
                    Current.TypeMap        = TypeMap;
                    _count = 1;
                }
                else
                {
                    BinaryClassInfo binaryClassInfo;
                    if (Current.BinaryClassInfo.ClassType == ClassType.Object)
                    {
                        if (Current.BinaryPropertyInfo != null)
                        {
                            binaryClassInfo = Current.PolymorphicBinaryClassInfo ?? Current.BinaryPropertyInfo.RuntimeClassInfo;
                        }
                        else
                        {
                            binaryClassInfo = Current.PolymorphicBinaryClassInfo ?? Current.CtorArgumentState !.BinaryParameterInfo !.RuntimeClassInfo;
                        }
                    }
                    else if (((ClassType.Value | ClassType.NewValue) & Current.BinaryClassInfo.ClassType) != 0)
                    {
                        // Although ClassType.Value doesn't push, a custom custom converter may re-enter serialization.
                        binaryClassInfo = Current.BinaryPropertyInfo !.RuntimeClassInfo;
                    }
                    else
                    {
                        Debug.Assert(((ClassType.Enumerable | ClassType.Dictionary) & Current.BinaryClassInfo.ClassType) != 0);
                        binaryClassInfo = Current.PolymorphicBinaryClassInfo ?? Current.BinaryClassInfo.ElementClassInfo !;
                    }

                    AddCurrent();
                    Current.Reset();

                    Current.BinaryClassInfo    = binaryClassInfo;
                    Current.BinaryPropertyInfo = binaryClassInfo.PropertyInfoForClassInfo;
                    Current.BinaryTypeInfo     = typeInfo;

                    Current.TypeMap = TypeMap;
                }
            }
            else if (_continuationCount == 1)
            {
                // No need for a push since there is only one stack frame.
                Debug.Assert(_count == 1);
                _continuationCount = 0;
            }
            else
            {
                // A continuation; adjust the index.
                Current = _previous[_count - 1];

                // Check if we are done.
                if (_count == _continuationCount)
                {
                    _continuationCount = 0;
                }
                else
                {
                    _count++;
                }
            }

            SetConstructorArgumentState();
        }