jobjectArray createResultObjectForGcRootsPaths()

in src/roots/paths_to_closest_gc_roots.cpp [208:240]


    jobjectArray createResultObjectForGcRootsPaths(JNIEnv *env, jvmtiEnv *jvmti, const std::vector<jlong> &roots,
                                                   const std::unordered_map<jlong, jlong> &prevNode, jlong start,
                                                   jint objectsNumber) {
        std::vector<std::pair<jlong, jint>> nodesToPathNum;
        std::unordered_map<jlong, std::vector<ReferenceInfo *>> tagToInfos;
        jint cnt = 0;
        for (auto it = roots.begin(); it != roots.end() && nodesToPathNum.size() < objectsNumber; ++it) {
            jlong tag = *it;
            nodesToPathNum.emplace_back(tag, cnt++);
            insertRootInfos(tag, tagToInfos);
            while (true) {
                if (nodesToPathNum.size() >= objectsNumber - roots.size()) {
                    if (cnt == 1) {
                        nodesToPathNum.emplace_back(start, 1);
                    }

                    truncatePath(start, tag, prevNode, tagToInfos);
                    break;
                }

                jlong prevTag = prevNode.find(tag)->second;
                if (prevTag == tag || insertInfos(prevTag, tag, tagToInfos)) {
                    break;
                }

                nodesToPathNum.emplace_back(prevTag, cnt);
                tag = prevTag;
            }
        }

        std::vector<std::pair<jobject, jlong>> objectToTag = getSortedObjectToTag(jvmti, nodesToPathNum);
        return createResultObject(env, jvmti, objectToTag, &tagToInfos);
    }