diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-04-26 09:18:39 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-04-26 09:18:39 +0900 |
| commit | c99b72b20d3c3814248c9654c934a06e5dff96e5 (patch) | |
| tree | 2b166e19616f3f114b4ad2f2838b028bd38b1e32 /src/kernel.c | |
| parent | fa0e41a84d472de9e37ae8ad609e94a1ab905c53 (diff) | |
| parent | 09dad05a72661727fcef688d110220fc443e80f2 (diff) | |
| download | mruby-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.c | 26 |
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); |
