From d88191e7e7fe234735718e8fd16c6247977e29f3 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 17 Apr 2018 11:32:31 +0900 Subject: Implement `Array#__svalue` in C. --- src/array.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/array.c') 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()); } -- cgit v1.2.3