public QilInvoke Invoke(QilNode function, QilNode arguments) { QilInvoke n = new QilInvoke(QilNodeType.Invoke, function, arguments); n.XmlType = this.typeCheck.CheckInvoke(n); TraceNode(n); return(n); }
public XmlQueryType CheckInvoke(QilInvoke node) { #if DEBUG CheckClassAndNodeType(node[1], typeof(QilList), QilNodeType.ActualParameterList); QilList actualArgs = node.Arguments; QilList formalArgs = node.Function.Arguments; Check(actualArgs.Count == formalArgs.Count, actualArgs, "Invoke argument count must match function's argument count"); for (int i = 0; i < actualArgs.Count; i++) { Check(actualArgs[i].XmlType.IsSubtypeOf(formalArgs[i].XmlType), actualArgs[i], "Invoke argument must be a subtype of the invoked function's argument"); } #endif return(node.Function.XmlType); }
protected virtual QilNode VisitInvoke(QilInvoke n) { return(VisitChildren(n)); }
public XmlQueryType CheckInvoke(QilInvoke node) { #if DEBUG CheckClassAndNodeType(node[1], typeof(QilList), QilNodeType.ActualParameterList); QilList actualArgs = node.Arguments; QilList formalArgs = node.Function.Arguments; Check(actualArgs.Count == formalArgs.Count, actualArgs, "Invoke argument count must match function's argument count"); for (int i = 0; i < actualArgs.Count; i++) Check(actualArgs[i].XmlType.IsSubtypeOf(formalArgs[i].XmlType), actualArgs[i], "Invoke argument must be a subtype of the invoked function's argument"); #endif return node.Function.XmlType; }
protected virtual QilNode VisitInvoke(QilInvoke n) { return VisitChildren(n); }
protected override QilNode VisitInvoke(QilInvoke n) { return NoReplace(n); }
protected override QilNode VisitInvoke(QilInvoke n) { return(NoReplace(n)); }
protected override QilNode VisitInvoke(QilInvoke local0) { QilNode local1 = local0[0]; QilNode local2 = local0[1]; if (this[XmlILOptimization.NormalizeInvokeEmpty]) { if (local1.NodeType == QilNodeType.Function) { QilNode local4 = local1[1]; if (local4.NodeType == QilNodeType.Sequence) { if ( (local4).Count == (0) ) { if (AllowReplace(XmlILOptimization.NormalizeInvokeEmpty, local0)) { return Replace(XmlILOptimization.NormalizeInvokeEmpty, local0, VisitSequence(f.Sequence())); } } } } } if (this[XmlILOptimization.AnnotateTrackCallers]) { if (AllowReplace(XmlILOptimization.AnnotateTrackCallers, local0)) { XmlILConstructInfo.Write(local1).CallersInfo.Add(XmlILConstructInfo.Write(local0)); } } if (this[XmlILOptimization.AnnotateInvoke]) { if (local1.NodeType == QilNodeType.Function) { QilNode local4 = local1[1]; if (AllowReplace(XmlILOptimization.AnnotateInvoke, local0)) { OptimizerPatterns.Inherit((QilNode) (local4), (QilNode) (local0), OptimizerPatternName.IsDocOrderDistinct); OptimizerPatterns.Inherit((QilNode) (local4), (QilNode) (local0), OptimizerPatternName.SameDepth); } } } return NoReplace(local0); }
public QilInvoke Invoke(QilNode function, QilNode arguments) { QilInvoke n = new QilInvoke(QilNodeType.Invoke, function, arguments); n.XmlType = this.typeCheck.CheckInvoke(n); TraceNode(n); return n; }
/// <summary> /// Generate code for for QilNodeType.Invoke. /// </summary> protected override QilNode VisitInvoke(QilInvoke ndInvoke) { QilFunction ndFunc = ndInvoke.Function; MethodInfo methInfo = XmlILAnnotation.Write(ndFunc).FunctionBinding; bool useWriter = (XmlILConstructInfo.Read(ndFunc).ConstructMethod == XmlILConstructMethod.Writer); Debug.Assert(!XmlILConstructInfo.Read(ndInvoke).PushToWriterFirst || useWriter); // Push XmlQueryRuntime onto the stack as the first parameter _helper.LoadQueryRuntime(); // Generate code to push each Invoke argument onto the stack for (int iArg = 0; iArg < ndInvoke.Arguments.Count; iArg++) { QilNode ndActualArg = ndInvoke.Arguments[iArg]; QilNode ndFormalArg = ndInvoke.Function.Arguments[iArg]; NestedVisitEnsureStack(ndActualArg, GetItemStorageType(ndFormalArg), !ndFormalArg.XmlType.IsSingleton); } // Check whether this call should compiled using the .tailcall instruction if (OptimizerPatterns.Read(ndInvoke).MatchesPattern(OptimizerPatternName.TailCall)) _helper.TailCall(methInfo); else _helper.Call(methInfo); // If function's results are not pushed to Writer, if (!useWriter) { // Return value is on the stack; ensure it has the correct storage type _iterCurr.Storage = StorageDescriptor.Stack(GetItemStorageType(ndInvoke), !ndInvoke.XmlType.IsSingleton); } else { _iterCurr.Storage = StorageDescriptor.None(); } return ndInvoke; }
protected override QilNode VisitInvoke(QilInvoke local0) { QilNode local1 = local0[0]; QilNode local2 = local0[1]; if (this[XmlILOptimization.NormalizeInvokeEmpty]) { if (local1.NodeType == QilNodeType.Function) { QilNode local4 = local1[1]; if (local4.NodeType == QilNodeType.Sequence) { if ((local4).Count == (0)) { // PATTERN: [NormalizeInvokeEmpty] (Invoke (Function * $seq:(Sequence) ^ (Count? $seq 0) * *) *) => (Sequence) if (AllowReplace(XmlILOptimization.NormalizeInvokeEmpty, local0)) { return Replace(XmlILOptimization.NormalizeInvokeEmpty, local0, VisitSequence(f.Sequence())); } } } } } if (this[XmlILOptimization.AnnotateTrackCallers]) { // PATTERN: [AnnotateTrackCallers] $caller:(Invoke $func:* *) => (AddCaller $func $caller) ^ { } if (AllowReplace(XmlILOptimization.AnnotateTrackCallers, local0)) { XmlILConstructInfo.Write(local1).CallersInfo.Add(XmlILConstructInfo.Write(local0)); } } if (this[XmlILOptimization.AnnotateInvoke]) { if (local1.NodeType == QilNodeType.Function) { QilNode local4 = local1[1]; // PATTERN: [AnnotateInvoke] $outer:(Invoke (Function * $defn:* * *) *) => (InheritPattern $outer $defn {IsDocOrderDistinct}) ^ (InheritPattern $outer $defn {SameDepth}) ^ { } if (AllowReplace(XmlILOptimization.AnnotateInvoke, local0)) { OptimizerPatterns.Inherit((QilNode)(local4), (QilNode)(local0), OptimizerPatternName.IsDocOrderDistinct); OptimizerPatterns.Inherit((QilNode)(local4), (QilNode)(local0), OptimizerPatternName.SameDepth); } } } return NoReplace(local0); }