Skip to content

Commit

Permalink
rb_catch_protect() accepts enum ruby_tag_type *.
Browse files Browse the repository at this point in the history
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59157 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
ko1 committed Jun 23, 2017
1 parent 769ef81 commit a90c696
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 25 deletions.
1 change: 0 additions & 1 deletion internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -1740,7 +1740,6 @@ typedef void rb_check_funcall_hook(int, VALUE, ID, int, const VALUE *, VALUE);
VALUE rb_check_funcall_with_hook(VALUE recv, ID mid, int argc, const VALUE *argv,
rb_check_funcall_hook *hook, VALUE arg);
VALUE rb_check_funcall_default(VALUE, ID, int, const VALUE *, VALUE);
VALUE rb_catch_protect(VALUE t, rb_block_call_func *func, VALUE data, int *stateptr);
VALUE rb_yield_1(VALUE val);
VALUE rb_yield_force_blockarg(VALUE values);

Expand Down
8 changes: 4 additions & 4 deletions thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -4689,22 +4689,22 @@ exec_recursive(VALUE (*func) (VALUE, VALUE, int), VALUE obj, VALUE pairid, VALUE
return (*func)(obj, arg, TRUE);
}
else {
enum ruby_tag_type state;

p.func = func;

if (outermost) {
int state;
recursive_push(p.list, ID2SYM(recursive_key), 0);
recursive_push(p.list, p.objid, p.pairid);
result = rb_catch_protect(p.list, exec_recursive_i, (VALUE)&p, &state);
if (!recursive_pop(p.list, p.objid, p.pairid)) goto invalid;
if (!recursive_pop(p.list, ID2SYM(recursive_key), 0)) goto invalid;
if (state) JUMP_TAG(state);
if (state != TAG_NONE) JUMP_TAG(state);
if (result == p.list) {
result = (*func)(obj, arg, TRUE);
}
}
else {
enum ruby_tag_type state;
volatile VALUE ret = Qundef;
recursive_push(p.list, p.objid, p.pairid);
PUSH_TAG();
Expand All @@ -4718,7 +4718,7 @@ exec_recursive(VALUE (*func) (VALUE, VALUE, int), VALUE obj, VALUE pairid, VALUE
"for %+"PRIsVALUE" in %+"PRIsVALUE,
sym, rb_thread_current());
}
if (state) JUMP_TAG(state);
if (state != TAG_NONE) JUMP_TAG(state);
result = ret;
}
}
Expand Down
2 changes: 2 additions & 0 deletions vm_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -1537,6 +1537,8 @@ const rb_callable_method_entry_t *rb_vm_frame_method_entry(const rb_control_fram
#define CHECK_VM_STACK_OVERFLOW(cfp, margin) \
WHEN_VM_STACK_OVERFLOWED(cfp, (cfp)->sp, margin) vm_stackoverflow()

VALUE rb_catch_protect(VALUE t, rb_block_call_func *func, VALUE data, enum ruby_tag_type *stateptr);

/* for thread */

#if RUBY_VM_THREAD_MODEL == 2
Expand Down
37 changes: 17 additions & 20 deletions vm_eval.c
Original file line number Diff line number Diff line change
Expand Up @@ -1958,28 +1958,9 @@ rb_catch(const char *tag, VALUE (*func)(), VALUE data)
return rb_catch_obj(vtag, func, data);
}

static VALUE vm_catch_protect(VALUE, rb_block_call_func *, VALUE, int *, rb_thread_t *volatile);

VALUE
rb_catch_obj(VALUE t, VALUE (*func)(), VALUE data)
{
int state;
rb_thread_t *th = GET_THREAD();
VALUE val = vm_catch_protect(t, (rb_block_call_func *)func, data, &state, th);
if (state)
TH_JUMP_TAG(th, state);
return val;
}

VALUE
rb_catch_protect(VALUE t, rb_block_call_func *func, VALUE data, int *stateptr)
{
return vm_catch_protect(t, func, data, stateptr, GET_THREAD());
}

static VALUE
vm_catch_protect(VALUE tag, rb_block_call_func *func, VALUE data,
int *stateptr, rb_thread_t *volatile th)
enum ruby_tag_type *stateptr, rb_thread_t *volatile th)
{
enum ruby_tag_type state;
VALUE val = Qnil; /* OK */
Expand All @@ -2006,6 +1987,22 @@ vm_catch_protect(VALUE tag, rb_block_call_func *func, VALUE data,
return val;
}

VALUE
rb_catch_protect(VALUE t, rb_block_call_func *func, VALUE data, enum ruby_tag_type *stateptr)
{
return vm_catch_protect(t, func, data, stateptr, GET_THREAD());
}

VALUE
rb_catch_obj(VALUE t, VALUE (*func)(), VALUE data)
{
enum ruby_tag_type state;
rb_thread_t *th = GET_THREAD();
VALUE val = vm_catch_protect(t, (rb_block_call_func *)func, data, &state, th);
if (state) TH_JUMP_TAG(th, state);
return val;
}

static void
local_var_list_init(struct local_var_list *vars)
{
Expand Down

0 comments on commit a90c696

Please sign in to comment.