insn: pc0=p c++; FETCH_ ## ops (); L_ ## insn ## _BO DY: #else #define CASE(insn,ops) L_ ## insn: pc0=p c++; exec_interrupt(mrb); FETCH_ ## ops (); L_ ## insn ## _BODY: #endif * vm.c * #ifdef MRB_SW_INTERRUPT static void exec_interrupt(mrb_state *mrb){ if(!mrb->interrupt_func) return; while( !(mrb->interrupt_flag & 0x8000) && mrb- >interrupt_flag & 0x7FFF){ for(int i=0;i<16;i++){ int bit = (mrb- >interrupt_flag >> i) & 0x0001; if(bit){ mrb->user_mutex_func(mrb,1); uint16_t backup = mrb->interrupt_flag; mrb- >interrupt_flag |= 0x8000; //Interrupt flag mrb->interrupt_func(mrb,i); mrb->interrupt_flag = backup; mrb->interrupt_flag &= ~(1 << i); mrb->user_mutex_func(mrb,0); } } } } #endif exec_interrupt() がmrubyバイトコード が実行されるたびに呼び出される