From b5e89e44f12a6e3a42e9515d1d3705d11f9442bf Mon Sep 17 00:00:00 2001 From: ko1 Date: Fri, 15 Aug 2014 10:32:58 +0000 Subject: [PATCH] * 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 --- ChangeLog | 12 ++++++++++++ array.c | 9 +++++++++ internal.h | 1 + node.h | 4 +--- 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 + + * 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 * 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