summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-02-05 14:20:58 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2019-02-06 22:07:11 +0900
commit905fef2669f4dd0efb71205219872d9fb4b135b6 (patch)
tree2007829229cf4eaad06041d0f9c69e90aa4911cf
parent02fbb2c21134ad0e8df0b723a4b11f7d7e21edcd (diff)
downloadmruby-905fef2669f4dd0efb71205219872d9fb4b135b6.tar.gz
mruby-905fef2669f4dd0efb71205219872d9fb4b135b6.zip
Reduce invocation of `mrb_convert_type()` from `mrb_str_to_str()`.
-rw-r--r--src/class.c2
-rw-r--r--src/string.c14
2 files changed, 13 insertions, 3 deletions
diff --git a/src/class.c b/src/class.c
index dd5b65cc3..359bb4fea 100644
--- a/src/class.c
+++ b/src/class.c
@@ -1815,7 +1815,7 @@ mrb_define_alias(mrb_state *mrb, struct RClass *klass, const char *name1, const
* show information on the thing we're attached to as well.
*/
-static mrb_value
+mrb_value
mrb_mod_to_s(mrb_state *mrb, mrb_value klass)
{
mrb_value str;
diff --git a/src/string.c b/src/string.c
index d26d6f4c9..19962fb30 100644
--- a/src/string.c
+++ b/src/string.c
@@ -20,6 +20,7 @@
#include <mruby/class.h>
#include <mruby/range.h>
#include <mruby/string.h>
+#include <mruby/numeric.h>
#include <mruby/re.h>
typedef struct mrb_shared_string {
@@ -972,13 +973,22 @@ mrb_str_equal_m(mrb_state *mrb, mrb_value str1)
return mrb_bool_value(mrb_str_equal(mrb, str1, str2));
}
/* ---------------------------------- */
+mrb_value mrb_mod_to_s(mrb_state *mrb, mrb_value klass);
+
MRB_API mrb_value
mrb_str_to_str(mrb_state *mrb, mrb_value str)
{
- if (!mrb_string_p(str)) {
+ switch (mrb_type(str)) {
+ case MRB_TT_STRING:
+ return str;
+ case MRB_TT_FIXNUM:
+ return mrb_fixnum_to_str(mrb, str, 10);
+ case MRB_TT_CLASS:
+ case MRB_TT_MODULE:
+ return mrb_mod_to_s(mrb, str);
+ default:
return mrb_convert_type(mrb, str, MRB_TT_STRING, "String", "to_s");
}
- return str;
}
MRB_API const char*