static jl_value_t *do_call(jl_value_t **args, size_t nargs, interpreter_state *s) { jl_value_t **argv; JL_GC_PUSHARGS(argv, nargs); size_t i; for(i=0; i < nargs; i++) argv[i] = eval(args[i], s); jl_value_t *result = jl_apply_generic(argv, nargs); JL_GC_POP(); return result; }
static jl_value_t *do_call(jl_value_t **args, size_t nargs, jl_value_t **locals, size_t nl, size_t ngensym) { jl_value_t **argv; JL_GC_PUSHARGS(argv, nargs); size_t i; for(i=0; i < nargs; i++) argv[i] = eval(args[i], locals, nl, ngensym); jl_value_t *result = jl_apply_generic(argv, nargs); JL_GC_POP(); return result; }
// perform f(args...) on stack JL_DLLEXPORT jl_value_t *jl_apply_2va(jl_value_t *f, jl_value_t **args, uint32_t nargs) { nargs++; int onstack = (nargs < jl_page_size/sizeof(jl_value_t*)); jl_value_t **newargs; JL_GC_PUSHARGS(newargs, onstack ? nargs : 1); jl_svec_t *arg_heap = NULL; newargs[0] = f; // make sure f is rooted if (!onstack) { arg_heap = jl_alloc_svec(nargs); newargs[0] = (jl_value_t*)arg_heap; newargs = jl_svec_data(arg_heap); newargs[0] = f; } memcpy(&newargs[1], args, (nargs-1)*sizeof(jl_value_t*)); jl_value_t *ret = jl_apply_generic(newargs, nargs); JL_GC_POP(); return ret; }