summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-08-15 10:32:58 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-08-15 10:32:58 +0000
commitb5e89e44f12a6e3a42e9515d1d3705d11f9442bf (patch)
treee1fb1a0cd6b9fe28df591c9cbed4e9a4c7fdd4d3
parent85691b9578fae7de871fba8084e4c35205b441e9 (diff)
* array.c (rb_ary_tmp_new): added.
This function creates internal use only array (which is completely hided by ObjectSpace.each_object) with filling nil. Otherwise, it can be incldues strange VALUEs. * internal.h: added. * node.h: use rb_ary_tmp_new_fill() for MEMO. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47189 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog12
-rw-r--r--array.c9
-rw-r--r--internal.h1
-rw-r--r--node.h4
4 files changed, 23 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 6673d0029e..5c1a39a233 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+Fri Aug 15 19:27:25 2014 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (rb_ary_tmp_new): added.
+ This function creates internal use only array (which is completely
+ hided by ObjectSpace.each_object) with filling nil.
+
+ Otherwise, it can be incldues strange VALUEs.
+
+ * internal.h: added.
+
+ * node.h: use rb_ary_tmp_new_fill() for MEMO.
+
Fri Aug 15 10:13:37 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
* lib/gserver.rb: removed unmaintained code.
diff --git a/array.c b/array.c
index 5d327bc6be..17b9f9d6b3 100644
--- a/array.c
+++ b/array.c
@@ -550,6 +550,15 @@ rb_ary_tmp_new(long capa)
return ary_new(0, capa);
}
+VALUE
+rb_ary_tmp_new_fill(long capa)
+{
+ VALUE ary = ary_new(0, capa);
+ ary_memfill(ary, 0, capa, Qnil);
+ ARY_SET_LEN(ary, capa);
+ return ary;
+}
+
void
rb_ary_free(VALUE ary)
{
diff --git a/internal.h b/internal.h
index cc7daa82fa..9eea77753d 100644
--- a/internal.h
+++ b/internal.h
@@ -506,6 +506,7 @@ struct vtm; /* defined by timev.h */
VALUE rb_ary_last(int, const VALUE *, VALUE);
void rb_ary_set_len(VALUE, long);
void rb_ary_delete_same(VALUE, VALUE);
+VALUE rb_ary_tmp_new_fill(long capa);
/* bignum.c */
VALUE rb_big_fdiv(VALUE x, VALUE y);
diff --git a/node.h b/node.h
index 9ee07048c2..ffc8b1b739 100644
--- a/node.h
+++ b/node.h
@@ -468,9 +468,7 @@ typedef struct RNode {
#define roomof(x, y) ((sizeof(x) + sizeof(y) - 1) / sizeof(y))
#define MEMO_FOR(type, value) ((type *)RARRAY_PTR(value))
#define NEW_MEMO_FOR(type, value) \
- (rb_ary_set_len(((value) = rb_ary_tmp_new(roomof(type, VALUE))), \
- roomof(type, VALUE)), \
- MEMO_FOR(type, value))
+ ((value) = rb_ary_tmp_new_fill(roomof(type, VALUE)), MEMO_FOR(type, value))
RUBY_SYMBOL_EXPORT_BEGIN