if (reval.res.getNotModified()) throw new RedirectException (null);
    public Object invoke (Object thisObject, String functionName, Object[] args) throws ScriptingException {	ESObject eso = null;	if (thisObject == null)	    eso = global;	else	    eso = getElementWrapper (thisObject);	try {	    ESValue[] esv = args == null ? new ESValue[0] : new ESValue[args.length];	    for (int i=0; i<esv.length; i++) {	        // for java.util.Map objects, we use the special "tight" wrapper	        // that makes the Map look like a native object	        if (args[i] instanceof Map)	            esv[i] = new ESMapWrapper (this, (Map) args[i]);	        else	            esv[i] = ESLoader.normalizeValue (args[i], evaluator);	    }	    evaluator.thread = Thread.currentThread ();	    ESValue retval =  eso.doIndirectCall (evaluator, eso, functionName, esv);	    return retval == null ? null : retval.toJavaObject ();	} catch (Exception x) {	    // check if this is a redirect exception, which has been converted by fesi	    // into an EcmaScript exception, which is why we can't explicitly catch it	    if (reval.res.getRedirect() != null)	        throw new RedirectException (reval.res.getRedirect ());	    // create and throw a ScriptingException with the right message	    String msg = x.getMessage ();	    if (msg == null || msg.length() < 10)	        msg = x.toString ();	    if (app.debug ()) {	        System.err.println ("Error in Script: "+msg);	        x.printStackTrace ();	    }	    throw new ScriptingException (msg);	}    }