示例#1
0
文件: Empty.cs 项目: PlumpMath/CAM
        static EmptyArrayWithRoles()
        {
            var state   = new ArrayState <TValue>(null);
            var arrayIQ = new ArrayImmutableQueryImpl <TValue, TValueQuery, TValueImmutable>(state);

            ARRAY = new ArrayWithRolesImpl <TValue, TValueQuery, TValueImmutable>(new ArrayQueryOfMutablesImpl <TValue, TValueQuery, TValueImmutable>(arrayIQ, new ArrayQueryOfQueriesImpl <TValue, TValueQuery, TValueImmutable>(arrayIQ, state), state), state);
        }
示例#2
0
文件: Empty.cs 项目: PlumpMath/CAM
        static EmptyArrayProxy()
        {
            // Can not cache this to CollectionsFactoryImpl since it is not generic class.
            var state = new ArrayState <TValue>(null);

            ARRAY = new ArrayProxyImpl <TValue>(new ArrayProxyQueryImpl <TValue>(state), state);
        }
示例#3
0
                // From measurements it seems we spend very little time in this method
                public bool LessEqual(ArrayState a)
                {
                    Contract.Requires(this.PluginsCount == a.PluginsCount);

                    bool result;

                    if (AbstractDomainsHelper.TryTrivialLessEqual(this, a, out result))
                    {
                        return(result);
                    }

                    if (!this.Array.LessEqual(a.Array))
                    {
                        return(false);
                    }

                    if (!this.Numerical.LessEqual(a.Numerical))
                    {
                        return(false);
                    }

                    for (var i = 0; i < this.PluginsCount; i++)
                    {
                        if (!this.PluginAbstractStateAt(i).LessEqual(a.PluginAbstractStateAt(i)))
                        {
                            return(false);
                        }
                    }

                    return(true);
                }
示例#4
0
        public ArrayParser(ArrayState state)
        {
            _state = state;
            switch (state)
            {
            case ArrayState.ReadyForFirst:
                // NextChar(ValueParser.ValueStarts, c => ValueParser.ParserForValue(c).ReturningTo(new ArrayParser(ArrayState.JustReadValue).ReturningTo(Return)));
                NextCanBeValueReturningTo(() => new ArrayParser(ArrayState.JustReadValue).ReturningTo(Return));
                NextChar(StructuralChar.Whitespace, () => this);     // Ignore it
                NextChar(StructuralChar.ArrayEnd, () => new ArrayParser(ArrayState.Completed).ReturningTo(Return));
                break;

            case ArrayState.ReadyForNext:
                // NextChar(ValueParser.ValueStarts, c => ValueParser.ParserForValue(c).ReturningTo(new ArrayParser(ArrayState.JustReadValue).ReturningTo(Return)));
                NextCanBeValueReturningTo(() => new ArrayParser(ArrayState.JustReadValue).ReturningTo(Return));
                break;

            case ArrayState.JustReadValue:
                NextChar(StructuralChar.Whitespace, () => this);     // Ignore it
                NextChar(StructuralChar.Comma, () => new ArrayParser(ArrayState.ReadyForNext).ReturningTo(Return));
                NextChar(StructuralChar.ArrayEnd, () => new ArrayParser(ArrayState.Completed).ReturningTo(Return));
                break;

            case ArrayState.Completed:
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(state), state, null);
            }
        }
示例#5
0
                public ArrayState Meet(ArrayState a)
                {
                    Contract.Requires(this.PluginsCount == a.PluginsCount);

                    Contract.Ensures(Contract.Result <ArrayState>() != null);
                    Contract.Ensures(Contract.Result <ArrayState>().PluginsCount == this.PluginsCount);

                    ArrayState result;

                    if (AbstractDomainsHelper.TryTrivialMeet(this, a, out result))
                    {
                        return(result);
                    }

#if DEBUG
                    // F: for debugging
                    result = null;
#endif
                    var array     = this.Array.Meet(a.Array);
                    var numerical = this.Numerical.Meet(a.Numerical) as INumericalAbstractDomain <BoxedVariable <Variable>, BoxedExpression>;

                    var plugins = new IAbstractDomainForEnvironments <BoxedVariable <Variable>, BoxedExpression> [this.PluginsCount];

                    for (var i = 0; i < this.PluginsCount; i++)
                    {
                        plugins[i] = this.PluginAbstractStateAt(i).Meet(a.PluginAbstractStateAt(i)) as IAbstractDomainForEnvironments <BoxedVariable <Variable>, BoxedExpression>;
                    }

                    return(new ArrayState(array, numerical, plugins, this.mappings));
                }
示例#6
0
 private void MoveToInitial(XmlDictionaryReaderQuotas quotas, XmlBinaryReaderSession session, OnXmlDictionaryReaderClose onClose)
 {
     MoveToInitial(quotas);
     _maxBytesPerRead = quotas.MaxBytesPerRead;
     _arrayState = ArrayState.None;
     _isTextWithEndElement = false;
 }
                AssignInParallel(Dictionary <BoxedVariable <Variable>, FList <BoxedVariable <Variable> > > refinedMap,
                                 Converter <BoxedVariable <Variable>, BoxedExpression> convert, List <Pair <NormalizedExpression <BoxedVariable <Variable> >, NormalizedExpression <BoxedVariable <Variable> > > > equalities,
                                 ArrayState state)
                {
                    Contract.Assume(refinedMap != null);
                    Contract.Assume(convert != null);

                    var renamed = Select(state);

                    renamed.AssignInParallel(refinedMap, convert);

                    return(renamed);
                }
                public override ArrayState HelperForAssignInParallel(
                    ArrayState state,
                    Pair <APC, APC> edge, Dictionary <BoxedVariable <Variable>, FList <BoxedVariable <Variable> > > refinedMap,
                    Converter <BoxedVariable <Variable>, BoxedExpression> convert)
                {
                    Contract.Assume(state != null);

                    var mySubState = Select(state);

                    mySubState.AssignInParallel(refinedMap, convert);

                    return(state.UpdatePluginAt(this.Id, mySubState));
                }
                AssumeExistsAll(APC pc, ExistsIndexedExpression exists, ArrayState data)
                {
                    Contract.Requires(exists != null);
                    Contract.Requires(data != null);

                    // F: those are readonly-fields to which we cannot attach postcondition
                    Contract.Assume(exists.LowerBound != null);
                    Contract.Assume(exists.UpperBound != null);

                    var mySubState = Select(data);

                    // Shortcut for Exists(false => ...)
                    if (exists.LowerBound.Equals(exists.UpperBound))
                    {
                        return(mySubState.Bottom
                               as ArraySegmentationEnvironment <NonRelationalValueAbstraction <BoxedVariable <Variable>, BoxedExpression>, BoxedVariable <Variable>, BoxedExpression>);
                    }

                    NonRelationalValueAbstraction <BoxedVariable <Variable>, BoxedExpression> intv;
                    BoxedExpression array;

                    if (this.TryInferNonRelationalProperty(exists.BoundVariable, exists.Body, data.Numerical, out array, out intv))
                    {
                        var      arrayVar = ((Variable)array.UnderlyingVariable);
                        Variable arrayLen;
                        if ((array.UnderlyingVariable is Variable) &&
                            this.Context.ValueContext.TryGetArrayLength(this.Context.MethodContext.CFG.Post(pc), arrayVar, out arrayLen))
                        {
                            Contract.Assume(arrayLen != null); // Clousot does not know arrayLen is a struct here

                            ArraySegmentation <NonRelationalValueAbstraction <BoxedVariable <Variable>, BoxedExpression>, BoxedVariable <Variable>, BoxedExpression>
                            arraySegmentation;

                            if (this.TryCreateArraySegment(exists.LowerBound, exists.UpperBound, arrayLen, intv, data.Numerical, out arraySegmentation))
                            {
                                ArraySegmentation <NonRelationalValueAbstraction <BoxedVariable <Variable>, BoxedExpression>, BoxedVariable <Variable>, BoxedExpression> prevVal;
                                if (mySubState.TryGetValue(ToBoxedVariable(arrayVar), out prevVal))
                                {
                                    var meet = prevVal.Meet(arraySegmentation);
                                    mySubState.Update(ToBoxedVariable(arrayVar), meet);
                                }
                                else
                                {
                                    mySubState.AddElement(ToBoxedVariable(arrayVar), arraySegmentation);
                                }
                            }
                        }
                    }

                    return(mySubState);
                }
                public ArrayTracking Select(ArrayState state)
                {
                    Contract.Requires(state != null);
                    Contract.Requires(this.Id < state.PluginsCount);

                    Contract.Ensures(Contract.Result <ArrayTracking>() != null);

                    var untyped  = state.PluginAbstractStateAt(this.Id);
                    var selected = untyped as ArrayTracking;

                    Contract.Assume(selected != null);

                    return(selected);
                }
