aboutsummaryrefslogtreecommitdiffstats
path: root/gc.c
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-10-21 08:40:28 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-10-21 08:40:28 +0000
commit8ffcea9edcb265e81983ec3f3f8156f3b38158be (patch)
tree23b4471775b07e7c2b7dbccc6c4ac1d5627d0848 /gc.c
parent9d01767f8276215fdf6f0adff00835be670cb06b (diff)
downloadruby-8ffcea9edcb265e81983ec3f3f8156f3b38158be.tar.gz
Replace NODE_ALLOCA with T_IMEMO (imemo_alloc)
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60239 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/gc.c b/gc.c
index a0f7e89448..bcd48565c4 100644
--- a/gc.c
+++ b/gc.c
@@ -439,6 +439,7 @@ typedef struct RVALUE {
struct rb_method_entry_struct ment;
const rb_iseq_t iseq;
rb_env_t env;
+ struct rb_imemo_alloc_struct alloc;
} imemo;
struct {
struct RBasic basic;
@@ -2354,6 +2355,9 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
GC_ASSERT(VM_ENV_ESCAPED_P(RANY(obj)->as.imemo.env.ep));
xfree((VALUE *)RANY(obj)->as.imemo.env.env);
break;
+ case imemo_alloc:
+ xfree(RANY(obj)->as.imemo.alloc.ptr);
+ break;
default:
break;
}
@@ -3282,6 +3286,9 @@ obj_memsize_of(VALUE obj, int use_all_types)
case T_RATIONAL:
case T_COMPLEX:
case T_IMEMO:
+ if (imemo_type_p(obj, imemo_alloc)) {
+ size += RANY(obj)->as.imemo.alloc.cnt * sizeof(VALUE);
+ }
break;
case T_FLOAT:
@@ -4524,6 +4531,11 @@ gc_mark_imemo(rb_objspace_t *objspace, VALUE obj)
case imemo_iseq:
rb_iseq_mark((rb_iseq_t *)obj);
return;
+ case imemo_alloc:
+ rb_gc_mark_locations(RANY(obj)->as.imemo.alloc.ptr,
+ RANY(obj)->as.imemo.alloc.ptr + RANY(obj)->as.imemo.alloc.cnt);
+ rb_gc_mark(RANY(obj)->as.imemo.alloc.next);
+ return;
#if VM_CHECK_MODE > 0
default:
VM_UNREACHABLE(gc_mark_imemo);
@@ -8104,14 +8116,16 @@ ruby_mimfree(void *ptr)
void *
rb_alloc_tmp_buffer_with_count(volatile VALUE *store, size_t size, size_t cnt)
{
- NODE *s;
+ VALUE s;
+ rb_imemo_alloc_t *a;
void *ptr;
- s = rb_node_newnode(NODE_ALLOCA, 0, 0, 0);
+ s = rb_imemo_new(imemo_alloc, 0, 0, 0, 0);
ptr = ruby_xmalloc0(size);
- s->u1.value = (VALUE)ptr;
- s->u3.cnt = cnt;
- *store = (VALUE)s;
+ a = (rb_imemo_alloc_t*)s;
+ a->ptr = (VALUE*)ptr;
+ a->cnt = cnt;
+ *store = s;
return ptr;
}
@@ -9360,6 +9374,7 @@ rb_raw_obj_info(char *buff, const int buff_size, VALUE obj)
IMEMO_NAME(memo);
IMEMO_NAME(ment);
IMEMO_NAME(iseq);
+ IMEMO_NAME(alloc);
#undef IMEMO_NAME
}
snprintf(buff, buff_size, "%s %s", buff, imemo_name);