Files
mruby-mruby/mrbgems/mruby-method
dearblue 4c196dcdaa Reorganize mcall() in mruby-method.
Use `mrb_exec_irep()`. If possible, re-entry into the VM will be suppressed.

Note that due to the effect of being a tail-call, the backtrace of `Method#call` will be lost, and it will look as if the target method was called directly.

This change fixes the problem of infinite loops when redefining methods that make block calls using `mruby-method`.

```console
% bin/mruby -e 'mm = method(:proc); define_method(:proc, ->(*a, &b) { mm.call(*a, &b) }); p proc { 1 }'
trace (most recent call last):
        [257] -e:1
        [256] -e:1:in proc
        [255] -e:1:in proc
        ...SNIP...
        [1] -e:1:in proc
-e:1:in proc: stack level too deep (SystemStackError)
```
2021-04-03 21:20:59 +09:00
..
2021-04-03 21:20:59 +09:00
2017-12-18 10:54:37 +09:00
2021-03-09 04:35:03 +10:00

mruby-method

An implementation of class Method and UnboundMethod for mruby

p Enumerable.instance_method(:find_all).source_location
#=> ["mruby/mruby/mrblib/enum.rb", 148]

Note

You need to enable debug option in your build configuration to use source_location method in this gem, for example:

MRuby::Build.new do |conf|
  conf.enable_debug
end

Supported Methods

Kernel

  • Kernel#method
  • Kernel#singleton_method

Module

  • Module#instance_method

Method class

  • Method#name
  • Method#call
  • Method#super_method
  • Method#arity
  • Method#unbind
  • Method#[]
  • Method#owner
  • Method#receiver
  • Method#parameters
  • Method#source_location
  • Method#to_proc

UnboundMethod class

  • UnboundMethod#name
  • UnboundMethod#bind
  • UnboundMethod#super_method
  • UnboundMethod#arity
  • UnboundMethod#owner
  • UnboundMethod#parameters
  • UnboundMethod#source_location

See also