enclave_calling_stub_result mock_enclave_calling_entry()

in sdk/host/src/main/native/cpp/platform/mock_in_svm/jni/jni_mock_in_svm.c [66:107]


enclave_calling_stub_result mock_enclave_calling_entry(JNIEnv *env, jlong isolate_handler, jbyteArray payload, mock_enclave_stub stub) {
    jbyte *payload_copy = (*env)->GetByteArrayElements(env, payload, NULL);
    int payload_copy_length = (*env)->GetArrayLength(env, payload);

    enc_data_t input;
    input.data = (char*)payload_copy;
    input.data_len = payload_copy_length;
    enc_data_t output;
    output.data = NULL;
    output.data_len = 0x0;

    jbyteArray invocation_result_array;
    enclave_calling_stub_result result_wrapper;
    result_wrapper.ret = 0;
    result_wrapper.result = invocation_result_array;

    callbacks_t callback_methods;
    callback_methods.memcpy_char_pointer = &memcpy_char_pointer;
    callback_methods.exception_handler = NULL;
    callback_methods.get_random_number = NULL;

    result_wrapper.ret = stub((graal_isolate_t*)isolate_handler, &input, &output, &callback_methods);
    if (result_wrapper.ret != 0) {
        (*env)->ReleaseByteArrayElements(env, payload, payload_copy, 0);
        free(output.data);
        return result_wrapper;
    }

    // create a byte array.
    invocation_result_array = (*env)->NewByteArray(env, output.data_len);
    jbyte *invocation_result_array_ptr = (*env)->GetByteArrayElements(env, invocation_result_array, NULL);
    memcpy(invocation_result_array_ptr, output.data, output.data_len);

    (*env)->ReleaseByteArrayElements(env, payload, payload_copy, 0);
    // free buffer malloc in jni.
    (*env)->ReleaseByteArrayElements(env, invocation_result_array, invocation_result_array_ptr, 0);
    // free buffer malloc in native image by callback mechanism.
    free(output.data);

    result_wrapper.result = invocation_result_array;
    return result_wrapper;
}