Package railo.runtime.functions.dynamicEvaluation

Source Code of railo.runtime.functions.dynamicEvaluation.Evaluate

package railo.runtime.functions.dynamicEvaluation;

import railo.runtime.PageContext;
import railo.runtime.PageContextImpl;
import railo.runtime.exp.PageException;
import railo.runtime.ext.function.Function;
import railo.runtime.interpreter.CFMLExpressionInterpreter;
import railo.runtime.op.Caster;
import railo.runtime.type.scope.Argument;
import railo.runtime.type.scope.CallerImpl;
import railo.runtime.type.scope.Local;
import railo.runtime.type.scope.LocalNotSupportedScope;
import railo.runtime.type.scope.Scope;
import railo.runtime.type.scope.Undefined;
import railo.runtime.type.scope.Variables;

/**
* Implements the CFML Function evaluate
*/
public final class Evaluate implements Function {

  private static final long serialVersionUID = 2259041678381553989L;

  public static Object call(PageContext pc , Object[] objs) throws PageException {
    return call(pc, objs, false);
  }
  public static Object call(PageContext pc , Object[] objs, boolean preciseMath) throws PageException {
    // define a ohter enviroment for the function
    if(objs.length>1 && objs[objs.length-1] instanceof Scope){
     
      // Variables Scope
      Variables var=null;
      Local lcl=null,cLcl=null;
      Argument arg=null,cArg=null;
      if(objs[objs.length-1] instanceof Variables){
        var=(Variables) objs[objs.length-1];
      }
      else if(objs[objs.length-1] instanceof CallerImpl){
        CallerImpl ci = ((CallerImpl) objs[objs.length-1]);
        var=ci.getVariablesScope();
        lcl = ci.getLocalScope();
        arg = ci.getArgumentsScope();
      }
     
      if(var!=null){
        Variables cVar=pc.variablesScope();
        pc.setVariablesScope(var);
        if(lcl!=null && !(lcl instanceof LocalNotSupportedScope)) {
          cLcl = pc.localScope();
          cArg=pc.argumentsScope();
          pc.setFunctionScopes(lcl, arg);
        }
            try{
              return _call(pc, objs,objs.length-1,preciseMath);
            }
            finally{
              pc.setVariablesScope(cVar);
              if(cLcl!=null) pc.setFunctionScopes(cLcl, cArg);
            }
      }
     
      // Undefined Scope
      else if(objs[objs.length-1] instanceof Undefined) {
        PageContextImpl pci=(PageContextImpl) pc;
        Undefined undefined=(Undefined) objs[objs.length-1];
       
        boolean check=undefined.getCheckArguments();
        Variables orgVar=pc.variablesScope();
        Argument orgArgs=pc.argumentsScope();
            Local orgLocal=pc.localScope();
       
        pci.setVariablesScope(undefined.variablesScope());
        if(check)pci.setFunctionScopes(undefined.localScope(), undefined.argumentsScope());
            try{
              return _call(pc, objs,objs.length-1,preciseMath);
            }
            finally{
              pc.setVariablesScope(orgVar);
              if(check)pci.setFunctionScopes(orgLocal,orgArgs);
            }
       
      }
    }
    return _call(pc,objs,objs.length,preciseMath);
  }

  private static Object _call(PageContext pc , Object[] objs,int len, boolean preciseMath) throws PageException {
    Object rst=null;
    for(int i=0;i<len;i++) {
      if(objs[i] instanceof Number) rst= objs[i];
      else rst= new CFMLExpressionInterpreter().interpret(pc,Caster.toString(objs[i]), preciseMath);
    }
    return rst;
  }
}
TOP

Related Classes of railo.runtime.functions.dynamicEvaluation.Evaluate

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.