From ae32538fedc919b431c0fd930695507ea77039ff Mon Sep 17 00:00:00 2001 From: Jameson Nash Date: Tue, 13 Sep 2016 14:27:37 -0400 Subject: [PATCH] make jl_interpret_call partially fixed and more robust --- src/interpreter.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/interpreter.c b/src/interpreter.c index c04fac2498c43b..93ffdff932f725 100644 --- a/src/interpreter.c +++ b/src/interpreter.c @@ -572,25 +572,41 @@ static jl_value_t *eval_body(jl_array_t *stmts, interpreter_state *s, int start, jl_value_t *jl_interpret_call(jl_method_instance_t *lam, jl_value_t **args, uint32_t nargs) { - jl_code_info_t *src = lam->inferred; - if (src == NULL) - src = lam->def->source; + if (lam->jlcall_api == 2) + return lam->inferred; + jl_code_info_t *src = (jl_code_info_t*)lam->inferred; + if (src == NULL || !jl_is_code_info(src)) { + if (lam->def->isstaged) { + src = jl_code_for_staged(lam); + lam->inferred = (jl_value_t*)src; + jl_gc_wb(lam, src); + } + else { + src = lam->def->source; + } + } jl_array_t *stmts = src->code; - // XXX: need to uncompress stmts + if (!jl_typeis(stmts, jl_array_any_type)) { + stmts = jl_uncompress_ast(lam->def, stmts); + src->code = stmts; + jl_gc_wb(src, stmts); + } assert(jl_typeis(stmts, jl_array_any_type)); jl_value_t **locals; - JL_GC_PUSHARGS(locals, jl_source_nslots(src) + jl_source_nssavalues(src)); + JL_GC_PUSHARGS(locals, jl_source_nslots(src) + jl_source_nssavalues(src) + 2); + locals[0] = (jl_value_t*)src; + locals[1] = (jl_value_t*)stmts; interpreter_state s; s.src = src; s.module = lam->def->module; - s.locals = locals; + s.locals = locals + 2; s.sparam_vals = lam->sparam_vals; size_t i; for (i = 0; i < lam->def->nargs; i++) { if (lam->def->isva && i == lam->def->nargs - 1) - locals[i] = jl_f_tuple(NULL, &args[i], nargs - i); + s.locals[i] = jl_f_tuple(NULL, &args[i], nargs - i); else - locals[i] = args[i]; + s.locals[i] = args[i]; } jl_value_t *r = eval_body(stmts, &s, 0, 0); JL_GC_POP();