summaryrefslogtreecommitdiffhomepage
path: root/src/kernel.c
diff options
context:
space:
mode:
authorcrimsonwoods <[email protected]>2013-04-25 15:56:53 +0900
committercrimsonwoods <[email protected]>2013-04-25 15:56:53 +0900
commit09dad05a72661727fcef688d110220fc443e80f2 (patch)
treeac2188e18d833bfb4fae83598784e12abfb1068d /src/kernel.c
parenta517a7f314efcdeb5dec306d0ccab6084cf2a439 (diff)
downloadmruby-09dad05a72661727fcef688d110220fc443e80f2.tar.gz
mruby-09dad05a72661727fcef688d110220fc443e80f2.zip
suppress intern inside of 'respond_to?'.
Diffstat (limited to 'src/kernel.c')
-rw-r--r--src/kernel.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/kernel.c b/src/kernel.c
index 5ce5669c3..222a9ab6b 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -966,15 +966,35 @@ obj_respond_to(mrb_state *mrb, mrb_value self)
int argc;
mrb_value mid, priv;
mrb_sym id, rtm_id;
- mrb_bool respond_to_p;
+ mrb_bool respond_to_p = TRUE;
mrb_get_args(mrb, "*", &argv, &argc);
mid = argv[0];
if (argc > 1) priv = argv[1];
else priv = mrb_nil_value();
- id = mrb_to_id(mrb, mid);
- respond_to_p = basic_obj_respond_to(mrb, self, id, !mrb_test(priv));
+ if (mrb_symbol_p(mid)) {
+ id = mrb_symbol(mid);
+ } else {
+ mrb_value tmp;
+ if (!mrb_string_p(mid)) {
+ tmp = mrb_check_string_type(mrb, mid);
+ if (mrb_nil_p(tmp)) {
+ tmp = mrb_inspect(mrb, mid);
+ mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", tmp);
+ }
+ }
+ tmp = mrb_str_interned(mrb, mid);
+ if (mrb_nil_p(tmp)) {
+ respond_to_p = FALSE;
+ } else {
+ id = mrb_intern_str(mrb, mid);
+ }
+ }
+
+ if (respond_to_p) {
+ respond_to_p = basic_obj_respond_to(mrb, self, id, !mrb_test(priv));
+ }
if (!respond_to_p) {
rtm_id = mrb_intern2(mrb, "respond_to_missing?", 19);