Changeset 331 for EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-kernel-ext
- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-1.3.0
- Files:
-
- 2 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()); -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-kernel-ext/test/kernel.rb
r321 r331 2 2 assert_raise(RuntimeError) { fail } 3 3 assert_raise(RuntimeError) { Kernel.fail } 4 end 5 6 assert('Kernel.caller, Kernel#caller') do 7 skip "backtrace isn't available" if caller(0).empty? 8 9 caller_lineno = __LINE__ + 3 10 c = Class.new do 11 def foo(*args) 12 caller(*args) 13 end 14 15 def bar(*args) 16 foo(*args) 17 end 18 19 def baz(*args) 20 bar(*args) 21 end 22 end 23 assert_equal "kernel.rb:#{caller_lineno}:in foo", c.new.baz(0)[0][-19..-1] 24 assert_equal "bar", c.new.baz[0][-3..-1] 25 assert_equal "foo", c.new.baz(0)[0][-3..-1] 26 assert_equal "bar", c.new.baz(1)[0][-3..-1] 27 assert_equal "baz", c.new.baz(2)[0][-3..-1] 28 assert_equal ["foo", "bar"], c.new.baz(0, 2).map { |i| i[-3..-1] } 29 assert_equal ["bar", "baz"], c.new.baz(1..2).map { |i| i[-3..-1] } 30 assert_nil c.new.baz(10..20) 31 assert_raise(ArgumentError) { c.new.baz(-1) } 32 assert_raise(ArgumentError) { c.new.baz(-1, 1) } 33 assert_raise(ArgumentError) { c.new.baz(1, -1) } 34 assert_raise(TypeError) { c.new.baz(nil) } 4 35 end 5 36 … … 23 54 assert_equal(930, Integer("0930", 10)) 24 55 assert_equal(7, Integer("111", 2)) 56 assert_equal(0, Integer("0")) 57 assert_equal(0, Integer("00000")) 25 58 assert_raise(TypeError) { Integer(nil) } 26 59 end
Note:
See TracChangeset
for help on using the changeset viewer.