Ruby Issue Tracking System: Issues
https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2023-10-12T12:56:37Z
Ruby Issue Tracking System
Redmine
Ruby master - Bug #19922 (Open): ObjectSpace.dump_all in multiple threads in parallel causes SEGV
https://bugs.ruby-lang.org/issues/19922
2023-10-12T12:56:37Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p><code>ObjectSpace.dump_all</code> in multiple threads in parallel causes SEGV.<br>
The reproduce code is here:</p>
<pre><code>$ ruby -robjspace -e 'def dump; 10.times { ObjectSpace.dump_all } end; Thread.new { dump }; dump'
/home/wanabe/.rbenv/versions/master/lib/ruby/3.3.0+0/objspace.rb:100: [BUG] Segmentation fault at 0x0000000000000000
(snip)
</code></pre>
<p>I attached the full log.</p>
<p>I assumed that:</p>
<ul>
<li>Thread1
<ul>
<li>calls <code>rb_objspace_reachable_objects_from_root()</code>
</li>
<li>changes <code>GET_RACTOR()->mfd</code>: mfd1</li>
<li>calls <code>dump_flush()</code>
<ul>
<li>changes current thread due to IO</li>
</ul>
</li>
</ul>
</li>
<li>Thread2
<ul>
<li>calls <code>rb_objspace_reachable_objects_from_root()</code>
</li>
<li>changes <code>GET_RACTOR()->mfd</code>: mfd2</li>
<li>calls <code>dump_flush()</code>
<ul>
<li>changes current thread due to IO</li>
</ul>
</li>
</ul>
</li>
<li>Thread1
<ul>
<li>gets unexpected <code>GET_RACTOR()->mfd</code>: mfd2</li>
</ul>
</li>
</ul>
Ruby master - Bug #18180 (Closed): opt_newarray_min/max instructions ignore refined methods
https://bugs.ruby-lang.org/issues/18180
2021-09-20T13:36:29Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<pre><code>$ ./miniruby -ve 'module M; refine Array do; def max; :max; end; def min; :min; end; end; end; using M; p [1 + 0, 2, 3].max, [1 + 0, 2, 3].min'
ruby 3.1.0dev (2021-09-20T10:07:58Z master cb8434563d) [x86_64-linux]
3
1
</code></pre>
<p>I expected :max and :min to be returned.</p>
<p>If I avoid the opt_newarray_min/max instruction, the behavior will be as expected.</p>
<pre><code>$ ./miniruby -ve 'module M; refine Array do; def max; :max; end; def min; :min; end; end; end; using M; p [1, 2, 3].max, [1, 2, 3].min'
ruby 3.1.0dev (2021-09-20T10:07:58Z master cb8434563d) [x86_64-linux]
:max
:min
</code></pre>
Ruby master - Bug #17275 (Closed): Please backport 8b0dc77a621ded75f72486c33f55404ce73f00d7
https://bugs.ruby-lang.org/issues/17275
2020-10-21T07:43:42Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>I've encountered the issue as same as <a href="https://github.com/ruby/ruby/pull/3307" class="external">https://github.com/ruby/ruby/pull/3307</a> with ruby-2.7.2.<br>
I'm using a workaround for now, but it would be very nice if ruby_2_7 had a backport the commit <a href="https://git.ruby-lang.org/ruby.git/commit/?id=8b0dc77a621ded75f72486c33f55404ce73f00d7" class="external">https://git.ruby-lang.org/ruby.git/commit/?id=8b0dc77a621ded75f72486c33f55404ce73f00d7</a> and release.</p>
<p>I'd like to put "2.7: REQUIRED" in the Backport field, but I'm not a backport maintainer, so I'll leave it up to you to decide.<br>
I hope you will consider it. Thank you.</p>
Ruby master - Bug #17192 (Closed): ISeq.load_from_binary can cause BUG if binary is a rbinc-derived
https://bugs.ruby-lang.org/issues/17192
2020-09-26T07:18:17Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>The following command can cause BUG.</p>
<pre><code>$ ruby -e 'print RubyVM::InstructionSequence.of(1.method(:abs)).to_binary'|ruby -e 'RubyVM::InstructionSequence.load_from_binary(ARGF.read)'
-e:1: [BUG] ibf_load_builtin: table is not provided.
ruby 3.0.0dev (2020-09-25T22:52:04Z master 137fa5b27e) [x86_64-linux]
-- Control frame information -----------------------------------------------
c:0003 p:---- s:0011 e:000010 CFUNC :load_from_binary
c:0002 p:0026 s:0006 e:000005 EVAL -e:1 [FINISH]
c:0001 p:0000 s:0003 E:001910 (none) [FINISH]
-- Ruby level backtrace information ----------------------------------------
-e:1:in `<main>'
-e:1:in `load_from_binary'
-- C level backtrace information -------------------------------------------
[0x5635c8378d2e]
/home/wanabe/.rbenv/versions/master/bin/ruby(rb_bug+0xe9) [0x5635c817641c] ../../error.c:686
[0x5635c817b772]
/home/wanabe/.rbenv/versions/master/bin/ruby(ibf_load_iseq+0xf3) [0x5635c83de093] ../../compile.c:11898
[0x5635c83de18e]
(snip)
</code></pre>
<p>I think that <code>ISeq.of</code> should raise some kind of exception on the case.<br>
Or <code>ISeq.load_from_binary</code> may raise an exception.</p>
Ruby master - Bug #16161 (Closed): tailcall_optimization may be disabled after r67315
https://bugs.ruby-lang.org/issues/16161
2019-09-10T00:28:17Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>Before r67315:</p>
<pre><code>$ ./miniruby -v -e 'iseq = RubyVM::InstructionSequence.compile("def foo(n, s = 0);return s if n < 1;foo(n - 1, n + s); end", tailcall_optimization: true); iseq.eval; p foo(900_000)'
ruby 2.7.0dev (2019-03-20 trunk 67314) [x86_64-linux]
405000450000
</code></pre>
<p>After r67315:</p>
<pre><code>$ ./miniruby -v -e 'iseq = RubyVM::InstructionSequence.compile("def foo(n, s = 0);return s if n < 1;foo(n - 1, n + s); end", tailcall_optimization: true); iseq.eval; p foo(900_000)'
ruby 2.7.0dev (2019-03-20 trunk 67315) [x86_64-linux]
Traceback (most recent call last):
10080: from -e:1:in `<main>'
10079: from <compiled>:1:in `foo'
10078: from <compiled>:1:in `foo'
10077: from <compiled>:1:in `foo'
10076: from <compiled>:1:in `foo'
10075: from <compiled>:1:in `foo'
10074: from <compiled>:1:in `foo'
10073: from <compiled>:1:in `foo'
... 10068 levels...
4: from <compiled>:1:in `foo'
3: from <compiled>:1:in `foo'
2: from <compiled>:1:in `foo'
1: from <compiled>:1:in `foo'
<compiled>:1:in `foo': stack level too deep (SystemStackError)
</code></pre>
<p>master:</p>
<pre><code>$ ./miniruby -v -e 'iseq = RubyVM::InstructionSequence.compile("def foo(n, s = 0);return s if n < 1;foo(n - 1, n + s); end", tailcall_optimization: true); iseq.eval; p foo(900_000)'
ruby 2.7.0dev (2019-09-09T23:18:03Z master 3678c37119) [x86_64-linux]
Traceback (most recent call last):
10080: from -e:1:in `<main>'
10079: from <compiled>:1:in `foo'
10078: from <compiled>:1:in `foo'
10077: from <compiled>:1:in `foo'
10076: from <compiled>:1:in `foo'
10075: from <compiled>:1:in `foo'
10074: from <compiled>:1:in `foo'
10073: from <compiled>:1:in `foo'
... 10068 levels...
4: from <compiled>:1:in `foo'
3: from <compiled>:1:in `foo'
2: from <compiled>:1:in `foo'
1: from <compiled>:1:in `foo'
<compiled>:1:in `foo': stack level too deep (SystemStackError)
</code></pre>
<p>I think ruby should not raise SystemStackError with tailcall_optimization, should it?</p>
Ruby master - Bug #16019 (Closed): please backport df317151a5b4e0c5a30fcc321a9dc6abad63f7ed
https://bugs.ruby-lang.org/issues/16019
2019-07-24T23:37:30Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p><code>TracePoint#enable</code> can cause SEGV without df317151a5b4e0c5a30fcc321a9dc6abad63f7ed on ruby_2_6.</p>
<pre><code>$ ((cd ../../; git checkout .); make install-nodoc -j4) >/dev/null 2>&1
$ ruby -v -e 'def foo; TracePoint.new(:b_return, &:disable).enable(target: method(:bar)); end;def bar; 100.times{ foo; foo }; end; bar'
ruby 2.6.3p65 (2019-06-22 revision 67712) [x86_64-linux]
double free or corruption (fasttop)
Aborted (core dumped)
$
</code></pre>
<p>But it can't with df317151a5b4e0c5a30fcc321a9dc6abad63f7ed.</p>
<pre><code>$ ((cd ../../; git checkout .; git show df317151a5b4e0c5a30fcc321a9dc6abad63f7ed vm_trace.c|patch -p1); make install-nodoc -j4) >/dev/null 2>&1
$ ruby -v -e 'def foo; TracePoint.new(:b_return, &:disable).enable(target: method(:bar)); end;def bar; 100.times{ foo; foo }; end; bar'
ruby 2.6.3p65 (2019-06-22 revision 67712) [x86_64-linux]
$
</code></pre>
<p>I think ruby_2_5 doesn't need the commit because <code>TracePoint#enable</code> accepts "target:" since 2.6.</p>
Ruby master - Feature #15833 (Open): Some refactors for shared-root array
https://bugs.ruby-lang.org/issues/15833
2019-05-06T10:29:39Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>I wrote some patches for shared-root array.<br>
But I can't decide whether to commit them because they include the modification of public header <code>include/ruby/ruby.h</code>.</p>
<p>To ruby core team (I'm not assuming anyone in particular):<br>
Can I modify <code>include/ruby/ruby.h</code> by the patches?</p>
<p>The following is descriptions of the patches.</p>
<p><code>0001-Name-RArray-member-to-count-reference-of-shared-root.patch</code> names reference count of shared-root array.<br>
So far, <code>as.heap.aux.capa</code> is used as reference count but it is different from the reality, reference count.<br>
This is a follow up of r19824.</p>
<p><code>0002-Export-RARRAY_SHARED_ROOT_FLAG.patch</code> exports RARRAY_SHARED_ROOT_FLAG.<br>
I followed other flags as in RARRAY_EMBED_FLAG or RARRAY_TRANSIENT_FLAG.</p>
<p><code>0003-Fix-object-info-of-shared-root-array.patch</code> is not a refactor but feature request patch based on above ones.<br>
<code>rb_obj_info</code> outputs shared-root array info as same as normal array currently, but its capa is not a really "capa" as I said.</p>
Ruby master - Bug #15821 (Closed): ruby_process_options() may cause "WB miss (O->Y)"
https://bugs.ruby-lang.org/issues/15821
2019-05-04T05:42:25Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<a name="Problem"></a>
<h2 >Problem<a href="#Problem" class="wiki-anchor">¶</a></h2>
<p>Ruby interpreter may cause error "WB miss (O->Y)" on some conditions that are <code>RGENGC_CHECK_MODE=5</code> and <code>RUBY_DEBUG=gc_stress</code></p>
<a name="How-to-reproduce"></a>
<h2 >How to reproduce<a href="#How-to-reproduce" class="wiki-anchor">¶</a></h2>
<ol>
<li>build ruby with high RGENGC_CHECK_MODE
<ul>
<li><code>make ruby optflags="-O3 -DRGENGC_CHECK_MODE=5"</code></li>
</ul>
</li>
<li>run ruby with gc_stress
<ul>
<li><code>RUBY_DEBUG=gc_stress ./ruby --disable-gems -ve 1</code></li>
</ul>
</li>
</ol>
<a name="Probable-cause"></a>
<h2 >Probable cause<a href="#Probable-cause" class="wiki-anchor">¶</a></h2>
<ol>
<li>
<code>rb_construct_expanded_load_path</code> calls <code>rb_ary_replace(vm->load_path_snapshot, vm->load_path)</code>.</li>
<li>It creates shared root array and makes <code>vm->load_path</code> SHARED_ARRAY.</li>
<li>After a while, <code>process_options</code> calls <code>RARRAY_ASET(load_path, i, path)</code>.</li>
<li>It calls <code>rb_gc_writebarrier</code> -> <code>gc_writebarrier_generational</code>.
<ul>
<li>Incremental mark phase is finished because of <code>RUBY_DEBUG=gc_stress</code>.</li>
</ul>
</li>
<li>It makes <code>vm->load_path</code> remembered, but not shared root array!</li>
<li>"WB miss (O->Y)" is done.
<ul>
<li>Old parent is shared root array.</li>
<li>New child is <code>path</code> of above 3.</li>
</ul>
</li>
</ol>
<a name="Proposal"></a>
<h2 >Proposal<a href="#Proposal" class="wiki-anchor">¶</a></h2>
<p>How about call <code>rb_ary_modify</code> before <code>RARRAY_SET</code> in <code>process_options</code>?<br>
Or using <code>rb_ary_store</code> instead of <code>RARRAY_SET</code> may avoid the error.</p>
<a name="Sample-output"></a>
<h2 >Sample output<a href="#Sample-output" class="wiki-anchor">¶</a></h2>
<p>An example of full output is attached.<br>
(Sorry, I GZipped it because of file-size limitation)<br>
The snippet is here:</p>
<pre><code>ruby 2.7.0dev (2019-05-04 trunk b72623012d) [x86_64-linux]
verify_internal_consistency_reachable_i: WB miss (O->Y) 0x000055c3262f3610 [3LM ] T_ARRAY [ ] len: 20, capa:2 ptr:0x000055c326498380 -> 0x000055c3262f3908 [2 P ] T_STRING (String) /home/wanabe/.rbenv/versions/trunk/lib/ruby/site_ruby/2.7.0
[all refs] (size: 5307)
(snip)
[allrefs_dump_i] 0x000055c3263349f8 [3LMP ] T_ARRAY [E ] len: 0 (embed) <- <0x000055c326336f28 [0 P U] VM/thread (Thread) VM/thread>
./ruby: [BUG] Segmentation fault at 0x0000000000000010
ruby 2.7.0dev (2019-05-04 trunk b72623012d) [x86_64-linux]
-- Control frame information -----------------------------------------------
c:0001 p:0000 s:0003 E:0022c0 (none) [FINISH]
-- Machine register context ------------------------------------------------
RIP: 0x000055c32452e15a RBP: 0x0000000000000001 RSP: 0x00007ffea126d470
RAX: 0x0000000000000000 RBX: 0x000055c3262ef3c8 RCX: 0x0000000000000001
RDX: 0x000055c324773446 RDI: 0x00007ff8c77cb680 RSI: 0x0000000000000001
R8: 0x000055c3262ef3b8 R9: 0x0000000000000018 R10: 0x0000000000000018
R11: 0x0000000000000246 R12: 0x0000000000000100 R13: 0x0000000000000005
R14: 0x000055c3262f3c28 R15: 0x000055c3262ef1b0 EFL: 0x0000000000010206
-- C level backtrace information -------------------------------------------
/home/wanabe/work/prog/ruby/ruby/tmp/trunk/ruby(rb_vm_bugreport+0x554) [0x55c324769fa4] ../../vm_dump.c:715
[0x55c324760088]
/home/wanabe/work/prog/ruby/ruby/tmp/trunk/ruby(sigsegv+0x42) [0x55c324640d42] ../../signal.c:997
/lib/x86_64-linux-gnu/libpthread.so.0(__restore_rt+0x0) [0x7ff8c797ff40]
/home/wanabe/work/prog/ruby/ruby/tmp/trunk/ruby(allrefs_dump+0x1a) [0x55c32452e15a] /usr/include/x86_64-linux-gnu/bits/stdio2.h:100
[0x55c32453a478]
[0x55c32453a64c]
[0x55c32453f874]
/home/wanabe/work/prog/ruby/ruby/tmp/trunk/ruby(rb_str_dup+0x29) [0x55c32465aa59] ../../string.c:722
[0x55c32463f2e1]
/home/wanabe/work/prog/ruby/ruby/tmp/trunk/ruby(ruby_process_options+0xc0) [0x55c3246404a0] ../../ruby.c:2380
/home/wanabe/work/prog/ruby/ruby/tmp/trunk/ruby(ruby_options+0xca) [0x55c32451e1ea] ../../eval.c:118
/home/wanabe/work/prog/ruby/ruby/tmp/trunk/ruby(main+0x67) [0x55c324519ec7] ../../main.c:42
(snip)
Aborted (core dumped)
</code></pre>
Ruby master - Feature #15747 (Rejected): `(..1).last(2)` should return array but raise TypeError
https://bugs.ruby-lang.org/issues/15747
2019-04-04T00:12:44Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p><code>Range#last</code> with argument for beginless range shouldn't raise exception, should it?</p>
<pre><code>$ ./miniruby -ve 'p (..1).last(2)'
ruby 2.7.0dev (2019-04-04 trunk 67430) [x86_64-linux]
Traceback (most recent call last):
4: from -e:1:in `<main>'
3: from -e:1:in `last'
2: from -e:1:in `to_a'
1: from -e:1:in `to_a'
-e:1:in `each': can't iterate from NilClass (TypeError)
</code></pre>
<p><code>Range#last</code> without argument works fine.</p>
<pre><code>$ ./miniruby -ve 'p (..1).last'
ruby 2.7.0dev (2019-04-04 trunk 67430) [x86_64-linux]
1
</code></pre>
Ruby master - Bug #15629 (Closed): super_method fails on binded/unbinded/cloned methods
https://bugs.ruby-lang.org/issues/15629
2019-03-01T00:57:19Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>derived from <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: super_method fails on some UnboundMethods (Closed)" href="https://bugs.ruby-lang.org/issues/13973">#13973</a>:</p>
<pre><code>module A
def foo
end
end
module B
def foo
end
end
class C
include A
include B
end
c = C.new
m1 = c.method(:foo)
p m1.super_method # => #<Method: A#foo>
p m1.clone.super_method # => nil
p m1.unbind.super_method # => nil
m2 = C.instance_method(:foo)
p m2.super_method # => #<UnboundMethod: A#foo>
p m2.clone.super_method # => nil
p m2.bind(c).super_method # => nil
</code></pre>
<p><code>super_method</code> of binded/unbinded/cloned method should be <code>super_method</code> of original method, shouldn't it?</p>
Ruby master - Bug #15406 (Closed): Loaded iseq may cause SEGV on GC
https://bugs.ruby-lang.org/issues/15406
2018-12-12T20:59:04Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>Attached <code>test.rb</code> causes SEGV on trunk r66370.<br>
<code>test.log</code> is stderr log.</p>
<p>I don't known what <code>[0, 13, 0]</code> means, but I guess environment dependent.<br>
<code>./miniruby test.rb 4 17 0</code> also causes SEGV on mn environment but <code>./miniruby test.rb 4 16 0</code> doesn't.</p>
<p>Note:<br>
I've found the issue during the investigation of <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Stack consistency error (2.6.0-rc1, JIT) (Closed)" href="https://bugs.ruby-lang.org/issues/15395">#15395</a>, but I don't know it is related or not.</p>
Ruby master - Bug #15396 (Closed): Please backport r62621 for LLP64 environment
https://bugs.ruby-lang.org/issues/15396
2018-12-10T10:52:02Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>Sometimes ruby 2.5.4 occurs SEGV on mswin64.<br>
<a href="https://ci.appveyor.com/project/ruby/ruby/builds/20707563" class="external">https://ci.appveyor.com/project/ruby/ruby/builds/20707563</a></p>
<p>It can be reproduced on my environment.</p>
<pre><code>C:\ruby>miniruby.exe -v -e 'RubyVM::InstructionSequence.compile("[]<</1/").to_binary'
ruby 2.5.4p122 (2018-12-09 revision 66298) [x64-mswin64_140]
-e:1: [BUG] Segmentation fault
ruby 2.5.4p122 (2018-12-09 revision 66298) [x64-mswin64_140]
(snip)
</code></pre>
<p>And this SEGV can be resolved with r62621.</p>
<pre><code>C:\ruby>miniruby -e 'h=`git log origin/trunk --grep=@62621 --format=%H -1`; p h;system("git cherry-pick #{h}")'
"b001766b080a3572a7fae94aa0b8ab0b0a0f3ee2\n"
[ruby_2_5 f54400618a] compile.c: do not truncate VALUE to long
Author: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Thu Mar 1 07:59:57 2018 +0000
1 file changed, 2 insertions(+), 2 deletions(-)
C:\ruby>nmake miniruby && miniruby.exe -v -e 'RubyVM::InstructionSequence.compile("[]<</1/").to_binary'
Microsoft (R) Program Maintenance Utility Version 14.16.27024.1
Copyright (C) Microsoft Corporation. All rights reserved.
compiling compile.c
compile.c
user32.lib advapi32.lib shell32.lib ws2_32.lib iphlpapi.lib imagehlp.lib shlwapi.lib
linking miniruby.exe
ruby 2.5.4p122 (2018-12-09 revision 66298) [x64-mswin64_140]
ruby 2.5.4p122 (2018-12-09 revision 66298) [x64-mswin64_140]
</code></pre>
<p>Would you please backport r62621?</p>
Ruby master - Bug #15232 (Closed): Is https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.2.tar.bz2...
https://bugs.ruby-lang.org/issues/15232
2018-10-18T00:50:20Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>Hello,</p>
<p>I'm glad for new ruby release. Thank you so much.</p>
<p>I tried to build ruby-2.5.2 in docker environment, but I couldn't and got a such error.</p>
<pre><code>[root@9838dd79fcdd tmp]# rbenv install 2.5.2
Downloading ruby-2.5.2.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.2.tar.bz2
Installing ruby-2.5.2...
BUILD FAILED (CentOS release 6.10 (Final) using ruby-build 20180822-14-gcbbd3c2)
Inspect or clean up the working tree at /tmp/ruby-build.20181018003202.361
Results logged to /tmp/ruby-build.20181018003202.361.log
Last 10 log lines:
/tmp/ruby-build.20181018003202.361 /tmp
/tmp/ruby-build.20181018003202.361/ruby-2.5.2 /tmp/ruby-build.20181018003202.361 /tmp
checking for ruby... false
configure: error: cannot run /bin/sh tool/config.sub
</code></pre>
<p>I guess <code>tool/config.sub</code> and <code>tool/config.guess</code> are corrupted unexpectedly.</p>
<pre><code>[root@9838dd79fcdd tmp]# ls -la /tmp/ruby-build.20181018003202.361/ruby-2.5.2/tool/config.*
lrwxrwxrwx 1 1044 1044 33 Oct 18 00:32 /tmp/ruby-build.20181018003202.361/ruby-2.5.2/tool/config.guess -> ../.downloaded-cache/config.guess
lrwxrwxrwx 1 1044 1044 31 Oct 18 00:32 /tmp/ruby-build.20181018003202.361/ruby-2.5.2/tool/config.sub -> ../.downloaded-cache/config.sub
</code></pre>
<p>On another environment that has BASERUBY, I confirmed to run <code>configure</code>.</p>
<pre><code>/tmp/ruby-2.5.2 $ ./configure
checking for ruby... /home/wanabe/.rbenv/shims/ruby
downloading config.guess ... done
downloading config.sub ... done
(snip)
</code></pre>
Ruby master - Feature #15085 (Rejected): Decrease memory cache usage of MJIT
https://bugs.ruby-lang.org/issues/15085
2018-09-06T23:25:33Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>MJIT makes ruby-methods faster by ordinary, but I have observed that some cases are exceptional.<br>
I guess the one is caused by <code>invokesuper</code> instruction.<br>
And I guess it is related to memory caching, especially iTLB.</p>
<p>Attached "export-big-func.patch" makes MJIT binary code for <code>invokesuper</code> smaller.<br>
"super.rb" is a benchmark script with benchmark_driver.<br>
"benchmark.log" is a result of super.rb.<br>
"benchmark-with-perf.log" is another result with <code>PERF_STAT</code> environment variable.<br>
The results are merely in my environment and depend to a large part on machine specs.</p>
<p><code>invokesuper</code> can get faster with exported <code>vm_search_super_method()</code>, but I think it is not enough.<br>
Because <code>perf stat</code> shows that there are still many iTLB-load-misses.<br>
I believe MJIT can grow fast with good care for CPU memory cache, not only iTLB but also L1 / L2 and so on.</p>
Ruby master - Bug #15071 (Closed): RubyVM::MJIT.pause may cause deadlock after compaction
https://bugs.ruby-lang.org/issues/15071
2018-09-04T23:57:21Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>Sometimes I met thread-deadlock while waiting <code>RubyVM::MJIT.pause</code>.<br>
Here is a terminal log.</p>
<pre><code>$ ruby --disable-gems --jit --jit-verbose=1 --jit-max-cache=3 -e '100.times do |i| eval("def foo#{i}; end; " + "foo#{i}; " * 5); end; RubyVM::MJIT.pause'
JIT success (96.7ms): block in <main>@-e:1 -> /tmp/_ruby_mjit_p9628u4.c
JIT success (25.0ms): foo0@(eval):1 -> /tmp/_ruby_mjit_p9628u0.c
JIT success (26.2ms): foo1@(eval):1 -> /tmp/_ruby_mjit_p9628u1.c
JIT success (24.4ms): foo2@(eval):1 -> /tmp/_ruby_mjit_p9628u2.c
JIT success (28.0ms): foo3@(eval):1 -> /tmp/_ruby_mjit_p9628u3.c
JIT success (24.8ms): foo4@(eval):1 -> /tmp/_ruby_mjit_p9628u5.c
JIT success (25.4ms): foo5@(eval):1 -> /tmp/_ruby_mjit_p9628u6.c
JIT success (24.5ms): foo6@(eval):1 -> /tmp/_ruby_mjit_p9628u7.c
JIT success (25.1ms): foo7@(eval):1 -> /tmp/_ruby_mjit_p9628u8.c
JIT success (25.7ms): foo8@(eval):1 -> /tmp/_ruby_mjit_p9628u9.c
JIT compaction (4.9ms): Compacted 10 methods -> /tmp/_ruby_mjit_p9628u101.so
JIT success (23.9ms): foo9@(eval):1 -> /tmp/_ruby_mjit_p9628u10.c
^CTraceback (most recent call last):
1: from -e:1:in `<main>'
-e:1:in `pause': Interrupt
JIT success (62.2ms): foo10@(eval):1 -> /tmp/_ruby_mjit_p9628u11.c
Successful MJIT finish
</code></pre>
Ruby master - Bug #14660 (Closed): RubyVM::InstructionSequence.load_from_binary(bin).eval may cau...
https://bugs.ruby-lang.org/issues/14660
2018-04-02T23:50:27Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>A certain script can cause SEGV when ISeq#to_binary -> load_from_binary -> eval.</p>
<pre><code>$ ./miniruby -ve 'str = "class P; def p; end; def q; end; E = \"\"; N = \"\#{E}\"; attr_reader :i; end"; iseq = RubyVM::InstructionSequence.compile(str); bin = iseq.to_binary; RubyVM::InstructionSequence.load_from_binary(bin).eval'
ruby 2.6.0dev (2018-04-02 trunk 63063) [x86_64-linux]
Segmentation fault (core dumped)
</code></pre>
<p>(Note above script is shortened version of "minitest/pride_plugin.rb")</p>
<p><code>git bisect</code> shows it is since r62856, but I don't know the commit is "bad" or not.<br>
It may make apparent a hidden bug, or increase the probability of reproduction.</p>
Ruby master - Bug #13887 (Closed): test/ruby/test_io.rb may get stuck with FIBER_USE_NATIVE=0 on ...
https://bugs.ruby-lang.org/issues/13887
2017-09-10T13:19:02Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>Eric Wong wrote in <a href="https://bugs.ruby-lang.org/issues/13875#note-5" class="external">https://bugs.ruby-lang.org/issues/13875#note-5</a> <a href="/issues/13875">[ruby-core:82708]</a></p>
<blockquote>
<p>However, test/ruby/test_io.rb seems stuck when FIBER_USE_NATIVE is 0<br>
on my system...</p>
</blockquote>
<p>I can reproduce with <code>make optflags="-DFIBER_USE_NATIVE=0 -O0" test-all TESTOPTS="$(git rev-parse --show-cdup)/test/ruby/test_io.rb"</code> on my Ubuntu 17.10, glibc 2.24-12.</p>
<p>Here is a reduced code.<br>
This code don't stop with SIGINT (CTRL+C) so I had to use SIGKILL.</p>
<pre><code>1000.times do |i|
p i
r, w = IO.pipe
w.puts "foo"
w.close
rt = Thread.new do
r.each_char.next
r.close
end
Thread.new {}.join # <= stuck
rt.join
end
</code></pre>
<p>GDB showed ALLOCATE_STACK() had entered in infinity loop at get_cached_stack(), static function of glibc.<br>
I guess <code>stack_cache</code> local variable of allocatestack.c of glibc got corrupted.</p>
<pre><code>$ gdb --args ./miniruby -v a.rb
(snip)
(gdb) r
Starting program: /home/takira/work/prog/ruby/ruby/tmp/.out.tmp/miniruby -v a.rb
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7f2865b5e700 (LWP 5568)]
ruby 2.5.0dev (2017-09-10 trunk 59457) [x86_64-linux]
0
(snip)
[Thread 0x7f8fe2ba4700 (LWP 27769) exited]
51
[Thread 0x7f8fe2da6700 (LWP 27768) exited]
^C
Thread 1 "miniruby" received signal SIGINT, Interrupt.
0x00007f8fe4014bc3 in get_cached_stack (memp=<synthetic pointer>, sizep=<synthetic pointer>) at allocatestack.c:194
warning: Source file is more recent than executable.
194 if (FREE_P (curr) && curr->stackblock_size >= size)
(gdb) bt 5
#0 0x00007f8fe4014bc3 in get_cached_stack (memp=<synthetic pointer>, sizep=<synthetic pointer>)
at allocatestack.c:194
#1 allocate_stack (stack=<synthetic pointer>, pdp=<synthetic pointer>, attr=0x7fffffffb350) at allocatestack.c:496
#2 __pthread_create_2_1 (newthread=0x555555d3f488, attr=0x7fffffffb350,
start_routine=0x555555713e6d <thread_start_func_1>, arg=0x555555d3f3c0) at pthread_create.c:663
#3 0x0000555555714013 in native_thread_create (th=0x555555d3f3c0) at ../../thread_pthread.c:1031
#4 0x000055555571827a in thread_create_core (thval=93824997656680, args=93824997656600, fn=0x0)
at ../../thread.c:740
(More stack frames follow...)
(gdb) f 0
#0 0x00007f8fe4014bc3 in get_cached_stack (memp=<synthetic pointer>, sizep=<synthetic pointer>)
at allocatestack.c:194
194 if (FREE_P (curr) && curr->stackblock_size >= size)
(gdb) p (&stack_cache)->next
$1 = (struct list_head *) 0x7f8fe2da69c0
(gdb) p (&stack_cache)->next->next->next->next->next
$2 = (struct list_head *) 0x7f8fe2da69c0
</code></pre>
<p>I've reproduced it with ruby_2_4, ruby_2_3 and ruby_2_2.</p>
Ruby master - Bug #13412 (Closed): Infinite recursion with define_method may cause silent SEGV or...
https://bugs.ruby-lang.org/issues/13412
2017-04-09T09:04:20Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>The script causes silent (no output [BUG]) SEGV or "cfp consistency error" on my environment.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">define_method</span><span class="p">(</span><span class="ss">:foo</span><span class="p">)</span> <span class="p">{</span> <span class="n">foo</span> <span class="p">}</span>
<span class="kp">loop</span> <span class="k">do</span>
<span class="mi">1</span><span class="p">.</span><span class="nf">times</span> <span class="k">do</span>
<span class="mi">1</span><span class="p">.</span><span class="nf">times</span> <span class="k">do</span>
<span class="k">begin</span>
<span class="n">foo</span>
<span class="k">rescue</span> <span class="no">Exception</span>
<span class="kp">nil</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
<p>I think this is related to <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Redefining a lazy-loaded variable in child context within RSpec spec causes crash (Closed)" href="https://bugs.ruby-lang.org/issues/11430">#11430</a> (maybe same).</p>
Ruby master - Bug #11616 (Closed): Forwardable fails to adjust backtrace when Forwardable is not ...
https://bugs.ruby-lang.org/issues/11616
2015-10-23T21:17:56Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>as follows:</p>
<pre><code>$ cat t.rb
require "forwardable"
class Foo < BasicObject
extend ::Forwardable
def_delegator :bar, :baz
end
Foo.new.baz
$ ruby t.rb
/Users/guest/.rbenv/versions/trunk/lib/ruby/2.3.0/forwardable.rb:185:in `rescue in baz': uninitialized constant Foo::Forwardable (NameError)
from /Users/guest/.rbenv/versions/trunk/lib/ruby/2.3.0/forwardable.rb:182:in `baz'
from t.rb:9:in `<main>'
</code></pre>
<p>or define Forwardable in the target class:</p>
<pre><code>$ cat t2.rb
require "forwardable"
class Foo
extend Forwardable
def_delegator :bar, :baz
module Forwardable
end
end
Foo.new.baz
$ ruby t2.rb
/Users/guest/.rbenv/versions/trunk/lib/ruby/2.3.0/forwardable.rb:185:in `rescue in baz': undefined method `debug' for Foo::Forwardable:Module (NoMethodError)
from /Users/guest/.rbenv/versions/trunk/lib/ruby/2.3.0/forwardable.rb:182:in `baz'
from t2.rb:12:in `<main>'
</code></pre>
<p>expected result:</p>
<pre><code>$ cat t3.rb
require "forwardable"
class Foo
extend ::Forwardable
def_delegator :bar, :baz
end
Foo.new.baz
$ ruby t3.rb
t3.rb:9:in `<main>': undefined local variable or method `bar' for #<Foo:0x007fff0b8db3e8> (NameError)
</code></pre>
Ruby master - Bug #11107 (Closed): Syntax error is raised by "p ->() do a(1) do end end", but not...
https://bugs.ruby-lang.org/issues/11107
2015-04-29T11:39:44Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>As below, lambda literal with do..end block can raise syntax error.</p>
<pre><code>$ ./ruby -ve 'p ->() do a(1) do end end'
ruby 2.3.0dev (2015-04-26 trunk 50395) [x86_64-darwin14]
-e:1: syntax error, unexpected keyword_do_block, expecting keyword_end
p ->() do a(1) do end end
^
</code></pre>
<p>The error is not raised when I use {...} block or omit parentheses from method call in lambda.</p>
<p>NG cases:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="nb">p</span> <span class="o">-></span><span class="p">()</span> <span class="k">do</span> <span class="n">a</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">do</span> <span class="k">end</span> <span class="k">end</span>
<span class="nb">p</span> <span class="o">-></span><span class="p">()</span> <span class="k">do</span> <span class="n">a</span><span class="p">()</span> <span class="k">do</span> <span class="k">end</span> <span class="k">end</span>
<span class="nb">p</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-></span><span class="p">()</span> <span class="k">do</span> <span class="n">a</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">do</span> <span class="k">end</span> <span class="k">end</span>
</code></pre>
<p>OK cases:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="nb">p</span> <span class="o">-></span><span class="p">()</span> <span class="k">do</span> <span class="n">a</span> <span class="mi">1</span> <span class="k">do</span> <span class="k">end</span> <span class="k">end</span>
<span class="nb">p</span> <span class="o">-></span><span class="p">()</span> <span class="k">do</span> <span class="n">a</span> <span class="k">do</span> <span class="k">end</span> <span class="k">end</span>
<span class="nb">p</span> <span class="o">-></span><span class="p">()</span> <span class="p">{</span> <span class="n">a</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">do</span> <span class="k">end</span> <span class="p">}</span>
<span class="nb">p</span> <span class="o">-></span><span class="p">()</span> <span class="k">do</span> <span class="n">a</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{}</span> <span class="k">end</span>
<span class="nb">p</span> <span class="o">-></span><span class="p">()</span> <span class="p">{</span> <span class="n">a</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span> <span class="p">}</span>
</code></pre>
<p>Confirmed versions (same results):</p>
<ul>
<li>ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-darwin14.3.0]</li>
<li>ruby 2.0.0p598 (2014-11-13) [i386-mingw32]</li>
<li>ruby 2.1.5p273 (2014-11-13 revision 48405) [i386-mingw32]</li>
<li>ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14]</li>
<li>ruby 2.3.0dev (2015-04-26 trunk 50395) [x86_64-darwin14]</li>
</ul>
Ruby master - Bug #10722 (Closed): Array#keep_if is borked if user calls 'break'
https://bugs.ruby-lang.org/issues/10722
2015-01-09T08:52:43Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>ref. [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Array#delete_if is borked if user calls 'break' (Closed)" href="https://bugs.ruby-lang.org/issues/2545">#2545</a>]</p>
<pre><code>$ ruby -e 'a = [5,6,7,8,9,10]; a.keep_if { |x| break if x > 8; x >= 7 }; p a'
[7, 8, 7, 8, 9, 10]
$ ruby -e 'a = [5,6,7,8,9,10]; a.delete_if { |x| break if x > 8; x < 7 }; p a'
[7, 8, 9, 10]
</code></pre>
<p>I was expecting the above scripts to be same results.</p>
Ruby master - Misc #9803 (Rejected): document of Removed C API is missing in NEWS
https://bugs.ruby-lang.org/issues/9803
2014-05-05T14:56:11Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>I found that <code>rb_check_safe_str()</code> is removed in ruby-2.1 and trunk.<br>
And I found <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Feature: Remove deprecated definitions (Closed)" href="https://bugs.ruby-lang.org/issues/9502">#9502</a> and <a href="https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/CAPI_obsolete_definitions" class="external">CAPI_obsolete_definitions</a> page, but these changes is not in NEWS and NEWS-2.1.0 as I see.</p>
<p>The changes should be written in NEWS, shouldn't they?</p>
Ruby master - Feature #9761 (Closed): TRY_WITH_GC with ruby_gc_stress
https://bugs.ruby-lang.org/issues/9761
2014-04-20T00:49:20Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>I hope <code>TRY_WITH_GC()</code> may use <code>ruby_gc_stress</code> value.</p>
<p>Currently, <code>ruby_gc_stress</code> doesn't affect simple <code>xmalloc()</code>/<code>xrealloc()</code>/<code>xcalloc()</code>.<br>
It is usefull to make these functions under gc-stress.<br>
For example, <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Segfault in bigdecimal/util.rb Float#to_d (Closed)" href="https://bugs.ruby-lang.org/issues/9657">#9657</a> is difficult to reproduce on trunk because there is not object creation but memory allocation after <code>BigDecimal_new()</code>.</p>
Backport193 - Backport #6403 (Closed): self という名前のメソッド定義で SyntaxError
https://bugs.ruby-lang.org/issues/6403
2012-05-05T10:29:04Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p><a href="http://toro.2ch.net/test/read.cgi/tech/1328648447/925-931" class="external">http://toro.2ch.net/test/read.cgi/tech/1328648447/925-931</a><br>
で指摘されていたのですが、self という名前のメソッドの定義で<br>
メソッド内部先頭にシンボルがある場合 SyntaxError になります。<br>
また、セミコロンか改行をはさむと正常にパースされます。</p>
<p>def self; :foo; end #<= NG<br>
def self;; :foo; end #<= OK<br>
def self() :foo; end #<= OK<br>
def self(); :foo; end #<= OK<br>
def hoge; :foo; end #<= OK<br>
def class; :foo; end #<= OK</p>
<p>parse.y の f_arglist に関する規則の部分で、<br>
'(' f_args rparen の時には lex_state を変更しているのに<br>
f_args term の時には $$ = $1; しかしていないあたりが<br>
怪しいように思うのですがどうでしょうか。</p>
Backport193 - Backport #6069 (Closed): シングルクォート内のマルチバイト直前のバックスラッシュが消える
https://bugs.ruby-lang.org/issues/6069
2012-02-23T21:55:33Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p><a href="http://toro.2ch.net/test/read.cgi/tech/1324826777/710" class="external">http://toro.2ch.net/test/read.cgi/tech/1324826777/710</a> で指摘があったのですが<br>
| シングルクォート文字列リテラルで<br>
| マルチバイト文字直前のバックスラッシュが一つだけだと<br>
| バックスラッシュが消え去ってました<br>
とのことです。具体的には以下の例のようになります。</p>
<a name="coding-UTF-8"></a>
<h1 >coding: UTF-8<a href="#coding-UTF-8" class="wiki-anchor">¶</a></h1>
<p>p 'foo\ほげ' # => "fooほげ"</p>
<p>git bisect で追ってみると、r33161 からのようでした。<br>
<a href="http://d.hatena.ne.jp/nagachika/20110902/ruby_trunk_changes_33158_33164" class="external">http://d.hatena.ne.jp/nagachika/20110902/ruby_trunk_changes_33158_33164</a></p>
<p>たとえば ruby -e "p '\b'" などは "\b" となりますので、<br>
バックスラッシュは無視するのでなくそのまま残す方が嬉しいように思うのですがいかがでしょうか。</p>
Backport193 - Backport #6055 (Closed): IO.foreach 等で binmode:true を指定すると例外
https://bugs.ruby-lang.org/issues/6055
2012-02-21T23:08:20Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p><a href="http://toro.2ch.net/test/read.cgi/tech/1324826777/666-675" class="external">http://toro.2ch.net/test/read.cgi/tech/1324826777/666-675</a> で指摘があったのですが<br>
Windows で IO.foreach や IO.read などで mode を指定せずに binmode:true を指定すると例外が発生するそうです。<br>
(試していません。すみません)</p>
<p>元の書き込みを参考に処理を追うと、rb_io_extract_modeenc で、mode 指定がないときには DEFAULT_TEXTMODE を付与していますが<br>
その処理の後で extract_binmode 呼び出しがあり、FMODE_BINMODE も同時に付与されてしまう、という流れのように見えます。</p>
Backport193 - Backport #6054 (Closed): IO.foreach を Enumerator 化したときキーワード引数が無視される
https://bugs.ruby-lang.org/issues/6054
2012-02-21T23:00:53Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p><a href="http://toro.2ch.net/test/read.cgi/tech/1324826777/666-675" class="external">http://toro.2ch.net/test/read.cgi/tech/1324826777/666-675</a> で指摘があったのですが<br>
末尾に示すように、IO.foreach にブロックを渡さず Enumerator 化したときキーワード引数が無視されます。<br>
上の書き込みによると "先にハッシュオプション取り除いてからEnumeratorを生成しちゃってるのでハッシュオプションがEnumeratorには反映されない" とのことでした。<br>
rb_io_s_foreach 中の RETURN_ENUMERATOR を rb_scan_args より先にするべきではないか、ということのようです。</p>
<p>$ cat foo.rb<br>
p IO.foreach(<strong>FILE</strong>,mode:"a").next<br>
IO.foreach(<strong>FILE</strong>,mode:"a") {|l| p l }</p>
<p>$ ruby -v foo.rb<br>
ruby 2.0.0dev (2012-02-21 trunk 34711) [i686-linux]<br>
"p IO.foreach(<strong>FILE</strong>,mode:"a").next\n"<br>
foo.rb:2:in <code>foreach': not opened for reading (IOError) from foo.rb:2:in </code>'</p>
Ruby master - Bug #5671 (Closed): windows でのマルチバイト文字列を含むファイルへの File.chmod
https://bugs.ruby-lang.org/issues/5671
2011-11-26T07:38:58Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p><a href="http://hibari.2ch.net/test/read.cgi/tech/1155031689/805-809" class="external">http://hibari.2ch.net/test/read.cgi/tech/1155031689/805-809</a><br>
で言われていたのですが、Windows 環境で File.chmod に ASCII 範囲外の文字を含むファイル名を渡すと<br>
うまく動作しないようです。<br>
報告された方が行番号で箇所を指摘なさっているので、1.9.3-p0 のソースだろうという憶測を仮定とすると<br>
rb_w32_uchmod で filecp_to_wstr でなく utf8_to_wstr を使うべき、ということではないでしょうか。<br>
(試せていないので確実ではありません。すみません。)</p>
Ruby master - Feature #3638 (Closed): VM内データ構造へアクセスするマクロ
https://bugs.ruby-lang.org/issues/3638
2010-08-01T07:44:28Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
dfp[-1] といったマジックナンバーを減らすよう、マクロを新設するのはどうでしょうか。<br>
叩き台としてパッチを添付します。<br>
=end</p>
Ruby master - Bug #3267 (Closed): BigDecimal/mathでatan()に1.08を入れると戻り値の有効桁数が足りない
https://bugs.ruby-lang.org/issues/3267
2010-05-11T07:05:53Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
2ch.net 上で報告があったので転載します。</p>
<p>Rubyについて Part 40<br>
<a href="http://pc12.2ch.net/test/read.cgi/tech/1272248179/121-122" class="external">http://pc12.2ch.net/test/read.cgi/tech/1272248179/121-122</a></p>
<p>RubyのトランクのBigDecimal/math<br>
atan()に1.08を入れると戻り値の有効桁数が足りない</p>
<p>return pi.div(neg ? -2 : 2, prec) if x.infinite?<br>
return pi / (neg ? -4 : 4) if x.round(prec) == 1</p>
<ul>
<li>x = 1 / x if inv = x > 1<br>
x = (-1 + sqrt(1 + x**2, prec))/x if dbl = x > 0.5</li>
</ul>
<p>irb(main):004:0> BigDecimal("1")/BigDecimal("1.08")<br>
=> #<BigDecimal:9940ce4,'0.9259259259 25926E0',16(24)><br>
irb(main):005:0> BigDecimal("1").div(BigDecimal("1.08"), 30)<br>
=> #<BigDecimal:9957468,'0.9259259259 2592592592 5925925926E0',32(44)><br>
irb(main):006:0></p>
<p>ここで桁数が足りなくなるのね。<br>
分母と分子の有効桁数が少ないときに、出力の有効桁数の指定が無い場合は、<br>
適当にちょんぎるのは、言語仕様的には、正解でありましょう。<br>
1/3が来たら、メモリを全部使い切りました、では悲しい。<br>
はい、<br>
x = BigDecimal("1").div(x, prec)<br>
で、なおります。<br>
y = tan(atan(x, prec), prec)<br>
で、ループを廻して、xとyの値を比較していてたら、たまたま発見しました。<br>
あ、トランクにはtanはないのだけど、sinとcosの組み合わせで間に合わせました。<br>
tanはパッと見、収束が遅いようなので後回し。</p>
<p>あと、expの絶対値が大きくなると、戻って来ないのよね。<br>
exp(a*b+c) = exp(a)**b * exp(c)<br>
を使うと、幸せになれるかも。(ん十倍の威力で)<br>
んで、powerも全部の桁を計算してご苦労さんなんだが、integerではないのだから、そんなに気張らなくても..<br>
とは、思います。<br>
expと同じ要領でやると、実行速度がずいぶん速くなります。<br>
(Rubyのコードからpowerをcallするんだが、それでもとても速い。<br>
ソースを書き換える手もあるのだけど、コンパイルするのがめんどくさい。<br>
そもそも、その手の労力を厭わない人は、こっちに来なくて良いでしょ)</p>
<p>logは、exponentが負の場合、<br>
を書いてあるから、正で2桁以上の場合、を追加すると良いですね。<br>
expとlogが実用範囲内になると、実数**実数が(実用的に)使えるようになります。<br>
=end</p>
Ruby master - Bug #3198 (Rejected): O_APPEND for redirect fd is ignored on windows
https://bugs.ruby-lang.org/issues/3198
2010-04-25T12:35:50Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
Windows7 で、リダイレクト用にファイルをオープンする時<br>
O_APPEND を渡しても無視されます。</p>
<p>$ cat test.rb<br>
fname = "tmp.out"<br>
File.delete fname if File.exist? fname<br>
5.times do<br>
system("echo a", STDOUT=>[fname, File::WRONLY|File::CREAT|File::APPEND, 0644])<br>
end<br>
p IO.read(fname)</p>
<p>$ ruby -v test.rb<br>
ruby 1.9.2dev (2010-04-24 trunk 22784) [i386-mingw32]<br>
"a\n"</p>
<p>以下のようなパッチを書きました。特に反対がなければコミットさせて頂きます。<br>
rb_w32_open で処理することも考えましたが、おそらくリダイレクト以外では<br>
O_APPEND が効くのではないかと思うので、とりあえず process.c で処理しました。</p>
<a name="Index-processc"></a>
<h1 >Index: process.c<a href="#Index-processc" class="wiki-anchor">¶</a></h1>
<p>--- process.c (revision 27483)<br>
+++ process.c (working copy)<br>
@@ -2094,6 +2094,11 @@ run_exec_open(VALUE ary, VALUE save, char *errmsg, size_t errmsg_buflen)<br>
ERRMSG("open");<br>
return -1;<br>
}<br>
+#if defined(_WIN32)</p>
<ul>
<li>if (flags & O_APPEND) {</li>
<li>
<pre><code> lseek(fd2, 0, SEEK_END);
</code></pre>
</li>
<li>}<br>
+#endif<br>
while (i < RARRAY_LEN(ary) &&<br>
(elt = RARRAY_PTR(ary)[i], RARRAY_PTR(elt)[1] == param)) {<br>
fd = FIX2INT(RARRAY_PTR(elt)[0]);<br>
=end</li>
</ul>
Ruby master - Bug #2776 (Rejected): can't return from lambda with outer block
https://bugs.ruby-lang.org/issues/2776
2010-02-22T07:43:55Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
<a href="http://pc12.2ch.net/test/read.cgi/tech/1264635554/685" class="external">http://pc12.2ch.net/test/read.cgi/tech/1264635554/685</a> で質問されていたのですが<br>
1.8 と 1.9 で lambda の挙動が異なっています。</p>
<hr>
<a name="testrb"></a>
<h1 >test.rb<a href="#testrb" class="wiki-anchor">¶</a></h1>
<h2>class Foo<br>
def initialize(&func)<br>
@func = lambda(&func)<br>
end<br>
def bar(x)<br>
@func.call(x)<br>
end<br>
end<br>
foo = Foo.new{ |x| return x**2 }<br>
p foo.bar(2)</h2>
<p>$ ruby1.8 -v test.rb<br>
ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]<br>
4</p>
<p>$ ./ruby -v test.rb<br>
ruby 1.9.2dev (2010-02-21 trunk 26722) [i686-linux]<br>
test.rb:9:in <code>block in <main>': unexpected return (LocalJumpError) from test.rb:6:in </code>call'<br>
from test.rb:6:in <code>bar' from test.rb:10:in </code>'<br>
=end</p>
Ruby master - Bug #2632 (Rejected): Windows での未読のあるソケットのクローズ後の読み取り
https://bugs.ruby-lang.org/issues/2632
2010-01-23T03:22:36Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
Windows XP SP3 で、添付の test.rb を実行すると、Errno::ECONNRESET 例外が発生します。</p>
<p>$ ruby test.rb<br>
test.rb:11:in <code>gets': 既存の接続はリモート ホストに強制的に切断されました。 (Errno::ECONNRESET) from test.rb:11:in </code>'</p>
<p>C で同様のプログラムを書いた場合も同じ減少が確認できたので、Winsock2 の仕様と思われます。<br>
しかし不便なのでできれば ruby 側で回避できる部分はしてしまうのはどうでしょうか。</p>
<p>具体的に困る例として drb で argc_limit を超えた長さの引数を渡したとき<br>
DRbMessage#recv_request 中で引数を読まずに通信を終了するので<br>
これにより DRbConnError を起こしてしまう、というものがあります。<br>
TestDRbCore#test_03 などで確認できます。</p>
<p>ソケットを shutdown / close するときに読み込めるデータがあればすべて破棄するようにした<br>
パッチを書いてみたので添付します。<br>
また、vista や 7 で動作が異なっている場合は教えていただけるとありがたいです。<br>
=end</p>
Ruby master - Bug #2584 (Rejected): クラス定義中の defined? yield が "yield" を返す
https://bugs.ruby-lang.org/issues/2584
2010-01-10T05:36:54Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
クラス定義中は yield を呼べないにも関わらず、defined?(yield) が "yield" を返します。</p>
<p>$ ruby -ve 'class Foo;p defined?(yield);end'<br>
ruby 1.9.2dev (2010-01-09 trunk 26260) [i386-mingw32]<br>
"yield"</p>
<p>GET_BLOCK_PTR() はクラス定義中なら 0 を返す方がいいと思うのですがどうでしょうか。<br>
パッチを添付します。なお、このパッチで Bug <a class="issue tracker-4 status-5 priority-4 priority-default closed" title="Backport: Segmentation fault deleting key named :class via Hash#delete defined via define_method (Closed)" href="https://bugs.ruby-lang.org/issues/2568">#2568</a> も修正されます。<br>
=end</p>
Ruby master - Bug #2583 (Closed): クラス定義中の defined? yield が "yield" を返す
https://bugs.ruby-lang.org/issues/2583
2010-01-10T05:36:53Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
クラス定義中は yield を呼べないにも関わらず、defined?(yield) が "yield" を返します。</p>
<p>$ ruby -ve 'class Foo;p defined?(yield);end'<br>
ruby 1.9.2dev (2010-01-09 trunk 26260) [i386-mingw32]<br>
"yield"</p>
<p>GET_BLOCK_PTR() はクラス定義中なら 0 を返す方がいいと思うのですがどうでしょうか。<br>
パッチを添付します。なお、このパッチで Bug <a class="issue tracker-4 status-5 priority-4 priority-default closed" title="Backport: Segmentation fault deleting key named :class via Hash#delete defined via define_method (Closed)" href="https://bugs.ruby-lang.org/issues/2568">#2568</a> も修正されます。<br>
=end</p>
Ruby master - Bug #2552 (Closed): HOME 変数を空にして起動すると、再度空にできなくなる
https://bugs.ruby-lang.org/issues/2552
2010-01-03T23:22:20Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
WindowsXP にて、環境変数 HOME が設定されていない状態でインタプリタを起動すると<br>
ENV.delete "HOME" が無効になります。</p>
<p>$ cat test.rb<br>
ENV.delete "HOME"</p>
<p>if ARGV[0]<br>
p ENV["HOME"]<br>
else<br>
system("ruby -v #{$0} child")<br>
end</p>
<p>$ ruby test.rb<br>
ruby 1.9.2dev (2010-01-02 trunk 26229) [i386-mingw32]<br>
"C:/"</p>
<p>init_env() 中の SetEnvironmentVariableW() と ruby_setenv() 中の putenv() で<br>
不整合が起きているようです。<br>
=end</p>
Ruby master - Bug #2541 (Closed): fork のない環境での spawn による未使用 fd へのリダイレクト
https://bugs.ruby-lang.org/issues/2541
2009-12-31T13:36:00Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
fork のない環境で spawn するとき、未使用の fd へリダイレクトしようとすると<br>
EBADF 例外が発生してしまいます。<br>
save_redirect_fd() 中の redirect_dup() の戻り値のチェックで引っかかっているようです。</p>
<p>$ ruby -ve 'spawn("echo foo", 10=>STDOUT)'<br>
ruby 1.9.2dev (2009-12-31 trunk 26211) [i386-mingw32]<br>
-e:1:in <code>spawn': Bad file descriptor - dup (Errno::EBADF) from -e:1:in </code>'<br>
=end</p>
Ruby master - Feature #2471 (Rejected): want to choose a GC algorithm
https://bugs.ruby-lang.org/issues/2471
2009-12-10T08:42:53Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
GC のアルゴリズムを複数用意して、選択可能にするのはどうでしょうか。<br>
パッチを添付します。たたき台にしていただければ幸いです。</p>
<p>選択対象として、authorNari さんの LazySweep<br>
<a href="http://www.narihiro.info/resource/patch/rb_gc_lazy_improve.diff" class="external">http://www.narihiro.info/resource/patch/rb_gc_lazy_improve.diff</a><br>
を使わせていただきました。ありがとうございます。<br>
起動時に環境変数 RUBYGC に lazy を代入しておくことで LazySweep が有効になります。</p>
<p>コンパイル時に NOSELECT_GC 定数を定義することで無効にすることも可能です。<br>
関数ポインタを参照するわずかな遅延が許せない人向けに一応用意しましたが、<br>
適切に GC を選択するならばあまり問題にならないのではないかと思います。<br>
=end</p>
Ruby master - Bug #2425 (Closed): Kernel#public_method の例外メッセージ
https://bugs.ruby-lang.org/issues/2425
2009-12-03T19:26:17Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
private メソッドの名前を Kernel#public_method に渡したときの例外メッセージが<br>
undefined private method になっています。</p>
<p>$ ruby -ve 'public_method(:fork)'<br>
ruby 1.9.2dev (2009-12-03 trunk 25979) [i386-mingw32]<br>
-e:1:in <code>public_method': undefined private method </code>fork' for class <code>Object' (NameError) from -e:1:in </code>'<br>
=end</p>
Ruby 1.8 - Bug #2393 (Closed): NoMethodError's message change in second time
https://bugs.ruby-lang.org/issues/2393
2009-11-23T21:54:52Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
何もオーバーライドしていないメソッドから super でメソッドを呼び出そうとしたとき<br>
一度目と二度目以降で以下のように例外のメッセージが変化します。<br>
1.9 のチケットなので関係あるかわかりませんが、Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: NoMethodError message "no superclass method" (Closed)" href="https://bugs.ruby-lang.org/issues/2312">#2312</a> の三番目の例に似ている気がします。</p>
<p>$ ruby -ve 'def foo; super; end; 2.times{foo rescue p $!}'<br>
ruby 1.8.8dev (2009-11-23 revision 25888) [i386-mingw32]<br>
-e:1: warning: too many arguments for format string<br>
#<NoMethodError: super: no superclass method <code>foo'> #<NoMethodError: undefined method </code>foo' for main:Object><br>
=end</p>
Ruby master - Bug #2390 (Closed): Marshal.dump pass a hidden object
https://bugs.ruby-lang.org/issues/2390
2009-11-20T21:40:14Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
以下のようにすると、hidden T_STRING object であるとされて例外になります。</p>
<p>$ ruby -ve '<br>
r, w = IO.pipe<br>
def w.write(str)<br>
p str<br>
end<br>
Marshal.dump(Object.new, w)<br>
'<br>
ruby 1.9.2dev (2009-11-20 trunk 25868) [i386-mingw32]<br>
-e:4:in <code>p': method </code>inspect' called on hidden T_STRING object (0xb91048) (NotImplementedError)<br>
from -e:4:in <code>write' from -e:6:in </code>dump'<br>
from -e:6:in `'</p>
<p>r25230 ではなく r19653 から NotImplementedError になるようなので<br>
Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: r25230 causes SEGV arround Marshal (Closed)" href="https://bugs.ruby-lang.org/issues/2386">#2386</a> とは違う問題ではないかと思い、別のチケットにさせていただきました。<br>
もし同じ問題でしたら申し訳ありません。<br>
=end</p>
Ruby master - Feature #2372 (Closed): read_all() with buffering
https://bugs.ruby-lang.org/issues/2372
2009-11-15T21:21:23Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
io.c の read_all() で、変換が必要な場合の処理が少し重いようだったので<br>
バッファに少し溜めてから io_shift_cbuf() を呼び出すようにするパッチを書きました。<br>
溜めるバイト数は io_shift_cbuf() 中にあった式を参考にしています。</p>
<p>ベンチマークスクリプトとその結果を併せて添付します。<br>
bm_io_file_read.rb を参考に、エンコーディングやモードを複数試すようにしています。<br>
Windwos 以外では 'r' モードは 'rb' モードと同じ結果になると思います。</p>
<p>最大で約 2.8 倍速を計測しましたが、変換が複雑な場合には差は縮まり、<br>
また当然ながら短いファイルではほとんど差は出ませんでした。</p>
<p>どなたかもし興味を持っていただけたら、Windows でない、または十分速い環境で<br>
同様に速度が改善するかどうか試していただけると助かります。<br>
=end</p>
Ruby master - Bug #2369 (Rejected): ENV's strange behavior on WinXP
https://bugs.ruby-lang.org/issues/2369
2009-11-15T14:11:47Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
Windows XP SP2 環境の Mingw で、環境変数に最大文字数に近い長さの値か<br>
または最大文字数を超えた長さの値を設定しようとした場合の挙動がおかしいようです。<br>
確認用のスクリプトを添付します。</p>
<p>スクリプトのコメントに書きましたとおり、<br>
32767 文字よりやや短い値をセットすると値が正しく取り出せません。<br>
GetEnvironmentVariableAで確認すると正しく取り出せているようです。</p>
<p>また、32767 文字を超えた値を何度もセットすると SEGV します。<br>
恐らくこのために、make test-all が TestRequire#test_require_too_long_filename か<br>
あるいは数個先の TestRipper_Generic#test_parse_files 等で落ちます。</p>
<p>根本的には前者は kernel32.dll、後者は msvcrt.dll のバグだとは思うのですが、<br>
よろしければ対策をお願いいたします。<br>
=end</p>
Ruby master - Bug #2342 (Closed): bootstraptest/test_thread.rb がまれに失敗する
https://bugs.ruby-lang.org/issues/2342
2009-11-06T20:14:45Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
bootstraptest/test_thread.rb の、$~ のスレッドローカル性を確認するテストがまれに失敗します。<br>
r24754 で MatchData#== が新設されましたが、この変更に追随していないのではないかと思います。<br>
成功するケースは単純にスレッド切り替えより先にテストが終了した場合か<br>
または変数代入前にふたたびメインスレッドへ切り替わった場合のようです。<br>
=end</p>
Ruby master - Bug #2341 (Closed): CGIMultipartTest#_read のモードをバイナリモードに
https://bugs.ruby-lang.org/issues/2341
2009-11-06T19:23:30Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
CGIMultipartTest#_read のファイルオープン時のモードが<br>
1.8, 1.9 の区別なく 'rb' 指定であるとありがたいです。</p>
<p>'r:ascii-8bit' ですと Windows 環境では処理が重くなってしまうようです。<br>
またバイナリモードで明示的なエンコーディング指定がない場合は<br>
rb_io_extract_modeenc() を見る限り自動的に ASCII-8BIT が選択されるようですので<br>
分岐する必要はあまりなさそうに思います。<br>
=end</p>
Ruby master - Feature #2328 (Rejected): malloc_limit の肥大化を防ぎたい
https://bugs.ruby-lang.org/issues/2328
2009-11-04T08:28:09Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
何らかの原因で malloc_limit が肥大化してしまうと、GC のタイミングが遅れて<br>
Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: fiber tests kill windows (Closed)" href="https://bugs.ruby-lang.org/issues/1325">#1325</a> のように異常なほどのスワップや NoMemoryError を引き起こしかねません。<br>
改善案としてパッチを二つ書きました。よろしければご検討ください。<br>
また、このパッチが問題になるケースがあれば教えていただけるとありがたいです。</p>
<ol>
<li>vm_xrealloc() での malloc_increase のチェックおよび増加量の抑制</li>
</ol>
<p>vm_xrealloc() では、malloc_increase は上限チェック無しで増加しており、<br>
これは上記の問題につながります。<br>
単純に vm_xmalloc() と同様の上限チェックを行うと GC が起こりすぎるので、<br>
malloc_increase の増加量を、それまでの増加量の平均値(よりやや小さい値)だけ<br>
抑制することで、メモリ使用量の近似値を取り、GC 回数を減らしました。</p>
<ol start="2">
<li>
<p>GC ごとの malloc_limit の直接的な減少</p>
</li>
<li>
<p>の対策をとっても、例えば malloc_increase が上限に近いときに大きなサイズの<br>
malloc がされることが続いた場合、malloc_limit は減少することなく増加し続けます。<br>
膨大なメモリを使う場合やプロセスの寿命が長い場合は特に蓄積量が大きいと思われます。<br>
この対策として、GC のたびに malloc_limit を何割かずつ減らすのはどうでしょうか。<br>
パッチでは 1/16 ほどの値を減らしています。<br>
=end</p>
</li>
</ol>
Ruby master - Bug #2310 (Closed): should ensure GVL_UNLOCK_END in rb_thread_blocking_region
https://bugs.ruby-lang.org/issues/2310
2009-10-30T09:53:58Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
rb_thread_blocking_region から呼び出された関数中で例外等の大域脱出が起きると<br>
GVL_UNLOCK_END 等の後処理が呼ばれません。<br>
例えば、WindowsXP のような WSASendMsg がない環境では以下のようにすると固まります。</p>
<p>$ ruby -rsocket -ve 'begin UDPSocket.new.sendmsg "hoge";rescue Exception;p $!;end';echo $?<br>
ruby 1.9.2dev (2009-10-29 trunk 25559) [i386-mingw32]<br>
#<NotImplementedError: sendmsg() function is unimplemented on this machine><br>
5 # <== CTRL+c を入力するまで表示されない<br>
=end</p>
Ruby master - Bug #2226 (Closed): case 文の式が省略され when 節に配列展開があるときの挙動
https://bugs.ruby-lang.org/issues/2226
2009-10-18T10:40:00Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
ワナベと申します。</p>
<p>case 文の式が省略され、かつ when 節に配列展開があるときの挙動、<br>
より具体的には NODE_ARGSCAT, NODE_ARGSPUSH の<br>
コンパイル結果が正しくないように思います。<br>
通常の NODE_CASE と同じように処理するのはどうでしょうか。</p>
<p>$ cat test.rb<br>
case<br>
when *[], false<br>
p :ng1<br>
else<br>
p :ok<br>
end</p>
<p>case<br>
when *false, []<br>
p :ok<br>
else<br>
p :ng2<br>
end</p>
<p>begin<br>
case<br>
when false, *nonexistent_var, false<br>
p :ng3<br>
else<br>
p :ng4<br>
end<br>
rescue NameError<br>
p :ok<br>
end</p>
<p>$ ruby -v test.rb<br>
ruby 1.9.2dev (2009-10-17 trunk 25387) [i386-mingw32]<br>
:ng1<br>
:ng2<br>
:ng3</p>
<a name="Index-compilec"></a>
<h1 >Index: compile.c<a href="#Index-compilec" class="wiki-anchor">¶</a></h1>
<p>--- compile.c (revision 25387)<br>
+++ compile.c (working copy)<br>
@@ -3116,41 +3116,31 @@<br>
ADD_INSNL(body_seq, nd_line(node), jump, endlabel);</p>
<pre><code> vals = node->nd_head;
</code></pre>
<ul>
<li>
<pre><code> if (vals && nd_type(vals) == NODE_ARRAY) {
</code></pre>
</li>
</ul>
<ul>
<li>
<pre><code> if (!vals) {
</code></pre>
</li>
<li>
<pre><code> rb_bug("NODE_WHEN: must be NODE_ARRAY, but 0");
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>
<pre><code> switch (nd_type(vals)) {
</code></pre>
</li>
<li>
<pre><code> case NODE_ARRAY:
while (vals) {
val = vals->nd_head;
COMPILE(ret, "when2", val);
ADD_INSNL(ret, nd_line(val), branchif, l1);
vals = vals->nd_next;
}
</code></pre>
</li>
<li>
<pre><code> break;
</code></pre>
</li>
<li>
<pre><code> case NODE_SPLAT:
</code></pre>
</li>
<li>
<pre><code> case NODE_ARGSCAT:
</code></pre>
</li>
<li>
<pre><code> case NODE_ARGSPUSH:
</code></pre>
</li>
<li>
<pre><code> ADD_INSN(ret, nd_line(vals), putnil);
</code></pre>
</li>
<li>
<pre><code> COMPILE(ret, "when2/cond splat", vals);
</code></pre>
</li>
<li>
<pre><code> ADD_INSN1(ret, nd_line(vals), checkincludearray, Qfalse);
</code></pre>
</li>
<li>
<pre><code> ADD_INSN(ret, nd_line(vals), pop);
</code></pre>
</li>
<li>
<pre><code> ADD_INSNL(ret, nd_line(vals), branchif, l1);
</code></pre>
</li>
<li>
<pre><code> break;
</code></pre>
</li>
<li>
<pre><code> default:
</code></pre>
</li>
<li>
<pre><code> rb_bug("NODE_WHEN: unknown node (%s)",
</code></pre>
</li>
<li>
<pre><code> ruby_node_name(nd_type(vals)));
}
</code></pre>
</li>
</ul>
<ul>
<li>
<pre><code> else if (nd_type(vals) == NODE_SPLAT ||
</code></pre>
</li>
<li>
<pre><code> nd_type(vals) == NODE_ARGSCAT ||
</code></pre>
</li>
<li>
<pre><code> nd_type(vals) == NODE_ARGSPUSH) {
</code></pre>
</li>
<li>
<li>
<pre><code> NODE *val = vals->nd_head;
</code></pre>
</li>
<li>
<li>
<pre><code> if (nd_type(vals) == NODE_ARGSCAT || nd_type(vals) == NODE_ARGSPUSH) {
</code></pre>
</li>
<li>
<pre><code> NODE *vs = vals->nd_head;
</code></pre>
</li>
<li>
<pre><code> val = vals->nd_body;
</code></pre>
</li>
<li>
<li>
<pre><code> while (vs) {
</code></pre>
</li>
<li>
<pre><code> NODE* val = vs->nd_head;
</code></pre>
</li>
<li>
<pre><code> COMPILE(ret, "when/argscat", val);
</code></pre>
</li>
<li>
<pre><code> ADD_INSNL(ret, nd_line(val), branchif, l1);
</code></pre>
</li>
<li>
<pre><code> vs = vs->nd_next;
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>
<li>
<pre><code> ADD_INSN(ret, nd_line(val), putnil);
</code></pre>
</li>
<li>
<pre><code> COMPILE(ret, "when2/splat", val);
</code></pre>
</li>
<li>
<pre><code> ADD_INSN1(ret, nd_line(val), checkincludearray, Qfalse);
</code></pre>
</li>
<li>
<pre><code> ADD_INSN(ret, nd_line(val), pop);
</code></pre>
</li>
<li>
<pre><code> ADD_INSNL(ret, nd_line(val), branchif, l1);
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>
<pre><code> else {
</code></pre>
</li>
<li>
<pre><code> rb_bug("err");
</code></pre>
</li>
<li>
<pre><code> }
node = node->nd_next;
</code></pre>
}<br>
/* else */</li>
</ul>
<p>--<br>
ワナベ<br>
=end</p>
Ruby master - Bug #1676 (Closed): only last "return" is traced by set_trace_func
https://bugs.ruby-lang.org/issues/1676
2009-06-22T19:44:54Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
複数ある return のうち最後ではないものでメソッドの処理が終わったとき<br>
set_trace_func の "return" イベントが起こりません。</p>
<p>$ ruby -ve '<br>
set_trace_func(proc{|*a|p a if a[0] == "call" || a[0] == "return"})<br>
iseq = RubyVM::InstructionSequence.compile(<<EOS)<br>
def foo(a)<br>
return if a<br>
return<br>
end<br>
foo(false)<br>
foo(true)<br>
EOS<br>
iseq.eval<br>
puts iseq.disasm<br>
'<br>
ruby 1.9.2dev (2009-06-21 trunk 23809) [i386-mingw32]<br>
["call", "", 1, :foo, #<a href="Binding:0xb94d80" class="external">Binding:0xb94d80</a>, Object]<br>
["return", "", 1, :foo, #<a href="Binding:0xb94a40" class="external">Binding:0xb94a40</a>, Object]<br>
["call", "", 1, :foo, #<a href="Binding:0xb947a0" class="external">Binding:0xb947a0</a>, Object]<br>
== disasm: <RubyVM::InstructionSequence:@>==========<br>
0000 trace 1 ( 1)<br>
0002 putspecialobject 1<br>
0004 putspecialobject 2<br>
0006 putobject :foo<br>
0008 putiseq foo<br>
0010 send :"core#define_method", 3, nil, 0, <br>
0016 pop<br>
0017 trace 1 ( 5)<br>
0019 putnil<br>
0020 putobject false<br>
0022 send :foo, 1, nil, 8, <br>
0028 pop<br>
0029 trace 1 ( 6)<br>
0031 putnil<br>
0032 putobject true<br>
0034 send :foo, 1, nil, 8, <br>
0040 leave<br>
== disasm: <RubyVM::InstructionSequence:foo@>=================<br>
local table (size: 2, argc: 1 [opts: 0, rest: -1, post: 0, block: -1] s1)<br>
[ 2] a<br>
0000 trace 8 ( 1)<br>
0002 trace 1 ( 2)<br>
0004 getlocal a<br>
0006 branchunless 12<br>
0008 jump 10<br>
0010 putnil<br>
0011 leave<br>
0012 putnil<br>
0013 trace 16 ( 1)<br>
0015 leave ( 2)<br>
=end</p>
Ruby master - Bug #1674 (Closed): set_trace_func with 1line block
https://bugs.ruby-lang.org/issues/1674
2009-06-22T10:20:24Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
内容が1行だけのブロックを実行すると<br>
set_trace_funcで期待通りの行番号が得られません。</p>
<p>$ ruby -ve '<br>
set_trace_func(proc{|type, file, line, *a|<br>
p [file, line] if type == "line"<br>
})<br>
iseq = RubyVM::InstructionSequence.compile("\n1.upto(2) {\n\np true\n\n}")<br>
iseq.eval<br>
puts iseq.disasm<br>
'<br>
ruby 1.9.2dev (2009-06-21 trunk 23809) [i386-mingw32]<br>
["-e", 5]<br>
["-e", 6]<br>
["", 2]<br>
["", 2]<br>
true<br>
["", 2]<br>
true<br>
["-e", 7]<br>
== disasm: <RubyVM::InstructionSequence:@>==========<br>
== catch table</p>
<table>
<thead>
<tr>
<th>catch type: break st: 0002 ed: 0012 sp: 0000 cont: 0012</th>
</tr>
</thead>
<tbody>
<tr>
<td>0000 trace 1 ( 2)</td>
</tr>
<tr>
<td>0002 putobject 1</td>
</tr>
<tr>
<td>0004 putobject 2</td>
</tr>
<tr>
<td>0006 send :upto, 1, block in , 0, </td>
</tr>
<tr>
<td>0012 leave</td>
</tr>
<tr>
<td>== disasm: <RubyVM::InstructionSequence:block in @>=</td>
</tr>
<tr>
<td>== catch table</td>
</tr>
<tr>
<td>catch type: redo st: 0000 ed: 0011 sp: 0000 cont: 0000</td>
</tr>
<tr>
<td>catch type: next st: 0000 ed: 0011 sp: 0000 cont: 0011</td>
</tr>
<tr>
<td>------------------------------------------------------------------------</td>
</tr>
<tr>
<td>0000 trace 1 ( 2)</td>
</tr>
<tr>
<td>0002 putnil</td>
</tr>
<tr>
<td>0003 putobject true ( 4)</td>
</tr>
<tr>
<td>0005 send :p, 1, nil, 8, ( 2)</td>
</tr>
<tr>
<td>0011 leave ( 4)</td>
</tr>
<tr>
<td>=end</td>
</tr>
</tbody>
</table>
Ruby master - Bug #926 (Closed): module_function中のsuperでSystemStackError
https://bugs.ruby-lang.org/issues/926
2008-12-25T00:56:16Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
ワナベと申します。</p>
<p>以下のスクリプトでSystemStackErrorになります。</p>
<p>$ ./ruby -ve '<br>
module Foo<br>
def foo<br>
super<br>
end<br>
module_function :foo<br>
end<br>
Foo.foo<br>
'<br>
ruby 1.9.1 (2008-12-24 patchlevel-5000 trunk 20971) [i386-mingw32]<br>
-e:4:in <code>foo': stack level too deep (SystemStackError) from -e:4:in </code>foo'<br>
from -e:4:in <code>foo' from -e:4:in </code>foo'<br>
from -e:4:in <code>foo' from -e:4:in </code>foo'<br>
from -e:4:in <code>foo' from -e:4:in </code>foo'<br>
from -e:4:in <code>foo' ... 8720 levels... from -e:4:in </code>foo'<br>
from -e:4:in <code>foo' from -e:4:in </code>foo'<br>
from -e:8:in `'</p>
<p>vm_search_normal_superclass() がスーパークラスを見つけられなかったときに<br>
渡された元クラスをそのまま返しているのが原因のように思います。<br>
この場合の適切なスーパークラスを決める方法がわからなかったので、<br>
0を返すようにしてパッチを書いてみました。<br>
副作用で [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed behind-schedule" title="Bug: Infinite recursion on 'super' in dynamically generated modules (Closed)" href="https://bugs.ruby-lang.org/issues/730">#730</a>] も SystemStackError にならなくなるようです。</p>
<a name="Index-insnsdef"></a>
<h1 >Index: insns.def<a href="#Index-insnsdef" class="wiki-anchor">¶</a></h1>
<p>--- insns.def (revision 20971)<br>
+++ insns.def (working copy)<br>
@@ -1015,13 +1015,15 @@<br>
rb_block_t *blockptr = !(op_flag & VM_CALL_ARGS_BLOCKARG_BIT) ?<br>
GET_BLOCK_PTR() : 0;<br>
int num = caller_setup_args(th, GET_CFP(), op_flag, op_argc,<br>
blockiseq, &blockptr);<br>
VALUE recv, klass;</p>
<ul>
<li>NODE *mn;</li>
</ul>
<ul>
<li>
<p>NODE *mn = 0;<br>
ID id;<br>
const VALUE flag = VM_CALL_SUPER_BIT | VM_CALL_FCALL_BIT;</p>
<p>recv = GET_SELF();<br>
vm_search_superclass(GET_CFP(), GET_ISEQ(), recv, TOPN(num), &id, &klass);</p>
</li>
</ul>
<ul>
<li>mn = rb_method_node(klass, id);</li>
</ul>
<ul>
<li>
<p>if (klass) {</p>
</li>
<li>
<p>mn = rb_method_node(klass, id);</p>
</li>
<li>
<p>}</p>
<p>CALL_METHOD(num, blockptr, flag, id, mn, recv);<br>
}<br>
Index: vm_insnhelper.c<br>
===================================================================<br>
--- vm_insnhelper.c (revision 20971)<br>
+++ vm_insnhelper.c (working copy)<br>
@@ -1179,6 +1179,9 @@<br>
}<br>
k = RCLASS_SUPER(k);<br>
}</p>
</li>
<li>
<p>if (!k) {</p>
</li>
<li>
<pre><code> klass = 0;
</code></pre>
</li>
<li>
<p>}<br>
}<br>
return klass;<br>
}</p>
</li>
</ul>
<p>--<br>
ワナベ<br>
=end</p>
Ruby master - Bug #837 (Closed): 異クラスの例外同士の比較でSystemStackError
https://bugs.ruby-lang.org/issues/837
2008-12-08T15:33:03Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
ワナベと申します。</p>
<p>1.9 でクラスの異なる例外オブジェクトを比較すると<br>
exc_equal で循環してしまい SystemStackError になってしまいます。</p>
<p>$ ruby -ve 'Exception.new == RuntimeError.new'<br>
ruby 1.9.0 (2008-10-20 revision 19851) [i386-mingw32]<br>
-e:1: warning: useless use of == in void context<br>
-e:1:in <code>==': stack level too deep (SystemStackError) from -e:1:in </code>=='<br>
from -e:1:in <code>==' from -e:1:in </code>=='<br>
from -e:1:in <code>==' from -e:1:in </code>=='<br>
from -e:1:in <code>==' from -e:1:in </code>=='<br>
from -e:1:in <code>==' ... 6144 levels... from -e:1:in </code>=='<br>
from -e:1:in <code>==' from -e:1:in </code>=='<br>
from -e:1:in `'</p>
<p>また、Exception.new == 1 や Exception.new == 1.0 などでも<br>
SystemStackError になります。</p>
<p>--<br>
ワナベ<br>
=end</p>
Ruby master - Bug #817 (Rejected): SystemStackError後のrescue
https://bugs.ruby-lang.org/issues/817
2008-12-03T16:46:48Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
スタックがあふれた後に例外が捕捉される位置がおかしくなるように思います。</p>
<p>$ ./ruby -ve '<br>
def foo<br>
foo<br>
rescue SystemStackError<br>
raise RuntimeError<br>
rescue RuntimeError<br>
puts "ng"<br>
end<br>
foo rescue puts "ok"<br>
'<br>
ruby 1.9.0 (2008-12-01 revision 20433) [i386-mingw32]<br>
ng<br>
=end</p>
Ruby master - Bug #684 (Closed): io.read(nil, buf) で buf が変更されない
https://bugs.ruby-lang.org/issues/684
2008-10-26T10:26:03Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
IO#read の第一引数に nil、第二引数に出力バッファ用の文字列を指定した場合<br>
出力バッファが変更されません。</p>
<p>$ ruby -ve '<br>
r, w = IO.pipe<br>
w.print "a"<br>
w.close<br>
buf = "x"<br>
p r.read(nil, buf)<br>
p buf<br>
'<br>
ruby 1.9.0 (2008-10-26 revision 19941) [i386-mingw32]<br>
"a"<br>
"x"</p>
<p>このような感じでどうでしょうか。</p>
<a name="Index-ioc"></a>
<h1 >Index: io.c<a href="#Index-ioc" class="wiki-anchor">¶</a></h1>
<p>--- io.c (revision 19941)<br>
+++ io.c (working copy)<br>
@@ -1556,7 +1556,12 @@<br>
int cr;</p>
<pre><code> if (NEED_READCONV(fptr)) {
</code></pre>
<ul>
<li>
<pre><code> VALUE str = rb_str_new(NULL, 0);
</code></pre>
</li>
</ul>
<ul>
<li>
<pre><code> if (NIL_P(str)) {
</code></pre>
</li>
<li>
<pre><code> str = rb_str_new(NULL, 0);
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>
<pre><code> else {
</code></pre>
</li>
<li>
<pre><code> rb_str_resize(str, 0);
</code></pre>
</li>
<li>
<pre><code> }
make_readconv(fptr);
while (1) {
if (fptr->cbuf_len) {
</code></pre>
</li>
</ul>
<p>=end</p>
Ruby master - Bug #676 (Rejected): 引数の有無によるIO#readの挙動の違い
https://bugs.ruby-lang.org/issues/676
2008-10-22T22:11:43Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
IO#read に引数を渡すかどうかで、挙動が異なる場合があるようです。<br>
たとえば mingw 上では以下のようになりました。</p>
<p>$ ruby -ve '<br>
[[], [1000]].each do |argv|<br>
r, w = IO.pipe<br>
w.print "\n"<br>
w.close<br>
p r.read(*argv)<br>
end<br>
'<br>
ruby 1.9.0 (2008-10-22 revision 19888) [i386-mingw32]<br>
"\n"<br>
"\r\n"<br>
=end</p>
Ruby master - Bug #529 (Closed): method_missing の再定義で Stack consistency error
https://bugs.ruby-lang.org/issues/529
2008-08-31T21:11:05Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
ワナベと申します。</p>
<p>[Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Tempfile yields [BUG] Stack consistency error (Closed)" href="https://bugs.ruby-lang.org/issues/513">#513</a>] と似た現象が vm_method_missing 中で<br>
POPN 到達前に break した場合にも起きるようです。</p>
<p>$ ruby -e '<br>
def method_missing(m)<br>
yield<br>
end<br>
foo {break}<br>
'<br>
-e:5: [BUG] Stack consistency error (sp: 7, bp: 6)<br>
ruby 1.9.0 (2008-08-31 revision 18997) [i386-mingw32]</p>
<h2>-- control frame ----------<br>
c:0003 p:0027 s:0007 b:0006 l:000005 d:000005 TOP -e:5<br>
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH :private_class_method<br>
c:0001 p:0000 s:0002 b:0002 l:000001 d:000001 TOP :384</h2>
<p>DBG> : "-e:5:in `'"</p>
<p>This application has requested the Runtime to terminate it in an unusual way.<br>
Please contact the application's support team for more information.</p>
<p>--<br>
ワナベ<br>
=end</p>
Ruby master - Bug #373 (Closed): MingwでIO#dupがブロックする
https://bugs.ruby-lang.org/issues/373
2008-07-30T15:21:14Z
wanabe (_ wanabe)
s.wanabe@gmail.com
<p>=begin<br>
ワナベと申します。<br>
ruby-list に送った不具合を改めてこちらにも書かせていただきます。</p>
<p>Mingw 上の trunkで、test/ruby/test_io.rb の test_dup のように<br>
パイプを最大まで作成してから IOオブジェクトの dup を繰り返すと<br>
処理が停止します。</p>
<p>$ ./ruby -ve '<br>
a = []<br>
loop{a.push IO.pipe} rescue nil<br>
loop {a.push(p a[0][0].dup)}'<br>
ruby 1.9.0 (2008-07-24 revision 18196) [i386-mingw32]<br>
#<a href="IO:0xbbdbe0" class="external">IO:0xbbdbe0</a> # ここで処理が止まる</p>
<p>また以下の結果から、msvcrt の問題のように思えます。</p>
<p>$ cat test.c<br>
#include <stdio.h><br>
#include <io.h><br>
int main(int argc, char **argv) {<br>
int n = 0;<br>
while(_dup(0) != -1) n++;<br>
printf("n = %i\n", n);<br>
_dup(0);<br>
printf("fin\n");<br>
return 0;<br>
}</p>
<p>$ gcc -mno-cygwin test.c && ./a.exe<br>
n = 2045 // ← CTRL+C で中断するまで処理が止まる</p>
<p>$ gcc -mno-cygwin test.c -lmsvcr71 && ./a.exe<br>
n = 2045<br>
fin</p>
<p>--<br>
ワナベ<br>
=end</p>