I'm embedding calls to Julia code within other languages, and have noticed what I think is an inconsistency in the implementation of the JL_GC_PUSH* macros. With the JL_GC_PUSH1, JL_GC_PUSH2, etc. macros, the documentation on embedding shows to pass the *address* of the jl_value_t pointer variable to the macro, e.g.:
jl_value_t* jret = NULL; JL_GC_PUSH1( &jret ); However, if using JL_GC_PUSHARGS, the documentation says to just store the jl_value_t pointer value itself, e.g.: jl_value_t* jret = NULL; jl_value_t** gcargs; JL_GC_PUSHARGS(gcargs, 1); gcargs[0] = jret; I've verified using a debugger that the JL_GC_PUSH1 case stores the address of the pointer variable in the GC stack frame, whereas JL_GC_PUSHARGS stores the pointer variable's value itself. I tried changing my use of JL_GC_PUSHARGS so that it will accept the address of the jl_value_t pointer variable (made gcargs a jl_value_t*** and set gcargs[0] to &jret), but the implementation assumes that gcargs is a jl_value_t** and so it won't compile. Conversely, I tried passing just jret to the JL_GC_PUSH1 macro. It compiles, but the program SEGVs if I force a garbage collection after pushing the value. Based on this, I think the JL_GC_PUSHARGS macro implementation is incorrect. So: is this operator error? Or a bug in the implementation/documentation?
