source: EcnlProtoTool/trunk/mruby-1.3.0/src/state.c@ 331

Last change on this file since 331 was 331, checked in by coas-nagasima, 6 years ago

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 6.3 KB
Line 
1/*
2** state.c - mrb_state open/close functions
3**
4** See Copyright Notice in mruby.h
5*/
6
7#include <stdlib.h>
8#include <string.h>
9#include <mruby.h>
10#include <mruby/irep.h>
11#include <mruby/variable.h>
12#include <mruby/debug.h>
13#include <mruby/string.h>
14
15void mrb_init_core(mrb_state*);
16void mrb_init_mrbgems(mrb_state*);
17
18void mrb_gc_init(mrb_state*, mrb_gc *gc);
19void mrb_gc_destroy(mrb_state*, mrb_gc *gc);
20
21static mrb_value
22inspect_main(mrb_state *mrb, mrb_value mod)
23{
24 return mrb_str_new_lit(mrb, "main");
25}
26
27MRB_API mrb_state*
28mrb_open_core(mrb_allocf f, void *ud)
29{
30 static const mrb_state mrb_state_zero = { 0 };
31 static const struct mrb_context mrb_context_zero = { 0 };
32 mrb_state *mrb;
33
34 mrb = (mrb_state *)(f)(NULL, NULL, sizeof(mrb_state), ud);
35 if (mrb == NULL) return NULL;
36
37 *mrb = mrb_state_zero;
38 mrb->allocf_ud = ud;
39 mrb->allocf = f;
40 mrb->atexit_stack_len = 0;
41
42 mrb_gc_init(mrb, &mrb->gc);
43 mrb->c = (struct mrb_context*)mrb_malloc(mrb, sizeof(struct mrb_context));
44 *mrb->c = mrb_context_zero;
45 mrb->root_c = mrb->c;
46
47 mrb_init_core(mrb);
48
49 return mrb;
50}
51
52void*
53mrb_default_allocf(mrb_state *mrb, void *p, size_t size, void *ud)
54{
55 if (size == 0) {
56 free(p);
57 return NULL;
58 }
59 else {
60 return realloc(p, size);
61 }
62}
63
64struct alloca_header {
65 struct alloca_header *next;
66 char buf[];
67};
68
69MRB_API void*
70mrb_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
80static void
81mrb_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
96MRB_API mrb_state*
97mrb_open(void)
98{
99 mrb_state *mrb = mrb_open_allocf(mrb_default_allocf, NULL, FALSE);
100
101 return mrb;
102}
103
104MRB_API mrb_state*
105mrb_open_allocf(mrb_allocf f, void *ud, mrb_bool disable_gems)
106{
107 mrb_state *mrb = mrb_open_core(f, ud);
108
109 if (mrb == NULL) {
110 return NULL;
111 }
112
113 if (!disable_gems) {
114 mrb_init_mrbgems(mrb);
115 mrb_gc_arena_restore(mrb, 0);
116 }
117 return mrb;
118}
119
120void mrb_free_symtbl(mrb_state *mrb);
121
122void
123mrb_irep_incref(mrb_state *mrb, mrb_irep *irep)
124{
125 irep->refcnt++;
126}
127
128void
129mrb_irep_decref(mrb_state *mrb, mrb_irep *irep)
130{
131 irep->refcnt--;
132 if (irep->refcnt == 0) {
133 mrb_irep_free(mrb, irep);
134 }
135}
136
137void
138mrb_irep_free(mrb_state *mrb, mrb_irep *irep)
139{
140 size_t i;
141
142 if (!(irep->flags & MRB_ISEQ_NO_FREE))
143 mrb_free(mrb, irep->iseq);
144 if (irep->pool) for (i=0; i<irep->plen; i++) {
145 if (mrb_type(irep->pool[i]) == MRB_TT_STRING) {
146 mrb_gc_free_str(mrb, RSTRING(irep->pool[i]));
147 mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
148 }
149#ifdef MRB_WORD_BOXING
150 else if (mrb_type(irep->pool[i]) == MRB_TT_FLOAT) {
151 mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
152 }
153#endif
154 }
155 mrb_free(mrb, irep->pool);
156 mrb_free(mrb, irep->syms);
157 for (i=0; i<irep->rlen; i++) {
158 mrb_irep_decref(mrb, irep->reps[i]);
159 }
160 mrb_free(mrb, irep->reps);
161 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 mrb_debug_info_free(mrb, irep->debug_info);
167 mrb_free(mrb, irep);
168}
169
170mrb_value
171mrb_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}
219
220void mrb_free_backtrace(mrb_state *mrb);
221
222MRB_API void
223mrb_free_context(mrb_state *mrb, struct mrb_context *c)
224{
225 if (!c) return;
226 mrb_free(mrb, c->stbase);
227 mrb_free(mrb, c->cibase);
228 mrb_free(mrb, c->rescue);
229 mrb_free(mrb, c->ensure);
230 mrb_free(mrb, c);
231}
232
233MRB_API void
234mrb_close(mrb_state *mrb)
235{
236 if (!mrb) return;
237 if (mrb->atexit_stack_len > 0) {
238 mrb_int i;
239 for (i = mrb->atexit_stack_len; i > 0; --i) {
240 mrb->atexit_stack[i - 1](mrb);
241 }
242#ifndef MRB_FIXED_STATE_ATEXIT_STACK
243 mrb_free(mrb, mrb->atexit_stack);
244#endif
245 }
246
247 /* free */
248 mrb_gc_free_gv(mrb);
249 mrb_free_context(mrb, mrb->root_c);
250 mrb_free_symtbl(mrb);
251 mrb_alloca_free(mrb);
252 mrb_gc_destroy(mrb, &mrb->gc);
253 mrb_free(mrb, mrb);
254}
255
256MRB_API mrb_irep*
257mrb_add_irep(mrb_state *mrb)
258{
259 static const mrb_irep mrb_irep_zero = { 0 };
260 mrb_irep *irep;
261
262 irep = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep));
263 *irep = mrb_irep_zero;
264 irep->refcnt = 1;
265 irep->own_filename = FALSE;
266
267 return irep;
268}
269
270MRB_API mrb_value
271mrb_top_self(mrb_state *mrb)
272{
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 return mrb_obj_value(mrb->top_self);
279}
280
281MRB_API void
282mrb_state_atexit(mrb_state *mrb, mrb_atexit_func f)
283{
284#ifdef MRB_FIXED_STATE_ATEXIT_STACK
285 if (mrb->atexit_stack_len + 1 > MRB_FIXED_STATE_ATEXIT_STACK_SIZE) {
286 mrb_raise(mrb, E_RUNTIME_ERROR, "exceeded fixed state atexit stack limit");
287 }
288#else
289 size_t stack_size;
290
291 stack_size = sizeof(mrb_atexit_func) * (mrb->atexit_stack_len + 1);
292 if (mrb->atexit_stack_len == 0) {
293 mrb->atexit_stack = (mrb_atexit_func*)mrb_malloc(mrb, stack_size);
294 }
295 else {
296 mrb->atexit_stack = (mrb_atexit_func*)mrb_realloc(mrb, mrb->atexit_stack, stack_size);
297 }
298#endif
299
300 mrb->atexit_stack[mrb->atexit_stack_len++] = f;
301}
Note: See TracBrowser for help on using the repository browser.