Пример #1
0
            void CompileFunction(XPathFunctionExpr expr)
            {
                // In some scenarios, some functions are handled in a special way
                if (this.CompileFunctionSpecial(expr))
                {
                    return;
                }

                // Generic function compilation
                QueryFunction function = expr.Function;

                // Compile each argument expression first, introducing a typecast where appropriate
                // Arguments are pushed C style - right to left
                if (expr.SubExprCount > 0)
                {
                    XPathExprList paramList = expr.SubExpr;
                    for (int i = paramList.Count - 1; i >= 0; --i)
                    {
                        this.CompileFunctionParam(function, expr.SubExpr, i);
                    }
                }
                this.codeBlock.Append(new FunctionCallOpcode(function));
                if (1 == this.compiler.nestingLevel && function.TestFlag(QueryFunctionFlag.UsesContextNode))
                {
                    this.compiler.SetPushInitialContext(true);
                }
            }
Пример #2
0
 private void CompileFunction(XPathFunctionExpr expr)
 {
     if (!this.CompileFunctionSpecial(expr))
     {
         QueryFunction function = expr.Function;
         if (expr.SubExprCount > 0)
         {
             for (int i = expr.SubExpr.Count - 1; i >= 0; i--)
             {
                 this.CompileFunctionParam(function, expr.SubExpr, i);
             }
         }
         this.codeBlock.Append(new FunctionCallOpcode(function));
         if ((1 == this.compiler.nestingLevel) && function.TestFlag(QueryFunctionFlag.UsesContextNode))
         {
             this.compiler.SetPushInitialContext(true);
         }
     }
 }