static Scheme_Object *jit_expr(Scheme_Object *expr) { Scheme_Type type = SCHEME_TYPE(expr); #ifdef DO_STACK_CHECK { # include "mzstkchk.h" { Scheme_Thread *p = scheme_current_thread; p->ku.k.p1 = (void *)expr; return scheme_handle_stack_overflow(jit_expr_k); } } #endif switch (type) { case scheme_application_type: return jit_application(expr); case scheme_application2_type: return jit_application2(expr); case scheme_application3_type: return jit_application3(expr); case scheme_sequence_type: return jit_sequence(expr); case scheme_branch_type: return jit_branch(expr); case scheme_with_cont_mark_type: return jit_wcm(expr); case scheme_lambda_type: return scheme_jit_closure(expr, NULL); case scheme_let_value_type: return jit_let_value(expr); case scheme_let_void_type: return jit_let_void(expr); case scheme_letrec_type: return jit_letrec(expr); case scheme_let_one_type: return jit_let_one(expr); case scheme_closure_type: { Scheme_Closure *c = (Scheme_Closure *)expr; if (ZERO_SIZED_CLOSUREP(c)) { /* JIT the closure body, producing a native closure: */ return scheme_jit_closure((Scheme_Object *)c->code, NULL); } else return expr; } case scheme_case_closure_type: { return scheme_unclose_case_lambda(expr, 1); } case scheme_define_values_type: return define_values_jit(expr); case scheme_set_bang_type: return set_jit(expr); case scheme_boxenv_type: return bangboxenv_jit(expr); case scheme_begin0_sequence_type: return begin0_jit(expr); case scheme_varref_form_type: return ref_jit(expr); case scheme_apply_values_type: return apply_values_jit(expr); case scheme_with_immed_mark_type: return with_immed_mark_jit(expr); case scheme_case_lambda_sequence_type: return scheme_case_lambda_jit(expr); case scheme_inline_variant_type: return inline_variant_jit(expr); default: return expr; } }
Scheme_Object *scheme_jit_expr(Scheme_Object *expr) { Scheme_Type type = SCHEME_TYPE(expr); switch (type) { case scheme_application_type: return jit_application(expr); case scheme_application2_type: return jit_application2(expr); case scheme_application3_type: return jit_application3(expr); case scheme_sequence_type: case scheme_splice_sequence_type: return jit_sequence(expr); case scheme_branch_type: return jit_branch(expr); case scheme_with_cont_mark_type: return jit_wcm(expr); case scheme_unclosed_procedure_type: return scheme_jit_closure(expr, NULL); case scheme_let_value_type: return jit_let_value(expr); case scheme_let_void_type: return jit_let_void(expr); case scheme_letrec_type: return jit_letrec(expr); case scheme_let_one_type: return jit_let_one(expr); case scheme_closure_type: { Scheme_Closure *c = (Scheme_Closure *)expr; if (ZERO_SIZED_CLOSUREP(c)) { /* JIT the closure body, producing a native closure: */ return scheme_jit_closure((Scheme_Object *)c->code, NULL); } else return expr; } case scheme_case_closure_type: { return scheme_unclose_case_lambda(expr, 1); } case scheme_define_values_type: return define_values_jit(expr); case scheme_define_syntaxes_type: return define_syntaxes_jit(expr); case scheme_begin_for_syntax_type: return begin_for_syntax_jit(expr); case scheme_set_bang_type: return set_jit(expr); case scheme_boxenv_type: return bangboxenv_jit(expr); case scheme_begin0_sequence_type: return begin0_jit(expr); case scheme_require_form_type: return scheme_top_level_require_jit(expr); case scheme_varref_form_type: return ref_jit(expr); case scheme_apply_values_type: return apply_values_jit(expr); case scheme_case_lambda_sequence_type: return scheme_case_lambda_jit(expr); case scheme_module_type: return scheme_module_jit(expr); case scheme_inline_variant_type: return inline_variant_jit(expr); default: return expr; } }