bool SpecialAsyncCommandHandler::getClassNameArg()

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;
}