1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

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
This commit is contained in:
nobu 2015-06-26 08:57:45 +00:00
parent e3815c4724
commit 20cecf1d33

View file

@ -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;
static const char prefix[] = "to_";
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;
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);