summaryrefslogtreecommitdiffhomepage
path: root/src/state.c
diff options
context:
space:
mode:
authormimaki <[email protected]>2012-04-20 09:39:03 +0900
committermimaki <[email protected]>2012-04-20 09:39:03 +0900
commite0d6430f63c4cbe0c71ce82ee23284671389a818 (patch)
tree41abad7f12eced98d9ac14d141cea62464c3332f /src/state.c
parent54ad561098ed353ada70205c39b2c42a2a2eb9e5 (diff)
downloadmruby-e0d6430f63c4cbe0c71ce82ee23284671389a818.tar.gz
mruby-e0d6430f63c4cbe0c71ce82ee23284671389a818.zip
add mruby sources
Diffstat (limited to 'src/state.c')
-rw-r--r--src/state.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/state.c b/src/state.c
new file mode 100644
index 000000000..14efed986
--- /dev/null
+++ b/src/state.c
@@ -0,0 +1,88 @@
+#include "mruby.h"
+#include "irep.h"
+#include <string.h>
+
+void mrb_init_heap(mrb_state*);
+void mrb_init_core(mrb_state*);
+void mrb_init_ext(mrb_state*);
+
+mrb_state*
+mrb_open_allocf(mrb_allocf f)
+{
+ mrb_state *mrb = (f)(NULL, NULL, sizeof(mrb_state));
+
+ memset(mrb, 0, sizeof(mrb_state));
+ mrb->allocf = f;
+ mrb->current_white_part = MRB_GC_WHITE_A;
+
+ mrb_init_heap(mrb);
+ mrb_init_core(mrb);
+ mrb_init_ext(mrb);
+ return mrb;
+}
+
+static void*
+allocf(mrb_state *mrb, void *p, size_t size)
+{
+ if (size == 0) {
+ free(p);
+ return NULL;
+ }
+ else {
+ return realloc(p, size);
+ }
+}
+
+mrb_state*
+mrb_open()
+{
+ mrb_state *mrb = mrb_open_allocf(allocf);
+
+ return mrb;
+}
+
+void
+mrb_close(mrb_state *mrb)
+{
+ int i;
+
+ /* free */
+ mrb_free(mrb, mrb->stbase);
+ mrb_free(mrb, mrb->cibase);
+ for (i=0; i<mrb->irep_len; i++) {
+ if (mrb->irep[i]->flags & MRB_IREP_NOFREE) continue;
+ if ((mrb->irep[i]->flags & MRB_ISEQ_NOFREE) == 0) {
+ mrb_free(mrb, mrb->irep[i]->iseq);
+ }
+ mrb_free(mrb, mrb->irep[i]->pool);
+ mrb_free(mrb, mrb->irep[i]->syms);
+ mrb_free(mrb, mrb->irep[i]);
+ }
+ mrb_free(mrb, mrb->irep);
+ mrb_free(mrb, mrb);
+}
+
+void
+mrb_add_irep(mrb_state *mrb, int idx)
+{
+ if (!mrb->irep) {
+ int max = 256;
+
+ if (idx > max) max = idx+1;
+ mrb->irep = mrb_malloc(mrb, sizeof(mrb_irep*)*max);
+ mrb->irep_capa = max;
+ }
+ else if (mrb->irep_capa < idx) {
+ while (mrb->irep_capa < idx) {
+ mrb->irep_capa *= 2;
+ }
+ mrb->irep = mrb_realloc(mrb, mrb->irep, sizeof(mrb_irep)*mrb->irep_capa);
+ }
+}
+
+mrb_value
+mrb_top_self(mrb_state *mrb)
+{
+ // for now
+ return mrb_nil_value();
+}