in src/main/java/org/apache/commons/jexl3/internal/InterpreterBase.java [334:370]
protected Object getVariable(final Frame frame, final LexicalScope block, final ASTIdentifier identifier) {
final int symbol = identifier.getSymbol();
final String name = identifier.getName();
// if we have a symbol, we have a scope thus a frame
if ((options.isLexicalShade() || identifier.isLexical()) && identifier.isShaded()) {
return undefinedVariable(identifier, name);
}
// a local var ?
if (symbol >= 0 && frame.has(symbol)) {
final Object value = frame.get(symbol);
// not out of scope with no lexical shade ?
if (value != Scope.UNDEFINED) {
// null operand of an arithmetic operator ?
if (value == null && isStrictOperand(identifier)) {
return unsolvableVariable(identifier, name, false); // defined but null
}
return value;
}
}
// consider global
final Object value = context.get(name);
// is it null ?
if (value == null) {
// is it defined ?
if (!context.has(name)) {
// not defined, ignore in some cases...
final boolean ignore = identifier.jjtGetParent() instanceof ASTReference
|| (isSafe() && (symbol >= 0 || identifier.jjtGetParent() instanceof ASTAssignment));
if (!ignore) {
return undefinedVariable(identifier, name); // undefined
}
} else if (isStrictOperand(identifier)) {
return unsolvableVariable(identifier, name, false); // defined but null
}
}
return value;
}