Changeset 439 for EcnlProtoTool/trunk/mruby-2.1.1/src/state.c
- 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/src/state.c
r331 r439 12 12 #include <mruby/debug.h> 13 13 #include <mruby/string.h> 14 #include <mruby/class.h> 14 15 15 16 void mrb_init_core(mrb_state*); … … 18 19 void mrb_gc_init(mrb_state*, mrb_gc *gc); 19 20 void mrb_gc_destroy(mrb_state*, mrb_gc *gc); 20 21 static mrb_value22 inspect_main(mrb_state *mrb, mrb_value mod)23 {24 return mrb_str_new_lit(mrb, "main");25 }26 21 27 22 MRB_API mrb_state* … … 32 27 mrb_state *mrb; 33 28 29 if (f == NULL) f = mrb_default_allocf; 34 30 mrb = (mrb_state *)(f)(NULL, NULL, sizeof(mrb_state), ud); 35 31 if (mrb == NULL) return NULL; … … 62 58 } 63 59 64 struct alloca_header {65 struct alloca_header *next;66 char buf[];67 };68 69 MRB_API void*70 mrb_alloca(mrb_state *mrb, size_t size)71 {72 struct alloca_header *p;73 74 p = (struct alloca_header*) mrb_malloc(mrb, sizeof(struct alloca_header)+size);75 p->next = mrb->mems;76 mrb->mems = p;77 return (void*)p->buf;78 }79 80 static void81 mrb_alloca_free(mrb_state *mrb)82 {83 struct alloca_header *p;84 struct alloca_header *tmp;85 86 if (mrb == NULL) return;87 p = mrb->mems;88 89 while (p) {90 tmp = p;91 p = p->next;92 mrb_free(mrb, tmp);93 }94 }95 96 60 MRB_API mrb_state* 97 61 mrb_open(void) … … 112 76 113 77 if (!disable_gems) { 78 #ifndef DISABLE_GEMS 114 79 mrb_init_mrbgems(mrb); 115 80 mrb_gc_arena_restore(mrb, 0); 81 #endif 116 82 } 117 83 return mrb; … … 136 102 137 103 void 104 mrb_irep_cutref(mrb_state *mrb, mrb_irep *irep) 105 { 106 mrb_irep *tmp; 107 int i; 108 109 for (i=0; i<irep->rlen; i++) { 110 tmp = irep->reps[i]; 111 irep->reps[i] = NULL; 112 if (tmp) mrb_irep_decref(mrb, tmp); 113 } 114 } 115 116 void 138 117 mrb_irep_free(mrb_state *mrb, mrb_irep *irep) 139 118 { 140 size_t i;119 int i; 141 120 142 121 if (!(irep->flags & MRB_ISEQ_NO_FREE)) 143 mrb_free(mrb, irep->iseq);122 mrb_free(mrb, (void*)irep->iseq); 144 123 if (irep->pool) for (i=0; i<irep->plen; i++) { 145 if (mrb_ type(irep->pool[i]) == MRB_TT_STRING) {124 if (mrb_string_p(irep->pool[i])) { 146 125 mrb_gc_free_str(mrb, RSTRING(irep->pool[i])); 147 126 mrb_free(mrb, mrb_obj_ptr(irep->pool[i])); 148 127 } 149 #if def MRB_WORD_BOXING150 else if (mrb_ type(irep->pool[i]) == MRB_TT_FLOAT) {128 #if defined(MRB_WORD_BOXING) && !defined(MRB_WITHOUT_FLOAT) 129 else if (mrb_float_p(irep->pool[i])) { 151 130 mrb_free(mrb, mrb_obj_ptr(irep->pool[i])); 152 131 } … … 156 135 mrb_free(mrb, irep->syms); 157 136 for (i=0; i<irep->rlen; i++) { 158 mrb_irep_decref(mrb, irep->reps[i]); 137 if (irep->reps[i]) 138 mrb_irep_decref(mrb, irep->reps[i]); 159 139 } 160 140 mrb_free(mrb, irep->reps); 161 141 mrb_free(mrb, irep->lv); 162 if (irep->own_filename) {163 mrb_free(mrb, (void *)irep->filename);164 }165 mrb_free(mrb, irep->lines);166 142 mrb_debug_info_free(mrb, irep->debug_info); 167 143 mrb_free(mrb, irep); 168 }169 170 mrb_value171 mrb_str_pool(mrb_state *mrb, mrb_value str)172 {173 struct RString *s = mrb_str_ptr(str);174 struct RString *ns;175 char *ptr;176 mrb_int len;177 178 ns = (struct RString *)mrb_malloc(mrb, sizeof(struct RString));179 ns->tt = MRB_TT_STRING;180 ns->c = mrb->string_class;181 182 if (RSTR_NOFREE_P(s)) {183 ns->flags = MRB_STR_NOFREE;184 ns->as.heap.ptr = s->as.heap.ptr;185 ns->as.heap.len = s->as.heap.len;186 ns->as.heap.aux.capa = 0;187 }188 else {189 ns->flags = 0;190 if (RSTR_EMBED_P(s)) {191 ptr = s->as.ary;192 len = RSTR_EMBED_LEN(s);193 }194 else {195 ptr = s->as.heap.ptr;196 len = s->as.heap.len;197 }198 199 if (len < RSTRING_EMBED_LEN_MAX) {200 RSTR_SET_EMBED_FLAG(ns);201 RSTR_SET_EMBED_LEN(ns, len);202 if (ptr) {203 memcpy(ns->as.ary, ptr, len);204 }205 ns->as.ary[len] = '\0';206 }207 else {208 ns->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)len+1);209 ns->as.heap.len = len;210 ns->as.heap.aux.capa = len;211 if (ptr) {212 memcpy(ns->as.heap.ptr, ptr, len);213 }214 ns->as.heap.ptr[len] = '\0';215 }216 }217 return mrb_obj_value(ns);218 144 } 219 145 … … 246 172 247 173 /* free */ 174 mrb_gc_destroy(mrb, &mrb->gc); 175 mrb_free_context(mrb, mrb->root_c); 248 176 mrb_gc_free_gv(mrb); 249 mrb_free_context(mrb, mrb->root_c);250 177 mrb_free_symtbl(mrb); 251 mrb_alloca_free(mrb);252 mrb_gc_destroy(mrb, &mrb->gc);253 178 mrb_free(mrb, mrb); 254 179 } … … 263 188 *irep = mrb_irep_zero; 264 189 irep->refcnt = 1; 265 irep->own_filename = FALSE;266 190 267 191 return irep; … … 271 195 mrb_top_self(mrb_state *mrb) 272 196 { 273 if (!mrb->top_self) {274 mrb->top_self = (struct RObject*)mrb_obj_alloc(mrb, MRB_TT_OBJECT, mrb->object_class);275 mrb_define_singleton_method(mrb, mrb->top_self, "inspect", inspect_main, MRB_ARGS_NONE());276 mrb_define_singleton_method(mrb, mrb->top_self, "to_s", inspect_main, MRB_ARGS_NONE());277 }278 197 return mrb_obj_value(mrb->top_self); 279 198 }
Note:
See TracChangeset
for help on using the changeset viewer.