mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
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
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user