summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-06-01 02:40:52 +0900
committerYukihiro Matsumoto <[email protected]>2012-06-01 02:40:52 +0900
commite36285769ad75d30bc835e795eb77608f23f66c4 (patch)
tree2794bc219684195e07c71eed0ffe502eb3510bcf
parentb7d5ccdb36528b2ab0009e4ec443b53e91ffb89e (diff)
downloadmruby-e36285769ad75d30bc835e795eb77608f23f66c4.tar.gz
mruby-e36285769ad75d30bc835e795eb77608f23f66c4.zip
new API mrb_gc_protect() to add object to arena
-rw-r--r--include/mruby.h2
-rw-r--r--src/gc.c25
2 files changed, 20 insertions, 7 deletions
diff --git a/include/mruby.h b/include/mruby.h
index 724f01d3e..2109a7615 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -506,7 +506,7 @@ mrb_value mrb_exec_recursive(mrb_state *mrb, mrb_value(*)(mrb_state *, mrb_value
#define xfree free
#endif
-void mrb_gc(void);
+void mrb_gc_protect(mrb_state *mrb, mrb_value obj);
#define thread_debug if(0)printf
#define RUBY_VM 1 /* YARV */
diff --git a/src/gc.c b/src/gc.c
index 6ebde5cb0..04be437c1 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -242,6 +242,24 @@ mrb_init_heap(mrb_state *mrb)
#endif
}
+static void
+gc_protect(mrb_state *mrb, struct RBasic *p)
+{
+ if (mrb->arena_idx > MRB_ARENA_SIZE) {
+ /* arena overflow error */
+ mrb->arena_idx = MRB_ARENA_SIZE - 4; /* force room in arena */
+ mrb_raise(mrb, mrb->eRuntimeError_class, "arena overflow error");
+ }
+ mrb->arena[mrb->arena_idx++] = p;
+}
+
+void
+mrb_gc_protect(mrb_state *mrb, mrb_value obj)
+{
+ if (SPECIAL_CONST_P(obj)) return;
+ gc_protect(mrb, RBASIC(obj));
+}
+
struct RBasic*
mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls)
{
@@ -264,12 +282,7 @@ mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls)
}
mrb->live++;
- if (mrb->arena_idx > MRB_ARENA_SIZE) {
- /* arena overflow error */
- mrb->arena_idx = MRB_ARENA_SIZE - 4; /* force room in arena */
- mrb_raise(mrb, mrb->eRuntimeError_class, "arena overflow error");
- }
- mrb->arena[mrb->arena_idx++] = p;
+ gc_protect(mrb, p);
memset(p, 0, sizeof(RVALUE));
p->tt = ttype;
p->c = cls;