示例#11
0
                private ADictionary Select(ArrayState state)
                {
                    Contract.Requires(state != null);
                    Contract.Ensures(Contract.Result <ADictionary>() != null);

                    Contract.Assume(-1 <= this.Id, "assuming the global invariant");
                    Contract.Assume(this.Id < state.PluginsCount, "assuming the global invariant");

                    var result = state.PluginAbstractStateAt(this.Id) as ADictionary;

                    Contract.Assume(result != null, "Wrong type!!!");

                    return(result);
                }
                Select(ArrayState state)
                {
                    Contract.Requires(state != null);

                    Contract.Ensures(Contract.Result <ArraySegmentationEnvironment <TwoValuesLattice <BoxedVariable <Variable> >, BoxedVariable <Variable>, BoxedExpression> >() != null);

                    Contract.Assume(this.Id < state.PluginsCount, "Assuming the global invariant");

                    var untyped  = state.PluginAbstractStateAt(this.Id);
                    var selected = untyped as ArraySegmentationEnvironment <TwoValuesLattice <BoxedVariable <Variable> >, BoxedVariable <Variable>, BoxedExpression>;

                    Contract.Assume(selected != null);

                    return(selected);
                }
                public override IAbstractDomainForEnvironments <BoxedVariable <Variable>, BoxedExpression> AssignInParallel(
                    Dictionary <BoxedVariable <Variable>, FList <BoxedVariable <Variable> > > refinedMap,
                    Converter <BoxedVariable <Variable>, BoxedExpression> convert, List <Pair <NormalizedExpression <BoxedVariable <Variable> >, NormalizedExpression <BoxedVariable <Variable> > > > equalities,
                    ArrayState state)
                {
                    Contract.Assume(state != null);
                    Contract.Assume(refinedMap != null, "missing preconditions in base class");
                    Contract.Assume(convert != null, "missing preconditions in base class");

                    var mySubState = Select(state);

                    mySubState.AssignInParallel(refinedMap, convert);

                    return(mySubState);
                }
示例#14
0
                public override IAbstractDomainForEnvironments <BoxedVariable <Variable>, BoxedExpression> AssignInParallel(
                    Dictionary <BoxedVariable <Variable>, FList <BoxedVariable <Variable> > > refinedMap,
                    Converter <BoxedVariable <Variable>, BoxedExpression> convert, List <Pair <NormalizedExpression <BoxedVariable <Variable> >, NormalizedExpression <BoxedVariable <Variable> > > > equalities,
                    ArrayState state)
                {
                    Contract.Assume(state != null, "Problem with the extractor of CC");
                    Contract.Assume(refinedMap != null, "Problem with the extractor of CC");
                    Contract.Assume(convert != null, "Problem with the extractor of CC");

                    var renamed = Select(state);

                    renamed.AssignInParallel(refinedMap, convert);

                    return(renamed);
                }
                public override IAbstractDomainForEnvironments <BoxedVariable <Variable>, BoxedExpression> AssignInParallel(
                    Dictionary <BoxedVariable <Variable>, FList <BoxedVariable <Variable> > > refinedMap,
                    Converter <BoxedVariable <Variable>, BoxedExpression> convert,
                    List <Pair <NormalizedExpression <BoxedVariable <Variable> >, NormalizedExpression <BoxedVariable <Variable> > > > equalities,
                    ArrayState state)
                {
                    Contract.Requires(refinedMap != null);
                    Contract.Requires(convert != null);
                    Contract.Requires(equalities != null);
                    Contract.Requires(state != null);

                    Contract.Ensures(Contract.Result <IAbstractDomainForEnvironments <BoxedVariable <Variable>, BoxedExpression> >() != null);

                    return(default(IAbstractDomainForEnvironments <BoxedVariable <Variable>, BoxedExpression>));
                }
                Select(ArrayState state)
                {
                    Contract.Requires(state != null);
                    Contract.Requires(this.Id < state.PluginsCount);
                    Contract.Ensures(
                        Contract.Result <
                            ArraySegmentationEnvironment <
                                FlatAbstractDomainOfBoolsWithRenaming <BoxedVariable <Variable> >, BoxedVariable <Variable>, BoxedExpression> >() != null);

                    var subState = state.PluginAbstractStateAt(this.Id)
                                   as ArraySegmentationEnvironment <FlatAbstractDomainOfBoolsWithRenaming <BoxedVariable <Variable> >, BoxedVariable <Variable>, BoxedExpression>;

                    Contract.Assume(subState != null);

                    return(subState);
                }
                protected bool TryInferSegmentEquality(BoxedExpression index, BoxedExpression body,
                                                       ArrayState state,
                                                       out BoxedExpression leftArray, out BoxedExpression rightArray, out AbstractDomain meet)
                {
                    BinaryOperator bop;

                    BoxedExpression.ArrayIndexExpression <Type> left, right;
                    if (body.TryFindArrayExpBinOpArrayExp(index, out bop, out left, out right) && bop == BinaryOperator.Ceq)
                    {
                        // we know we have the expression "left == right"
                        leftArray  = left.Array;
                        rightArray = right.Array;
                    }

                    leftArray = rightArray = default(BoxedExpression);
                    meet      = default(AbstractDomain);
                    return(false);
                }
                private ArrayState AssumeCheckOfAnArrayElement(APC pc, Variable var, ArrayState data)
                {
                    Contract.Requires(data != null);
                    Contract.Ensures(Contract.Result <ArrayState>() != null);

                    Pair <BoxedVariable <Variable>, BoxedVariable <Variable> > refined;

                    if (data.CanRefineToArrayLoad(new BoxedVariable <Variable>(var), out refined))
                    {
                        var mySubState = Select(data);
                        ArraySegmentation <
                            FlatAbstractDomainOfBoolsWithRenaming <BoxedVariable <Variable> >, BoxedVariable <Variable>, BoxedExpression> segmentation;

                        Contract.Assume(refined.One != null);
                        Contract.Assume(refined.Two != null);

                        // Do we have a segmentation?
                        foreach (var arr in GetEquals(pc, refined.One, data))
                        {
                            if (mySubState.TryGetValue(arr, out segmentation))
                            {
                                // Is it unmodified?
                                if (data.IsUnmodifiedArrayElementFromEntry(arr, ToBoxedExpression(pc, refined.Two)))
                                {
                                    var norm = ToBoxedExpression(pc, refined.Two).ToNormalizedExpression <Variable>();
                                    if (norm != null && segmentation.TrySetAbstractValue(norm, CHECKED, data.Numerical, out segmentation))
                                    {
                                        mySubState.Update(arr, segmentation);
                                    }
                                    else
                                    {
                                        mySubState.RemoveElement(arr);
                                    }

                                    data = data.UpdatePluginAt(this.Id, mySubState);
                                }
                            }
                        }
                    }

                    return(data);
                }
