diff options
| author | Jun Hiroe <[email protected]> | 2014-10-19 19:04:02 +0900 |
|---|---|---|
| committer | Jun Hiroe <[email protected]> | 2014-10-19 19:25:31 +0900 |
| commit | b6edf24a018547fe49eb72fd963058f5f762a731 (patch) | |
| tree | fcc93a217f180b2c550b3d086eb594109a809274 /mrbgems/mruby-kernel-ext/src | |
| parent | 3f06307317ceb4bef2f4c245205d389d23456397 (diff) | |
| download | mruby-b6edf24a018547fe49eb72fd963058f5f762a731.tar.gz mruby-b6edf24a018547fe49eb72fd963058f5f762a731.zip | |
Add Kernel.Array
Diffstat (limited to 'mrbgems/mruby-kernel-ext/src')
| -rw-r--r-- | mrbgems/mruby-kernel-ext/src/kernel.c | 37 |
1 files changed, 37 insertions, 0 deletions
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 |
