in src/core/src/main/java/org/apache/jmeter/engine/util/FunctionParser.java [191:253]
ArrayList<CompoundVariable> parseParams(StringReader reader) throws InvalidVariableException {
ArrayList<CompoundVariable> result = new ArrayList<>();
StringBuilder buffer = new StringBuilder();
char[] current = new char[1];
char previous = ' ';
int functionRecursion = 0;
int parenRecursion = 0;
try {
while (reader.read(current) == 1) {
if (current[0] == '\\') { // Process escaped characters
buffer.append(current[0]); // Store the \
if (reader.read(current) == 0) {
break; // end of buffer
}
previous = ' ';
buffer.append(current[0]); // store the following character
} else if (current[0] == ',' && functionRecursion == 0) {
CompoundVariable param = new CompoundVariable();
param.setParameters(buffer.toString());
buffer.setLength(0);
result.add(param);
} else if (current[0] == ')' && functionRecursion == 0 && parenRecursion == 0) {
// Detect functionName() so this does not generate empty string as the parameter
if (buffer.length() == 0 && result.isEmpty()){
return result;
}
// Normal exit occurs here
CompoundVariable param = new CompoundVariable();
param.setParameters(buffer.toString());
buffer.setLength(0);
result.add(param);
return result;
} else if (current[0] == '{' && previous == '$') {
buffer.append(current[0]);
previous = current[0];
functionRecursion++;
} else if (current[0] == '}' && functionRecursion > 0) {
buffer.append(current[0]);
previous = current[0];
functionRecursion--;
} else if (current[0] == ')' && functionRecursion == 0 && parenRecursion > 0) {
buffer.append(current[0]);
previous = current[0];
parenRecursion--;
} else if (current[0] == '(' && functionRecursion == 0) {
buffer.append(current[0]);
previous = current[0];
parenRecursion++;
} else {
buffer.append(current[0]);
previous = current[0];
}
}
} catch (IOException e) {// Should not happen with StringReader
log.error("Error parsing function: {}", buffer, e);
}
// Dropped out, i.e. did not find closing ')'
log.warn("Probably an invalid function string: {}", buffer);
CompoundVariable var = new CompoundVariable();
var.setParameters(buffer.toString());
result.add(var);
return result;
}