summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrbgems/default.gembox3
-rw-r--r--mrbgems/mruby-object-ext/mrbgem.rake4
-rw-r--r--mrbgems/mruby-object-ext/src/object.c56
-rw-r--r--mrbgems/mruby-object-ext/test/nil.rb11
-rw-r--r--src/object.c1
-rw-r--r--test/t/nil.rb1
6 files changed, 75 insertions, 1 deletions
diff --git a/mrbgems/default.gembox b/mrbgems/default.gembox
index 1c6732d48..b2cdac93d 100644
--- a/mrbgems/default.gembox
+++ b/mrbgems/default.gembox
@@ -41,6 +41,9 @@ MRuby::GemBox.new do |conf|
# Use Random class
conf.gem :core => "mruby-random"
+ # Use extensional Object class
+ conf.gem :core => "mruby-object-ext"
+
# Use ObjectSpace class
conf.gem :core => "mruby-objectspace"
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
diff --git a/src/object.c b/src/object.c
index a2162f77f..d6f756f18 100644
--- a/src/object.c
+++ b/src/object.c
@@ -5,6 +5,7 @@
*/
#include "mruby.h"
+#include "mruby/array.h"
#include "mruby/class.h"
#include "mruby/numeric.h"
#include "mruby/string.h"
diff --git a/test/t/nil.rb b/test/t/nil.rb
index 99b1215e9..08d2acdf1 100644
--- a/test/t/nil.rb
+++ b/test/t/nil.rb
@@ -27,4 +27,3 @@ end
assert('NilClass#to_s', '15.2.4.3.5') do
assert_equal nil.to_s, ''
end
-