@@ -572,25 +572,41 @@ static jl_value_t *eval_body(jl_array_t *stmts, interpreter_state *s, int start,
572
572
573
573
jl_value_t * jl_interpret_call (jl_method_instance_t * lam , jl_value_t * * args , uint32_t nargs )
574
574
{
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
+ }
578
588
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
+ }
580
594
assert (jl_typeis (stmts , jl_array_any_type ));
581
595
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 ;
583
599
interpreter_state s ;
584
600
s .src = src ;
585
601
s .module = lam -> def -> module ;
586
- s .locals = locals ;
602
+ s .locals = locals + 2 ;
587
603
s .sparam_vals = lam -> sparam_vals ;
588
604
size_t i ;
589
605
for (i = 0 ; i < lam -> def -> nargs ; i ++ ) {
590
606
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 );
592
608
else
593
- locals [i ] = args [i ];
609
+ s . locals [i ] = args [i ];
594
610
}
595
611
jl_value_t * r = eval_body (stmts , & s , 0 , 0 );
596
612
JL_GC_POP ();
0 commit comments