Bug #17305 ยป 0001-Fix-rb_rescue2-when-called-with-non-module.patch
eval.c | ||
---|---|---|
}
|
||
}
|
||
/*! An equivalent of \c rescue clause.
|
||
*
|
||
* Equivalent to <code>begin .. rescue err_type .. end</code>
|
||
*
|
||
* \param[in] b_proc a function which potentially raises an exception.
|
||
* \param[in] data1 the argument of \a b_proc
|
||
* \param[in] r_proc a function which rescues an exception in \a b_proc.
|
||
* \param[in] data2 the first argument of \a r_proc
|
||
* \param[in] ... 1 or more exception classes. Must be terminated by \c (VALUE)0.
|
||
*
|
||
* First it calls the function \a b_proc, with \a data1 as the argument.
|
||
* When \a b_proc raises an exception, it calls \a r_proc with \a data2 and
|
||
* the exception object if the exception is a kind of one of the given
|
||
* exception classes.
|
||
*
|
||
* \return the return value of \a b_proc if no exception occurs,
|
||
* or the return value of \a r_proc if otherwise.
|
||
* \sa rb_rescue
|
||
* \sa rb_ensure
|
||
* \sa rb_protect
|
||
* \ingroup exception
|
||
/*!
|
||
* \copydoc rb_rescue2
|
||
* \param[in] args exception classes, terminated by 0.
|
||
*/
|
||
VALUE
|
||
rb_rescue2(VALUE (* b_proc) (ANYARGS), VALUE data1,
|
||
VALUE (* r_proc) (ANYARGS), VALUE data2, ...)
|
||
static VALUE
|
||
rb_vrescue2(VALUE (* b_proc) (VALUE), VALUE data1,
|
||
VALUE (* r_proc) (VALUE, VALUE), VALUE data2,
|
||
va_list args)
|
||
{
|
||
enum ruby_tag_type state;
|
||
rb_execution_context_t * volatile ec = GET_EC();
|
||
rb_control_frame_t *volatile cfp = ec->cfp;
|
||
volatile VALUE result = Qfalse;
|
||
volatile VALUE e_info = ec->errinfo;
|
||
va_list args;
|
||
EC_PUSH_TAG(ec);
|
||
if ((state = EC_EXEC_TAG()) == TAG_NONE) {
|
||
... | ... | |
int handle = FALSE;
|
||
VALUE eclass;
|
||
va_init_list(args, data2);
|
||
while ((eclass = va_arg(args, VALUE)) != 0) {
|
||
if (rb_obj_is_kind_of(ec->errinfo, eclass)) {
|
||
handle = TRUE;
|
||
break;
|
||
}
|
||
}
|
||
va_end(args);
|
||
if (handle) {
|
||
result = Qnil;
|
||
... | ... | |
return result;
|
||
}
|
||
/*! An equivalent of \c rescue clause.
|
||
*
|
||
* Equivalent to <code>begin .. rescue err_type .. end</code>
|
||
*
|
||
* \param[in] b_proc a function which potentially raises an exception.
|
||
* \param[in] data1 the argument of \a b_proc
|
||
* \param[in] r_proc a function which rescues an exception in \a b_proc.
|
||
* \param[in] data2 the first argument of \a r_proc
|
||
* \param[in] ... 1 or more exception classes. Must be terminated by \c (VALUE)0.
|
||
*
|
||
* First it calls the function \a b_proc, with \a data1 as the argument.
|
||
* When \a b_proc raises an exception, it calls \a r_proc with \a data2 and
|
||
* the exception object if the exception is a kind of one of the given
|
||
* exception classes.
|
||
*
|
||
* \return the return value of \a b_proc if no exception occurs,
|
||
* or the return value of \a r_proc if otherwise.
|
||
* \sa rb_rescue
|
||
* \sa rb_ensure
|
||
* \sa rb_protect
|
||
* \ingroup exception
|
||
*/
|
||
VALUE
|
||
rb_rescue2(VALUE (* b_proc) (ANYARGS), VALUE data1,
|
||
VALUE (* r_proc) (ANYARGS), VALUE data2, ...)
|
||
{
|
||
va_list ap;
|
||
va_start(ap, data2);
|
||
return rb_vrescue2(b_proc, data1, r_proc, data2, ap);
|
||
va_end(ap);
|
||
}
|
||
/*! An equivalent of \c rescue clause.
|
||
*
|
||
* Equivalent to <code>begin .. rescue .. end</code>.
|