Not fully get that. Is the issue that `JL_PUSH123` take the address of a `jl_value_t*`? I don't see a difference of your version to

    jl_value_t **argv;
    argv[0] = new_thing1();
    argv[1] = new_thing2();
    jl_call(f, argv, 2);

internally `jl_call` just copies the argv array into a rooted array. 

If the issue is only with  `JL_PUSH123` we could use `JL_PUSH_ARGS` in `jl_call123`