in modules/jpda/src/main/native/jdwp/common/agent/core/CommandHandler.cpp [216:270]
bool SpecialAsyncCommandHandler::getClassNameArg(jint index, char* sig, char* name)
{
JDWP_TRACE_ENTRY("Async::getArgsNumber(" << index << ',' << JDWP_CHECK_NULL(sig) << ')');
if (sig == 0) return false;
// skip previous arguments
const size_t len = strlen(sig);
size_t i;
for (i = 1; index > 0 && i < len && sig[i] != ')'; i++) {
while (i < len && sig[i] == '[') i++;
if (sig[i] == 'L') {
while (i < len && sig[i] != ';' && sig[i] != ')') i++;
}
index--;
}
if (index > 0) return false;
// extract type name for the next argument
bool isArrayType = false;
size_t j = 0;
if (sig[i] == '[') {
// copy all starting '[' chars for array type
isArrayType = true;
for (; i < len && sig[i] == '['; i++) {
name[j++] = sig[i];
}
}
if (sig[i] == 'L') {
// copy class name until ';'
if (!isArrayType) {
i++; // skip starting 'L' for not array type
}
for (; i < len && sig[i] != ';'; i++) {
name[j++] = sig[i];
}
if (isArrayType) {
name[j++] = sig[i]; // add trailing ';' for array type
}
} else if (isArrayType) {
// copy single char tag for primitive array type
name[j++] = sig[i];
} else {
// not a class or array type
return false;
}
name[j] = '\0';
return true;
}