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 | d2403667fd954c7f331d1453d1330fa5bb997bbe (patch) | |
| tree | da51f25d928d2c8825aa66b1bf6c5f7880aa8e11 /eval.c | |
| parent | 8d4fda47e4867c2c8583ff396e21223a164dfb46 (diff) | |
| download | ruby-d2403667fd954c7f331d1453d1330fa5bb997bbe.tar.gz ruby-d2403667fd954c7f331d1453d1330fa5bb997bbe.tar.xz ruby-d2403667fd954c7f331d1453d1330fa5bb997bbe.zip | |
* 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: http://svn.ruby-lang.org/repos/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); |
