Michael Paus
08/05/2022, 3:23 PMMichael Paus
08/05/2022, 3:23 PMfun graal_create_isolate(
params: CValuesRef<graal_create_isolate_params_t>?,
isolate: CValuesRef<CPointerVar<graal_isolate_t>>?,
thread: CValuesRef<CPointerVar<graal_isolatethread_t>>?): Int
fun LibEnvMap_filterEnv(
arg0: CValuesRef<graal_isolatethread_t>?,
arg1: CValuesRef<ByteVar>?): Int
fun graal_tear_down_isolate(
isolateThread: CValuesRef<graal_isolatethread_t>?): Int
Calling the original library from C is trivial:
#include <stdio.h>
#include <stdlib.h>
#include "libenvmap.h"
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <filter>\n", argv[0]);
exit(1);
}
graal_isolate_t *isolate = NULL;
graal_isolatethread_t *thread = NULL;
if (graal_create_isolate(NULL, &isolate, &thread) != 0) {
fprintf(stderr, "initialization error\n");
return 1;
}
printf("Number of entries: %d\n", LibEnvMap_filterEnv(thread, argv[1]));
graal_tear_down_isolate(thread);
}
Now, how do you have to declare and initialize these variables on the Kotlin side?Landry Norris
08/05/2022, 3:40 PMLandry Norris
08/05/2022, 3:43 PMmemScoped {
val paramsPtr = allocPointerTo<graal_create_isolate_params_t>()
val isolatePtr = allocPointerTo<graal_isolate_t>()
graal_create_isolate(paramsPtr.ptr, isolatePtr.ptr, etc.)
}
Disclaimer: My memory could be a bit off. Let me know if this snippet doesn;t work.Landry Norris
08/05/2022, 3:43 PMMichael Paus
08/05/2022, 4:24 PMallocPointerTo
was what I was missing. This is the working result:
import kotlinx.cinterop.*
import libenvmap.*
fun main(args : Array<String>) {
println("### Starting main ###")
if (args.size == 1) {
memScoped {
val isolate = allocPointerTo<graal_isolate_t>()
val isolateThread = allocPointerTo<graal_isolatethread_t>()
if (graal_create_isolate(null, isolate.ptr, isolateThread.ptr) != 0) {
throw RuntimeException("Could not create isolate.")
}
val entries = LibEnvMap_filterEnv(isolateThread.value, args[0].cstr)
println("Number of entries: ${entries}");
graal_tear_down_isolate(isolateThread.value)
}
} else {
println("Missing argument!")
}
println("### Done main ###")
}
Michael Paus
08/05/2022, 4:35 PMLandry Norris
08/05/2022, 4:37 PM