mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
merges r25377 from trunk into ruby_1_9_1.
-- * st.c (unpack_entries): save table->bins and never change the table during unpacking. Because st_insert() may cause GC and refer the table, i.e. st_foreach(). [Bug #2196] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@26490 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
8c9edc0082
commit
caa2bb47b3
3 changed files with 16 additions and 8 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
Fri Oct 17 00:05:53 2009 wanabe <s.wanabe@gmail.com>
|
||||||
|
|
||||||
|
* st.c (unpack_entries): save table->bins and never change the table
|
||||||
|
during unpacking. Because st_insert() may cause GC and refer the
|
||||||
|
table, i.e. st_foreach(). [Bug #2196]
|
||||||
|
|
||||||
Fri Oct 16 18:42:18 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Fri Oct 16 18:42:18 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* bootstraptest/test_gc.rb: added tests based on [ruby-dev:39484]
|
* bootstraptest/test_gc.rb: added tests based on [ruby-dev:39484]
|
||||||
|
|
16
st.c
16
st.c
|
@ -367,15 +367,17 @@ unpack_entries(register st_table *table)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct st_table_entry *packed_bins[MAX_PACKED_NUMHASH*2];
|
struct st_table_entry *packed_bins[MAX_PACKED_NUMHASH*2];
|
||||||
int num_entries = table->num_entries;
|
st_table tmp_table = *table;
|
||||||
|
|
||||||
memcpy(packed_bins, table->bins, sizeof(struct st_table_entry *) * num_entries*2);
|
memcpy(packed_bins, table->bins, sizeof(struct st_table_entry *) * table->num_entries*2);
|
||||||
table->entries_packed = 0;
|
table->bins = packed_bins;
|
||||||
table->num_entries = 0;
|
tmp_table.entries_packed = 0;
|
||||||
memset(table->bins, 0, sizeof(struct st_table_entry *) * table->num_bins);
|
tmp_table.num_entries = 0;
|
||||||
for (i = 0; i < num_entries; i++) {
|
memset(tmp_table.bins, 0, sizeof(struct st_table_entry *) * tmp_table.num_bins);
|
||||||
st_insert(table, (st_data_t)packed_bins[i*2], (st_data_t)packed_bins[i*2+1]);
|
for (i = 0; i < table->num_entries; i++) {
|
||||||
|
st_insert(&tmp_table, (st_data_t)packed_bins[i*2], (st_data_t)packed_bins[i*2+1]);
|
||||||
}
|
}
|
||||||
|
*table = tmp_table;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#define RUBY_VERSION "1.9.1"
|
#define RUBY_VERSION "1.9.1"
|
||||||
#define RUBY_PATCHLEVEL 395
|
#define RUBY_PATCHLEVEL 396
|
||||||
#define RUBY_VERSION_MAJOR 1
|
#define RUBY_VERSION_MAJOR 1
|
||||||
#define RUBY_VERSION_MINOR 9
|
#define RUBY_VERSION_MINOR 9
|
||||||
#define RUBY_VERSION_TEENY 1
|
#define RUBY_VERSION_TEENY 1
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue