Skip to content

Commit ae32538

Browse files
committed
make jl_interpret_call partially fixed and more robust
1 parent a8afbc4 commit ae32538

File tree

1 file changed

+24
-8
lines changed

1 file changed

+24
-8
lines changed

src/interpreter.c

+24-8
Original file line numberDiff line numberDiff line change
@@ -572,25 +572,41 @@ static jl_value_t *eval_body(jl_array_t *stmts, interpreter_state *s, int start,
572572

573573
jl_value_t *jl_interpret_call(jl_method_instance_t *lam, jl_value_t **args, uint32_t nargs)
574574
{
575-
jl_code_info_t *src = lam->inferred;
576-
if (src == NULL)
577-
src = lam->def->source;
575+
if (lam->jlcall_api == 2)
576+
return lam->inferred;
577+
jl_code_info_t *src = (jl_code_info_t*)lam->inferred;
578+
if (src == NULL || !jl_is_code_info(src)) {
579+
if (lam->def->isstaged) {
580+
src = jl_code_for_staged(lam);
581+
lam->inferred = (jl_value_t*)src;
582+
jl_gc_wb(lam, src);
583+
}
584+
else {
585+
src = lam->def->source;
586+
}
587+
}
578588
jl_array_t *stmts = src->code;
579-
// XXX: need to uncompress stmts
589+
if (!jl_typeis(stmts, jl_array_any_type)) {
590+
stmts = jl_uncompress_ast(lam->def, stmts);
591+
src->code = stmts;
592+
jl_gc_wb(src, stmts);
593+
}
580594
assert(jl_typeis(stmts, jl_array_any_type));
581595
jl_value_t **locals;
582-
JL_GC_PUSHARGS(locals, jl_source_nslots(src) + jl_source_nssavalues(src));
596+
JL_GC_PUSHARGS(locals, jl_source_nslots(src) + jl_source_nssavalues(src) + 2);
597+
locals[0] = (jl_value_t*)src;
598+
locals[1] = (jl_value_t*)stmts;
583599
interpreter_state s;
584600
s.src = src;
585601
s.module = lam->def->module;
586-
s.locals = locals;
602+
s.locals = locals + 2;
587603
s.sparam_vals = lam->sparam_vals;
588604
size_t i;
589605
for (i = 0; i < lam->def->nargs; i++) {
590606
if (lam->def->isva && i == lam->def->nargs - 1)
591-
locals[i] = jl_f_tuple(NULL, &args[i], nargs - i);
607+
s.locals[i] = jl_f_tuple(NULL, &args[i], nargs - i);
592608
else
593-
locals[i] = args[i];
609+
s.locals[i] = args[i];
594610
}
595611
jl_value_t *r = eval_body(stmts, &s, 0, 0);
596612
JL_GC_POP();

0 commit comments

Comments
 (0)