summaryrefslogtreecommitdiff
path: root/object.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-07-11 19:20:53 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-07-11 20:04:29 +0900
commit3e7d002118a92fad5934e11c75be6768a1476c1b (patch)
treee9f437327b5c743622a97c092ddadc2d99cb0bc5 /object.c
parentcd069df36596d9bf7a6db8aaa0dcefdafb233a91 (diff)
Check exception flag as a bool [Bug #15987]
Diffstat (limited to 'object.c')
-rw-r--r--object.c29
1 files changed, 21 insertions, 8 deletions
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