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