22enum rb_mjit_iseq_func {
24 NOT_ADDED_JIT_ISEQ_FUNC = 0,
27 NOT_READY_JIT_ISEQ_FUNC = 1,
30 NOT_COMPILED_JIT_ISEQ_FUNC = 2,
32 LAST_JIT_ISEQ_FUNC = 3
54 unsigned int min_calls;
64struct rb_mjit_compile_info {
66 bool disable_ivar_cache;
68 bool disable_exivar_cache;
70 bool disable_send_cache;
72 bool disable_inlining;
74 bool disable_const_cache;
79RUBY_SYMBOL_EXPORT_BEGIN
83extern void rb_mjit_add_iseq_to_process(
const rb_iseq_t *iseq);
85extern struct rb_mjit_compile_info* rb_mjit_iseq_compile_info(
const struct rb_iseq_constant_body *body);
86extern void rb_mjit_recompile_send(
const rb_iseq_t *iseq);
87extern void rb_mjit_recompile_ivar(
const rb_iseq_t *iseq);
88extern void rb_mjit_recompile_exivar(
const rb_iseq_t *iseq);
89extern void rb_mjit_recompile_inlining(
const rb_iseq_t *iseq);
90extern void rb_mjit_recompile_const(
const rb_iseq_t *iseq);
93extern bool mjit_compile(
FILE *
f,
const rb_iseq_t *iseq,
const char *funcname,
int id);
94extern void mjit_init(
const struct mjit_options *opts);
95extern void mjit_gc_start_hook(
void);
96extern void mjit_gc_exit_hook(
void);
97extern void mjit_free_iseq(
const rb_iseq_t *iseq);
98extern void mjit_update_references(
const rb_iseq_t *iseq);
99extern void mjit_mark(
void);
101extern void mjit_cont_free(
struct mjit_cont *cont);
102extern void mjit_add_class_serial(
rb_serial_t class_serial);
103extern void mjit_remove_class_serial(
rb_serial_t class_serial);
108#define JIT_ISEQ_SIZE_THRESHOLD 1000
114 return (body->
type == ISEQ_TYPE_METHOD || body->
type == ISEQ_TYPE_BLOCK)
116 && body->
iseq_size < JIT_ISEQ_SIZE_THRESHOLD;
128 ASSUME(func_i <= LAST_JIT_ISEQ_FUNC);
129 switch ((
enum rb_mjit_iseq_func)func_i) {
130 case NOT_ADDED_JIT_ISEQ_FUNC:
132 if (body->total_calls ==
mjit_opts.min_calls && mjit_target_iseq_p(body)) {
133 rb_mjit_add_iseq_to_process(iseq);
135 return rb_mjit_wait_call(
ec, body);
139 case NOT_READY_JIT_ISEQ_FUNC:
142 case NOT_COMPILED_JIT_ISEQ_FUNC:
167 mjit_func_t func = body->jit_func;
174 return mjit_exec_slowpath(ec, iseq, body);
183 return func(ec, ec->
cfp);
186void mjit_child_after_fork(
void);
189#define mjit_enabled true
193VALUE mjit_pause(
bool wait_p);
194VALUE mjit_resume(
void);
195void mjit_finish(
bool close_handle_p);
200static inline void mjit_cont_free(
struct mjit_cont *cont){}
201static inline void mjit_gc_start_hook(
void){}
202static inline void mjit_gc_exit_hook(
void){}
203static inline void mjit_free_iseq(
const rb_iseq_t *iseq){}
204static inline void mjit_mark(
void){}
205static inline void mjit_add_class_serial(
rb_serial_t class_serial){}
206static inline void mjit_remove_class_serial(
rb_serial_t class_serial){}
208static inline void mjit_child_after_fork(
void){}
210#define mjit_enabled false
211static inline VALUE mjit_pause(
bool wait_p){
return Qnil; }
212static inline VALUE mjit_resume(
void){
return Qnil; }
213static inline void mjit_finish(
bool close_handle_p){}
#define RB_DEBUG_COUNTER_INC(type)
Thin wrapper to ruby/config.h.
struct mjit_options mjit_opts
unsigned LONG_LONG rb_serial_t
rb_execution_context_t * ec
enum rb_iseq_constant_body::iseq_type type
struct rb_iseq_constant_body * body