From 02f848f9a48129aca2b372a06a85da0e6c687923 Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 16 Nov 2004 14:51:38 +0000 Subject: [PATCH] * numeric.c (flo_divmod): protect float values from GC by assignment to local variables. [ruby-dev:24873] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7289 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ hash.c | 9 ++++++--- numeric.c | 4 +++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index f79edb3589..585fa25579 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Nov 16 23:45:07 2004 Yukihiro Matsumoto + + * numeric.c (flo_divmod): protect float values from GC by + assignment to local variables. [ruby-dev:24873] + Tue Nov 16 14:31:54 2004 Michael Neumann * test/xmlrpc/*: imported and refactored original test cases. diff --git a/hash.c b/hash.c index 270553005f..c9a26a0a80 100644 --- a/hash.c +++ b/hash.c @@ -1554,8 +1554,10 @@ rb_hash_update_block_i(key, value, hash) /* * call-seq: - * hsh.merge!(other_hash) => hsh - * hsh.update(other_hash) => hsh + * hsh.merge!(other_hash) => hsh + * hsh.update(other_hash) => hsh + * hsh.merge!(other_hash){|key, oldval, newval| block} => hsh + * hsh.update(other_hash){|key, oldval, newval| block} => hsh * * Adds the contents of other_hash to hsh, overwriting * entries with duplicate keys with those from other_hash. @@ -1581,7 +1583,8 @@ rb_hash_update(hash1, hash2) /* * call-seq: - * hsh.merge(other_hash) -> a_hash + * hsh.merge(other_hash) -> a_hash + * hsh.merge(other_hash){|key, oldval, newval| block} -> a_hash * * Returns a new hash containing the contents of other_hash and * the contents of hsh, overwriting entries in hsh with diff --git a/numeric.c b/numeric.c index 6b3c377001..a222bf3401 100644 --- a/numeric.c +++ b/numeric.c @@ -731,7 +731,9 @@ flo_divmod(x, y) return rb_num_coerce_bin(x, y); } flodivmod(RFLOAT(x)->value, fy, &div, &mod); - return rb_assoc_new(rb_float_new(div), rb_float_new(mod)); + x = rb_float_new(div); + y = rb_float_new(mod); + return rb_assoc_new(x, y); } /*