示例#19
0
        private Token Step(int character, ArrayState newState, ArrayTokenType newArrayTokenType, bool create = false)
        {
            Token res = null;

            if (create)
            {
                res = new Token((int)_arrayTokenType, Text.ToString());
                Text.Clear();
            }

            if (character != IgnoreChar)
            {
                Text.Append((char)character);
            }

            CurrentState    = newState;
            _arrayTokenType = newArrayTokenType;

            return(res);
        }
示例#20
0
                public ArrayState Widening(ArrayState a)
                {
                    Contract.Requires(this.PluginsCount == a.PluginsCount);

                    Contract.Ensures(Contract.Result <ArrayState>() != null);
                    Contract.Ensures(Contract.Result <ArrayState>().PluginsCount == this.PluginsCount);

                    ArrayState result;

                    if (AbstractDomainsHelper.TryTrivialJoin(this, a, out result))
                    {
                        return(result);
                    }

#if DEBUG
                    // F: for debugging
                    result = null;
#endif
                    ArraySegmentationEnvironment <NonRelationalValueAbstraction <BoxedVariable <Variable>, BoxedExpression>, BoxedVariable <Variable>, BoxedExpression> array = null;
                    INumericalAbstractDomain <BoxedVariable <Variable>, BoxedExpression> numerical = null;

#if PARALLELWIDENING
                    var arrayTask     = Task.Run(() => array = this.Array.Widening(a.Array));
                    var numericalTask = Task.Run(() => numerical = this.Numerical.Widening(a.Numerical) as INumericalAbstractDomain <BoxedVariable <Variable>, BoxedExpression>);
#else
                    array     = this.Array.Widening(a.Array);
                    numerical = this.Numerical.Widening(a.Numerical) as INumericalAbstractDomain <BoxedVariable <Variable>, BoxedExpression>;
#endif

                    var plugins = new IAbstractDomainForEnvironments <BoxedVariable <Variable>, BoxedExpression> [this.PluginsCount];

                    for (var i = 0; i < this.PluginsCount; i++)
                    {
                        plugins[i] = this.PluginAbstractStateAt(i).Widening(a.PluginAbstractStateAt(i)) as IAbstractDomainForEnvironments <BoxedVariable <Variable>, BoxedExpression>;
                    }

#if PARALLELWIDENING
                    Task.WaitAll(arrayTask, numericalTask);
#endif
                    return(new ArrayState(array, numerical, plugins, this.mappings));
                }
                public override ArrayState Entry(APC pc, Method method, ArrayState data)
                {
                    Contract.Assume(data != null);
                    var resultState = data;

                    var arrayParamCount = 0;

                    // We materialize all the arrays in the parameters...
                    foreach (var param in this.DecoderForMetaData.Parameters(method).Enumerate())
                    {
                        Variable symb;
                        var      postPC = Context.MethodContext.CFG.Post(pc);
                        if (this.Context.ValueContext.TryParameterValue(postPC, param, out symb))
                        {
                            var paramType = this.DecoderForMetaData.ParameterType(param);
                            if (this.DecoderForMetaData.IsArray(paramType))
                            {
                                arrayParamCount++;
                                var dummy = MaterializeArray(postPC, Select(resultState), resultState.Numerical.CheckIfNonZero, symb, UNMODIFIED, UNMODIFIED);
                            }
                            else
                            {
                                foreach (var intf in this.DecoderForMetaData.Interfaces(paramType))
                                {
                                    if (this.DecoderForMetaData.Name(intf).AssumeNotNull().Contains("IEnumerable"))
                                    {
                                        var dummy = MaterializeEnumerable(postPC, Select(resultState), symb, UNMODIFIED);
                                    }
                                }
                            }
                        }
                    }

#if false && DEBUG
                    if (arrayParamCount > 0)
                    {
                        Console.WriteLine("Method contains {0} array params", arrayParamCount);
                    }
#endif
                    return(resultState);
                }
示例#22
0
        private void AppendValue(string s)
        {
            bool needSeparator = false;

            if (state_.Count > 0)
            {
                var        state      = state_.Peek();
                ArrayState arrayState = state as ArrayState;
                if (arrayState != null)
                {
                    needSeparator = arrayState.ElementsCount > 0;
                    arrayState.ElementsCount++;
                }
            }

            if (needSeparator)
            {
                builder_.Append(", ");
            }

            builder_.Append(s);
        }
                public override ArrayState Entry(APC pc, Method method, ArrayState data)
                {
                    Contract.Assume(data != null);

                    var mySubState = Select(data);

                    // We materialize all the arrays in the parameters...
                    foreach (var param in this.DecoderForMetaData.Parameters(method).Enumerate())
                    {
                        Variable symb;
                        var      postPC = Context.MethodContext.CFG.Post(pc);
                        if (
                            this.Context.ValueContext.TryParameterValue(postPC, param, out symb))
                        {
                            if (this.DecoderForMetaData.IsArray(DecoderForMetaData.ParameterType(param)))
                            {
                                var dummy = MaterializeArray(
                                    postPC, mySubState,
                                    data.Numerical.CheckIfNonZero, symb, UNCHECKED,
                                    new FlatAbstractDomainOfBoolsWithRenaming <BoxedVariable <Variable> >(FlatAbstractDomain <bool> .State.Bottom));
                            }
                            else
                            {
                                var paramType = this.DecoderForMetaData.ParameterType(param);
                                foreach (var intf in this.DecoderForMetaData.Interfaces(paramType))
                                {
                                    if (this.DecoderForMetaData.Name(intf).AssumeNotNull().Contains("IEnumerable"))
                                    {
                                        var dummy = MaterializeEnumerable(postPC, mySubState, symb, UNCHECKED);
                                    }
                                }
                            }
                        }
                    }

                    return(data.UpdatePluginAt(this.Id, mySubState));
                }
 public override ArrayState Entry(APC pc, Method method, ArrayState data)
 {
     return(MakeState(this.enumAnalysis.Entry(pc, method, Select(data)), data));
 }
 private void ReadArray()
 {
     if (this.GetNodeType() == XmlBinaryNodeType.Array)
     {
         XmlExceptionHelper.ThrowInvalidBinaryFormat(this);
     }
     this.ReadNode();
     if (base.Node.NodeType != XmlNodeType.Element)
     {
         XmlExceptionHelper.ThrowInvalidBinaryFormat(this);
     }
     if (this.GetNodeType() == XmlBinaryNodeType.Array)
     {
         XmlExceptionHelper.ThrowInvalidBinaryFormat(this);
     }
     this.ReadNode();
     if (base.Node.NodeType != XmlNodeType.EndElement)
     {
         XmlExceptionHelper.ThrowInvalidBinaryFormat(this);
     }
     this.arrayState = ArrayState.Element;
     this.arrayNodeType = this.GetNodeType();
     if (!this.IsValidArrayType(this.arrayNodeType))
     {
         XmlExceptionHelper.ThrowInvalidBinaryFormat(this);
     }
     this.SkipNodeType();
     this.arrayCount = this.ReadMultiByteUInt31();
     if (this.arrayCount == 0)
     {
         XmlExceptionHelper.ThrowInvalidBinaryFormat(this);
     }
     this.MoveToArrayElement();
 }
 private static bool hasState(int currState, ArrayState state)
 {
     return((currState & (int)state) > 0);
 }
 private void MoveToArrayElement()
 {
     this.arrayState = ArrayState.Element;
     base.MoveToNode(base.ElementNode);
 }
 public override bool Read()
 {
     if (base.Node.ReadState == System.Xml.ReadState.Closed)
     {
         return false;
     }
     base.SignNode();
     if (this.isTextWithEndElement)
     {
         this.isTextWithEndElement = false;
         base.MoveToEndElement();
         return true;
     }
     if (this.arrayState == ArrayState.Content)
     {
         if (this.arrayCount != 0)
         {
             this.MoveToArrayElement();
             return true;
         }
         this.arrayState = ArrayState.None;
     }
     if (base.Node.ExitScope)
     {
         base.ExitScope();
     }
     return this.ReadNode();
 }
