summaryrefslogtreecommitdiffhomepage
path: root/src/kernel.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-04-26 09:18:39 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-04-26 09:18:39 +0900
commitc99b72b20d3c3814248c9654c934a06e5dff96e5 (patch)
tree2b166e19616f3f114b4ad2f2838b028bd38b1e32 /src/kernel.c
parentfa0e41a84d472de9e37ae8ad609e94a1ab905c53 (diff)
parent09dad05a72661727fcef688d110220fc443e80f2 (diff)
downloadmruby-c99b72b20d3c3814248c9654c934a06e5dff96e5.tar.gz
mruby-c99b72b20d3c3814248c9654c934a06e5dff96e5.zip
Merge branch 'suppress_intern' of https://github.com/crimsonwoods/mruby into crimsonwoods-suppress_intern
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 e4d820f4a..637a7b952 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);