in src/roots/paths_to_closest_gc_roots.cpp [84:110]
jobjectArray createResultObject(JNIEnv *env, jvmtiEnv *jvmti,
const std::vector<std::pair<jobject, jlong>> &objectToTag,
const std::unordered_map<jlong, std::vector<ReferenceInfo *>> *tagToInfos = nullptr) {
std::unordered_map<jlong, jint> tagToIndex = getTagToIndex(objectToTag);
jclass langObject = env->FindClass("java/lang/Object");
jint objectsCount = static_cast<jint>(objectToTag.size());
jobjectArray resultObjects = env->NewObjectArray(objectsCount, langObject, nullptr);
jobjectArray links = env->NewObjectArray(objectsCount, langObject, nullptr);
std::vector<jboolean> weakSoftReachable(objectsCount);
for (jsize i = 0; i < objectsCount; ++i) {
env->SetObjectArrayElement(resultObjects, i, objectToTag[i].first);
jlong tag = objectToTag[i].second;
auto infos = tagToInfos == nullptr ?
createLinksInfos(env, jvmti, tagToIndex, GcTag::pointerToGcTag(tag)->backRefs) :
createLinksInfos(env, jvmti, tagToIndex, (*tagToInfos).find(tag)->second);
env->SetObjectArrayElement(links, i, infos);
weakSoftReachable[i] = GcTag::pointerToGcTag(tag)->isWeakSoftReachable();
}
jobjectArray result = env->NewObjectArray(3, langObject, nullptr);
env->SetObjectArrayElement(result, 0, resultObjects);
env->SetObjectArrayElement(result, 1, links);
env->SetObjectArrayElement(result, 2, toJavaArray(env, weakSoftReachable));
return result;
}