示例#29
0
        private bool ReadNode()
        {
            if (!_buffered)
                BufferReader.SetWindow(ElementNode.BufferOffset, _maxBytesPerRead);

            if (BufferReader.EndOfFile)
            {
                MoveToEndOfFile();
                return false;
            }

            XmlBinaryNodeType nodeType;
            if (_arrayState == ArrayState.None)
            {
                nodeType = GetNodeType();
                SkipNodeType();
            }
            else
            {
                DiagnosticUtility.DebugAssert(_arrayState == ArrayState.Element, "");
                nodeType = _arrayNodeType;
                _arrayCount--;
                _arrayState = ArrayState.Content;
            }

            XmlElementNode elementNode;
            PrefixHandleType prefix;
            switch (nodeType)
            {
                case XmlBinaryNodeType.ShortElement:
                    elementNode = EnterScope();
                    elementNode.Prefix.SetValue(PrefixHandleType.Empty);
                    ReadName(elementNode.LocalName);
                    ReadAttributes();
                    elementNode.Namespace = LookupNamespace(PrefixHandleType.Empty);
                    elementNode.BufferOffset = BufferReader.Offset;
                    return true;
                case XmlBinaryNodeType.Element:
                    elementNode = EnterScope();
                    ReadName(elementNode.Prefix);
                    ReadName(elementNode.LocalName);
                    ReadAttributes();
                    elementNode.Namespace = LookupNamespace(elementNode.Prefix);
                    elementNode.BufferOffset = BufferReader.Offset;
                    return true;
                case XmlBinaryNodeType.ShortDictionaryElement:
                    elementNode = EnterScope();
                    elementNode.Prefix.SetValue(PrefixHandleType.Empty);
                    ReadDictionaryName(elementNode.LocalName);
                    ReadAttributes();
                    elementNode.Namespace = LookupNamespace(PrefixHandleType.Empty);
                    elementNode.BufferOffset = BufferReader.Offset;
                    return true;
                case XmlBinaryNodeType.DictionaryElement:
                    elementNode = EnterScope();
                    ReadName(elementNode.Prefix);
                    ReadDictionaryName(elementNode.LocalName);
                    ReadAttributes();
                    elementNode.Namespace = LookupNamespace(elementNode.Prefix);
                    elementNode.BufferOffset = BufferReader.Offset;
                    return true;
                case XmlBinaryNodeType.PrefixElementA:
                case XmlBinaryNodeType.PrefixElementB:
                case XmlBinaryNodeType.PrefixElementC:
                case XmlBinaryNodeType.PrefixElementD:
                case XmlBinaryNodeType.PrefixElementE:
                case XmlBinaryNodeType.PrefixElementF:
                case XmlBinaryNodeType.PrefixElementG:
                case XmlBinaryNodeType.PrefixElementH:
                case XmlBinaryNodeType.PrefixElementI:
                case XmlBinaryNodeType.PrefixElementJ:
                case XmlBinaryNodeType.PrefixElementK:
                case XmlBinaryNodeType.PrefixElementL:
                case XmlBinaryNodeType.PrefixElementM:
                case XmlBinaryNodeType.PrefixElementN:
                case XmlBinaryNodeType.PrefixElementO:
                case XmlBinaryNodeType.PrefixElementP:
                case XmlBinaryNodeType.PrefixElementQ:
                case XmlBinaryNodeType.PrefixElementR:
                case XmlBinaryNodeType.PrefixElementS:
                case XmlBinaryNodeType.PrefixElementT:
                case XmlBinaryNodeType.PrefixElementU:
                case XmlBinaryNodeType.PrefixElementV:
                case XmlBinaryNodeType.PrefixElementW:
                case XmlBinaryNodeType.PrefixElementX:
                case XmlBinaryNodeType.PrefixElementY:
                case XmlBinaryNodeType.PrefixElementZ:
                    elementNode = EnterScope();
                    prefix = PrefixHandle.GetAlphaPrefix((int)nodeType - (int)XmlBinaryNodeType.PrefixElementA);
                    elementNode.Prefix.SetValue(prefix);
                    ReadName(elementNode.LocalName);
                    ReadAttributes();
                    elementNode.Namespace = LookupNamespace(prefix);
                    elementNode.BufferOffset = BufferReader.Offset;
                    return true;
                case XmlBinaryNodeType.PrefixDictionaryElementA:
                case XmlBinaryNodeType.PrefixDictionaryElementB:
                case XmlBinaryNodeType.PrefixDictionaryElementC:
                case XmlBinaryNodeType.PrefixDictionaryElementD:
                case XmlBinaryNodeType.PrefixDictionaryElementE:
                case XmlBinaryNodeType.PrefixDictionaryElementF:
                case XmlBinaryNodeType.PrefixDictionaryElementG:
                case XmlBinaryNodeType.PrefixDictionaryElementH:
                case XmlBinaryNodeType.PrefixDictionaryElementI:
                case XmlBinaryNodeType.PrefixDictionaryElementJ:
                case XmlBinaryNodeType.PrefixDictionaryElementK:
                case XmlBinaryNodeType.PrefixDictionaryElementL:
                case XmlBinaryNodeType.PrefixDictionaryElementM:
                case XmlBinaryNodeType.PrefixDictionaryElementN:
                case XmlBinaryNodeType.PrefixDictionaryElementO:
                case XmlBinaryNodeType.PrefixDictionaryElementP:
                case XmlBinaryNodeType.PrefixDictionaryElementQ:
                case XmlBinaryNodeType.PrefixDictionaryElementR:
                case XmlBinaryNodeType.PrefixDictionaryElementS:
                case XmlBinaryNodeType.PrefixDictionaryElementT:
                case XmlBinaryNodeType.PrefixDictionaryElementU:
                case XmlBinaryNodeType.PrefixDictionaryElementV:
                case XmlBinaryNodeType.PrefixDictionaryElementW:
                case XmlBinaryNodeType.PrefixDictionaryElementX:
                case XmlBinaryNodeType.PrefixDictionaryElementY:
                case XmlBinaryNodeType.PrefixDictionaryElementZ:
                    elementNode = EnterScope();
                    prefix = PrefixHandle.GetAlphaPrefix((int)nodeType - (int)XmlBinaryNodeType.PrefixDictionaryElementA);
                    elementNode.Prefix.SetValue(prefix);
                    ReadDictionaryName(elementNode.LocalName);
                    ReadAttributes();
                    elementNode.Namespace = LookupNamespace(prefix);
                    elementNode.BufferOffset = BufferReader.Offset;
                    return true;
                case XmlBinaryNodeType.EndElement:
                    MoveToEndElement();
                    return true;
                case XmlBinaryNodeType.Comment:
                    ReadName(MoveToComment().Value);
                    return true;
                case XmlBinaryNodeType.EmptyTextWithEndElement:
                    MoveToAtomicTextWithEndElement().Value.SetValue(ValueHandleType.Empty);
                    if (this.OutsideRootElement)
                        VerifyWhitespace();
                    return true;
                case XmlBinaryNodeType.ZeroTextWithEndElement:
                    MoveToAtomicTextWithEndElement().Value.SetValue(ValueHandleType.Zero);
                    if (this.OutsideRootElement)
                        VerifyWhitespace();
                    return true;
                case XmlBinaryNodeType.OneTextWithEndElement:
                    MoveToAtomicTextWithEndElement().Value.SetValue(ValueHandleType.One);
                    if (this.OutsideRootElement)
                        VerifyWhitespace();
                    return true;
                case XmlBinaryNodeType.TrueTextWithEndElement:
                    MoveToAtomicTextWithEndElement().Value.SetValue(ValueHandleType.True);
                    if (this.OutsideRootElement)
                        VerifyWhitespace();
                    return true;
                case XmlBinaryNodeType.FalseTextWithEndElement:
                    MoveToAtomicTextWithEndElement().Value.SetValue(ValueHandleType.False);
                    if (this.OutsideRootElement)
                        VerifyWhitespace();
                    return true;
                case XmlBinaryNodeType.BoolTextWithEndElement:
                    MoveToAtomicTextWithEndElement().Value.SetValue(ReadUInt8() != 0 ? ValueHandleType.True : ValueHandleType.False);
                    if (this.OutsideRootElement)
                        VerifyWhitespace();
                    return true;
                case XmlBinaryNodeType.Chars8TextWithEndElement:
                    if (_buffered)
                        ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.UTF8, ReadUInt8());
                    else
                        ReadPartialUTF8Text(true, ReadUInt8());
                    return true;
                case XmlBinaryNodeType.Chars8Text:
                    if (_buffered)
                        ReadText(MoveToComplexText(), ValueHandleType.UTF8, ReadUInt8());
                    else
                        ReadPartialUTF8Text(false, ReadUInt8());
                    return true;
                case XmlBinaryNodeType.Chars16TextWithEndElement:
                    if (_buffered)
                        ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.UTF8, ReadUInt16());
                    else
                        ReadPartialUTF8Text(true, ReadUInt16());
                    return true;
                case XmlBinaryNodeType.Chars16Text:
                    if (_buffered)
                        ReadText(MoveToComplexText(), ValueHandleType.UTF8, ReadUInt16());
                    else
                        ReadPartialUTF8Text(false, ReadUInt16());
                    return true;
                case XmlBinaryNodeType.Chars32TextWithEndElement:
                    if (_buffered)
                        ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.UTF8, ReadUInt31());
                    else
                        ReadPartialUTF8Text(true, ReadUInt31());
                    return true;
                case XmlBinaryNodeType.Chars32Text:
                    if (_buffered)
                        ReadText(MoveToComplexText(), ValueHandleType.UTF8, ReadUInt31());
                    else
                        ReadPartialUTF8Text(false, ReadUInt31());
                    return true;
                case XmlBinaryNodeType.UnicodeChars8TextWithEndElement:
                    ReadUnicodeText(true, ReadUInt8());
                    return true;
                case XmlBinaryNodeType.UnicodeChars8Text:
                    ReadUnicodeText(false, ReadUInt8());
                    return true;
                case XmlBinaryNodeType.UnicodeChars16TextWithEndElement:
                    ReadUnicodeText(true, ReadUInt16());
                    return true;
                case XmlBinaryNodeType.UnicodeChars16Text:
                    ReadUnicodeText(false, ReadUInt16());
                    return true;
                case XmlBinaryNodeType.UnicodeChars32TextWithEndElement:
                    ReadUnicodeText(true, ReadUInt31());
                    return true;
                case XmlBinaryNodeType.UnicodeChars32Text:
                    ReadUnicodeText(false, ReadUInt31());
                    return true;
                case XmlBinaryNodeType.Bytes8TextWithEndElement:
                    if (_buffered)
                        ReadBinaryText(MoveToAtomicTextWithEndElement(), ReadUInt8());
                    else
                        ReadPartialBinaryText(true, ReadUInt8());
                    return true;
                case XmlBinaryNodeType.Bytes8Text:
                    if (_buffered)
                        ReadBinaryText(MoveToComplexText(), ReadUInt8());
                    else
                        ReadPartialBinaryText(false, ReadUInt8());
                    return true;
                case XmlBinaryNodeType.Bytes16TextWithEndElement:
                    if (_buffered)
                        ReadBinaryText(MoveToAtomicTextWithEndElement(), ReadUInt16());
                    else
                        ReadPartialBinaryText(true, ReadUInt16());
                    return true;
                case XmlBinaryNodeType.Bytes16Text:
                    if (_buffered)
                        ReadBinaryText(MoveToComplexText(), ReadUInt16());
                    else
                        ReadPartialBinaryText(false, ReadUInt16());
                    return true;
                case XmlBinaryNodeType.Bytes32TextWithEndElement:
                    if (_buffered)
                        ReadBinaryText(MoveToAtomicTextWithEndElement(), ReadUInt31());
                    else
                        ReadPartialBinaryText(true, ReadUInt31());
                    return true;
                case XmlBinaryNodeType.Bytes32Text:
                    if (_buffered)
                        ReadBinaryText(MoveToComplexText(), ReadUInt31());
                    else
                        ReadPartialBinaryText(false, ReadUInt31());
                    return true;
                case XmlBinaryNodeType.DictionaryTextWithEndElement:
                    MoveToAtomicTextWithEndElement().Value.SetDictionaryValue(ReadDictionaryKey());
                    return true;
                case XmlBinaryNodeType.UniqueIdTextWithEndElement:
                    ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.UniqueId, ValueHandleLength.UniqueId);
                    return true;
                case XmlBinaryNodeType.GuidTextWithEndElement:
                    ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.Guid, ValueHandleLength.Guid);
                    return true;
                case XmlBinaryNodeType.DecimalTextWithEndElement:
                    ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.Decimal, ValueHandleLength.Decimal);
                    return true;
                case XmlBinaryNodeType.Int8TextWithEndElement:
                    ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.Int8, ValueHandleLength.Int8);
                    return true;
                case XmlBinaryNodeType.Int16TextWithEndElement:
                    ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.Int16, ValueHandleLength.Int16);
                    return true;
                case XmlBinaryNodeType.Int32TextWithEndElement:
                    ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.Int32, ValueHandleLength.Int32);
                    return true;
                case XmlBinaryNodeType.Int64TextWithEndElement:
                    ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.Int64, ValueHandleLength.Int64);
                    return true;
                case XmlBinaryNodeType.UInt64TextWithEndElement:
                    ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.UInt64, ValueHandleLength.UInt64);
                    return true;
                case XmlBinaryNodeType.FloatTextWithEndElement:
                    ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.Single, ValueHandleLength.Single);
                    return true;
                case XmlBinaryNodeType.DoubleTextWithEndElement:
                    ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.Double, ValueHandleLength.Double);
                    return true;
                case XmlBinaryNodeType.TimeSpanTextWithEndElement:
                    ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.TimeSpan, ValueHandleLength.TimeSpan);
                    return true;
                case XmlBinaryNodeType.DateTimeTextWithEndElement:
                    ReadText(MoveToAtomicTextWithEndElement(), ValueHandleType.DateTime, ValueHandleLength.DateTime);
                    return true;
                case XmlBinaryNodeType.QNameDictionaryTextWithEndElement:
                    BufferReader.ReadQName(MoveToAtomicTextWithEndElement().Value);
                    return true;
                case XmlBinaryNodeType.Array:
                    ReadArray();
                    return true;
                default:
                    BufferReader.ReadValue(nodeType, MoveToComplexText().Value);
                    return true;
            }
        }
 public override ArrayState Stfld(APC pc, Field field, bool @volatile, Variable obj, Variable value, ArrayState data)
 {
     return(MakeState(this.enumAnalysis.Stfld(pc, field, @volatile, obj, value, Select(data)), data));
 }
