/// <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); } }
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; } } }