diff options
author | 卜部昌平 <shyouhei@ruby-lang.org> | 2019-09-05 23:50:45 +0900 |
---|---|---|
committer | 卜部昌平 <shyouhei@ruby-lang.org> | 2019-09-06 15:50:58 +0900 |
commit | a569bc09e25a2ba813d0bec1228d9ff65330a3db (patch) | |
tree | b8bb974a90c1d0685633c7ec6728b86b3dcaef99 /eval.c | |
parent | d6a94cffda6763c7ad3ac3830dcfe6a87e405fe4 (diff) | |
download | ruby-a569bc09e25a2ba813d0bec1228d9ff65330a3db.tar.gz |
add include/ruby/backward/cxxanyargs.hpp
Compilation of extension libraries written in C++ are reportedly
broken due to https://github.com/ruby/ruby/pull/2404
The root cause of this issue was that the definition of ANYARGS
differ between C and C++, and that of C++ is incompatible with the
updated ones.
We are using the incompatibility against itself. In C++ two distinct
function prototypes can be overloaded. We provide the old, ANYARGSed
prototypes in addition to the current granular ones; and let the
older ones warn about types.
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 18 |
1 files changed, 15 insertions, 3 deletions
@@ -948,12 +948,26 @@ VALUE rb_rescue2(VALUE (* b_proc) (VALUE), VALUE data1, VALUE (* r_proc) (VALUE, VALUE), VALUE data2, ...) { + va_list ap; + va_start(ap, data2); + return rb_vrescue2(b_proc, data1, r_proc, data2, ap); + va_end(ap); +} + +/*! + * \copydoc rb_rescue2 + * \param[in] args exception classes, terminated by 0. + */ +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) { @@ -976,14 +990,12 @@ rb_rescue2(VALUE (* b_proc) (VALUE), VALUE data1, 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; |