示例#31
0
 private void SkipArrayElements(int count)
 {
     _arrayCount -= count;
     if (_arrayCount == 0)
     {
         _arrayState = ArrayState.None;
         ExitScope();
         ReadNode();
     }
 }
示例#32
0
 private void ReadArray()
 {
     if (GetNodeType() == XmlBinaryNodeType.Array) // Prevent recursion
         XmlExceptionHelper.ThrowInvalidBinaryFormat(this);
     ReadNode(); // ReadStartElement
     if (this.Node.NodeType != XmlNodeType.Element)
         XmlExceptionHelper.ThrowInvalidBinaryFormat(this);
     if (GetNodeType() == XmlBinaryNodeType.Array) // Prevent recursion
         XmlExceptionHelper.ThrowInvalidBinaryFormat(this);
     ReadNode(); // ReadEndElement
     if (this.Node.NodeType != XmlNodeType.EndElement)
         XmlExceptionHelper.ThrowInvalidBinaryFormat(this);
     _arrayState = ArrayState.Element;
     _arrayNodeType = GetNodeType();
     if (!IsValidArrayType(_arrayNodeType))
         XmlExceptionHelper.ThrowInvalidBinaryFormat(this);
     SkipNodeType();
     _arrayCount = ReadMultiByteUInt31();
     if (_arrayCount == 0)
         XmlExceptionHelper.ThrowInvalidBinaryFormat(this);
     MoveToArrayElement();
 }
 public ArrayState MakeState(EnumDefined <BoxedVariable <Variable>, Type, BoxedExpression> newSubState, ArrayState oldState)
 {
     return(oldState.UpdatePluginAt(this.Id, newSubState));
 }
                public EnumDefined <BoxedVariable <Variable>, Type, BoxedExpression> Select(ArrayState state)
                {
                    Contract.Requires(state != null);
                    Contract.Requires(this.Id < state.PluginsCount);

                    Contract.Ensures(Contract.Result <EnumDefined <BoxedVariable <Variable>, Type, BoxedExpression> >() != null);

                    var untyped  = state.PluginAbstractStateAt(this.Id);
                    var selected = untyped as EnumDefined <BoxedVariable <Variable>, Type, BoxedExpression>;

                    Contract.Assume(selected != null);

                    return(selected);
                }
 public override ArrayState Ldfld(APC pc, Field field, bool @volatile, Variable dest, Variable obj, ArrayState data)
 {
     return(MakeState(this.enumAnalysis.Ldfld(pc, field, @volatile, dest, obj, Select(data)), data));
 }
