Changeset 439 for EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-proc-ext
- Timestamp:
- Jul 9, 2020, 8:51:43 AM (4 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-2.1.1
- Files:
-
- 4 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-proc-ext/mrblib/proc.rb
r321 r439 28 28 pproc = self 29 29 make_curry = proc do |given_args=[]| 30 send(type) do |*args|30 __send__(type) do |*args| 31 31 new_args = given_args + args 32 32 if new_args.size >= arity … … 40 40 end 41 41 42 def <<(other) 43 ->(*args, &block) { call(other.call(*args, &block)) } 44 end 45 46 def >>(other) 47 ->(*args, &block) { other.call(call(*args, &block)) } 48 end 49 42 50 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-proc-ext/src/proc.c
r331 r439 26 26 const char *filename; 27 27 28 filename = mrb_debug_get_filename( irep, 0);29 line = mrb_debug_get_line( irep, 0);28 filename = mrb_debug_get_filename(mrb, irep, 0); 29 line = mrb_debug_get_line(mrb, irep, 0); 30 30 31 31 return (!filename && line == -1)? mrb_nil_value() … … 39 39 struct RProc *p = mrb_proc_ptr(self); 40 40 mrb_value str = mrb_str_new_lit(mrb, "#<Proc:"); 41 mrb_str_c oncat(mrb, str, mrb_ptr_to_str(mrb, mrb_cptr(self)));41 mrb_str_cat_str(mrb, str, mrb_ptr_to_str(mrb, mrb_cptr(self))); 42 42 43 43 if (!MRB_PROC_CFUNC_P(p)) { … … 47 47 mrb_str_cat_lit(mrb, str, "@"); 48 48 49 filename = mrb_debug_get_filename( irep, 0);49 filename = mrb_debug_get_filename(mrb, irep, 0); 50 50 mrb_str_cat_cstr(mrb, str, filename ? filename : "-"); 51 51 mrb_str_cat_lit(mrb, str, ":"); 52 52 53 line = mrb_debug_get_line( irep, 0);53 line = mrb_debug_get_line(mrb, irep, 0); 54 54 if (line != -1) { 55 str = mrb_format(mrb, "%S:%S", str, mrb_fixnum_value(line));55 mrb_str_concat(mrb, str, mrb_fixnum_value(line)); 56 56 } 57 57 else { … … 73 73 mrb_value blk; 74 74 75 mrb_get_args(mrb, "&", &blk); 76 if (mrb_nil_p(blk)) { 77 mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block"); 78 } 75 mrb_get_args(mrb, "&!", &blk); 79 76 80 77 return blk; … … 95 92 { 96 93 struct parameters_type { 94 size_t len; 95 const char *name; 97 96 int size; 98 const char *name;99 97 } *p, parameters_list [] = { 100 { 0, "req"},101 { 0, "opt"},102 { 0, "rest"},103 { 0, "req"},104 { 0, "block"},105 {0, NULL }98 {sizeof("req") - 1, "req", 0}, 99 {sizeof("opt") - 1, "opt", 0}, 100 {sizeof("rest") - 1, "rest", 0}, 101 {sizeof("req") - 1, "req", 0}, 102 {sizeof("block") - 1, "block", 0}, 103 {0, NULL, 0} 106 104 }; 107 105 const struct RProc *proc = mrb_proc_ptr(self); 108 106 const struct mrb_irep *irep = proc->body.irep; 109 107 mrb_aspec aspec; 110 mrb_value sname,parameters;108 mrb_value parameters; 111 109 int i, j; 110 int max = -1; 112 111 113 112 if (MRB_PROC_CFUNC_P(proc)) { … … 121 120 return mrb_ary_new(mrb); 122 121 } 123 if ( GET_OPCODE(*irep->iseq)!= OP_ENTER) {122 if (*irep->iseq != OP_ENTER) { 124 123 return mrb_ary_new(mrb); 125 124 } 126 125 127 126 if (!MRB_PROC_STRICT_P(proc)) { 127 parameters_list[0].len = sizeof("opt") - 1; 128 128 parameters_list[0].name = "opt"; 129 parameters_list[3].len = sizeof("opt") - 1; 129 130 parameters_list[3].name = "opt"; 130 131 } 131 132 132 aspec = GETARG_Ax(*irep->iseq);133 aspec = PEEK_W(irep->iseq+1); 133 134 parameters_list[0].size = MRB_ASPEC_REQ(aspec); 134 135 parameters_list[1].size = MRB_ASPEC_OPT(aspec); … … 139 140 parameters = mrb_ary_new_capa(mrb, irep->nlocals-1); 140 141 142 max = irep->nlocals-1; 141 143 for (i = 0, p = parameters_list; p->name; p++) { 142 if (p->size <= 0) continue;143 sname = mrb_symbol_value(mrb_intern_cstr(mrb, p->name)); 144 mrb_value sname = mrb_symbol_value(mrb_intern_static(mrb, p->name, p->len)); 145 144 146 for (j = 0; j < p->size; i++, j++) { 145 mrb_value a = mrb_ary_new(mrb); 147 mrb_value a; 148 149 a = mrb_ary_new(mrb); 146 150 mrb_ary_push(mrb, a, sname); 147 if (irep->lv[i].name) { 148 mrb_ary_push(mrb, a, mrb_symbol_value(irep->lv[i].name)); 151 if (i < max && irep->lv[i].name) { 152 mrb_sym sym = irep->lv[i].name; 153 const char *name = mrb_sym_name(mrb, sym); 154 switch (name[0]) { 155 case '*': case '&': 156 break; 157 default: 158 mrb_ary_push(mrb, a, mrb_symbol_value(sym)); 159 break; 160 } 149 161 } 150 162 mrb_ary_push(mrb, parameters, a); … … 164 176 mrb_define_method(mrb, p, "parameters", mrb_proc_parameters, MRB_ARGS_NONE()); 165 177 166 mrb_define_class_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE() );167 mrb_define_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE() );178 mrb_define_class_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE()|MRB_ARGS_BLOCK()); 179 mrb_define_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE()|MRB_ARGS_BLOCK()); 168 180 } 169 181 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-proc-ext/test/proc.c
r331 r439 14 14 mrb_sym n; 15 15 mrb_value n_val; 16 mrb_method_t m; 17 struct RProc *p; 16 18 mrb_get_args(mrb, "n", &n); 17 19 n_val = mrb_symbol_value(n); 18 mrb_define_method_raw(mrb, mrb_class_ptr(self), n, 19 mrb_proc_new_cfunc_with_env(mrb, return_func_name, 1, &n_val)); 20 p = mrb_proc_new_cfunc_with_env(mrb, return_func_name, 1, &n_val); 21 MRB_METHOD_FROM_PROC(m, p); 22 mrb_define_method_raw(mrb, mrb_class_ptr(self), n, m); 20 23 return self; 21 24 } … … 34 37 mrb_sym n; 35 38 mrb_value *argv; mrb_int argc; 39 mrb_method_t m; 40 struct RProc *p; 36 41 mrb_get_args(mrb, "na", &n, &argv, &argc); 37 mrb_define_method_raw(mrb, mrb_class_ptr(self), n, 38 mrb_proc_new_cfunc_with_env(mrb, return_env, argc, argv)); 42 p = mrb_proc_new_cfunc_with_env(mrb, return_env, argc, argv); 43 MRB_METHOD_FROM_PROC(m, p); 44 mrb_define_method_raw(mrb, mrb_class_ptr(self), n, m); 39 45 return self; 40 46 } -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-proc-ext/test/proc.rb
r331 r439 2 2 # Proc(Ext) Test 3 3 4 def enable_debug_info? 5 return @enable_debug_info unless @enable_debug_info == nil 6 begin 7 raise 8 rescue => e 9 @enable_debug_info = !e.backtrace.empty? 10 end 11 end 12 4 13 assert('Proc#source_location') do 5 loc = Proc.new {}.source_location6 next true if loc.nil?7 assert_equal loc[0][-7, 7], 'proc.rb'8 assert_equal loc[1], 514 skip unless enable_debug_info? 15 file, line = Proc.new{}.source_location 16 assert_equal __FILE__, file 17 assert_equal __LINE__ - 2, line 9 18 end 10 19 11 20 assert('Proc#inspect') do 12 21 ins = Proc.new{}.inspect 13 assert_kind_of String, ins 22 if enable_debug_info? 23 metas = %w(\\ * ? [ ] { }) 24 file = __FILE__.split("").map{|c| metas.include?(c) ? "\\#{c}" : c}.join 25 line = __LINE__ - 4 26 else 27 file = line = "-" 28 end 29 assert_match "#<Proc:0x*@#{file}:#{line}>", ins 30 end 31 32 assert('Proc#parameters') do 33 parameters = Proc.new{|x,y=42,*other|}.parameters 34 assert_equal [[:opt, :x], [:opt, :y], [:rest, :other]], parameters 14 35 end 15 36 … … 67 88 assert('Kernel#proc') do 68 89 assert_true !proc{|a|}.lambda? 90 91 assert_raise LocalJumpError do 92 proc{ break }.call 93 end 94 end 95 96 assert "Proc#<< and Proc#>>" do 97 add3 = ->(n) { n + 3 } 98 mul2 = ->(n) { n * 2 } 99 100 f1 = mul2 << add3 101 assert_kind_of Proc, f1 102 assert_equal 16, f1.call(5) 103 104 f2 = mul2 >> add3 105 assert_kind_of Proc, f2 106 assert_equal 13, f2.call(5) 69 107 end 70 108
Note:
See TracChangeset
for help on using the changeset viewer.