summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-error
diff options
context:
space:
mode:
authortake_cheeze <[email protected]>2015-06-22 10:49:37 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2015-07-15 14:47:15 +0900
commitf6b5a829729479d4ae557effc15656605ca71781 (patch)
tree9127017d099a8e35fcbb30582c60f3f38fd57f20 /mrbgems/mruby-error
parentcdd72d9c3783749c979edf62522cf9636681538d (diff)
downloadmruby-f6b5a829729479d4ae557effc15656605ca71781.tar.gz
mruby-f6b5a829729479d4ae557effc15656605ca71781.zip
Use class array instead of variadic.
Diffstat (limited to 'mrbgems/mruby-error')
-rw-r--r--mrbgems/mruby-error/src/exception.c14
-rw-r--r--mrbgems/mruby-error/test/exception.c4
2 files changed, 9 insertions, 9 deletions
diff --git a/mrbgems/mruby-error/src/exception.c b/mrbgems/mruby-error/src/exception.c
index abd03bc29..7199e0801 100644
--- a/mrbgems/mruby-error/src/exception.c
+++ b/mrbgems/mruby-error/src/exception.c
@@ -1,4 +1,3 @@
-#include <stdarg.h>
#include "mruby.h"
#include "mruby/throw.h"
#include "mruby/error.h"
@@ -52,18 +51,19 @@ MRB_API mrb_value
mrb_rescue(mrb_state *mrb, mrb_func_t body, mrb_value b_data,
mrb_func_t rescue, mrb_value r_data)
{
- return mrb_rescue_exceptions(mrb, body, b_data, rescue, r_data, mrb->eStandardError_class, NULL);
+ return mrb_rescue_exceptions(mrb, body, b_data, rescue, r_data, 1, &mrb->eStandardError_class);
}
MRB_API mrb_value
-mrb_rescue_exceptions(mrb_state *mrb, mrb_func_t body, mrb_value b_data, mrb_func_t rescue, mrb_value r_data, ...)
+mrb_rescue_exceptions(mrb_state *mrb, mrb_func_t body, mrb_value b_data, mrb_func_t rescue, mrb_value r_data,
+ mrb_int len, struct RClass **classes)
{
struct mrb_jmpbuf *prev_jmp = mrb->jmp;
struct mrb_jmpbuf c_jmp;
mrb_value result;
- va_list excs;
struct RClass *cls;
mrb_bool error_matched = FALSE;
+ mrb_int i;
MRB_TRY(&c_jmp) {
mrb->jmp = &c_jmp;
@@ -72,14 +72,12 @@ mrb_rescue_exceptions(mrb_state *mrb, mrb_func_t body, mrb_value b_data, mrb_fun
} MRB_CATCH(&c_jmp) {
mrb->jmp = prev_jmp;
- va_start(excs, r_data);
- while((cls = va_arg(excs, struct RClass*))) {
- if (mrb_obj_is_kind_of(mrb, mrb_obj_value(mrb->exc), cls)) {
+ for (i = 0; i < len; ++i) {
+ if (mrb_obj_is_kind_of(mrb, mrb_obj_value(mrb->exc), classes[i])) {
error_matched = TRUE;
break;
}
}
- va_end(excs);
if (!error_matched) { MRB_THROW(mrb->jmp); }
diff --git a/mrbgems/mruby-error/test/exception.c b/mrbgems/mruby-error/test/exception.c
index 7c15fb457..2a943aaae 100644
--- a/mrbgems/mruby-error/test/exception.c
+++ b/mrbgems/mruby-error/test/exception.c
@@ -40,8 +40,10 @@ static mrb_value
run_rescue_exceptions(mrb_state *mrb, mrb_value self)
{
mrb_value b, r;
+ struct RClass *cls[1];
mrb_get_args(mrb, "oo", &b, &r);
- return mrb_rescue_exceptions(mrb, protect_cb, b, protect_cb, r, E_TYPE_ERROR, NULL);
+ cls[0] = E_TYPE_ERROR;
+ return mrb_rescue_exceptions(mrb, protect_cb, b, protect_cb, r, 1, cls);
}
void