cont.c: replace "GetFooPtr" macros with "foo_ptr" functions

Following ko1's lead in r59192, this gets rid of non-obvious
assignments which happen inside macros.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64489 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
normal 2018-08-21 01:01:37 +00:00
parent 7e5423b8e7
commit 383d7dba12

45
cont.c
View File

@ -281,13 +281,26 @@ static VALUE rb_cContinuation;
static VALUE rb_cFiber; static VALUE rb_cFiber;
static VALUE rb_eFiberError; static VALUE rb_eFiberError;
#define GetContPtr(obj, ptr) \ static rb_context_t *
TypedData_Get_Struct((obj), rb_context_t, &cont_data_type, (ptr)) cont_ptr(VALUE obj)
{
rb_context_t *cont;
#define GetFiberPtr(obj, ptr) do {\ TypedData_Get_Struct(obj, rb_context_t, &cont_data_type, cont);
TypedData_Get_Struct((obj), rb_fiber_t, &fiber_data_type, (ptr)); \
if (!(ptr)) rb_raise(rb_eFiberError, "uninitialized fiber"); \ return cont;
} while (0) }
static rb_fiber_t *
fiber_ptr(VALUE obj)
{
rb_fiber_t *fib;
TypedData_Get_Struct(obj, rb_fiber_t, &fiber_data_type, fib);
if (!fib) rb_raise(rb_eFiberError, "uninitialized fiber");
return fib;
}
NOINLINE(static VALUE cont_capture(volatile int *volatile stat)); NOINLINE(static VALUE cont_capture(volatile int *volatile stat));
@ -1251,9 +1264,8 @@ rollback_ensure_stack(VALUE self,rb_ensure_list_t *current,rb_ensure_entry_t *ta
static VALUE static VALUE
rb_cont_call(int argc, VALUE *argv, VALUE contval) rb_cont_call(int argc, VALUE *argv, VALUE contval)
{ {
rb_context_t *cont; rb_context_t *cont = cont_ptr(contval);
rb_thread_t *th = GET_THREAD(); rb_thread_t *th = GET_THREAD();
GetContPtr(contval, cont);
if (cont_thread_value(cont) != th->self) { if (cont_thread_value(cont) != th->self) {
rb_raise(rb_eRuntimeError, "continuation called across threads"); rb_raise(rb_eRuntimeError, "continuation called across threads");
@ -1741,9 +1753,7 @@ fiber_switch(rb_fiber_t *fib, int argc, const VALUE *argv, int is_resume)
VALUE VALUE
rb_fiber_transfer(VALUE fibval, int argc, const VALUE *argv) rb_fiber_transfer(VALUE fibval, int argc, const VALUE *argv)
{ {
rb_fiber_t *fib; return fiber_switch(fiber_ptr(fibval), argc, argv, 0);
GetFiberPtr(fibval, fib);
return fiber_switch(fib, argc, argv, 0);
} }
void void
@ -1794,8 +1804,7 @@ rb_fiber_terminate(rb_fiber_t *fib, int need_interrupt)
VALUE VALUE
rb_fiber_resume(VALUE fibval, int argc, const VALUE *argv) rb_fiber_resume(VALUE fibval, int argc, const VALUE *argv)
{ {
rb_fiber_t *fib; rb_fiber_t *fib = fiber_ptr(fibval);
GetFiberPtr(fibval, fib);
if (fib->prev != 0 || fib->cont.type == ROOT_FIBER_CONTEXT) { if (fib->prev != 0 || fib->cont.type == ROOT_FIBER_CONTEXT) {
rb_raise(rb_eFiberError, "double resume"); rb_raise(rb_eFiberError, "double resume");
@ -1835,9 +1844,7 @@ rb_fiber_reset_root_local_storage(VALUE thval)
VALUE VALUE
rb_fiber_alive_p(VALUE fibval) rb_fiber_alive_p(VALUE fibval)
{ {
const rb_fiber_t *fib; return FIBER_TERMINATED_P(fiber_ptr(fibval)) ? Qfalse : Qtrue;
GetFiberPtr(fibval, fib);
return FIBER_TERMINATED_P(fib) ? Qfalse : Qtrue;
} }
/* /*
@ -1909,8 +1916,7 @@ rb_fiber_m_resume(int argc, VALUE *argv, VALUE fib)
static VALUE static VALUE
rb_fiber_m_transfer(int argc, VALUE *argv, VALUE fibval) rb_fiber_m_transfer(int argc, VALUE *argv, VALUE fibval)
{ {
rb_fiber_t *fib; rb_fiber_t *fib = fiber_ptr(fibval);
GetFiberPtr(fibval, fib);
fib->transferred = 1; fib->transferred = 1;
return fiber_switch(fib, argc, argv, 0); return fiber_switch(fib, argc, argv, 0);
} }
@ -1956,11 +1962,10 @@ rb_fiber_s_current(VALUE klass)
static VALUE static VALUE
fiber_to_s(VALUE fibval) fiber_to_s(VALUE fibval)
{ {
const rb_fiber_t *fib; const rb_fiber_t *fib = fiber_ptr(fibval);
const rb_proc_t *proc; const rb_proc_t *proc;
char status_info[0x10]; char status_info[0x10];
GetFiberPtr(fibval, fib);
snprintf(status_info, 0x10, " (%s)", fiber_status_name(fib->status)); snprintf(status_info, 0x10, " (%s)", fiber_status_name(fib->status));
if (!rb_obj_is_proc(fib->first_proc)) { if (!rb_obj_is_proc(fib->first_proc)) {
VALUE str = rb_any_to_s(fibval); VALUE str = rb_any_to_s(fibval);