From 20cecf1d33abfb1cf114b2e313d7de0ce444a0d4 Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 26 Jun 2015 08:57:45 +0000 Subject: object.c: common prefix of converter methods * object.c (convert_type): check common prefix of converter method names first. shrink conv_method_names. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51039 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- object.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'object.c') diff --git a/object.c b/object.c index 685757987f..86468ca4e1 100644 --- a/object.c +++ b/object.c @@ -2557,10 +2557,10 @@ rb_mod_singleton_p(VALUE klass) } static const struct conv_method_tbl { - const char method[8]; - ID id; + const char method[6]; + unsigned short id; } conv_method_names[] = { -#define M(n) {"to_"#n, idTo_##n} +#define M(n) {#n, (unsigned short)idTo_##n} M(int), M(ary), M(str), @@ -2581,12 +2581,16 @@ convert_type(VALUE val, const char *tname, const char *method, int raise) ID m = 0; int i; VALUE r; - - for (i=0; i < numberof(conv_method_names); i++) { - if (conv_method_names[i].method[0] == method[0] && - strcmp(conv_method_names[i].method, method) == 0) { - m = conv_method_names[i].id; - break; + static const char prefix[] = "to_"; + + if (strncmp(prefix, method, sizeof(prefix)-1) == 0) { + const char *const meth = &method[sizeof(prefix)-1]; + for (i=0; i < numberof(conv_method_names); i++) { + if (conv_method_names[i].method[0] == meth[0] && + strcmp(conv_method_names[i].method, meth) == 0) { + m = conv_method_names[i].id; + break; + } } } if (!m) m = rb_intern(method); -- cgit v1.2.3