Пример #1
0
        /// <summary>
        /// Returns an object from the pipe. If pipe is empty returns null.
        /// This will try the ExternalReader if there are no queued objects.
        /// </summary>
        /// <returns>
        /// object that is retrieved, or AutomationNull.Value if none
        /// </returns>
        internal object Retrieve()
        {
            if (ObjectQueue != null && ObjectQueue.Count != 0)
            {
                return(ObjectQueue.Dequeue());
            }
            else if (_enumeratorToProcess != null)
            {
                if (_enumeratorToProcessIsEmpty)
                {
                    return(AutomationNull.Value);
                }

                while (true)
                {
                    if (!ParserOps.MoveNext(_context, errorPosition: null, _enumeratorToProcess))
                    {
                        _enumeratorToProcessIsEmpty = true;
                        return(AutomationNull.Value);
                    }

                    object retValue = ParserOps.Current(errorPosition: null, _enumeratorToProcess);
                    if (retValue == AutomationNull.Value)
                    {
                        // 'AutomationNull.Value' from the enumerator won't be sent to the pipeline.
                        // We try to get the next value in this case.
                        continue;
                    }

                    return(retValue);
                }
            }
            else if (ExternalReader != null)
            {
                try
                {
                    object o = ExternalReader.Read();
                    if (AutomationNull.Value == o)
                    {
                        // NOTICE-2004/06/08-JonN 963367
                        // The fix to this bug involves making one last
                        // attempt to read from the pipeline in DoComplete.
                        // We should be sure to not hit the ExternalReader
                        // again if it already reported completion.
                        ExternalReader = null;
                    }

                    return(o);
                }
                catch (PipelineClosedException)
                {
                    return(AutomationNull.Value);
                }
                catch (ObjectDisposedException)
                {
                    return(AutomationNull.Value);
                }
            }
            else
            {
                return(AutomationNull.Value);
            }
        }
