summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-kernel-ext
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-08-30 19:33:56 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-09-01 07:00:54 +0900
commit8c296a3818763f77d8bd056ef3bb9da8d904a048 (patch)
treee3615332f1e0397486faea7c7239217428da9fe2 /mrbgems/mruby-kernel-ext
parent37a7ff228b4b8b5c0230ef5a80ba1312763d93f8 (diff)
downloadmruby-8c296a3818763f77d8bd056ef3bb9da8d904a048.tar.gz
mruby-8c296a3818763f77d8bd056ef3bb9da8d904a048.zip
object.c: remove `mrb_convert_to_integer()' function.
And merged to `mrb_f_integer()` which is only usage of the function.
Diffstat (limited to 'mrbgems/mruby-kernel-ext')
-rw-r--r--mrbgems/mruby-kernel-ext/src/kernel.c40
1 files changed, 37 insertions, 3 deletions
diff --git a/mrbgems/mruby-kernel-ext/src/kernel.c b/mrbgems/mruby-kernel-ext/src/kernel.c
index 17692a801..2d93e4fef 100644
--- a/mrbgems/mruby-kernel-ext/src/kernel.c
+++ b/mrbgems/mruby-kernel-ext/src/kernel.c
@@ -3,6 +3,8 @@
#include <mruby/array.h>
#include <mruby/hash.h>
#include <mruby/range.h>
+#include <mruby/string.h>
+#include <mruby/numeric.h>
#include <mruby/presym.h>
static mrb_value
@@ -107,11 +109,43 @@ mrb_f_method(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_f_integer(mrb_state *mrb, mrb_value self)
{
- mrb_value arg;
+ mrb_value val, tmp;
mrb_int base = 0;
- mrb_get_args(mrb, "o|i", &arg, &base);
- return mrb_convert_to_integer(mrb, arg, base);
+ mrb_get_args(mrb, "o|i", &val, &base);
+ if (mrb_nil_p(val)) {
+ if (base != 0) goto arg_error;
+ mrb_raise(mrb, E_TYPE_ERROR, "can't convert nil into Integer");
+ }
+ switch (mrb_type(val)) {
+#ifndef MRB_NO_FLOAT
+ case MRB_TT_FLOAT:
+ if (base != 0) goto arg_error;
+ return mrb_float_to_integer(mrb, val);
+#endif
+
+ case MRB_TT_INTEGER:
+ if (base != 0) goto arg_error;
+ return val;
+
+ case MRB_TT_STRING:
+ string_conv:
+ return mrb_str_to_inum(mrb, val, base, TRUE);
+
+ default:
+ break;
+ }
+ if (base != 0) {
+ tmp = mrb_obj_as_string(mrb, val);
+ if (mrb_string_p(tmp)) {
+ val = tmp;
+ goto string_conv;
+ }
+arg_error:
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "base specified for non string value");
+ }
+ /* to raise TypeError */
+ return mrb_to_int(mrb, val);
}
#ifndef MRB_NO_FLOAT