Slide 25
Slide 25 text
実装(実験的)
* vm.c *
#ifndef MRB_SW_INTERRUPT
#define CASE(insn,ops) L_ ## 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バイトコード
が実行されるたびに呼び出される