Bug #4040
SystemStackError with Hash[*a] for Large _a_
Description
=begin
I've been hesitating over whether to file a ticket about this, so please feel free to close if I've made the wrong choice.
I often use Hash[*array.flatten] in IRB to convert arrays of arrays into hashes. Today I noticed that if the array is big enough, this would raise a SystemStackError. Puzzled, I looked deeper. I assumed I was hitting the maximum number of arguments a method's argc can hold, but realised that the minimum size of the array needed to trigger this exception differed depending on whether I used IRB or not. So, presumably this is indeed exhausting the stack...
In IRB, the following is the minimal reproduction of this problem:
Hash[*130648.times.map{ 1 }]; true
I haven't looked for the minimum value needed with ruby -e
, but the following reproduces:
ruby -e 'Hash[*1380888.times.map{ 1 }]'
I suppose this isn't technically a bug, but maybe it offers another argument for either #666 or an extension of #3131.
=end
Related issues
Updated by duerst (Martin Dürst) about 10 years ago
=begin
This bug may be related to bug #982.
=end
Updated by naruse (Yui NARUSE) over 9 years ago
- Status changed from Open to Assigned
- Assignee set to ko1 (Koichi Sasada)
Updated by nahi (Hiroshi Nakamura) over 9 years ago
- Target version set to 1.9.3
Updated by ko1 (Koichi Sasada) over 9 years ago
- Target version changed from 1.9.3 to 2.0.0
Let us pending it to next version....
Updated by ko1 (Koichi Sasada) about 8 years ago
- Target version changed from 2.0.0 to 2.6
We need re-consideration about method invocation to support such cases.
I want to challenge at next version.
Updated by ko1 (Koichi Sasada) almost 4 years ago
Current implementation: now splatting huge parameters (and receive rest arguments) for Ruby methods are fine. However, C methods doesn't support this pattern. It should be fixed.
Updated by ko1 (Koichi Sasada) almost 4 years ago
- Related to Bug #5719: Hash::[] can't handle 100000+ args added