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());