- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-1.3.0
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-kernel-ext/src/kernel.c
r321 r331 1 #include "mruby.h" 2 #include "mruby/error.h" 3 #include "mruby/array.h" 4 #include "mruby/hash.h" 1 #include <mruby.h> 2 #include <mruby/error.h> 3 #include <mruby/array.h> 4 #include <mruby/hash.h> 5 #include <mruby/range.h> 6 7 static mrb_value 8 mrb_f_caller(mrb_state *mrb, mrb_value self) 9 { 10 mrb_value bt, v, length; 11 mrb_int bt_len, argc, lev, n; 12 13 bt = mrb_get_backtrace(mrb); 14 bt_len = RARRAY_LEN(bt); 15 argc = mrb_get_args(mrb, "|oo", &v, &length); 16 17 switch (argc) { 18 case 0: 19 lev = 1; 20 n = bt_len - lev; 21 break; 22 case 1: 23 if (mrb_type(v) == MRB_TT_RANGE) { 24 mrb_int beg, len; 25 if (mrb_range_beg_len(mrb, v, &beg, &len, bt_len, TRUE) == 1) { 26 lev = beg; 27 n = len; 28 } 29 else { 30 return mrb_nil_value(); 31 } 32 } 33 else { 34 v = mrb_to_int(mrb, v); 35 lev = mrb_fixnum(v); 36 if (lev < 0) { 37 mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative level (%S)", v); 38 } 39 n = bt_len - lev; 40 } 41 break; 42 case 2: 43 lev = mrb_fixnum(mrb_to_int(mrb, v)); 44 n = mrb_fixnum(mrb_to_int(mrb, length)); 45 if (lev < 0) { 46 mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative level (%S)", v); 47 } 48 if (n < 0) { 49 mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative size (%S)", length); 50 } 51 break; 52 default: 53 lev = n = 0; 54 break; 55 } 56 57 if (n == 0) { 58 return mrb_ary_new(mrb); 59 } 60 61 return mrb_funcall(mrb, bt, "[]", 2, mrb_fixnum_value(lev), mrb_fixnum_value(n)); 62 } 5 63 6 64 /* … … 62 120 * 63 121 * Returns <i>arg</i> converted to a float. Numeric types are converted 64 * directly, the rest are converted using <i>arg</i>.to_f. 122 * directly, the rest are converted using <i>arg</i>.to_f. 65 123 * 66 124 * Float(1) #=> 1.0 … … 171 229 172 230 mrb_define_module_function(mrb, krn, "fail", mrb_f_raise, MRB_ARGS_OPT(2)); 231 mrb_define_module_function(mrb, krn, "caller", mrb_f_caller, MRB_ARGS_OPT(2)); 173 232 mrb_define_method(mrb, krn, "__method__", mrb_f_method, MRB_ARGS_NONE()); 174 233 mrb_define_module_function(mrb, krn, "Integer", mrb_f_integer, MRB_ARGS_ANY());
Note:
See TracChangeset
for help on using the changeset viewer.