示例#36
0
 private void MoveToArrayElement()
 {
     _arrayState = ArrayState.Element;
     MoveToNode(ElementNode);
 }
                public override ArrayState Assume(APC pc, string tag, Variable source, object provenance, ArrayState data)
                {
                    var newData     = data;
                    var newSubState = this.enumAnalysis.Assume(pc, tag, source, provenance, Select(data));

                    // At this point, we may know more on enums, so let's push them to the numerical domain

                    if (newSubState.IsNormal())
                    {
                        var mdDecoder       = this.DecoderForMetaData;
                        var numericalDomain = data.Numerical;
                        foreach (var pair in newSubState.DefinedVariables)
                        {
                            List <int> typeValues;
                            // TODO: We may be smarted, and avoid recomputing the enum values if we already saw the type
                            var type = pair.One;
                            if (mdDecoder.IsEnumWithoutFlagAttribute(type) && mdDecoder.TryGetEnumValues(type, out typeValues))
                            {
                                // Assume the variable is in the enum
                                numericalDomain.AssumeInDisInterval(pair.Two, DisInterval.For(typeValues));
                            }
                        }

                        newData = newData.UpdateNumerical(numericalDomain);
                    }

                    return(MakeState(newSubState, newData));
                }
示例#38
0
 public override bool Read()
 {
     if (this.Node.ReadState == ReadState.Closed)
         return false;
     if (_isTextWithEndElement)
     {
         _isTextWithEndElement = false;
         MoveToEndElement();
         return true;
     }
     if (_arrayState == ArrayState.Content)
     {
         if (_arrayCount != 0)
         {
             MoveToArrayElement();
             return true;
         }
         _arrayState = ArrayState.None;
     }
     if (this.Node.ExitScope)
     {
         ExitScope();
     }
     return ReadNode();
 }
        private bool ReadNode()
        {
            XmlBinaryNodeType nodeType;
            XmlBaseReader.XmlElementNode node;
            PrefixHandleType alphaPrefix;
            if (!this.buffered)
            {
                base.BufferReader.SetWindow(base.ElementNode.BufferOffset, this.maxBytesPerRead);
            }
            if (base.BufferReader.EndOfFile)
            {
                base.MoveToEndOfFile();
                return false;
            }
            if (this.arrayState == ArrayState.None)
            {
                nodeType = this.GetNodeType();
                this.SkipNodeType();
            }
            else
            {
                nodeType = this.arrayNodeType;
                this.arrayCount--;
                this.arrayState = ArrayState.Content;
            }
            switch (nodeType)
            {
                case XmlBinaryNodeType.EndElement:
                    base.MoveToEndElement();
                    return true;

                case XmlBinaryNodeType.Comment:
                    this.ReadName(base.MoveToComment().Value);
                    return true;

                case XmlBinaryNodeType.Array:
                    this.ReadArray();
                    return true;

                case XmlBinaryNodeType.MinElement:
                    node = base.EnterScope();
                    node.Prefix.SetValue(PrefixHandleType.Empty);
                    this.ReadName(node.LocalName);
                    this.ReadAttributes();
                    node.Namespace = base.LookupNamespace(PrefixHandleType.Empty);
                    node.BufferOffset = base.BufferReader.Offset;
                    return true;

                case XmlBinaryNodeType.Element:
                    node = base.EnterScope();
                    this.ReadName(node.Prefix);
                    this.ReadName(node.LocalName);
                    this.ReadAttributes();
                    node.Namespace = base.LookupNamespace(node.Prefix);
                    node.BufferOffset = base.BufferReader.Offset;
                    return true;

                case XmlBinaryNodeType.ShortDictionaryElement:
                    node = base.EnterScope();
                    node.Prefix.SetValue(PrefixHandleType.Empty);
                    this.ReadDictionaryName(node.LocalName);
                    this.ReadAttributes();
                    node.Namespace = base.LookupNamespace(PrefixHandleType.Empty);
                    node.BufferOffset = base.BufferReader.Offset;
                    return true;

                case XmlBinaryNodeType.DictionaryElement:
                    node = base.EnterScope();
                    this.ReadName(node.Prefix);
                    this.ReadDictionaryName(node.LocalName);
                    this.ReadAttributes();
                    node.Namespace = base.LookupNamespace(node.Prefix);
                    node.BufferOffset = base.BufferReader.Offset;
                    return true;

                case XmlBinaryNodeType.PrefixDictionaryElementA:
                case XmlBinaryNodeType.PrefixDictionaryElementB:
                case XmlBinaryNodeType.PrefixDictionaryElementC:
                case XmlBinaryNodeType.PrefixDictionaryElementD:
                case XmlBinaryNodeType.PrefixDictionaryElementE:
                case XmlBinaryNodeType.PrefixDictionaryElementF:
                case XmlBinaryNodeType.PrefixDictionaryElementG:
                case XmlBinaryNodeType.PrefixDictionaryElementH:
                case XmlBinaryNodeType.PrefixDictionaryElementI:
                case XmlBinaryNodeType.PrefixDictionaryElementJ:
                case XmlBinaryNodeType.PrefixDictionaryElementK:
                case XmlBinaryNodeType.PrefixDictionaryElementL:
                case XmlBinaryNodeType.PrefixDictionaryElementM:
                case XmlBinaryNodeType.PrefixDictionaryElementN:
                case XmlBinaryNodeType.PrefixDictionaryElementO:
                case XmlBinaryNodeType.PrefixDictionaryElementP:
                case XmlBinaryNodeType.PrefixDictionaryElementQ:
                case XmlBinaryNodeType.PrefixDictionaryElementR:
                case XmlBinaryNodeType.PrefixDictionaryElementS:
                case XmlBinaryNodeType.PrefixDictionaryElementT:
                case XmlBinaryNodeType.PrefixDictionaryElementU:
                case XmlBinaryNodeType.PrefixDictionaryElementV:
                case XmlBinaryNodeType.PrefixDictionaryElementW:
                case XmlBinaryNodeType.PrefixDictionaryElementX:
                case XmlBinaryNodeType.PrefixDictionaryElementY:
                case XmlBinaryNodeType.PrefixDictionaryElementZ:
                    node = base.EnterScope();
                    alphaPrefix = PrefixHandle.GetAlphaPrefix(((int) nodeType) - 0x44);
                    node.Prefix.SetValue(alphaPrefix);
                    this.ReadDictionaryName(node.LocalName);
                    this.ReadAttributes();
                    node.Namespace = base.LookupNamespace(alphaPrefix);
                    node.BufferOffset = base.BufferReader.Offset;
                    return true;

                case XmlBinaryNodeType.PrefixElementA:
                case XmlBinaryNodeType.PrefixElementB:
                case XmlBinaryNodeType.PrefixElementC:
                case XmlBinaryNodeType.PrefixElementD:
                case XmlBinaryNodeType.PrefixElementE:
                case XmlBinaryNodeType.PrefixElementF:
                case XmlBinaryNodeType.PrefixElementG:
                case XmlBinaryNodeType.PrefixElementH:
                case XmlBinaryNodeType.PrefixElementI:
                case XmlBinaryNodeType.PrefixElementJ:
                case XmlBinaryNodeType.PrefixElementK:
                case XmlBinaryNodeType.PrefixElementL:
                case XmlBinaryNodeType.PrefixElementM:
                case XmlBinaryNodeType.PrefixElementN:
                case XmlBinaryNodeType.PrefixElementO:
                case XmlBinaryNodeType.PrefixElementP:
                case XmlBinaryNodeType.PrefixElementQ:
                case XmlBinaryNodeType.PrefixElementR:
                case XmlBinaryNodeType.PrefixElementS:
                case XmlBinaryNodeType.PrefixElementT:
                case XmlBinaryNodeType.PrefixElementU:
                case XmlBinaryNodeType.PrefixElementV:
                case XmlBinaryNodeType.PrefixElementW:
                case XmlBinaryNodeType.PrefixElementX:
                case XmlBinaryNodeType.PrefixElementY:
                case XmlBinaryNodeType.PrefixElementZ:
                    node = base.EnterScope();
                    alphaPrefix = PrefixHandle.GetAlphaPrefix(((int) nodeType) - 0x5e);
                    node.Prefix.SetValue(alphaPrefix);
                    this.ReadName(node.LocalName);
                    this.ReadAttributes();
                    node.Namespace = base.LookupNamespace(alphaPrefix);
                    node.BufferOffset = base.BufferReader.Offset;
                    return true;

                case XmlBinaryNodeType.ZeroTextWithEndElement:
                    this.MoveToAtomicTextWithEndElement().Value.SetValue(ValueHandleType.Zero);
                    if (base.OutsideRootElement)
                    {
                        this.VerifyWhitespace();
                    }
                    return true;

                case XmlBinaryNodeType.OneTextWithEndElement:
                    this.MoveToAtomicTextWithEndElement().Value.SetValue(ValueHandleType.One);
                    if (base.OutsideRootElement)
                    {
                        this.VerifyWhitespace();
                    }
                    return true;

                case XmlBinaryNodeType.FalseTextWithEndElement:
                    this.MoveToAtomicTextWithEndElement().Value.SetValue(ValueHandleType.False);
                    if (base.OutsideRootElement)
                    {
                        this.VerifyWhitespace();
                    }
                    return true;

                case XmlBinaryNodeType.TrueTextWithEndElement:
                    this.MoveToAtomicTextWithEndElement().Value.SetValue(ValueHandleType.True);
                    if (base.OutsideRootElement)
                    {
                        this.VerifyWhitespace();
                    }
                    return true;

                case XmlBinaryNodeType.Int8TextWithEndElement:
                    this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.Int8, 1);
                    return true;

                case XmlBinaryNodeType.Int16TextWithEndElement:
                    this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.Int16, 2);
                    return true;

                case XmlBinaryNodeType.Int32TextWithEndElement:
                    this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.Int32, 4);
                    return true;

                case XmlBinaryNodeType.Int64TextWithEndElement:
                    this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.Int64, 8);
                    return true;

                case XmlBinaryNodeType.FloatTextWithEndElement:
                    this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.Single, 4);
                    return true;

                case XmlBinaryNodeType.DoubleTextWithEndElement:
                    this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.Double, 8);
                    return true;

                case XmlBinaryNodeType.DecimalTextWithEndElement:
                    this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.Decimal, 0x10);
                    return true;

                case XmlBinaryNodeType.DateTimeTextWithEndElement:
                    this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.DateTime, 8);
                    return true;

                case XmlBinaryNodeType.Chars8Text:
                    if (!this.buffered)
                    {
                        this.ReadPartialUTF8Text(false, this.ReadUInt8());
                    }
                    else
                    {
                        this.ReadText(base.MoveToComplexText(), ValueHandleType.UTF8, this.ReadUInt8());
                    }
                    return true;

                case XmlBinaryNodeType.Chars8TextWithEndElement:
                    if (!this.buffered)
                    {
                        this.ReadPartialUTF8Text(true, this.ReadUInt8());
                        break;
                    }
                    this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.UTF8, this.ReadUInt8());
                    break;

                case XmlBinaryNodeType.Chars16Text:
                    if (!this.buffered)
                    {
                        this.ReadPartialUTF8Text(false, this.ReadUInt16());
                    }
                    else
                    {
                        this.ReadText(base.MoveToComplexText(), ValueHandleType.UTF8, this.ReadUInt16());
                    }
                    return true;

                case XmlBinaryNodeType.Chars16TextWithEndElement:
                    if (!this.buffered)
                    {
                        this.ReadPartialUTF8Text(true, this.ReadUInt16());
                    }
                    else
                    {
                        this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.UTF8, this.ReadUInt16());
                    }
                    return true;

                case XmlBinaryNodeType.Chars32Text:
                    if (!this.buffered)
                    {
                        this.ReadPartialUTF8Text(false, this.ReadUInt31());
                    }
                    else
                    {
                        this.ReadText(base.MoveToComplexText(), ValueHandleType.UTF8, this.ReadUInt31());
                    }
                    return true;

                case XmlBinaryNodeType.Chars32TextWithEndElement:
                    if (!this.buffered)
                    {
                        this.ReadPartialUTF8Text(true, this.ReadUInt31());
                    }
                    else
                    {
                        this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.UTF8, this.ReadUInt31());
                    }
                    return true;

                case XmlBinaryNodeType.Bytes8Text:
                    if (!this.buffered)
                    {
                        this.ReadPartialBinaryText(false, this.ReadUInt8());
                    }
                    else
                    {
                        this.ReadBinaryText(base.MoveToComplexText(), this.ReadUInt8());
                    }
                    return true;

                case XmlBinaryNodeType.Bytes8TextWithEndElement:
                    if (!this.buffered)
                    {
                        this.ReadPartialBinaryText(true, this.ReadUInt8());
                    }
                    else
                    {
                        this.ReadBinaryText(this.MoveToAtomicTextWithEndElement(), this.ReadUInt8());
                    }
                    return true;

                case XmlBinaryNodeType.Bytes16Text:
                    if (!this.buffered)
                    {
                        this.ReadPartialBinaryText(false, this.ReadUInt16());
                    }
                    else
                    {
                        this.ReadBinaryText(base.MoveToComplexText(), this.ReadUInt16());
                    }
                    return true;

                case XmlBinaryNodeType.Bytes16TextWithEndElement:
                    if (!this.buffered)
                    {
                        this.ReadPartialBinaryText(true, this.ReadUInt16());
                    }
                    else
                    {
                        this.ReadBinaryText(this.MoveToAtomicTextWithEndElement(), this.ReadUInt16());
                    }
                    return true;

                case XmlBinaryNodeType.Bytes32Text:
                    if (!this.buffered)
                    {
                        this.ReadPartialBinaryText(false, this.ReadUInt31());
                    }
                    else
                    {
                        this.ReadBinaryText(base.MoveToComplexText(), this.ReadUInt31());
                    }
                    return true;

                case XmlBinaryNodeType.Bytes32TextWithEndElement:
                    if (!this.buffered)
                    {
                        this.ReadPartialBinaryText(true, this.ReadUInt31());
                    }
                    else
                    {
                        this.ReadBinaryText(this.MoveToAtomicTextWithEndElement(), this.ReadUInt31());
                    }
                    return true;

                case XmlBinaryNodeType.EmptyTextWithEndElement:
                    this.MoveToAtomicTextWithEndElement().Value.SetValue(ValueHandleType.Empty);
                    if (base.OutsideRootElement)
                    {
                        this.VerifyWhitespace();
                    }
                    return true;

                case XmlBinaryNodeType.DictionaryTextWithEndElement:
                    this.MoveToAtomicTextWithEndElement().Value.SetDictionaryValue(this.ReadDictionaryKey());
                    return true;

                case XmlBinaryNodeType.UniqueIdTextWithEndElement:
                    this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.UniqueId, 0x10);
                    return true;

                case XmlBinaryNodeType.TimeSpanTextWithEndElement:
                    this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.TimeSpan, 8);
                    return true;

                case XmlBinaryNodeType.GuidTextWithEndElement:
                    this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.Guid, 0x10);
                    return true;

                case XmlBinaryNodeType.UInt64TextWithEndElement:
                    this.ReadText(this.MoveToAtomicTextWithEndElement(), ValueHandleType.UInt64, 8);
                    return true;

                case XmlBinaryNodeType.BoolTextWithEndElement:
                    this.MoveToAtomicTextWithEndElement().Value.SetValue((this.ReadUInt8() != 0) ? ValueHandleType.True : ValueHandleType.False);
                    if (base.OutsideRootElement)
                    {
                        this.VerifyWhitespace();
                    }
                    return true;

                case XmlBinaryNodeType.UnicodeChars8Text:
                    this.ReadUnicodeText(false, this.ReadUInt8());
                    return true;

                case XmlBinaryNodeType.UnicodeChars8TextWithEndElement:
                    this.ReadUnicodeText(true, this.ReadUInt8());
                    return true;

                case XmlBinaryNodeType.UnicodeChars16Text:
                    this.ReadUnicodeText(false, this.ReadUInt16());
                    return true;

                case XmlBinaryNodeType.UnicodeChars16TextWithEndElement:
                    this.ReadUnicodeText(true, this.ReadUInt16());
                    return true;

                case XmlBinaryNodeType.UnicodeChars32Text:
                    this.ReadUnicodeText(false, this.ReadUInt31());
                    return true;

                case XmlBinaryNodeType.UnicodeChars32TextWithEndElement:
                    this.ReadUnicodeText(true, this.ReadUInt31());
                    return true;

                case XmlBinaryNodeType.QNameDictionaryTextWithEndElement:
                    base.BufferReader.ReadQName(this.MoveToAtomicTextWithEndElement().Value);
                    return true;

                default:
                    base.BufferReader.ReadValue(nodeType, base.MoveToComplexText().Value);
                    return true;
            }
            return true;
        }
 public override ArrayState Ldloc(APC pc, Local local, Variable dest, ArrayState data)
 {
     return(MakeState(this.enumAnalysis.Ldloc(pc, local, dest, Select(data)), data));
 }
 private void SkipArrayElements(int count)
 {
     this.arrayCount -= count;
     if (this.arrayCount == 0)
     {
         this.arrayState = ArrayState.None;
         base.ExitScope();
         this.ReadNode();
     }
 }