Changeset 331 for EcnlProtoTool/trunk/mruby-1.3.0/src/proc.c
- 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/src/proc.c
r321 r331 5 5 */ 6 6 7 #include "mruby.h"8 #include "mruby/class.h"9 #include "mruby/proc.h"10 #include "mruby/opcode.h"7 #include <mruby.h> 8 #include <mruby/class.h> 9 #include <mruby/proc.h> 10 #include <mruby/opcode.h> 11 11 12 12 static mrb_code call_iseq[] = { … … 42 42 e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)mrb->c->ci->proc->env); 43 43 MRB_SET_ENV_STACK_LEN(e, nlocals); 44 e-> mid = mrb->c->ci->mid;44 e->cxt.c = mrb->c; 45 45 e->cioff = mrb->c->ci - mrb->c->cibase; 46 46 e->stack = mrb->c->stack; … … 62 62 } 63 63 p->env = e; 64 mrb_field_write_barrier(mrb, (struct RBasic *)p, (struct RBasic *)p->env); 64 65 } 65 66 … … 136 137 } 137 138 138 MRB_APIvoid139 void 139 140 mrb_proc_copy(struct RProc *a, struct RProc *b) 140 141 { 141 142 a->flags = b->flags; 142 143 a->body = b->body; 143 if (!MRB_PROC_CFUNC_P(a) ) {144 if (!MRB_PROC_CFUNC_P(a) && a->body.irep) { 144 145 a->body.irep->refcnt++; 145 146 } … … 149 150 150 151 static mrb_value 151 mrb_proc_ initialize(mrb_state *mrb, mrb_value self)152 mrb_proc_s_new(mrb_state *mrb, mrb_value proc_class) 152 153 { 153 154 mrb_value blk; 155 mrb_value proc; 156 struct RProc *p; 154 157 155 158 mrb_get_args(mrb, "&", &blk); … … 158 161 mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block"); 159 162 } 160 else { 161 mrb_proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(blk)); 162 } 163 return self; 163 p = (struct RProc *)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb_class_ptr(proc_class)); 164 mrb_proc_copy(p, mrb_proc_ptr(blk)); 165 proc = mrb_obj_value(p); 166 mrb_funcall_with_block(mrb, proc, mrb_intern_lit(mrb, "initialize"), 0, NULL, blk); 167 return proc; 164 168 } 165 169 … … 189 193 } 190 194 191 mrb_code*192 mrb_proc_iseq(mrb_state *mrb, struct RProc *p)193 {194 return p->body.irep->iseq;195 }196 197 195 /* 15.2.17.4.2 */ 198 196 static mrb_value … … 200 198 { 201 199 struct RProc *p = mrb_proc_ptr(self); 202 mrb_code *iseq = mrb_proc_iseq(mrb, p); 200 struct mrb_irep *irep; 201 mrb_code *iseq; 203 202 mrb_aspec aspec; 204 203 int ma, op, ra, pa, arity; … … 209 208 } 210 209 210 irep = p->body.irep; 211 if (!irep) { 212 return mrb_fixnum_value(0); 213 } 214 215 iseq = irep->iseq; 211 216 /* arity is depend on OP_ENTER */ 212 217 if (GET_OPCODE(*iseq) != OP_ENTER) { … … 267 272 call_irep->iseq = call_iseq; 268 273 call_irep->ilen = 1; 269 270 mrb_define_method(mrb, mrb->proc_class, "initialize", mrb_proc_initialize, MRB_ARGS_NONE()); 274 call_irep->nregs = 2; /* receiver and block */ 275 276 mrb_define_class_method(mrb, mrb->proc_class, "new", mrb_proc_s_new, MRB_ARGS_ANY()); 271 277 mrb_define_method(mrb, mrb->proc_class, "initialize_copy", mrb_proc_init_copy, MRB_ARGS_REQ(1)); 272 278 mrb_define_method(mrb, mrb->proc_class, "arity", mrb_proc_arity, MRB_ARGS_NONE());
Note:
See TracChangeset
for help on using the changeset viewer.