in src/roots/paths_to_closest_gc_roots.cpp [37:65]
jobjectArray createLinksInfos(JNIEnv *env, jvmtiEnv *jvmti,
const std::unordered_map<jlong, jint> &tagToIndex,
const std::vector<ReferenceInfo *> &infos) {
std::vector<jint> prevIndices;
std::vector<jint> refKinds;
std::vector<jobject> refInfos;
size_t size = infos.size();
prevIndices.reserve(size);
refInfos.reserve(size);
refKinds.reserve(size);
for (ReferenceInfo *info : infos) {
jlong prevTag = info->getTag();
auto it = tagToIndex.find(prevTag);
if (prevTag != -1 && it == tagToIndex.end()) {
continue;
}
prevIndices.push_back(prevTag == -1 ? -1 : it->second);
refKinds.push_back(static_cast<jint>(info->getKind()));
refInfos.push_back(info->getReferenceInfo(env, jvmti));
}
jobjectArray result = env->NewObjectArray(4, env->FindClass("java/lang/Object"), nullptr);
env->SetObjectArrayElement(result, 0, toJavaArray(env, prevIndices));
env->SetObjectArrayElement(result, 1, toJavaArray(env, refKinds));
env->SetObjectArrayElement(result, 2, toJavaArray(env, refInfos));
return result;
}