From b6edf24a018547fe49eb72fd963058f5f762a731 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Sun, 19 Oct 2014 19:04:02 +0900 Subject: Add Kernel.Array --- mrbgems/mruby-kernel-ext/src/kernel.c | 37 +++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'mrbgems/mruby-kernel-ext/src') diff --git a/mrbgems/mruby-kernel-ext/src/kernel.c b/mrbgems/mruby-kernel-ext/src/kernel.c index a6ecd72bd..c293f5e8e 100644 --- a/mrbgems/mruby-kernel-ext/src/kernel.c +++ b/mrbgems/mruby-kernel-ext/src/kernel.c @@ -1,5 +1,7 @@ #include "mruby.h" #include "mruby/error.h" +#include "mruby/object.h" +#include "mruby/array.h" /* * call-seq: @@ -21,6 +23,40 @@ mrb_f_method(mrb_state *mrb, mrb_value self) return mrb_nil_value(); } +/* + * call-seq: + * Array(arg) -> array + * + * Returns +arg+ as an Array. + * + * First tries to call Array#to_ary on +arg+, then Array#to_a. + * + * Array(1..5) #=> [1, 2, 3, 4, 5] + * + */ +static mrb_value +mrb_f_array(mrb_state *mrb, mrb_value self) +{ + mrb_value argv, tmp; + + mrb_get_args(mrb, "o", &argv); + tmp = mrb_check_array_type(mrb, argv); + + if (mrb_nil_p(tmp)) { + tmp = mrb_check_convert_type(mrb, argv, MRB_TT_ARRAY, "Array", "to_a"); + } + if (mrb_nil_p(tmp)) { + struct RArray *a; + + tmp = mrb_ary_new_capa(mrb, 1); + a = mrb_ary_ptr(tmp); + a->ptr[0] = argv; + a->len = 1; + } + + return tmp; +} + void mrb_mruby_kernel_ext_gem_init(mrb_state *mrb) { @@ -28,6 +64,7 @@ mrb_mruby_kernel_ext_gem_init(mrb_state *mrb) mrb_define_module_function(mrb, krn, "fail", mrb_f_raise, MRB_ARGS_OPT(2)); mrb_define_method(mrb, krn, "__method__", mrb_f_method, MRB_ARGS_NONE()); + mrb_define_module_function(mrb, krn, "Array", mrb_f_array, MRB_ARGS_REQ(1)); } void -- cgit v1.2.3