try {
// attempt to reuse last executor cached in volatile JexlNode.value
if (cache) {
Object cached = node.jjtGetValue();
if (cached instanceof JexlMethod) {
JexlMethod me = (JexlMethod) cached;
Object eval = me.tryInvoke(methodName, data, argv);
if (!me.tryFailed(eval)) {
return eval;
}
}
}
JexlMethod vm = uberspect.getMethod(data, methodName, argv, node);
// DG: If we can't find an exact match, narrow the parameters and try again!
if (vm == null) {
if (arithmetic.narrowArguments(argv)) {
vm = uberspect.getMethod(data, methodName, argv, node);
}
if (vm == null) {
xjexl = new JexlException(node, "unknown or ambiguous method", null);
}
}
if (xjexl == null) {
Object eval = vm.invoke(data, argv); // vm cannot be null if xjexl is null
// cache executor in volatile JexlNode.value
if (cache && vm.isCacheable()) {
node.jjtSetValue(vm);
}
return eval;
}
} catch (InvocationTargetException e) {