- Timestamp:
- Jul 9, 2020, 8:51:43 AM (4 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-2.1.1
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
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
Note:
See TracChangeset
for help on using the changeset viewer.