Пример #2
0
        protected override void BeginProcessing()
        {
            Func <object, object, object> func9  = null;
            Func <object, object, object> func10 = null;
            Func <object, object, object> func11 = null;
            Func <object, object, object> func12 = null;
            Func <object, object, object> func13 = null;
            Func <object, object, object> func14 = null;
            Func <object, object, object> func15 = null;
            Func <object, object, object> func16 = null;
            Func <object, object, object> func17 = null;
            Func <object, object, object> func18 = null;

            if (this.script == null)
            {
                switch (this._binaryOperator)
                {
                case TokenKind.Ieq:
                    if (this._forceBooleanEvaluation)
                    {
                        CallSite <Func <CallSite, object, object, object> > site = CallSite <Func <CallSite, object, object, object> > .Create(PSBinaryOperationBinder.Get(ExpressionType.Equal, true, false));

                        this.operationDelegate = (x, y) => site.Target(site, y, x);
                        return;
                    }
                    this.operationDelegate = GetCallSiteDelegate(ExpressionType.Equal, true);
                    return;

                case TokenKind.Ine:
                    this.operationDelegate = GetCallSiteDelegate(ExpressionType.NotEqual, true);
                    return;

                case TokenKind.Ige:
                    this.operationDelegate = GetCallSiteDelegate(ExpressionType.GreaterThanOrEqual, true);
                    return;

                case TokenKind.Igt:
                    this.operationDelegate = GetCallSiteDelegate(ExpressionType.GreaterThan, true);
                    return;

                case TokenKind.Ilt:
                    this.operationDelegate = GetCallSiteDelegate(ExpressionType.LessThan, true);
                    return;

                case TokenKind.Ile:
                    this.operationDelegate = GetCallSiteDelegate(ExpressionType.LessThanOrEqual, true);
                    return;

                case TokenKind.Ilike:
                    if (func9 == null)
                    {
                        func9 = (lval, rval) => ParserOps.LikeOperator(base.Context, PositionUtilities.EmptyExtent, lval, rval, false, true);
                    }
                    this.operationDelegate = func9;
                    return;

                case TokenKind.Inotlike:
                    if (func11 == null)
                    {
                        func11 = (lval, rval) => ParserOps.LikeOperator(base.Context, PositionUtilities.EmptyExtent, lval, rval, true, true);
                    }
                    this.operationDelegate = func11;
                    return;

                case TokenKind.Imatch:
                    this.CheckLanguageMode();
                    if (func13 == null)
                    {
                        func13 = (lval, rval) => ParserOps.MatchOperator(base.Context, PositionUtilities.EmptyExtent, lval, rval, false, true);
                    }
                    this.operationDelegate = func13;
                    return;

                case TokenKind.Inotmatch:
                    this.CheckLanguageMode();
                    if (func15 == null)
                    {
                        func15 = (lval, rval) => ParserOps.MatchOperator(base.Context, PositionUtilities.EmptyExtent, lval, rval, true, true);
                    }
                    this.operationDelegate = func15;
                    return;

                case TokenKind.Ireplace:
                case TokenKind.Iin:
                case TokenKind.Isplit:
                case TokenKind.Creplace:
                case TokenKind.Csplit:
                    return;

                case TokenKind.Icontains:
                case TokenKind.Inotcontains:
                case TokenKind.Inotin:
                case TokenKind.In:
                {
                    Func <object, object, object> func  = null;
                    Func <object, object, object> func2 = null;
                    Func <object, object, object> func3 = null;
                    Func <object, object, object> func4 = null;
                    Tuple <CallSite <Func <CallSite, object, IEnumerator> >, CallSite <Func <CallSite, object, object, object> > > sites = GetContainsCallSites(true);
                    switch (this._binaryOperator)
                    {
                    case TokenKind.Icontains:
                        if (func == null)
                        {
                            func = (lval, rval) => ParserOps.ContainsOperatorCompiled(this.Context, sites.Item1, sites.Item2, lval, rval);
                        }
                        this.operationDelegate = func;
                        return;

                    case TokenKind.Inotcontains:
                        if (func2 == null)
                        {
                            func2 = (lval, rval) => !ParserOps.ContainsOperatorCompiled(this.Context, sites.Item1, sites.Item2, lval, rval);
                        }
                        this.operationDelegate = func2;
                        return;

                    case TokenKind.Iin:
                        return;

                    case TokenKind.Inotin:
                        if (func4 == null)
                        {
                            func4 = (lval, rval) => !ParserOps.ContainsOperatorCompiled(this.Context, sites.Item1, sites.Item2, rval, lval);
                        }
                        this.operationDelegate = func4;
                        return;

                    case TokenKind.In:
                        if (func3 == null)
                        {
                            func3 = (lval, rval) => ParserOps.ContainsOperatorCompiled(this.Context, sites.Item1, sites.Item2, rval, lval);
                        }
                        this.operationDelegate = func3;
                        return;
                    }
                    return;
                }

                case TokenKind.Ceq:
                    this.operationDelegate = GetCallSiteDelegate(ExpressionType.Equal, false);
                    return;

                case TokenKind.Cne:
                    this.operationDelegate = GetCallSiteDelegate(ExpressionType.NotEqual, false);
                    return;

                case TokenKind.Cge:
                    this.operationDelegate = GetCallSiteDelegate(ExpressionType.GreaterThanOrEqual, false);
                    return;

                case TokenKind.Cgt:
                    this.operationDelegate = GetCallSiteDelegate(ExpressionType.GreaterThan, false);
                    return;

                case TokenKind.Clt:
                    this.operationDelegate = GetCallSiteDelegate(ExpressionType.LessThan, false);
                    return;

                case TokenKind.Cle:
                    this.operationDelegate = GetCallSiteDelegate(ExpressionType.LessThanOrEqual, false);
                    return;

                case TokenKind.Clike:
                    if (func10 == null)
                    {
                        func10 = (lval, rval) => ParserOps.LikeOperator(base.Context, PositionUtilities.EmptyExtent, lval, rval, false, false);
                    }
                    this.operationDelegate = func10;
                    return;

                case TokenKind.Cnotlike:
                    if (func12 == null)
                    {
                        func12 = (lval, rval) => ParserOps.LikeOperator(base.Context, PositionUtilities.EmptyExtent, lval, rval, true, false);
                    }
                    this.operationDelegate = func12;
                    return;

                case TokenKind.Cmatch:
                    this.CheckLanguageMode();
                    if (func14 == null)
                    {
                        func14 = (lval, rval) => ParserOps.MatchOperator(base.Context, PositionUtilities.EmptyExtent, lval, rval, false, false);
                    }
                    this.operationDelegate = func14;
                    return;

                case TokenKind.Cnotmatch:
                    this.CheckLanguageMode();
                    if (func16 == null)
                    {
                        func16 = (lval, rval) => ParserOps.MatchOperator(base.Context, PositionUtilities.EmptyExtent, lval, rval, true, false);
                    }
                    this.operationDelegate = func16;
                    return;

                case TokenKind.Ccontains:
                case TokenKind.Cnotcontains:
                case TokenKind.Cin:
                case TokenKind.Cnotin:
                {
                    Func <object, object, object> func5 = null;
                    Func <object, object, object> func6 = null;
                    Func <object, object, object> func7 = null;
                    Func <object, object, object> func8 = null;
                    Tuple <CallSite <Func <CallSite, object, IEnumerator> >, CallSite <Func <CallSite, object, object, object> > > sites = GetContainsCallSites(false);
                    switch (this._binaryOperator)
                    {
                    case TokenKind.Ccontains:
                        if (func5 == null)
                        {
                            func5 = (lval, rval) => ParserOps.ContainsOperatorCompiled(this.Context, sites.Item1, sites.Item2, lval, rval);
                        }
                        this.operationDelegate = func5;
                        return;

                    case TokenKind.Cnotcontains:
                        if (func6 == null)
                        {
                            func6 = (lval, rval) => !ParserOps.ContainsOperatorCompiled(this.Context, sites.Item1, sites.Item2, lval, rval);
                        }
                        this.operationDelegate = func6;
                        return;

                    case TokenKind.Cin:
                        if (func7 == null)
                        {
                            func7 = (lval, rval) => ParserOps.ContainsOperatorCompiled(this.Context, sites.Item1, sites.Item2, rval, lval);
                        }
                        this.operationDelegate = func7;
                        return;

                    case TokenKind.Cnotin:
                        if (func8 == null)
                        {
                            func8 = (lval, rval) => !ParserOps.ContainsOperatorCompiled(this.Context, sites.Item1, sites.Item2, rval, lval);
                        }
                        this.operationDelegate = func8;
                        return;
                    }
                    return;
                }

                case TokenKind.Is:
                    if (func17 == null)
                    {
                        func17 = (lval, rval) => ParserOps.IsOperator(base.Context, PositionUtilities.EmptyExtent, lval, rval);
                    }
                    this.operationDelegate = func17;
                    return;

                case TokenKind.IsNot:
                    if (func18 == null)
                    {
                        func18 = (lval, rval) => ParserOps.IsNotOperator(base.Context, PositionUtilities.EmptyExtent, lval, rval);
                    }
                    this.operationDelegate = func18;
                    return;
                }
            }
        }