[#15701] Ruby 1.9.0-1 snapshot released — Yukihiro Matsumoto <matz@...>
Hi,
[#15704] Proc#curry doesn't work on func which produces func — Lin Jen-Shin <godfat@...>
Proc#curry doesn't work on function which produces function,
Hi,
>>>>> "Y" == Yusuke ENDOH <mame@tsg.ne.jp> writes:
[#15707] Schedule for the 1.8.7 release — "Akinori MUSHA" <knu@...>
Hi, developers,
On Sat, Mar 01, 2008 at 08:58:00PM +0900, Akinori MUSHA wrote:
Hi,
At Fri, 21 Mar 2008 23:16:54 +0900,
At Mon, 24 Mar 2008 21:39:45 +0900,
[#15709] capitalize and downcase — Trans <transfire@...>
I've always wondered why String#capitalize downcases the whole string
[#15713] Ruby String hash key overflow when converting to Fixnum. — "Chiyuan Zhang" <pluskid@...>
Hi, all! I've opened a issue at rubyforge:
[#15728] Question on build process - skipping unsupported extensions — Daniel Berger <djberg96@...>
Hi,
[#15740] Copy-on-write friendly garbage collector — Hongli Lai <hongli@...99.net>
Hi.
Hi,
Yukihiro Matsumoto wrote:
Yukihiro Matsumoto wrote:
Hi.
Hongli Lai wrote:
Hi.
Hi,
I believe I managed to close the performance gap to only 6% slower than
Daniel DeLorme wrote:
[#15746] Am I misinterpreting the new keyword arguments to IO.foreach and friends? — Dave Thomas <dave@...>
I was expecting this to pass lines to the block:
[#15756] embedding Ruby 1.9.0 inside pthread — "Suraj Kurapati" <sunaku@...>
Hello,
Hi,
Hi,
Yukihiro Matsumoto wrote:
Suraj N. Kurapati wrote:
Hi,
Nobuyoshi Nakada wrote:
Suraj N. Kurapati wrote:
Hongli Lai wrote:
[#15775] next(n), succ(n) ? — Trans <transfire@...>
Can anyone see any reason against adding an optional parameter to
[#15778] Named captures and regular captures — Dave Thomas <dave@...>
It seems that once you have a named capture in a regular expression,
[#15783] Adding startup and shutdown to Test::Unit — Daniel Berger <Daniel.Berger@...>
Hi all,
Daniel Berger wrote:
On Wed, Mar 05, 2008 at 07:52:40AM +0900, Daniel Berger wrote:
[#15835] TimeoutError in core, timeouts for ConditionVariable#wait — MenTaLguY <mental@...>
I've been reworking JRuby's stdlib to improve performance and fix
On Sun, 2008-03-09 at 12:13 +0900, MenTaLguY wrote:
[#15837] Correct procedure for patch review? — Hongli Lai <hongli@...99.net>
Hi.
[#15855] Ruby 1.8.6 trace return line numbers wrong — "Rocky Bernstein" <rocky.bernstein@...>
Consider this program:
[#15860] Webrick directory traversal exploit on UNIX — Jos Backus <jos@...>
DSecRG Advisory #DSECRG-08-026 aka -018 describes a remote directory traversal
[#15871] Sparc architecture optimizations — Thomas Enebo <Thomas.Enebo@...>
Someone at Sun has been looking at Ruby on Sparc:
Thomas Enebo wrote:
Hello Ruby-core,
Hi,
Yukihiro Matsumoto wrote:
Prashant Srinivasan wrote:
[#15880] Ruby 1.8.6 binding value after "if" expression evaluation — "Rocky Bernstein" <rocky.bernstein@...>
Here's another trace hook weirdness that I've encountered.
Hello,
Thanks. The output you report matches what I get in 1.8.6 and suggests where
I think I've found why this is happening. The trace hook for NODE_IF is
[#15907] Range#member? semantics seem wrong — Dave Thomas <dave@...>
Range#member? has been changed so that it the start and end of the
[#15909] RARRAY_PTR — "Laurent Sansonetti" <laurent.sansonetti@...>
Hi,
[#15917] Ruby 1.9 (trunk) crashes when running RubyGems and Rake — Hongli Lai <hongli@...99.net>
Ruby 1.9 (trunk) seems to crash when running the supplied RubyGems and Rake:
Hi,
Nobuyoshi Nakada wrote:
On Mon, Mar 17, 2008 at 06:53:19PM +0900, Hongli Lai wrote:
[#15927] how to create a block with a block parameter in C? — Paul Brannan <pbrannan@...>
This works in Ruby (1.9):
>>>>> "P" == Paul Brannan <pbrannan@atdesk.com> writes:
[#15933] complex and rational — Dave Thomas <dave@...>
Before I start doing the documentation for the PickAxe, could I just
[#15936] Are Depreciated Methods "add_final" & "remove_final" supposed to ACTUALLY WORK? — Charles Thornton <ceo@...>
In Working on IRHG Docs for GC the following
>>>>> "C" == Charles Thornton <ceo@hawthorne-press.com> writes:
ts wrote:
[#15938] Questions on Enumerator#skip_first and Enumerable#first — "Artem Voroztsov" <artem.voroztsov@...>
I asked in ruby-talk, but did not get answer.
On Mar 18, 2008, at 6:20 AM, Artem Voroztsov wrote:
[#15975] Bugs in REXML — "Federico Builes" <federico.builes@...>
Hi,
On Mar 21, 2008, at 17:35, Federico Builes wrote:
[#15980] 1.8.6 memory leak? — "Stephen Sykes" <sdsykes@...>
Hi,
[#15983] Changing the algorithm of String#* — apeiros <apeiros@...>
Hi there
[#15990] Recent changes in Range#step behavior — "Vladimir Sizikov" <vsizikov@...>
Hi,
Hi Dave,
Hi Dave,
Hi,
Hi,
Hi,
On Wed, Mar 26, 2008 at 7:01 PM, Dave Thomas <dave@pragprog.com> wrote:
Dave Thomas wrote:
Dave Thomas wrote:
Dave Thomas wrote:
Dave,
This is all a semantic problem. Different people have different
[#16011] New ERb mode — Marc Haisenko <haisenko@...>
Hi folks,
On Tuesday 25 March 2008, Marc Haisenko wrote:
ERb already does this:
On Tuesday 25 March 2008, Jason Roelofs wrote:
On Tue, Mar 25, 2008 at 11:39 AM, Marc Haisenko <haisenko@comdasys.com> wro=
On Tuesday 25 March 2008, Jason Roelofs wrote:
[#16023] some Enumerable methods slower in 1.9 on OS X after revision 15124 — Chris Shea <cmshea@...>
All,
Hi,
Hi,
On Thu, Mar 27, 2008 at 02:26:51PM +0900, Nobuyoshi Nakada wrote:
Hi,
Nobuyoshi Nakada wrote:
Hi,
[#16057] About the license of gserver.rb being "freeware"? — "XiaoLiang Liu" <liuxlsh@...>
Hello everyone,
[#16088] command_call in parse.y — Adrian Thurston <thurston@...>
Hi,
Ruby String hash key overflow when converting to Fixnum.
Hi, all! I've opened a issue at rubyforge:
http://rubyforge.org/tracker/?func=detail&aid=18507&group_id=426&atid=1698
It is said the issue will be automatically post
to ruby-core ml, but I didn't see it here. So I post this
manually.
== Summary
Ruby String hash key overflow when converting to Fixnum.
== How to reproduce?
Run the ruby code below:
class MyStr
def initialize(str)
@str = str
end
def hash
@str.hash
end
def eql?(o)
@str.eql?(o)
end
end
s1 = "foo"
s2 = "This"
my_s1 = MyStr.new(s1)
my_s2 = MyStr.new(s2)
h = { s1 => "value of foo", s2 => "value of This" }
puts "h[my_s1] = #{h[my_s1].inspect}"
puts "h[my_s2] = #{h[my_s2].inspect}"
== Expected output:
h[my_s1] = "value of foo"
h[my_s2] = "value of This"
== Actual output:
h[my_s1] = "value of foo"
h[my_s2] = nil
== My environment:
* ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-linux]
* Linux arch 2.6.24-ARCH #1 SMP PREEMPT Sun Feb 10 15:21:33 UTC 2008
i686 Intel(R) Core(TM)2 CPU T5600 @ 1.83GHz GenuineIntel
GNU/Linux
== Why this bug?
Ruby Hash is dealing with String specially. In hash.c:88 rb_any_hash,
we can see that if key is a String, its hash is calculated directly by
rb_str_hash:
switch (TYPE(a)) {
case T_FIXNUM:
case T_SYMBOL:
return (int)a;
break;
case T_STRING:
return rb_str_hash(a);
break;
But what's the case when we're calling hash in Ruby (not C)? See
string.c:898, rb_str_hash_m, int is converted to Fixnum:
int key = rb_str_hash(str);
return INT2FIX(key);
The calculated hash value of the word "This" is 2073740424, which
exceed the maximum value of a Ruby Fixnum. When converted it becomes
-73743224. You can see it in IRB:
irb(main):001:0> "This".hash
=> -73743224
That's why h[my_s2] returns nil. I'm stored it using s2 which is a
string. Ruby calculate its hash directly in C (without converting to
Fixnum and then back to int) which produce 2073740424. But when I
later fetch it, the hash calculated is -73743224. So I get nothing.
== Discussion
Someone might argue that the key to store is in fact "not the same" to
which I'm using to fetch. Will this be the desired behavior of Ruby
Hash? I just assume as long as the key produce the same hash value and
defined eql? properly, I can use them as Ducks (as in Duck-Typing).
In fact, in one of my project, I'm constructing a lot of temp small
Strings just to look up some value in a Hash. Those Strings are all
sub-string of a large piece of text. So I made a Substring class
(which stores reference to the text and the sub-string interval) to
avoid copying all those small Strings. The problem is: I'm storing
with normal Ruby String, but fetching with my own customized
Substring, and I get nothing.
== Patch
There're multiple ways to fix this problem. A more "proper" way is to
use INT2NUM instead of INT2FIX to avoid overflow. We can get the
"correct" hash value of a String in Ruby (which may be a
Bignum). However, this might be ineffecient. Constructing a Bignum
need time and memory, and an overhead of calling rb_funcall may be
introduced in rb_any_hash (hash.c:106)
if (!FIXNUM_P(hval)) {
hval = rb_funcall(hval, '%', 1, INT2FIX(536870923));
}
Another more efficient way is to perform truncation when calculating
String hash to make the result meet what we geet in Ruby world. Here's
the patch:
Index: hash.c
===================================================================
--- hash.c (revision 15640)
+++ hash.c (working copy)
@@ -97,7 +97,8 @@
break;
case T_STRING:
- return rb_str_hash(a);
+ /* do a shift to make it like being converted to Fixnum and back */
+ return (rb_str_hash(a)<<1>>1);
break;
default: