Overload rb_protect

To use rb_protect you have to wrap the function you want to protect so it
accepts a single VALUE parameter. Would it not make sense to overload
rb_protect, so it could protect the three normal signatures for ruby
methods, ie:

  1. VALUE func(VALUE self[, VALUE arg1, VALUE arg2, …]);
  2. VALUE func(int argc, VALUE *argv, VALUE self);
  3. VALUE func(VALUE self, VALUE args);

The existing rb_protect(VALUE (*proc)(VALUE), VALUE data, int *state)
matches the third of the common signatures, so if

VALUE rb_protect2(int *state, VALUE (*proc)(ANYARGS), VALUE self, …);

and

VALUE rb_protect3(int *state, VALUE (proc)(int, VALUE, VALUE), int argc,
VALUE *argv, VALUE self);

were added it would be easier to do exception handling in C. Doesn’t that
make good sense? Or maybe rb_protect could be macroized, so you could do
something like

RB_EXCEPTION_INIT // declare int exception_state among other things
RB_TRY
… do something that you want to protect here
RB_RESCUE
… examine exception_state here

Hm, okay, maybe not :slight_smile:

Thomas