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:
- VALUE func(VALUE self[, VALUE arg1, VALUE arg2, …]);
- VALUE func(int argc, VALUE *argv, VALUE self);
- 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
Thomas