Skip to content

Commit 3a0e225

Browse files
authored
Merge pull request mruby#5857 from dearblue/avoid-abort-resume
Avoid `abort()` when exception occurs in `mrb_fiber_resume()`
2 parents 9c5dc42 + f0a65ec commit 3a0e225

1 file changed

Lines changed: 25 additions & 4 deletions

File tree

mrbgems/mruby-fiber/src/fiber.c

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
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(...)` */
176197
static mrb_value
177198
fiber_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

Comments
 (0)