From 36fc42e7dbb8511efe316647dbbbdc822a929425 Mon Sep 17 00:00:00 2001 From: Akira Yumiyama Date: Tue, 25 Jun 2013 20:16:41 +0900 Subject: add nil.to_a, nil.to_f, nil.to_i methods --- mrbgems/mruby-object-ext/mrbgem.rake | 4 +++ mrbgems/mruby-object-ext/src/object.c | 56 +++++++++++++++++++++++++++++++++++ mrbgems/mruby-object-ext/test/nil.rb | 11 +++++++ 3 files changed, 71 insertions(+) create mode 100644 mrbgems/mruby-object-ext/mrbgem.rake create mode 100644 mrbgems/mruby-object-ext/src/object.c create mode 100644 mrbgems/mruby-object-ext/test/nil.rb (limited to 'mrbgems/mruby-object-ext') diff --git a/mrbgems/mruby-object-ext/mrbgem.rake b/mrbgems/mruby-object-ext/mrbgem.rake new file mode 100644 index 000000000..1f232949e --- /dev/null +++ b/mrbgems/mruby-object-ext/mrbgem.rake @@ -0,0 +1,4 @@ +MRuby::Gem::Specification.new('mruby-object-ext') do |spec| + spec.license = 'MIT' + spec.authors = 'mruby developers' +end diff --git a/mrbgems/mruby-object-ext/src/object.c b/mrbgems/mruby-object-ext/src/object.c new file mode 100644 index 000000000..70b8b4baa --- /dev/null +++ b/mrbgems/mruby-object-ext/src/object.c @@ -0,0 +1,56 @@ +#include "mruby.h" +#include "mruby/array.h" + +/* + * call-seq: + * nil.to_a -> [] + * + * Always returns an empty array. + */ + +static mrb_value +nil_to_a(mrb_state *mrb, mrb_value obj) +{ + return mrb_ary_new(mrb); +} + +/* + * call-seq: + * nil.to_f -> 0.0 + * + * Always returns zero. + */ + +static mrb_value +nil_to_f(mrb_state *mrb, mrb_value obj) +{ + return mrb_float_value(mrb, 0.0); +} + +/* + * call-seq: + * nil.to_i -> 0 + * + * Always returns zero. + */ + +static mrb_value +nil_to_i(mrb_state *mrb, mrb_value obj) +{ + return mrb_fixnum_value(0); +} + +void +mrb_mruby_object_ext_gem_init(mrb_state* mrb) +{ + struct RClass * n = mrb->nil_class; + + mrb_define_method(mrb, n, "to_a", nil_to_a, MRB_ARGS_NONE()); + mrb_define_method(mrb, n, "to_f", nil_to_f, MRB_ARGS_NONE()); + mrb_define_method(mrb, n, "to_i", nil_to_i, MRB_ARGS_NONE()); +} + +void +mrb_mruby_object_ext_gem_final(mrb_state* mrb) +{ +} diff --git a/mrbgems/mruby-object-ext/test/nil.rb b/mrbgems/mruby-object-ext/test/nil.rb new file mode 100644 index 000000000..e385dec6a --- /dev/null +++ b/mrbgems/mruby-object-ext/test/nil.rb @@ -0,0 +1,11 @@ +assert('NilClass#to_a') do + assert_equal nil.to_a, [] +end + +assert('NilClass#to_f') do + assert_equal nil.to_f, 0.0 +end + +assert('NilClass#to_i') do + assert_equal nil.to_i, 0 +end -- cgit v1.2.3 From 2117f0973cbd0de28142b6abba10b5511fef9ee4 Mon Sep 17 00:00:00 2001 From: h2so5 Date: Mon, 1 Jul 2013 16:21:03 +0900 Subject: Add Object#instance_exec --- mrbgems/mruby-object-ext/src/object.c | 52 +++++++++++++++++++++++++++++++++ mrbgems/mruby-object-ext/test/object.rb | 9 ++++++ 2 files changed, 61 insertions(+) create mode 100644 mrbgems/mruby-object-ext/test/object.rb (limited to 'mrbgems/mruby-object-ext') diff --git a/mrbgems/mruby-object-ext/src/object.c b/mrbgems/mruby-object-ext/src/object.c index 70b8b4baa..598ebe91d 100644 --- a/mrbgems/mruby-object-ext/src/object.c +++ b/mrbgems/mruby-object-ext/src/object.c @@ -1,5 +1,6 @@ #include "mruby.h" #include "mruby/array.h" +#include "mruby/class.h" /* * call-seq: @@ -40,6 +41,55 @@ nil_to_i(mrb_state *mrb, mrb_value obj) return mrb_fixnum_value(0); } +/* + * call-seq: + * obj.instance_exec(arg...) {|var...| block } -> obj + * + * Executes the given block within the context of the receiver + * (_obj_). In order to set the context, the variable +self+ is set + * to _obj_ while the code is executing, giving the code access to + * _obj_'s instance variables. Arguments are passed as block parameters. + * + * class KlassWithSecret + * def initialize + * @secret = 99 + * end + * end + * k = KlassWithSecret.new + * k.instance_exec(5) {|x| @secret+x } #=> 104 + */ + +mrb_value +mrb_yield_internal(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_value self, struct RClass *c); + +static mrb_value +mrb_obj_instance_exec(mrb_state *mrb, mrb_value self) +{ + mrb_value *argv; + int argc; + mrb_value blk; + struct RClass *c; + + mrb_get_args(mrb, "*&", &argv, &argc, &blk); + + if (mrb_nil_p(blk)) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); + } + + switch (mrb_type(self)) { + case MRB_TT_SYMBOL: + case MRB_TT_FIXNUM: + case MRB_TT_FLOAT: + c = 0; + break; + default: + c = mrb_class_ptr(mrb_singleton_class(mrb, self)); + break; + } + + return mrb_yield_internal(mrb, blk, argc, argv, self, c); +} + void mrb_mruby_object_ext_gem_init(mrb_state* mrb) { @@ -48,6 +98,8 @@ mrb_mruby_object_ext_gem_init(mrb_state* mrb) mrb_define_method(mrb, n, "to_a", nil_to_a, MRB_ARGS_NONE()); mrb_define_method(mrb, n, "to_f", nil_to_f, MRB_ARGS_NONE()); mrb_define_method(mrb, n, "to_i", nil_to_i, MRB_ARGS_NONE()); + + mrb_define_method(mrb, mrb->object_class, "instance_exec", mrb_obj_instance_exec, MRB_ARGS_ANY() | MRB_ARGS_BLOCK()); } void diff --git a/mrbgems/mruby-object-ext/test/object.rb b/mrbgems/mruby-object-ext/test/object.rb new file mode 100644 index 000000000..1a75622f6 --- /dev/null +++ b/mrbgems/mruby-object-ext/test/object.rb @@ -0,0 +1,9 @@ +assert('Object#instance_exec') do + class KlassWithSecret + def initialize + @secret = 99 + end + end + k = KlassWithSecret.new + assert_equal k.instance_exec(5) {|x| @secret+x }, 104 +end -- cgit v1.2.3 From 116f75a8ce9d5d11d41268ecc95863f4e10f2729 Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Tue, 23 Jul 2013 10:09:24 +0900 Subject: "spec.author" is better for single-author gems. "spec.author=" expects a String represents a single author. "spec.authors=" expects an Array which is a list of multiple authors. http://guides.rubygems.org/specification-reference/ --- doc/mrbgems/README.md | 4 ++-- examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake | 2 +- examples/mrbgems/c_extension_example/mrbgem.rake | 2 +- examples/mrbgems/ruby_extension_example/mrbgem.rake | 2 +- mrbgems/mruby-array-ext/mrbgem.rake | 2 +- mrbgems/mruby-bin-mirb/mrbgem.rake | 2 +- mrbgems/mruby-bin-mruby/mrbgem.rake | 2 +- mrbgems/mruby-enum-ext/mrbgem.rake | 2 +- mrbgems/mruby-eval/mrbgem.rake | 2 +- mrbgems/mruby-fiber/mrbgem.rake | 2 +- mrbgems/mruby-hash-ext/mrbgem.rake | 2 +- mrbgems/mruby-math/mrbgem.rake | 2 +- mrbgems/mruby-numeric-ext/mrbgem.rake | 2 +- mrbgems/mruby-object-ext/mrbgem.rake | 2 +- mrbgems/mruby-objectspace/mrbgem.rake | 2 +- mrbgems/mruby-print/mrbgem.rake | 2 +- mrbgems/mruby-proc-ext/mrbgem.rake | 2 +- mrbgems/mruby-random/mrbgem.rake | 2 +- mrbgems/mruby-range-ext/mrbgem.rake | 2 +- mrbgems/mruby-sprintf/mrbgem.rake | 2 +- mrbgems/mruby-string-ext/mrbgem.rake | 2 +- mrbgems/mruby-struct/mrbgem.rake | 2 +- mrbgems/mruby-symbol-ext/mrbgem.rake | 2 +- mrbgems/mruby-time/mrbgem.rake | 2 +- mrbgems/mruby-toplevel-ext/mrbgem.rake | 2 +- 25 files changed, 26 insertions(+), 26 deletions(-) (limited to 'mrbgems/mruby-object-ext') diff --git a/doc/mrbgems/README.md b/doc/mrbgems/README.md index 1062adc6b..07f7002fb 100644 --- a/doc/mrbgems/README.md +++ b/doc/mrbgems/README.md @@ -99,7 +99,7 @@ GEM directory. A typical GEM specification could look like this for example: MRuby::Gem::Specification.new('c_and_ruby_extension_example') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end The mrbgems build process will use this specification to compile Object and Ruby @@ -124,7 +124,7 @@ In case your GEM is depending on other GEMs please use MRuby::Gem::Specification.new('c_and_ruby_extension_example') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' # add GEM dependency mruby-parser. # Version has to be between 1.0.0 and 1.5.2 diff --git a/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake b/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake index 35dbe5e18..a1f964b36 100644 --- a/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake +++ b/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake @@ -1,6 +1,6 @@ MRuby::Gem::Specification.new('c_and_ruby_extension_example') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' # Add compile flags # spec.cc.flags << '' diff --git a/examples/mrbgems/c_extension_example/mrbgem.rake b/examples/mrbgems/c_extension_example/mrbgem.rake index 8c132b233..3524e22f4 100644 --- a/examples/mrbgems/c_extension_example/mrbgem.rake +++ b/examples/mrbgems/c_extension_example/mrbgem.rake @@ -1,6 +1,6 @@ MRuby::Gem::Specification.new('c_extension_example') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' # Add compile flags # spec.cc.flags << '-g' diff --git a/examples/mrbgems/ruby_extension_example/mrbgem.rake b/examples/mrbgems/ruby_extension_example/mrbgem.rake index 3a80b5cd7..5624c33e9 100644 --- a/examples/mrbgems/ruby_extension_example/mrbgem.rake +++ b/examples/mrbgems/ruby_extension_example/mrbgem.rake @@ -1,6 +1,6 @@ MRuby::Gem::Specification.new('ruby_extension_example') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' # Add compile flags # spec.cc.flags << '' diff --git a/mrbgems/mruby-array-ext/mrbgem.rake b/mrbgems/mruby-array-ext/mrbgem.rake index 38e0ad267..18f92ad65 100644 --- a/mrbgems/mruby-array-ext/mrbgem.rake +++ b/mrbgems/mruby-array-ext/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-array-ext') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-bin-mirb/mrbgem.rake b/mrbgems/mruby-bin-mirb/mrbgem.rake index fd0b20254..337473975 100644 --- a/mrbgems/mruby-bin-mirb/mrbgem.rake +++ b/mrbgems/mruby-bin-mirb/mrbgem.rake @@ -1,5 +1,5 @@ MRuby::Gem::Specification.new('mruby-bin-mirb') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' spec.bins = %w(mirb) end diff --git a/mrbgems/mruby-bin-mruby/mrbgem.rake b/mrbgems/mruby-bin-mruby/mrbgem.rake index 2e173a291..08ba89855 100644 --- a/mrbgems/mruby-bin-mruby/mrbgem.rake +++ b/mrbgems/mruby-bin-mruby/mrbgem.rake @@ -1,5 +1,5 @@ MRuby::Gem::Specification.new('mruby-bin-mruby') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' spec.bins = %w(mruby) end diff --git a/mrbgems/mruby-enum-ext/mrbgem.rake b/mrbgems/mruby-enum-ext/mrbgem.rake index 758d298dc..e054f4318 100644 --- a/mrbgems/mruby-enum-ext/mrbgem.rake +++ b/mrbgems/mruby-enum-ext/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-enum-ext') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-eval/mrbgem.rake b/mrbgems/mruby-eval/mrbgem.rake index f80cf1b9e..217a9e604 100644 --- a/mrbgems/mruby-eval/mrbgem.rake +++ b/mrbgems/mruby-eval/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-eval') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-fiber/mrbgem.rake b/mrbgems/mruby-fiber/mrbgem.rake index cb258adcb..25009c47f 100644 --- a/mrbgems/mruby-fiber/mrbgem.rake +++ b/mrbgems/mruby-fiber/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-fiber') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-hash-ext/mrbgem.rake b/mrbgems/mruby-hash-ext/mrbgem.rake index 3163c8c88..25d4f8e61 100644 --- a/mrbgems/mruby-hash-ext/mrbgem.rake +++ b/mrbgems/mruby-hash-ext/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-hash-ext') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-math/mrbgem.rake b/mrbgems/mruby-math/mrbgem.rake index 4b0fa40fd..75d3d1fff 100644 --- a/mrbgems/mruby-math/mrbgem.rake +++ b/mrbgems/mruby-math/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-math') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-numeric-ext/mrbgem.rake b/mrbgems/mruby-numeric-ext/mrbgem.rake index 69c4fde4c..010804058 100644 --- a/mrbgems/mruby-numeric-ext/mrbgem.rake +++ b/mrbgems/mruby-numeric-ext/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-numeric-ext') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-object-ext/mrbgem.rake b/mrbgems/mruby-object-ext/mrbgem.rake index 1f232949e..980f1667a 100644 --- a/mrbgems/mruby-object-ext/mrbgem.rake +++ b/mrbgems/mruby-object-ext/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-object-ext') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-objectspace/mrbgem.rake b/mrbgems/mruby-objectspace/mrbgem.rake index 100df4cdc..6a6a3e778 100644 --- a/mrbgems/mruby-objectspace/mrbgem.rake +++ b/mrbgems/mruby-objectspace/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-objectspace') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-print/mrbgem.rake b/mrbgems/mruby-print/mrbgem.rake index dc7831280..768fc2e18 100644 --- a/mrbgems/mruby-print/mrbgem.rake +++ b/mrbgems/mruby-print/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-print') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-proc-ext/mrbgem.rake b/mrbgems/mruby-proc-ext/mrbgem.rake index 7f979431d..b75fceda3 100644 --- a/mrbgems/mruby-proc-ext/mrbgem.rake +++ b/mrbgems/mruby-proc-ext/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-proc-ext') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-random/mrbgem.rake b/mrbgems/mruby-random/mrbgem.rake index 38e93e4b1..7ad3c855c 100644 --- a/mrbgems/mruby-random/mrbgem.rake +++ b/mrbgems/mruby-random/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-random') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-range-ext/mrbgem.rake b/mrbgems/mruby-range-ext/mrbgem.rake index 5ed521a44..a7970aa51 100644 --- a/mrbgems/mruby-range-ext/mrbgem.rake +++ b/mrbgems/mruby-range-ext/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-range-ext') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-sprintf/mrbgem.rake b/mrbgems/mruby-sprintf/mrbgem.rake index 8772a5174..3e15ee7a9 100644 --- a/mrbgems/mruby-sprintf/mrbgem.rake +++ b/mrbgems/mruby-sprintf/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-sprintf') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-string-ext/mrbgem.rake b/mrbgems/mruby-string-ext/mrbgem.rake index 83db97eb4..4a3369998 100644 --- a/mrbgems/mruby-string-ext/mrbgem.rake +++ b/mrbgems/mruby-string-ext/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-string-ext') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-struct/mrbgem.rake b/mrbgems/mruby-struct/mrbgem.rake index 476e990da..3e9eab8d7 100644 --- a/mrbgems/mruby-struct/mrbgem.rake +++ b/mrbgems/mruby-struct/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-struct') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-symbol-ext/mrbgem.rake b/mrbgems/mruby-symbol-ext/mrbgem.rake index 8e40c743b..6294e7a46 100644 --- a/mrbgems/mruby-symbol-ext/mrbgem.rake +++ b/mrbgems/mruby-symbol-ext/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-symbol-ext') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-time/mrbgem.rake b/mrbgems/mruby-time/mrbgem.rake index 0f0b4899d..edf2aa3fc 100644 --- a/mrbgems/mruby-time/mrbgem.rake +++ b/mrbgems/mruby-time/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-time') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end diff --git a/mrbgems/mruby-toplevel-ext/mrbgem.rake b/mrbgems/mruby-toplevel-ext/mrbgem.rake index 457047e8d..78eb73a26 100644 --- a/mrbgems/mruby-toplevel-ext/mrbgem.rake +++ b/mrbgems/mruby-toplevel-ext/mrbgem.rake @@ -1,4 +1,4 @@ MRuby::Gem::Specification.new('mruby-toplevel-ext') do |spec| spec.license = 'MIT' - spec.authors = 'mruby developers' + spec.author = 'mruby developers' end -- cgit v1.2.3