summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-05-15 10:26:22 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-05-15 10:26:22 +0000
commitf1ccdf98cae8e02d156968b1a8f67ac72f9857de (patch)
treee56d27915bce82ad470280cdf3f8194940b7a378 /gc.c
parent1ad7cbbf640f7af4be6d0a348f6f1fcab0628e2a (diff)
* gc.c (newobj): rename to `newobj_of' and accept additional
three parameters v1, v2, v3. newobj_of() do OBJSETUP() and fill values with v1, v2, v3. * gc.c (rb_data_object_alloc, rb_data_typed_object_alloc): use newobj_of(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40764 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c52
1 files changed, 25 insertions, 27 deletions
diff --git a/gc.c b/gc.c
index 831233d555..824d561fa7 100644
--- a/gc.c
+++ b/gc.c
@@ -191,6 +191,12 @@ typedef struct RVALUE {
struct RMatch match;
struct RRational rational;
struct RComplex complex;
+ struct {
+ struct RBasic basic;
+ VALUE v1;
+ VALUE v2;
+ VALUE v3;
+ } values;
} as;
#ifdef GC_DEBUG
const char *file;
@@ -775,7 +781,7 @@ heaps_increment(rb_objspace_t *objspace)
}
static VALUE
-newobj(VALUE klass, VALUE flags)
+newobj_of(VALUE klass, VALUE flags, VALUE v1, VALUE v2, VALUE v3)
{
rb_objspace_t *objspace = &rb_objspace;
VALUE obj;
@@ -807,6 +813,20 @@ newobj(VALUE klass, VALUE flags)
unlink_free_heap_slot(objspace, objspace->heap.free_slots);
}
+ /* OBJSETUP */
+ RBASIC(obj)->flags = flags;
+ RBASIC_SET_CLASS(obj, klass);
+ if (rb_safe_level() >= 3) FL_SET((obj), FL_TAINT | FL_UNTRUSTED);
+ RANY(obj)->as.values.v1 = v1;
+ RANY(obj)->as.values.v2 = v2;
+ RANY(obj)->as.values.v3 = v3;
+
+#ifdef GC_DEBUG
+ RANY(obj)->file = rb_sourcefile();
+ RANY(obj)->line = rb_sourceline();
+#endif
+ objspace->total_allocated_object_num++;
+
#if RGENGC_PROFILE
if (flags & FL_WB_PROTECTED) objspace->profile.generated_sunny_object_count++;
else {
@@ -817,13 +837,6 @@ newobj(VALUE klass, VALUE flags)
}
#endif
- MEMZERO((void*)obj, RVALUE, 1);
-#ifdef GC_DEBUG
- RANY(obj)->file = rb_sourcefile();
- RANY(obj)->line = rb_sourceline();
-#endif
- objspace->total_allocated_object_num++;
-
rgengc_report(5, objspace, "newobj: %p (%s)\n", (void *)obj, obj_type_name(obj));
#if USE_RGENGC && RGENGC_CHECK_MODE
@@ -838,18 +851,13 @@ newobj(VALUE klass, VALUE flags)
VALUE
rb_newobj(void)
{
- return newobj(0, T_NONE);
+ return newobj_of(0, T_NONE, 0, 0, 0);
}
VALUE
rb_newobj_of(VALUE klass, VALUE flags)
{
- VALUE obj;
-
- obj = newobj(klass, flags);
- OBJSETUP(obj, klass, flags);
-
- return obj;
+ return newobj_of(klass, flags, 0, 0, 0);
}
NODE*
@@ -870,25 +878,15 @@ rb_node_newnode(enum node_type type, VALUE a0, VALUE a1, VALUE a2)
VALUE
rb_data_object_alloc(VALUE klass, void *datap, RUBY_DATA_FUNC dmark, RUBY_DATA_FUNC dfree)
{
- NEWOBJ_OF(data, struct RData, klass, T_DATA);
if (klass) Check_Type(klass, T_CLASS);
- data->data = datap;
- data->dfree = dfree;
- data->dmark = dmark;
-
- return (VALUE)data;
+ return newobj_of(klass, T_DATA, (VALUE)dmark, (VALUE)dfree, (VALUE)datap);
}
VALUE
rb_data_typed_object_alloc(VALUE klass, void *datap, const rb_data_type_t *type)
{
- NEWOBJ_OF(data, struct RTypedData, klass, T_DATA);
if (klass) Check_Type(klass, T_CLASS);
- data->data = datap;
- data->typed_flag = 1;
- data->type = type;
-
- return (VALUE)data;
+ return newobj_of(klass, T_DATA, (VALUE)type, (VALUE)1, (VALUE)datap);
}
size_t