11#include <mruby.h>
22#include <mruby/array.h>
33#include <mruby/class.h>
4+ #include <mruby/error.h>
45#include <mruby/proc.h>
56
67#define fiber_ptr (o ) ((struct RFiber*)mrb_ptr(o))
@@ -173,6 +174,26 @@ fiber_switch_context(mrb_state *mrb, struct mrb_context *c)
173174 mrb -> c = c ;
174175}
175176
177+ /*
178+ * Argument mesg is limited to a string literal or "static const" string.
179+ * Also, it must be called as `return fiber_error(...)`.
180+ */
181+ static mrb_value
182+ fiber_error (mrb_state * mrb , const char * mesg )
183+ {
184+ mrb_value str = mrb_str_new_static (mrb , mesg , strlen (mesg ));
185+ mrb_value exc = mrb_exc_new_str (mrb , E_FIBER_ERROR , str );
186+
187+ if (mrb -> jmp ) {
188+ mrb_exc_raise (mrb , exc );
189+ }
190+
191+ mrb -> exc = mrb_obj_ptr (exc );
192+
193+ return exc ;
194+ }
195+
196+ /* This function must be called as `return fiber_switch(...)` */
176197static mrb_value
177198fiber_switch (mrb_state * mrb , mrb_value self , mrb_int len , const mrb_value * a , mrb_bool resume , mrb_bool vmexec )
178199{
@@ -186,15 +207,15 @@ fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mr
186207 switch (status ) {
187208 case MRB_FIBER_TRANSFERRED :
188209 if (resume ) {
189- mrb_raise (mrb , E_FIBER_ERROR , "resuming transferred fiber" );
210+ return fiber_error (mrb , "resuming transferred fiber" );
190211 }
191212 break ;
192213 case MRB_FIBER_RUNNING :
193214 case MRB_FIBER_RESUMED :
194- mrb_raise (mrb , E_FIBER_ERROR , "double resume" );
215+ return fiber_error (mrb , "double resume" );
195216 break ;
196217 case MRB_FIBER_TERMINATED :
197- mrb_raise (mrb , E_FIBER_ERROR , "resuming dead fiber" );
218+ return fiber_error (mrb , "resuming dead fiber" );
198219 break ;
199220 default :
200221 break ;
@@ -206,7 +227,7 @@ fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mr
206227 mrb_value * b , * e ;
207228
208229 if (!c -> ci -> proc ) {
209- mrb_raise (mrb , E_FIBER_ERROR , "double resume (current)" );
230+ return fiber_error (mrb , "double resume (current)" );
210231 }
211232 if (vmexec ) {
212233 c -> ci -- ; /* pop dummy callinfo */
0 commit comments