jobjectArray createResultObject()

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