summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-04-17 11:32:31 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2018-04-17 11:32:31 +0900
commitd88191e7e7fe234735718e8fd16c6247977e29f3 (patch)
tree3d5ec0b7d57cd64fe5412b64fed92a5364f0facd
parentb51b21fc63c9805862322551387d9036f2b63433 (diff)
downloadmruby-d88191e7e7fe234735718e8fd16c6247977e29f3.tar.gz
mruby-d88191e7e7fe234735718e8fd16c6247977e29f3.zip
Implement `Array#__svalue` in C.
-rw-r--r--mrblib/array.rb6
-rw-r--r--src/array.c16
2 files changed, 16 insertions, 6 deletions
diff --git a/mrblib/array.rb b/mrblib/array.rb
index 046397156..d76756335 100644
--- a/mrblib/array.rb
+++ b/mrblib/array.rb
@@ -184,12 +184,6 @@ class Array
return block.call if ret.nil? && block
ret
end
-
- # internal method to convert multi-value to single value
- def __svalue
- return self.first if self.size < 2
- self
- end
end
##
diff --git a/src/array.c b/src/array.c
index 43d2b824f..f5c3d3246 100644
--- a/src/array.c
+++ b/src/array.c
@@ -1207,6 +1207,21 @@ mrb_ary_cmp(mrb_state *mrb, mrb_value ary1)
return ary2;
}
+/* internal method to convert multi-value to single value */
+static mrb_value
+mrb_ary_svalue(mrb_state *mrb, mrb_value ary)
+{
+ mrb_get_args(mrb, "");
+ switch (RARRAY_LEN(ary)) {
+ case 0:
+ return mrb_nil_value();
+ case 1:
+ return RARRAY_PTR(ary)[0];
+ default:
+ return ary;
+ }
+}
+
void
mrb_init_array(mrb_state *mrb)
{
@@ -1248,4 +1263,5 @@ mrb_init_array(mrb_state *mrb)
mrb_define_method(mrb, a, "__ary_eq", mrb_ary_eq, MRB_ARGS_REQ(1));
mrb_define_method(mrb, a, "__ary_cmp", mrb_ary_cmp, MRB_ARGS_REQ(1));
mrb_define_method(mrb, a, "__ary_index", mrb_ary_index_m, MRB_ARGS_REQ(1)); /* kept for mruby-array-ext */
+ mrb_define_method(mrb, a, "__svalue", mrb_ary_svalue, MRB_ARGS_NONE());
}