diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-04-17 11:32:31 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-04-17 11:32:31 +0900 |
| commit | d88191e7e7fe234735718e8fd16c6247977e29f3 (patch) | |
| tree | 3d5ec0b7d57cd64fe5412b64fed92a5364f0facd | |
| parent | b51b21fc63c9805862322551387d9036f2b63433 (diff) | |
| download | mruby-d88191e7e7fe234735718e8fd16c6247977e29f3.tar.gz mruby-d88191e7e7fe234735718e8fd16c6247977e29f3.zip | |
Implement `Array#__svalue` in C.
| -rw-r--r-- | mrblib/array.rb | 6 | ||||
| -rw-r--r-- | src/array.c | 16 |
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()); } |
