diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-11-19 14:42:45 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-11-19 14:42:45 +0000 |
commit | 04f27f5e8ddbbc06544d96df4097e0300685a1cc (patch) | |
tree | da51f25d928d2c8825aa66b1bf6c5f7880aa8e11 /eval.c | |
parent | df96f994f1a224070ffaa61eb2bcb969d0109246 (diff) |
* eval.c (rb_mod_modfunc): should follow NODE_ZSUPER link; based
on Guy Decoux's patch in [ruby-talk:25478].
* string.c (rb_str_succ): there was buffer overrun.
* parse.y (str_extend): term can be any character.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1847 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 14 |
1 files changed, 11 insertions, 3 deletions
@@ -5679,10 +5679,18 @@ rb_mod_modfunc(argc, argv, module) set_method_visibility(module, argc, argv, NOEX_PRIVATE); for (i=0; i<argc; i++) { + VALUE m = module; + id = rb_to_id(argv[i]); - body = search_method(module, id, 0); - if (body == 0 || body->nd_body == 0) { - rb_bug("undefined method `%s'; can't happen", rb_id2name(id)); + for (;;) { + body = search_method(m, id, &m); + if (body == 0 || body->nd_body == 0) { + rb_bug("undefined method `%s'; can't happen", rb_id2name(id)); + } + if (nd_type(body->nd_body) != NODE_ZSUPER) { + break; /* normal case: need not to follow 'super' link */ + } + m = RCLASS(m)->super; } rb_add_method(rb_singleton_class(module), id, body->nd_body, NOEX_PUBLIC); rb_clear_cache_by_id(id); |