From 3e7d002118a92fad5934e11c75be6768a1476c1b Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 11 Jul 2019 19:20:53 +0900 Subject: Check exception flag as a bool [Bug #15987] --- object.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) (limited to 'object.c') diff --git a/object.c b/object.c index 3fc1ed9df3..6b7a8f2952 100644 --- a/object.c +++ b/object.c @@ -3330,18 +3330,31 @@ rb_Integer(VALUE val) return rb_convert_to_integer(val, 0, TRUE); } -static int -opts_exception_p(VALUE opts) +int +rb_bool_expected(VALUE obj, const char *flagname) { - static ID kwds[1]; - VALUE exception; - if (!kwds[0]) { - kwds[0] = idException; + switch (obj) { + case Qtrue: case Qfalse: + break; + default: + rb_raise(rb_eArgError, "true or false is expected as %s: %+"PRIsVALUE, + flagname, obj); } - rb_get_kwargs(opts, kwds, 0, 1, &exception); - return exception != Qfalse; + return obj != Qfalse; +} + +int +rb_opts_exception_p(VALUE opts, int default_value) +{ + static ID kwds[1] = {idException}; + VALUE exception; + if (rb_get_kwargs(opts, kwds, 0, 1, &exception)) + return rb_bool_expected(exception, "exception"); + return default_value; } +#define opts_exception_p(opts) rb_opts_exception_p((opts), TRUE) + /* * call-seq: * Integer(arg, base=0, exception: true) -> integer or nil -- cgit v1.2.3