diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-12-20 15:53:37 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-12-20 19:37:26 +0900 |
| commit | 165e7b181b8a238aa546bd78b0baef1312e7000f (patch) | |
| tree | 99e7b23363d7f1c3985da85402a79cb30d3888cd | |
| parent | d0f60182af9114f6840d993d74f492e483302805 (diff) | |
| download | mruby-165e7b181b8a238aa546bd78b0baef1312e7000f.tar.gz mruby-165e7b181b8a238aa546bd78b0baef1312e7000f.zip | |
Fixed method look-up for `method_missing` in OP_SUPER; ref #3905
Method look-up for `OP_SUPER` should start from the superclass of
the `target_class` but if it fails, the look-up for `method_missing`
should start from the class of the receiver.
The following code explains the case:
```ruby
class Bar
def foo
super
end
end
class Foo<Bar
def method_missing(mid, *)
p mid
end
end
```
Foo.new.foo
| -rw-r--r-- | src/vm.c | 4 |
1 files changed, 4 insertions, 0 deletions
@@ -1619,6 +1619,10 @@ RETRY_TRY_BLOCK: m = mrb_method_search_vm(mrb, &c, mid); if (MRB_METHOD_UNDEF_P(m)) { mrb_sym missing = mrb_intern_lit(mrb, "method_missing"); + + if (mid != missing) { + c = mrb_class(mrb, recv); + } m = mrb_method_search_vm(mrb, &c, missing); if (MRB_METHOD_UNDEF_P(m)) { mrb_value args = (argc < 0) ? regs[a+1] : mrb_ary_new_from_values(mrb, n, regs+a+1); |
