A function invocation node which represents a call to a Qil functions.
Inheritance: QilBinary
Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
 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); }
Example #6
0
 protected override QilNode VisitInvoke(QilInvoke n) { return NoReplace(n); }
Example #7
0
 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;
 }
Example #10
0
        /// <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;
        }
Example #11
0
 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);
 }