summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--include/ruby/intern.h3
-rw-r--r--range.c11
-rw-r--r--struct.c13
4 files changed, 30 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 322eb95c9a..29bf4ed4ef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Fri Nov 23 15:59:04 2007 Tanaka Akira <akr@fsij.org>
+
+ * struct.c (rb_struct_alloc_noinit): new function.
+ (rb_struct_define_without_accessor): add allocator to the arguments.
+
+ * range.c (range_alloc): re-introduced using rb_struct_alloc_noinit.
+
Fri Nov 23 15:27:43 2007 Tanaka Akira <akr@fsij.org>
* re.c (REG_CASESTATE): unused macro removed.
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index 7af65d414f..20ba6ef55b 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -542,7 +542,8 @@ VALUE rb_struct_getmember(VALUE, ID);
VALUE rb_struct_iv_get(VALUE, const char*);
VALUE rb_struct_s_members(VALUE);
VALUE rb_struct_members(VALUE);
-VALUE rb_struct_define_without_accessor(char *, VALUE, ...);
+VALUE rb_struct_alloc_noinit(VALUE);
+VALUE rb_struct_define_without_accessor(char *, VALUE, rb_alloc_func_t, ...);
/* thread.c */
typedef void rb_unblock_function_t(void *);
typedef VALUE rb_blocking_function_t(void *);
diff --git a/range.c b/range.c
index 5855be5f91..6bc8dcda4a 100644
--- a/range.c
+++ b/range.c
@@ -816,6 +816,14 @@ range_loader(VALUE range, VALUE obj)
return range;
}
+static VALUE
+range_alloc(VALUE klass)
+{
+ /* rb_struct_alloc_noinit itself should not be used because
+ * rb_marshal_define_compat uses equality of allocaiton function */
+ return rb_struct_alloc_noinit(klass);
+}
+
/* A <code>Range</code> represents an interval---a set of values with a
* start and an end. Ranges may be constructed using the
* <em>s</em><code>..</code><em>e</em> and
@@ -879,7 +887,8 @@ Init_Range(void)
id_end = rb_intern("end");
id_excl = rb_intern("excl");
- rb_cRange = rb_struct_define_without_accessor("Range", rb_cObject,
+ rb_cRange = rb_struct_define_without_accessor(
+ "Range", rb_cObject, range_alloc,
"begin", "end", "excl", NULL);
rb_include_module(rb_cRange, rb_mEnumerable);
diff --git a/struct.c b/struct.c
index ad5f4619aa..ebf2049b7a 100644
--- a/struct.c
+++ b/struct.c
@@ -218,7 +218,13 @@ make_struct(VALUE name, VALUE members, VALUE klass)
}
VALUE
-rb_struct_define_without_accessor(char *class_name, VALUE super, ...)
+rb_struct_alloc_noinit(VALUE klass)
+{
+ return struct_alloc(klass);
+}
+
+VALUE
+rb_struct_define_without_accessor(char *class_name, VALUE super, rb_alloc_func_t alloc, ...)
{
VALUE klass;
va_list ar;
@@ -247,7 +253,10 @@ rb_struct_define_without_accessor(char *class_name, VALUE super, ...)
rb_iv_set(klass, "__size__", LONG2NUM(RARRAY_LEN(members)));
rb_iv_set(klass, "__members__", members);
- rb_define_alloc_func(klass, struct_alloc);
+ if (alloc)
+ rb_define_alloc_func(klass, alloc);
+ else
+ rb_define_alloc_func(klass, struct_alloc);
return klass;
}