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:
parent
e3815c4724
commit
20cecf1d33
1 changed files with 12 additions and 8 deletions
20
object.c
20
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;
|
||||
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);
|
||||
|
|
Loading…
Reference in a new issue