diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-08-30 16:07:59 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-08-30 22:30:36 +0900 |
| commit | e471d37ca5f1422860a1eaa81d4c9f1b3c8b6aed (patch) | |
| tree | 9f474e50d1dd921abe1e2611fd33e9e03825d191 /mrbgems/mruby-method | |
| parent | 75a01af710309e4fc53db285c9018e233c61cb56 (diff) | |
| download | mruby-e471d37ca5f1422860a1eaa81d4c9f1b3c8b6aed.tar.gz mruby-e471d37ca5f1422860a1eaa81d4c9f1b3c8b6aed.zip | |
Separate meta-programming features to `mruby-metaprog` gem.
We assume meta-programming is less used in embedded environments.
We have moved following methods:
* Kernel module
global_variables, local_variables, singleton_class,
instance_variables, instance_variables_defined?, instance_variable_get,
instance_variable_set, methods, private_methods, public_methods,
protected_methods, singleton_methods, define_singleton_methods
* Module class
class_variables, class_variables_defined?, class_variable_get,
class_variable_set, remove_class_variable, included_modules,
instance_methods, remove_method, method_removed, constants
* Module class methods
constants, nesting
Note:
Following meta-programming methods are kept in the core:
* Module class
alias_method, undef_method, ancestors, const_defined?, const_get,
const_set, remove_const, method_defined?, define_method
* Toplevel object
define_method
`mruby-metaprog` gem is linked by default (specified in default.gembox).
When it is removed, it will save 40KB (stripped:8KB) on x86-64
environment last time I measured.
Diffstat (limited to 'mrbgems/mruby-method')
| -rw-r--r-- | mrbgems/mruby-method/mrblib/kernel.rb | 5 | ||||
| -rw-r--r-- | mrbgems/mruby-method/test/method.rb | 12 |
2 files changed, 10 insertions, 7 deletions
diff --git a/mrbgems/mruby-method/mrblib/kernel.rb b/mrbgems/mruby-method/mrblib/kernel.rb index b2ebd45ea..2efc93f37 100644 --- a/mrbgems/mruby-method/mrblib/kernel.rb +++ b/mrbgems/mruby-method/mrblib/kernel.rb @@ -1,8 +1,9 @@ module Kernel def singleton_method(name) m = method(name) - if m.owner != singleton_class - raise NameError, "undefined method `#{name}' for class `#{singleton_class}'" + sc = (class <<self; self; end) + if m.owner != sc + raise NameError, "undefined method `#{name}' for class `#{sc}'" end m end diff --git a/mrbgems/mruby-method/test/method.rb b/mrbgems/mruby-method/test/method.rb index b229a4560..eb5f48341 100644 --- a/mrbgems/mruby-method/test/method.rb +++ b/mrbgems/mruby-method/test/method.rb @@ -149,7 +149,7 @@ assert 'Method#source_location' do assert_equal [filename, lineno], klass.new.method(:find_me_if_you_can).source_location lineno = __LINE__ + 1 - klass.define_singleton_method(:s_find_me_if_you_can) {} + class <<klass; define_method(:s_find_me_if_you_can) {}; end assert_equal [filename, lineno], klass.method(:s_find_me_if_you_can).source_location klass = Class.new { def respond_to_missing?(m, b); m == :nothing; end } @@ -243,7 +243,7 @@ assert 'owner' do assert_equal(c, c.new.method(:foo).owner) assert_equal(c, c2.new.method(:foo).owner) - assert_equal(c.singleton_class, c2.method(:bar).owner) + assert_equal((class <<c; self; end), c2.method(:bar).owner) end assert 'owner missing' do @@ -413,12 +413,14 @@ assert 'UnboundMethod#bind' do assert_equal(:meth, m.bind(1).call) assert_equal(:meth, m.bind(:sym).call) assert_equal(:meth, m.bind(Object.new).call) - sc = Class.new { - class << self + sc = nil + Class.new { + sc = class << self def foo end + self end - }.singleton_class + } assert_raise(TypeError) { sc.instance_method(:foo).bind([]) } assert_raise(TypeError) { Array.instance_method(:each).bind(1) } assert_kind_of Method, Object.instance_method(:object_id).bind(Object.new) |
