Ruby Issue Tracking System: Issues
https://redmine.ruby-lang.org/
https://redmine.ruby-lang.org/favicon.ico?1711330511
2020-12-26T11:04:18Z
Ruby Issue Tracking System
Redmine
Ruby master - Feature #17472 (Rejected): HashWithIndifferentAccess like Hash extension
https://redmine.ruby-lang.org/issues/17472
2020-12-26T11:04:18Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Rails has <a href="https://api.rubyonrails.org/classes/ActiveSupport/HashWithIndifferentAccess.html" class="external">ActiveSupport::HashWithIndifferentAccess</a>, which is widely used in Rails to handle Request, Session, ActionView's form construction, ActiveRecord's DB communication, and so on. It receives String or Symbol and normalize them to fetch the value. But it is implemented with Ruby. If we provide C implementation of that, Rails will gain the performance improvement.</p>
<p>summary of previous discussion: <a href="https://github.com/rails/rails/pull/40182#issuecomment-687607812" class="external">https://github.com/rails/rails/pull/40182#issuecomment-687607812</a></p>
Ruby master - Feature #17468 (Closed): Deprecate RUBY_DEVEL
https://redmine.ruby-lang.org/issues/17468
2020-12-25T09:32:50Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Some configuration of Ruby use RUBY_DEVEL, which depends PATCH_LEVEL.<br>
But depending PATCH_LEVEL causes issues which will become revealed on the final release.<br>
Though we release some previews and RCs, they don't contributes the quality around RUBY_DEVEL.</p>
<p>Therefore to ensure CI tests the quality of the final release, we need to deprecate RUBY_DEVEL.</p>
Ruby master - Feature #16275 (Closed): Revert `.:` syntax
https://redmine.ruby-lang.org/issues/16275
2019-10-23T15:26:13Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p><code>obj.:method</code> is introduced at r66667 by <a class="issue tracker-2 status-1 priority-4 priority-default" title="Feature: Proposal: Shorthand operator for Object#method (Open)" href="https://redmine.ruby-lang.org/issues/12125">#12125</a> and <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Feature: Syntax sugar for method reference (Closed)" href="https://redmine.ruby-lang.org/issues/13581">#13581</a>.<br>
It encourages the functional programming style in Ruby.</p>
<p>But this shorthand syntax is just for methods of <code>self</code> without arguments.<br>
It causes another feature requests like <a class="issue tracker-2 status-1 priority-4 priority-default" title="Feature: Proposal: Shorthand operator for "#instance_method" (Open)" href="https://redmine.ruby-lang.org/issues/16273">#16273</a> (and lambda compositions like <a class="issue tracker-1 status-7 priority-4 priority-default closed" title="Bug: Refactor Proc#>> and #<< (Feedback)" href="https://redmine.ruby-lang.org/issues/15428">#15428</a>).</p>
<p>Such features will introduce a new view of Ruby but no one illustrates the whole picture yet.<br>
I worried about such patch work may cause a conflict with future expansion of functional programing style or a just a garbage feature.</p>
<p><code>.:</code> syntax is introduced in 2.7.0 preview1, not released in production yet.<br>
How about reverting at this time and re-introduce with a big picture.</p>
Ruby master - Feature #16131 (Closed): Remove $SAFE, taint and trust
https://redmine.ruby-lang.org/issues/16131
2019-08-29T07:14:34Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Ruby had Taint checking which is originally introduced in Perl.<br>
<a href="https://en.wikipedia.org/wiki/Taint_checking" class="external">https://en.wikipedia.org/wiki/Taint_checking</a></p>
<p>It was intended to provide a useful tool for handle objects which are come from outside.<br>
Input data is set as tainted by default and call untaint if you checked or filtered the value.<br>
Some people used this feature in the age of CGI.</p>
<p>But these days, no one use the mechanism and input libraries usually doesn't support it.<br>
For example rack, as following shows its input is not tainted and the mechanism is unusable.</p>
<pre><code>% cat foo.ru
run ->(env) do
['200', {'Content-Type' => 'text/plain'}, ["Is QUERY_STRING tainted?: #{env["QUERY_STRING"].tainted?}"]]
end
% rackup foo.ru
[51724] Puma starting in cluster mode...
[51724] * Version 3.12.1 (ruby 2.6.3-p62), codename: Llamas in Pajamas
[51724] * Min threads: 3, max threads: 3
[51724] * Environment: development
[51724] * Process workers: 1
[51724] * Preloading application
[51724] * Listening on tcp://localhost:9292
[51724] Use Ctrl-C to stop
[51737] + Gemfile in context: /Users/naruse/work/td-cdp-api/Gemfile
[51724] - Worker 0 (pid: 51737) booted, phase: 0
</code></pre>
<pre><code>% curl http://localhost:9292/\?foo=1
Is QUERY_STRING tainted?: false
</code></pre>
<p>Therefore I think Taint checking mechanism is unusable on the current Ruby ecosystem.</p>
<p>On the other hand we experienced multiple vulnerability around $SAFE and taint mechanism.<br>
<a href="https://cse.google.com/cse?q=taint&cx=008288045305770251182%3Afvruzsaknew&ie=UTF-8" class="external">https://cse.google.com/cse?q=taint&cx=008288045305770251182%3Afvruzsaknew&ie=UTF-8</a><br>
The cost of maintaining it is expensive.</p>
<p>In conclusion, I think the taint mechanism is too expensive to maintain for the merit of it.<br>
I suggest to remove it.</p>
Ruby master - Bug #15992 (Closed): An exception breaks monitor state and cause deadlock
https://redmine.ruby-lang.org/issues/15992
2019-07-10T06:55:40Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>lib/monitor.rb provides Monitor.<br>
But its state handling is weak for interrupts caused by Thread.kill for example timeout libraries.</p>
<p>Timeout exception may happen everywhere. If it raised when the thread is executing</p>
<pre><code class="ruby syntaxhl" data-language="ruby"> <span class="k">def</span> <span class="nf">mon_exit</span>
<span class="n">mon_check_owner</span>
<span class="vi">@mon_count</span> <span class="o">-=</span><span class="mi">1</span>
<span class="k">if</span> <span class="vi">@mon_count</span> <span class="o">==</span> <span class="mi">0</span>
<span class="vi">@mon_owner</span> <span class="o">=</span> <span class="kp">nil</span>
<span class="c1"># HERE!!!</span>
<span class="vi">@mon_mutex</span><span class="p">.</span><span class="nf">unlock</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
<p>It breaks the state of the monitor and it causes deadlock.</p>
Ruby master - Feature #15958 (Closed): Time#inspect with frac
https://redmine.ruby-lang.org/issues/15958
2019-06-25T13:12:18Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>When Matz changed Time#to_s format in 2006, frac part of Time string is dropped because it is considered not useful.<br>
<a href="https://blade.ruby-lang.org/ruby-dev/29440">[ruby-dev:29440]</a></p>
<p>But recently we encounters some troubles the comparison of Time objects whose frac parts are different.<br>
<a href="https://twitter.com/__gfx__/status/1143056072422219776" class="external">https://twitter.com/__gfx__/status/1143056072422219776</a></p>
<p>For example a is original object and b is once stored in RDB (and dropped the frac part).<br>
Or there're multiple time objects which are generated in a single HTTP request.<br>
Of course they are different and assert_equal will be failed but inspect doesn't show the frac part.</p>
Ruby master - Bug #15398 (Closed): TestThread#test_signal_at_join fails on FreeBSD
https://redmine.ruby-lang.org/issues/15398
2018-12-11T09:10:02Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Since r64538 or r64539, TestThread#test_signal_at_join is failing on our FreeBSD CI.</p>
<pre><code>+ <n>) Error:
+TestThread#test_signal_at_join:
+Timeout::Error: execution of assert_separately expired timeout (120 sec)
+pid 80587 killed by SIGTERM (signal 15)
+| BAhvOhRTaWduYWxFeGNlcHRpb24KOgltZXNnIgxTSUdURVJNOgdidFsMSSIU
+| LTozNzppbiBgd3JpdGUnBjoGRUZJIhMtOjM3OmluIGBwdXRzJwY7CEZJIikt
+| OjM3OmluIGBibG9jayAoMiBsZXZlbHMpIGluIDxtYWluPicGOwhGSSIULToz
+| NDppbiBgdGltZXMnBjsIRkkiHi06MzQ6aW4gYGJsb2NrIGluIDxtYWluPicG
+| OwhGSSIULToxMDppbiBgcG9wZW4nBjsIRkkiFS06MTA6aW4gYDxtYWluPicG
+| OwhGOgpzaWdub2kUOgpjYXVzZTA6EWJ0X2xvY2F0aW9uc0AH
+| assertions=122
+|
</code></pre>
<p><a href="https://rubyci.org/logs/rubyci.s3.amazonaws.com/freebsd11zfs/ruby-trunk/log/20180826T003001Z.diff.html.gz" class="external">https://rubyci.org/logs/rubyci.s3.amazonaws.com/freebsd11zfs/ruby-trunk/log/20180826T003001Z.diff.html.gz</a></p>
<p>Note that this doesn't happen on my private FreeBSD box.</p>
Ruby master - Bug #15164 (Closed): mkmf doesn't work with miniruby on Windows
https://redmine.ruby-lang.org/issues/15164
2018-09-26T15:29:46Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>After r59449 <code>nmake</code> failes to run when making ripper and so on.<br>
It because miniruby sets UTF-8 encoding even though the content is CP932 (on Japanese Windows).<br>
It should set ASCII-8BIT and handle as it is.</p>
<pre><code>ripper:
" Could not be configured. It will not be installed."
" C:/ruby-trunk/lib/mkmf.rb:1560: invalid byte sequence in UTF-8"
" Check ext/ripper/mkmf.log for more details."
*** Fix the problems, then remove these directories and try again if you want.
</code></pre>
<p>Note that recent Windows sets PATH to paths under %APPDATA% for example<br>
C:\Users<UserNameInANSI>\AppData\Local\Microsoft\WindowsApps</p>
Ruby master - Bug #14208 (Closed): raise error if value contains CR/LF in iniheader of initialize...
https://redmine.ruby-lang.org/issues/14208
2017-12-20T12:04:47Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>like r59693, initialize_http_header also should raise error.</p>
<p><a href="https://twitter.com/DouweM/status/943441930142220289" class="external">https://twitter.com/DouweM/status/943441930142220289</a></p>
Ruby master - Bug #14186 (Closed): cannot build ruby with tarball on noruby environment
https://redmine.ruby-lang.org/issues/14186
2017-12-14T16:35:37Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>r61055 breaks build</p>
Ruby master - Bug #13945 (Closed): Backport r60024
https://redmine.ruby-lang.org/issues/13945
2017-09-27T21:48:05Z
naruse (Yui NARUSE)
naruse@airemix.jp
<pre><code>vm.c: fetch retval iff necessary
* vm.c (rb_vm_make_jump_tag_but_local_jump): get rid of fetching
retval when it is not used. it is necessary for local jump
state only.
</code></pre>
<p>This caused SEGV if an application which embeds Ruby and uses <code>rb_load_protect</code>.<br>
<a href="https://github.com/vim/vim/pull/2147" class="external">https://github.com/vim/vim/pull/2147</a></p>
Ruby master - Feature #13881 (Open): Use getcontext/setcontext on OS X
https://redmine.ruby-lang.org/issues/13881
2017-09-08T09:10:50Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>getcontext/setcontext is first appeared on OS X 10.5 but deprecated on 10.6.<br>
It seems because POSIX removed them from recent specs.</p>
<p>IEEE Std 1003.1, 2004 Edition says makecontext's use of function declarators with empty parentheses<br>
is an obsolescent feature.<br>
<a href="http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html" class="external">http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html</a></p>
<p>Then POSIX.1-2008 removed those functions.</p>
<p>But OS X 10.13 still has them maybe because some essential applications uses them for co-routines.<br>
Therefore we can use them for performance.</p>
<pre><code>diff --git a/configure.in b/configure.in
index 08e109317f..3e75eb3cf2 100644
--- a/configure.in
+++ b/configure.in
@@ -1142,8 +1142,6 @@ AS_CASE(["$target_os"],
ac_cv_header_syscall_h=no
])
AS_IF([test $macosx_10_5 = yes], [
- ac_cv_func_getcontext=no
- ac_cv_func_setcontext=no
], [
AC_DEFINE(BROKEN_SETREUID, 1)
AC_DEFINE(BROKEN_SETREGID, 1)
diff --git a/cont.c b/cont.c
index c86095775c..f94883ef02 100644
--- a/cont.c
+++ b/cont.c
@@ -65,7 +65,15 @@
#ifndef _WIN32
#include <unistd.h>
#include <sys/mman.h>
-#include <ucontext.h>
+# ifdef __APPLE__
+/* avoid deprecated maks on ucontext.h */
+int getcontext(ucontext_t *);
+void makecontext(ucontext_t *, void (*)(), int, ...);
+int setcontext(const ucontext_t *);
+int swapcontext(ucontext_t * __restrict, const ucontext_t * __restrict);
+# else
+# include <ucontext.h>
+# endif
#endif
#define RB_PAGE_SIZE (pagesize)
#define RB_PAGE_MASK (~(RB_PAGE_SIZE - 1))
</code></pre>
Ruby master - Feature #13873 (Closed): Optimize Dir.glob with FNM_EXTGLOB
https://redmine.ruby-lang.org/issues/13873
2017-09-05T17:51:27Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Rails often queries Dir.glob with complex pattern.</p>
<p>On accessing Rails site, it calls glob as follows on querying templates.<br>
Note that Dir[] insists File::FNM_EXTGLOB.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"> <span class="k">def</span> <span class="nf">find_template_paths</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
<span class="no">Dir</span><span class="p">[</span><span class="n">query</span><span class="p">].</span><span class="nf">uniq</span><span class="p">.</span><span class="nf">reject</span> <span class="k">do</span> <span class="o">|</span><span class="n">filename</span><span class="o">|</span>
<span class="no">File</span><span class="p">.</span><span class="nf">directory?</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span> <span class="o">||</span>
<span class="c1"># deals with case-insensitive file systems.</span>
<span class="o">!</span><span class="no">File</span><span class="p">.</span><span class="nf">fnmatch</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="no">File</span><span class="o">::</span><span class="no">FNM_EXTGLOB</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
<p><a href="https://github.com/rails/rails/blob/6f1c18308ebffc97d51440cdeed7be71de58f26a/actionview/lib/action_view/template/resolver.rb#L247" class="external">https://github.com/rails/rails/blob/6f1c18308ebffc97d51440cdeed7be71de58f26a/actionview/lib/action_view/template/resolver.rb#L247</a></p>
<p>For example on accessing index page of Post Model (/posts), it calls following glob:<br>
Dir["/home/naruse/foo/app/views/posts/index{.en,}{.html,.text,.js,.css,.ics,.csv,.vcf,.png,.jpeg,.gif,.bmp,.tiff,.svg,.mpeg,.xml,.rss,.atom,.yaml,.multipart_form,.url_encoded_form,.json,.pdf,.zip,.gzip,}{}{.raw,.erb,.html,.builder,.ruby,.coffee,.jbuilder,}"]'</p>
<p>It calls many stat as follows:</p>
<pre><code>% sudo strace ./miniruby58882 -e'Dir["/home/naruse/foo/app/views/posts/index{.en,}{.html,.text,.js,.css,.ics,.csv,.vcf,.png,.jpeg,.gif,.bmp,.tiff,.svg,.mpeg,.xml,.rss,.atom,.yaml,.multipart_form,.url_encoded_form,.json,.pdf,.zip,.gzip,}{}{.raw,.erb,.html,.builder,.ruby,.coffee,.jbuilder,}"]'|&grep newfstatat|wc -l
400
</code></pre>
<p>Because current glob implementation handles braces in early stage,<br>
then calls stat for each combination of brace patterns instead of using readdir results.</p>
<p>Below is a patch to use readdir instead of hundreds of syscalls.<br>
Note that this patch changes the order of the result as follows:</p>
<pre><code> 1) Failure:
TestDir#test_glob [/home/naruse/ruby/test/ruby/test_dir.rb:157]:
<["/tmp/test-all/__test_dir__20170906-8620-ka8yqu/}}{}",
"/tmp/test-all/__test_dir__20170906-8620-ka8yqu/}}a"]> expected but was
<["/tmp/test-all/__test_dir__20170906-8620-ka8yqu/}}a",
"/tmp/test-all/__test_dir__20170906-8620-ka8yqu/}}{}"]>.
</code></pre>
<pre><code>diff --git a/dir.c b/dir.c
index b7afaec4e0..7ca84fa8c5 100644
--- a/dir.c
+++ b/dir.c
@@ -290,6 +290,8 @@ bracket(
#define UNESCAPE(p) (escape && *(p) == '\\' ? (p) + 1 : (p))
#define ISEND(p) (!*(p) || (pathname && *(p) == '/'))
#define RETURN(val) return *pcur = p, *scur = s, (val);
+#define FNMATCH_ALLOC_N(type, n) ((type *)malloc(sizeof(type) * (n)))
+#define FNMATCH_FREE(ptr) free(ptr)
static int
fnmatch_helper(
@@ -348,6 +350,56 @@ fnmatch_helper(
}
goto failed;
}
+
+ case '{': {
+ size_t len = pend - p;
+ char *buf = FNMATCH_ALLOC_N(char, len);
+ const char *rbrace = NULL;
+ while (p < pend) {
+ const char *t = ++p;
+ int nest = 0;
+ while (p < pend && !(*p == ',' && nest == 0)) {
+ if (*p == '{') nest++;
+ if (*p == '}') {
+ if (nest == 0) {
+ if (!rbrace) rbrace = p;
+ goto rest;
+ }
+ nest--;
+ }
+ if (*p == '\\' && escape) {
+ if (++p >= pend) break;
+ }
+ Inc(p, pend, enc);
+ }
+ if (!rbrace) {
+ rbrace = p;
+ while (rbrace < pend && !(*rbrace == '}' && nest == 0)) {
+ if (*rbrace == '{') nest++;
+ if (*rbrace == '}') nest--;
+ if (*rbrace == '\\' && escape) {
+ if (++p >= pend) break;
+ }
+ Inc(rbrace, pend, enc);
+ }
+ }
+rest:
+ memcpy(buf, t, p-t);
+ buf[p-t]=0;
+ strlcpy(buf+(p-t), rbrace+1, len-(p-t));
+ {
+ const char *pp = buf, *ss = s;
+ r = fnmatch_helper((const char **)&pp, &ss, flags|FNM_DOTMATCH, enc);
+ }
+ if (r == 0) {
+ p = buf;
+ FNMATCH_FREE(buf);
+ RETURN(0);
+ }
+ if (p >= rbrace) break;
+ }
+ FNMATCH_FREE(buf);
+ }
}
/* ordinary */
@@ -1426,6 +1478,12 @@ has_magic(const char *p, const char *pend, int flags, rb_encoding *enc)
case '[':
return MAGICAL;
+ case '{':
+ if (flags & FNM_EXTGLOB) {
+ return MAGICAL;
+ }
+ break;
+
case '\\':
if (escape && p++ >= pend)
continue;
@@ -2272,6 +2330,13 @@ push_pattern(const char *path, VALUE ary, void *enc)
rb_ary_push(ary, name);
}
+struct push_glob_args {
+ struct glob_args glob;
+ int flags;
+ int fd;
+};
+static int push_caller(const char *path, VALUE val, void *enc);
+
static int
ruby_brace_expand(const char *str, int flags, ruby_glob_func *func, VALUE arg,
rb_encoding *enc, VALUE var)
@@ -2280,7 +2345,7 @@ ruby_brace_expand(const char *str, int flags, ruby_glob_func *func, VALUE arg,
const char *p = str;
const char *pend = p + strlen(p);
const char *s = p;
- const char *lbrace = 0, *rbrace = 0;
+ const char *lbrace = NULL, *rbrace = NULL;
int nest = 0, status = 0;
while (*p) {
@@ -2299,9 +2364,18 @@ ruby_brace_expand(const char *str, int flags, ruby_glob_func *func, VALUE arg,
if (lbrace && rbrace) {
size_t len = strlen(s) + 1;
- char *buf = GLOB_ALLOC_N(char, len);
+ char *buf;
long shift;
+ if (func == push_caller && !strchr(lbrace, '/')) {
+ /* Now it reaches file basename entry. */
+ /* Handle braces in glob_helper */
+ struct push_glob_args *a = (struct push_glob_args *)arg;
+ a->flags |= FNM_EXTGLOB;
+ return glob_call_func(func, s, arg, enc);
+ }
+
+ buf = GLOB_ALLOC_N(char, len);
if (!buf) return -1;
memcpy(buf, s, lbrace-s);
shift = (lbrace-s);
@@ -2365,12 +2439,6 @@ ruby_brace_glob(const char *str, int flags, ruby_glob_func *func, VALUE arg)
return ruby_brace_glob_with_enc(str, flags, func, arg, rb_ascii8bit_encoding());
}
-struct push_glob_args {
- struct glob_args glob;
- int flags;
- int fd;
-};
-
static int
push_caller(const char *path, VALUE val, void *enc)
{
</code></pre>
Ruby master - Feature #13869 (Open): Filter non directories from Dir.glob
https://redmine.ruby-lang.org/issues/13869
2017-09-05T14:30:58Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Dir.glob is a tool to fetch filesystem entries with filtering.</p>
<p>On Rails, it often query files from template directories with braces (FNM_EXTGLOB)<br>
<a href="https://github.com/rails/rails/blob/6f1c18308ebffc97d51440cdeed7be71de58f26a/actionview/lib/action_view/template/resolver.rb#L247" class="external">https://github.com/rails/rails/blob/6f1c18308ebffc97d51440cdeed7be71de58f26a/actionview/lib/action_view/template/resolver.rb#L247</a></p>
<pre><code class="ruby syntaxhl" data-language="ruby"> <span class="k">def</span> <span class="nf">find_template_paths</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
<span class="no">Dir</span><span class="p">[</span><span class="n">query</span><span class="p">].</span><span class="nf">uniq</span><span class="p">.</span><span class="nf">reject</span> <span class="k">do</span> <span class="o">|</span><span class="n">filename</span><span class="o">|</span>
<span class="no">File</span><span class="p">.</span><span class="nf">directory?</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span> <span class="o">||</span>
<span class="c1"># deals with case-insensitive file systems.</span>
<span class="o">!</span><span class="no">File</span><span class="p">.</span><span class="nf">fnmatch</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="no">File</span><span class="o">::</span><span class="no">FNM_EXTGLOB</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
<p>By this code, File.directory?() will call lstat(2) system call for each files.</p>
<p>But if Dir.glob is extended, it can avoid calling lstat because it can fetch entry's type from struct dirent<br>
(on many platforms).</p>
<pre><code class="diff syntaxhl" data-language="diff"><span class="gh">diff --git a/dir.c b/dir.c
index b7afaec4e0..5db9c2dc79 100644
</span><span class="gd">--- a/dir.c
</span><span class="gi">+++ b/dir.c
</span><span class="p">@@ -206,6 +206,7 @@</span> typedef enum {
#else
#define FNM_SHORTNAME 0
#endif
<span class="gi">+#define FNM_NONDIR 0x40
</span>
#define FNM_NOMATCH 1
#define FNM_ERROR 2
<span class="p">@@ -1408,7 +1409,7 @@</span> do_opendir(const int basefd, const char *path, int flags, rb_encoding *enc,
}
/* Globing pattern */
<span class="gd">-enum glob_pattern_type { PLAIN, ALPHA, MAGICAL, RECURSIVE, MATCH_ALL, MATCH_DIR };
</span><span class="gi">+enum glob_pattern_type { PLAIN, ALPHA, MAGICAL, RECURSIVE, MATCH_ALL, MATCH_DIR, MATCH_NONDIR };
</span>
/* Return nonzero if S has any special globbing chars in it. */
static enum glob_pattern_type
<span class="p">@@ -1581,7 +1582,7 @@</span> glob_make_pattern(const char *p, const char *e, int flags, rb_encoding *enc)
glob_free_pattern(list);
return 0;
}
<span class="gd">- tmp->type = dirsep ? MATCH_DIR : MATCH_ALL;
</span><span class="gi">+ tmp->type = dirsep ? MATCH_DIR : flags & flags & FNM_NONDIR ? MATCH_NONDIR : MATCH_ALL;
</span> tmp->str = 0;
*tail = tmp;
tmp->next = 0;
<span class="p">@@ -1893,7 +1894,7 @@</span> glob_helper(
struct stat st;
int status = 0;
struct glob_pattern **cur, **new_beg, **new_end;
<span class="gd">- int plain = 0, magical = 0, recursive = 0, match_all = 0, match_dir = 0;
</span><span class="gi">+ int plain = 0, magical = 0, recursive = 0, match_all = 0, match_dir = 0, match_nondir = 0;
</span> int escape = !(flags & FNM_NOESCAPE);
size_t pathlen = baselen + namelen;
const char *base = path;
<span class="p">@@ -1926,6 +1927,9 @@</span> glob_helper(
case MATCH_DIR:
match_dir = 1;
break;
<span class="gi">+ case MATCH_NONDIR:
+ match_nondir = 1;
+ break;
</span> case RECURSIVE:
rb_bug("continuous RECURSIVEs");
}
<span class="p">@@ -1940,7 +1944,7 @@</span> glob_helper(
pathtype = path_noent;
}
}
<span class="gd">- if (match_dir && (pathtype == path_unknown || pathtype == path_symlink)) {
</span><span class="gi">+ if ((match_dir || match_nondir) && (pathtype == path_unknown || pathtype == path_symlink)) {
</span> if (do_stat(fd, base, &st, flags, enc) == 0) {
pathtype = IFTODT(st.st_mode);
}
<span class="p">@@ -1953,6 +1957,11 @@</span> glob_helper(
status = glob_call_func(funcs->match, subpath, arg, enc);
if (status) return status;
}
<span class="gi">+ if (match_nondir && pathtype > path_noent && pathtype != path_directory) {
+ const char *subpath = path + baselen + (baselen && path[baselen] == '/');
+ status = glob_call_func(funcs->match, subpath, arg, enc);
+ if (status) return status;
+ }
</span> if (match_dir && pathtype == path_directory) {
const char *subpath = path + baselen + (baselen && path[baselen] == '/');
char *tmp = join_path(subpath, namelen, dirsep, "", 0);
<span class="p">@@ -3152,4 +3161,10 @@</span> Init_Dir(void)
* on Microsoft Windows.
*/
rb_file_const("FNM_SHORTNAME", INT2FIX(FNM_SHORTNAME));
<span class="gi">+
+ /* Document-const: File::Constants::FNM_NONDIR
+ *
+ * Makes patterns to match non directory. Valid only
+ */
+ rb_file_const("FNM_NONDIR", INT2FIX(FNM_NONDIR));
</span> }
</code></pre>
Ruby master - Bug #13852 (Closed): Backport r59693,59695 (Net::HTTP should raise error when CR/LF...
https://redmine.ruby-lang.org/issues/13852
2017-08-30T17:25:44Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>This is a ticket for backport management. The issue was already fixed on trunk.<br>
Let's treat r59693 as a bugfix and backport into stable branches.</p>
Ruby master - Feature #13712 (Closed): String#start_with? with regexp
https://redmine.ruby-lang.org/issues/13712
2017-07-04T09:18:51Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>String#start_with? should receive regexp.</p>
<p>When I write a parser, I want to check a string is start with a pattern or not.<br>
It's just the same thing with <a href="https://ruby-doc.org/stdlib-2.4.0/libdoc/strscan/rdoc/StringScanner.html#method-i-match-3F" class="external">StringScanner#match</a></p>
<p>If I want to do the same thing with normal string method, it needs to write like <code>/\A#{re}/.match(…)</code>.<br>
But if re is argument, it needs to create a new temporary regexp every time.</p>
<p>Though we have a workaround as follows but it's bit tricky.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="s2">"foo "</span><span class="p">.</span><span class="nf">rindex</span><span class="p">(</span><span class="sr">/fo+./</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</code></pre>
<p>A patch is following:</p>
<pre><code class="diff syntaxhl" data-language="diff"><span class="gh">diff --git a/re.c b/re.c
index d0aa2a792e..f672ba75ec 100644
</span><span class="gd">--- a/re.c
</span><span class="gi">+++ b/re.c
</span><span class="p">@@ -1588,6 +1588,84 @@</span> rb_reg_search(VALUE re, VALUE str, long pos, int reverse)
return rb_reg_search0(re, str, pos, reverse, 1);
}
<span class="gi">+bool
+rb_reg_start_with_p(VALUE re, VALUE str)
+{
+ long pos = 0;
+ long result;
+ VALUE match;
+ struct re_registers regi, *regs = &regi;
+ regex_t *reg;
+ int tmpreg;
+ onig_errmsg_buffer err = "";
+
+ reg = rb_reg_prepare_re0(re, str, err);
+ tmpreg = reg != RREGEXP_PTR(re);
+ if (!tmpreg) RREGEXP(re)->usecnt++;
+
+ match = rb_backref_get();
+ if (!NIL_P(match)) {
+ if (FL_TEST(match, MATCH_BUSY)) {
+ match = Qnil;
+ }
+ else {
+ regs = RMATCH_REGS(match);
+ }
+ }
+ if (NIL_P(match)) {
+ MEMZERO(regs, struct re_registers, 1);
+ }
+ result = onig_match(reg,
+ (UChar*)(RSTRING_PTR(str)),
+ ((UChar*)(RSTRING_PTR(str)) + RSTRING_LEN(str)),
+ (UChar*)(RSTRING_PTR(str)),
+ regs, ONIG_OPTION_NONE);
+ if (!tmpreg) RREGEXP(re)->usecnt--;
+ if (tmpreg) {
+ if (RREGEXP(re)->usecnt) {
+ onig_free(reg);
+ }
+ else {
+ onig_free(RREGEXP_PTR(re));
+ RREGEXP_PTR(re) = reg;
+ }
+ }
+ if (result < 0) {
+ if (regs == &regi)
+ onig_region_free(regs, 0);
+ if (result == ONIG_MISMATCH) {
+ rb_backref_set(Qnil);
+ return false;
+ }
+ else {
+ onig_error_code_to_str((UChar*)err, (int)result);
+ rb_reg_raise(RREGEXP_SRC_PTR(re), RREGEXP_SRC_LEN(re), err, re);
+ }
+ }
+
+ if (NIL_P(match)) {
+ int err;
+ match = match_alloc(rb_cMatch);
+ err = rb_reg_region_copy(RMATCH_REGS(match), regs);
+ onig_region_free(regs, 0);
+ if (err) rb_memerror();
+ }
+ else {
+ FL_UNSET(match, FL_TAINT);
+ }
+
+ RMATCH(match)->str = rb_str_new4(str);
+ OBJ_INFECT(match, str);
+
+ RMATCH(match)->regexp = re;
+ RMATCH(match)->rmatch->char_offset_updated = 0;
+ rb_backref_set(match);
+
+ OBJ_INFECT(match, re);
+
+ return true;
+}
+
</span> VALUE
rb_reg_nth_defined(int nth, VALUE match)
{
<span class="gh">diff --git a/string.c b/string.c
index 072f1329ee..6542a4acb1 100644
</span><span class="gd">--- a/string.c
</span><span class="gi">+++ b/string.c
</span><span class="p">@@ -9126,6 +9126,7 @@</span> rb_str_rpartition(VALUE str, VALUE sep)
RSTRING_LEN(str)-pos-RSTRING_LEN(sep)));
}
<span class="gi">+extern bool rb_reg_start_with_p(VALUE re, VALUE str);
</span> /*
* call-seq:
* str.start_with?([prefixes]+) -> true or false
<span class="p">@@ -9146,11 +9147,20 @@</span> rb_str_start_with(int argc, VALUE *argv, VALUE str)
for (i=0; i<argc; i++) {
VALUE tmp = argv[i];
<span class="gd">- StringValue(tmp);
- rb_enc_check(str, tmp);
- if (RSTRING_LEN(str) < RSTRING_LEN(tmp)) continue;
- if (memcmp(RSTRING_PTR(str), RSTRING_PTR(tmp), RSTRING_LEN(tmp)) == 0)
- return Qtrue;
</span><span class="gi">+ switch (BUILTIN_TYPE(tmp)) {
+ case T_REGEXP:
+ {
+ bool r = rb_reg_start_with_p(tmp, str);
+ if (r) return Qtrue;
+ }
+ break;
+ default:
+ StringValue(tmp);
+ rb_enc_check(str, tmp);
+ if (RSTRING_LEN(str) < RSTRING_LEN(tmp)) continue;
+ if (memcmp(RSTRING_PTR(str), RSTRING_PTR(tmp), RSTRING_LEN(tmp)) == 0)
+ return Qtrue;
+ }
</span> }
return Qfalse;
}
</code></pre>
Ruby master - Feature #13608 (Rejected): Add TracePoint#thread
https://redmine.ruby-lang.org/issues/13608
2017-05-29T05:21:37Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>rb_trace_arg_t, TracePoint's internal struct, already stores the thread which the event happened at,<br>
but there's not API to fetch it.<br>
How about adding an API to get the info.</p>
<pre><code class="diff syntaxhl" data-language="diff"><span class="gh">diff --git a/test/ruby/test_settracefunc.rb b/test/ruby/test_settracefunc.rb
index 53ee82a229..65dbc938ab 100644
</span><span class="gd">--- a/test/ruby/test_settracefunc.rb
</span><span class="gi">+++ b/test/ruby/test_settracefunc.rb
</span><span class="p">@@ -699,6 +699,23 @@</span> def test_tracepoint_enabled
assert_equal(false, trace.enabled?)
end
<span class="gi">+ def test_tracepoint_thread
+ trace = TracePoint.new(:call, :return){|tp|
+ next if !target_thread?
+ next if tp.path != __FILE__
+ assert_equal(Thread.current, tp.thread)
+ case tp.event
+ when :call
+ assert_raise(RuntimeError) {tp.return_value}
+ when :return
+ assert_equal("xyzzy", tp.return_value)
+ end
+ }
+ trace.enable{
+ foo
+ }
+ end
+
</span> def method_test_tracepoint_return_value obj
obj
end
<span class="gh">diff --git a/vm_trace.c b/vm_trace.c
index decb2c32e4..702b84e6e3 100644
</span><span class="gd">--- a/vm_trace.c
</span><span class="gi">+++ b/vm_trace.c
</span><span class="p">@@ -776,6 +776,12 @@</span> rb_tracearg_path(rb_trace_arg_t *trace_arg)
return trace_arg->path;
}
<span class="gi">+VALUE
+rb_tracearg_thread(rb_trace_arg_t *trace_arg)
+{
+ return trace_arg->th->self;
+}
+
</span> static void
fill_id_and_klass(rb_trace_arg_t *trace_arg)
{
<span class="p">@@ -913,6 +919,15 @@</span> tracepoint_attr_path(VALUE tpval)
}
/*
<span class="gi">+ * Thread of the event
+ */
+static VALUE
+tracepoint_attr_thread(VALUE tpval)
+{
+ return rb_tracearg_thread(get_trace_arg());
+}
+
+/*
</span> * Return the name at the definition of the method being called
*/
static VALUE
<span class="p">@@ -1502,6 +1517,7 @@</span> Init_vm_trace(void)
rb_define_method(rb_cTracePoint, "self", tracepoint_attr_self, 0);
rb_define_method(rb_cTracePoint, "return_value", tracepoint_attr_return_value, 0);
rb_define_method(rb_cTracePoint, "raised_exception", tracepoint_attr_raised_exception, 0);
<span class="gi">+ rb_define_method(rb_cTracePoint, "thread", tracepoint_attr_thread, 0);
</span>
rb_define_singleton_method(rb_cTracePoint, "stat", tracepoint_stat_s, 0);
</code></pre>
Ruby master - Feature #13577 (Assigned): Digest.file accidentally receives File object but uses f...
https://redmine.ruby-lang.org/issues/13577
2017-05-19T09:03:19Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Digest::SHA256.file()'s first argument is file path name but it accidentally accepts file object.<br>
But for file objects created with O_TMPFILE to_path returns the directory of the temporary file and this File.open will fail.</p>
<pre><code> class ::Digest::Class
# Creates a digest object and reads a given file, _name_.
# Optional arguments are passed to the constructor of the digest
# class.
#
# p Digest::SHA256.file("X11R6.8.2-src.tar.bz2").hexdigest
# # => "f02e3c85572dc9ad7cb77c2a638e3be24cc1b5bea9fdbb0b0299c9668475c534"
def self.file(name, *args)
new(*args).file(name)
end
end
module Instance
# Updates the digest with the contents of a given file _name_ and
# returns self.
def file(name)
File.open(name, "rb") {|f|
buf = ""
while f.read(16384, buf)
update buf
end
}
self
end
</code></pre>
Ruby master - Bug #13304 (Closed): public function rb_thread_fd_close is removed at r57422
https://redmine.ruby-lang.org/issues/13304
2017-03-12T19:06:16Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>It hits abi-check:<br>
<a href="http://rubyci.org/logs/www.rubyist.net/~akr/chkbuild/debian/ruby-2.4/log/20170312T170653Z.log.html.gz#abi-check" class="external">http://rubyci.org/logs/www.rubyist.net/~akr/chkbuild/debian/ruby-2.4/log/20170312T170653Z.log.html.gz#abi-check</a></p>
Ruby master - Feature #13303 (Feedback): String#any? as !String#empty?
https://redmine.ruby-lang.org/issues/13303
2017-03-12T18:29:26Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Once I proposed "some container#nonempty?" on <a class="issue tracker-2 status-7 priority-4 priority-default closed" title="Feature: some container#nonempty? (Feedback)" href="https://redmine.ruby-lang.org/issues/12075">#12075</a>, and understand there's Array#any?.</p>
<p>Today I found String doesn't have such method.</p>
Ruby master - Bug #13150 (Closed): TestMarshal failures on FreeBSD with gcc7 because of GC
https://redmine.ruby-lang.org/issues/13150
2017-01-23T16:58:04Z
naruse (Yui NARUSE)
naruse@airemix.jp
<pre><code> 1) Failure:
TestMarshal#test_context_switch [/home/naruse/ruby/test/ruby/test_marshal.rb:368]:
[StopIteration] exception expected, not.
Class: <RuntimeError>
Message: <"Marshal.dump reentered at marshal_dump">
---Backtrace---
/home/naruse/ruby/test/ruby/test_marshal.rb:345:in `dump'
/home/naruse/ruby/test/ruby/test_marshal.rb:345:in `dump_each'
../../ruby/test/runner.rb: TestMarshal#test_context_switch:1:in `each'
---------------
2) Failure:
TestMarshal#test_gc [/home/naruse/ruby/test/ruby/test_marshal.rb:187]:
Exception raised:
<#<RuntimeError: Marshal.dump reentered at _dump>>.
Finished tests in 0.153251s, 698.2016 tests/s, 6238.1380 assertions/s.
107 tests, 956 assertions, 2 failures, 0 errors, 0 skips
ruby -v: ruby 2.5.0dev (2017-01-23 trunk 57407) [x86_64-freebsd10.3]
</code></pre>
Ruby master - Feature #13020 (Closed): Zlib.gzip and Zlib.gunzip
https://redmine.ruby-lang.org/issues/13020
2016-12-09T22:37:22Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>I added Zlib.deflate/inflate [Feature <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Feature: Add Zlib.deflate / Zlib.inflate (Closed)" href="https://redmine.ruby-lang.org/issues/4180">#4180</a>] before, but writing/reading gzip is still too complex.<br>
It should have shorthand method.</p>
Ruby master - Bug #12923 (Closed): Accessing singleton_class of fstring cause assertion failure
https://redmine.ruby-lang.org/issues/12923
2016-11-11T17:57:23Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>以下のワンライナーが「Assertion Failed: string.c:343:register_fstring:RBASIC_CLASS(ret) == rb_cString」します。</p>
<p>./miniruby -e'#encoding:us-ascii' -e'ObjectSpace.each_object{|o| o.singleton_class if o.is_a?(String)}; "hoge".intern'</p>
<p>クラッシュログは自分で走らせてもらうとして、何が起きているかというと、<br>
(1) 文字列リテラルをはじめとして、何らかのかたちでシンボルを作らずにrb_fstringからfrozenなStringを作る<br>
(2) その文字列に対してsingleton_classを呼ぶ。するとそのRVALUE->klassにsingleton_classが代入される<br>
(3) 同じ内容の文字列でString#internする(1.でシンボルを作っているとlookup_str_sym()にひっかかる)<br>
(4) register_fstringの"assert(RBASIC_CLASS(ret) == rb_cString);"で落ちる</p>
<p>しかし、どう直しましょうかね。</p>
Ruby master - Bug #12791 (Closed): Don't allow ,-separator for cookie
https://redmine.ruby-lang.org/issues/12791
2016-09-27T03:11:40Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>RFC2965 allowed both ; and , as a separator for cookie, but RFC6265 only allows ;.</p>
<p>Moreover CVE-2016-7401 uses , as a separator to overwrite CSRF-token.<br>
<a href="https://gist.github.com/mala/457a25650950d4daf4144f98159802cc" class="external">https://gist.github.com/mala/457a25650950d4daf4144f98159802cc</a></p>
Ruby master - Bug #12711 (Closed): Darwin doesn't show C backtrace correctly if iSIGSEGV is recei...
https://redmine.ruby-lang.org/issues/12711
2016-08-29T18:38:08Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Current Ruby can show C backtrace on the following case</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">Process</span><span class="p">.</span><span class="nf">kill</span> <span class="ss">:SEGV</span><span class="p">,</span> <span class="vg">$$</span>
</code></pre>
<p>But can't on the following:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="nb">require</span><span class="s2">"fiddle"</span>
<span class="no">Fiddle</span><span class="p">.</span><span class="nf">dlunwrap</span><span class="p">(</span><span class="mi">100</span><span class="p">).</span><span class="nf">class</span>
</code></pre>
Ruby master - Bug #12568 (Closed): wrong ArgumentError if an array is given for instance_exec wit...
https://redmine.ruby-lang.org/issues/12568
2016-07-07T18:50:32Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>From Ruby 2.2 to trunk, it wrongly raise ArgumentError as follows:</p>
<p>Sample code:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">instance_exec</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]){</span><span class="o">|</span><span class="n">a</span><span class="o">|</span> <span class="nb">p</span> <span class="n">a</span><span class="p">}</span>
<span class="n">instance_exec</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]){</span><span class="o">|</span><span class="n">a</span><span class="o">=</span><span class="p">[]</span><span class="o">|</span> <span class="nb">p</span> <span class="n">a</span><span class="p">}</span>
<span class="n">instance_exec</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">],</span> <span class="o">&-></span><span class="p">(</span><span class="n">a</span><span class="p">){</span> <span class="nb">p</span> <span class="n">a</span> <span class="p">})</span>
<span class="o">-></span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="p">[]){</span> <span class="nb">p</span> <span class="n">a</span> <span class="p">}.</span><span class="nf">to_proc</span><span class="p">.</span><span class="nf">call</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">])</span>
<span class="n">instance_exec</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">],</span> <span class="o">&-></span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="p">[]){</span> <span class="nb">p</span> <span class="n">a</span> <span class="p">})</span>
</code></pre>
<p>Expected result:</p>
<pre><code>[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
</code></pre>
<p>Actual result:</p>
<pre><code>[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
test.rb:7:in `block in <main>': wrong number of arguments (given 3, expected 0..1) (ArgumentError)
from test.rb:7:in `instance_exec'
from test.rb:7:in `<main>'
</code></pre>
<p>This issue affect <a href="https://github.com/rails/rails/pull/25699" class="external">https://github.com/rails/rails/pull/25699</a></p>
Ruby master - Bug #12563 (Closed): backport 49758,50356
https://redmine.ruby-lang.org/issues/12563
2016-07-06T20:40:07Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>49758,50356 is required to run <code>make test-rubyspec</code> because without them rubyspec fails to build option/capi/ext.<br>
<a href="https://travis-ci.org/ruby/ruby/builds/142788121" class="external">https://travis-ci.org/ruby/ruby/builds/142788121</a></p>
Ruby master - Bug #12560 (Closed): backport r55602
https://redmine.ruby-lang.org/issues/12560
2016-07-06T18:20:29Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>They may fail parallel test-all.</p>
<ul>
<li>ruby_2_3: <a href="https://travis-ci.org/ruby/ruby/builds/141708115" class="external">https://travis-ci.org/ruby/ruby/builds/141708115</a>
</li>
<li>ruby_2_2: <a href="https://travis-ci.org/ruby/ruby/builds/142772798" class="external">https://travis-ci.org/ruby/ruby/builds/142772798</a>
</li>
</ul>
Ruby master - Bug #12320 (Closed): Skip SHA from test_digest_constants for LibreSSL 2.3
https://redmine.ruby-lang.org/issues/12320
2016-04-26T06:30:04Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Backport r53718 to fix the first one of ruby/openssl#40<br>
<a href="https://github.com/ruby/openssl/issues/40#issuecomment-159839338" class="external">https://github.com/ruby/openssl/issues/40#issuecomment-159839338</a></p>
Ruby master - Bug #12316 (Third Party's Issue): clang on Linux wrongly keep the inlined symbol
https://redmine.ruby-lang.org/issues/12316
2016-04-24T14:56:35Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Through clang-3.4 to clang-3.8 they wrongly keep the inlined symbols, and it cause compilation error.</p>
<pre><code>compiling vm.c
linking miniruby
vm.o: In function `vm_getinstancevariable':
/home/naruse/ruby-clang/./vm_insnhelper.c:876: undefined reference to `vm_getivar'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Makefile:223: recipe for target 'miniruby' failed
make: *** [miniruby] Error 1
</code></pre>
<p>Note that Apple's and FreeBSD's following versions works fine.</p>
<pre><code>Apple LLVM version 7.3.0 (clang-703.0.29)
Target: x86_64-apple-darwin15.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
FreeBSD clang version 3.4.1 (tags/RELEASE_34/dot1-final 208032) 20140512
Target: x86_64-unknown-freebsd10.3
Thread model: posix
</code></pre>
Ruby master - Bug #12158 (Closed): Fixnum#% doesn't show its name on ZeroDivisionError
https://redmine.ruby-lang.org/issues/12158
2016-03-08T08:54:05Z
naruse (Yui NARUSE)
naruse@airemix.jp
<pre><code>% ruby -ve'p 12345 % 0'
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-freebsd10.2]
-e:1:in `<main>': divided by 0 (ZeroDivisionError)
</code></pre>
<p>It should behave like</p>
<pre><code>% ruby -ve'p 12345 / 0'
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-freebsd10.2]
-e:1:in `/': divided by 0 (ZeroDivisionError)
from -e:1:in `<main>'
</code></pre>
Ruby master - Bug #12011 (Closed): honor Marshal.load post proc value for TYPE_LINK
https://redmine.ruby-lang.org/issues/12011
2016-01-20T02:25:15Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Following test doesn't work.<br>
A patch also attached.<br>
Both of them are worked by nahi.</p>
<pre><code class="diff syntaxhl" data-language="diff"><span class="gh">diff --git a/test/ruby/test_marshal.rb b/test/ruby/test_marshal.rb
index 482637f..262e7f6 100644
</span><span class="gd">--- a/test/ruby/test_marshal.rb
</span><span class="gi">+++ b/test/ruby/test_marshal.rb
</span><span class="p">@@ -712,4 +712,10 @@</span> def test_no_internal_ids
assert_predicate(status, :success?)
assert_equal(expected, out)
end
<span class="gi">+
+ def test_marshal_post_proc
+ str = 'x' # for link
+ obj = [str, str]
+ assert_equal(['X', 'X'], Marshal.load(Marshal.dump(obj), ->(v) { v == str ? v.upcase : v }))
+ end
</span> end
<span class="gh">diff --git a/marshal.c b/marshal.c
index d67ce87..d64e5ff 100644
</span><span class="gd">--- a/marshal.c
</span><span class="gi">+++ b/marshal.c
</span><span class="p">@@ -1569,7 +1569,7 @@</span> r_object0(struct load_arg *arg, int *ivp, VALUE extmod)
rb_raise(rb_eArgError, "dump format error (unlinked)");
}
v = (VALUE)link;
<span class="gd">- r_post_proc(v, arg);
</span><span class="gi">+ v = r_post_proc(v, arg);
</span> break;
case TYPE_IVAR:
</code></pre>
<p><a href="https://github.com/ruby/ruby/pull/1204" class="external">https://github.com/ruby/ruby/pull/1204</a></p>
Ruby master - Bug #11669 (Closed): inconsitent behavior of refining frozen class
https://redmine.ruby-lang.org/issues/11669
2015-11-09T05:38:34Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Is this expected behavior?</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">C</span>
<span class="k">def</span> <span class="nf">foo</span>
<span class="nb">p</span> <span class="mi">1</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">module</span> <span class="nn">Foo</span>
<span class="n">refine</span> <span class="no">C</span> <span class="k">do</span>
<span class="k">def</span> <span class="nf">foo</span>
<span class="nb">p</span> <span class="mi">2</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="n">using</span> <span class="no">Foo</span>
<span class="no">C</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">foo</span> <span class="c1">#=> 2</span>
<span class="no">C</span><span class="p">.</span><span class="nf">freeze</span>
<span class="k">module</span> <span class="nn">Foo</span>
<span class="n">refine</span> <span class="no">C</span> <span class="k">do</span>
<span class="k">def</span> <span class="nf">foo</span>
<span class="nb">p</span> <span class="mi">3</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">bar</span> <span class="c1">#=> can't modify frozen class (RuntimeError)</span>
<span class="nb">p</span> <span class="mi">3</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="no">C</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">foo</span>
<span class="no">C</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">bar</span>
</code></pre>
<pre><code>ruby 2.3.0dev (2015-10-26 trunk 52291) [x86_64-darwin15]
2
test.rb:21:in `block in <module:Foo>': can't modify frozen class (RuntimeError)
from test.rb:17:in `refine'
from test.rb:17:in `<module:Foo>'
from test.rb:16:in `<main>'
</code></pre>
Ruby master - Bug #11613 (Closed): test_aspawn_too_long_path creates too many processes
https://redmine.ruby-lang.org/issues/11613
2015-10-22T16:52:33Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>At least on FreeBSD, spawn("echo|echo|echo|echo|echo|echo|echo| ...20000 times") success and create 20000 zombie processes.<br>
To prevent this you can add rlimit_nproc: 1 because it tests sh itself, don't test spawned echos.</p>
<pre><code class="diff syntaxhl" data-language="diff"><span class="gh">diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb
index 32dcaed..7877171 100644
</span><span class="gd">--- a/test/ruby/test_process.rb
</span><span class="gi">+++ b/test/ruby/test_process.rb
</span><span class="p">@@ -1600,7 +1600,7 @@</span> class TestProcess < Test::Unit::TestCase
assert_raise(*exs, mesg) do
begin
loop do
<span class="gd">- Process.spawn(cmds.join(sep), [STDOUT, STDERR]=>File::NULL)
</span><span class="gi">+ Process.spawn(cmds.join(sep), [STDOUT, STDERR]=>File::NULL, rlimit_nproc: 1)
</span> min = [cmds.size, min].max
cmds *= 100
end
</code></pre>
Ruby master - Bug #11457 (Closed): miniruby SEGVs on CentOS 5
https://redmine.ruby-lang.org/issues/11457
2015-08-18T11:03:58Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>minirubyがCentOS 5 (64bit) でSEGVするやつです。<br>
<a href="http://rubyci.s3.amazonaws.com/centos5-64/ruby-trunk/log/20150818T093302Z.log.html.gz#miniversion" class="external">http://rubyci.s3.amazonaws.com/centos5-64/ruby-trunk/log/20150818T093302Z.log.html.gz#miniversion</a></p>
<p>パッチ見ればわかりますが原因はr49452です。<br>
2.1と2.2にはバックポートされているようだけど、2.0.0には入っていないと思う。</p>
Ruby master - Bug #11206 (Closed): short file name match incompatibility
https://redmine.ruby-lang.org/issues/11206
2015-06-01T17:54:57Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>When I develop a foo.gem, my working diretory has foo.gemspec and foo.gem.<br>
If I run <code>gem install -l foo</code>, it fails as following:</p>
<p>ERROR: While executing gem ... (Gem::Package::FormatError)<br>
package metadata is missing in foo.gemspec</p>
<p>Because gem command tries to traverse the current directory with Dir["*.gem"],<br>
and it include *.gemspec.</p>
<p>Another example, Rakefile has <code>rake clean</code> task and it is specified by CLEAN constant.<br>
if I specify CLEAN.include( "*.gem" ), it removes *.gemspec.</p>
Ruby master - Bug #11172 (Closed): Windowsでmode: ab+の時に開いたファイルの内容が読めない
https://redmine.ruby-lang.org/issues/11172
2015-05-23T15:23:47Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Windowsでopen("hoge.txt", "ab+")すると、開いたファイルの既存の内容が読めません。<br>
File::APPEND|File::CREAT|File::RDWR|File::BINARYでも同様です。</p>
<p>Unixでは読める上に、a+の時、つまり_openを使う場合も読めるので、意図しない挙動でしょう。</p>
<pre><code>diff --git a/win32/win32.c b/win32/win32.c
index 55e0d2e..57d9df4 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -6476,12 +6476,16 @@ rb_w32_close(int fd)
}
static int
-setup_overlapped(OVERLAPPED *ol, int fd)
+setup_overlapped(OVERLAPPED *ol, int fd, int iswrite)
{
memset(ol, 0, sizeof(*ol));
if (!(_osfile(fd) & (FDEV | FPIPE))) {
LONG high = 0;
- DWORD method = _osfile(fd) & FAPPEND ? FILE_END : FILE_CURRENT;
+ /* On mode:a, it can write only FILE_END.
+ * On mode:a+, though it can write only FILE_END,
+ * it can read from everywhere.
+ */
+ DWORD method = ((_osfile(fd) & FAPPEND) && iswrite) ? FILE_END : FILE_CURRENT;
DWORD low = SetFilePointer((HANDLE)_osfhnd(fd), 0, &high, method);
#ifndef INVALID_SET_FILE_POINTER
#define INVALID_SET_FILE_POINTER ((DWORD)-1)
@@ -6578,7 +6582,7 @@ rb_w32_read(int fd, void *buf, size_t size)
/* if have cancel_io, use Overlapped I/O */
if (cancel_io) {
- if (setup_overlapped(&ol, fd)) {
+ if (setup_overlapped(&ol, fd, FALSE)) {
rb_acrt_lowio_unlock_fh(fd);
return -1;
}
@@ -6708,7 +6712,7 @@ rb_w32_write(int fd, const void *buf, size_t size)
/* if have cancel_io, use Overlapped I/O */
if (cancel_io) {
- if (setup_overlapped(&ol, fd)) {
+ if (setup_overlapped(&ol, fd, TRUE)) {
rb_acrt_lowio_unlock_fh(fd);
return -1;
}
</code></pre>
Ruby master - Bug #10397 (Closed): gcc 4.1.2 for x86 can't build trunk
https://redmine.ruby-lang.org/issues/10397
2014-10-19T07:12:15Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Recently CentOS 5.6 x86 can't build ruby-trunk.<br>
This is since r47562 and it hit <a href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=16185" class="external">gcc bug</a>.</p>
<p>Do people want CRuby to continue RHEL/CentOS 5.6 support?<br>
If so, ideally it is fixed by gcc.</p>
Ruby master - Bug #9287 (Closed): 'rb_obj_write' discards qualifiers from pointer target type
https://redmine.ruby-lang.org/issues/9287
2013-12-23T18:22:00Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>array.c: In function 'rb_ary_new_from_args':<br>
array.c:506: warning: passing argument 2 of 'rb_obj_write' discards qualifiers from pointer target type<br>
などといった警告が出ます。</p>
<p><a href="http://fb32.rubyci.org/~chkbuild/ruby-trunk/log/20131223T070301Z.log.html.gz" class="external">http://fb32.rubyci.org/~chkbuild/ruby-trunk/log/20131223T070301Z.log.html.gz</a></p>
Ruby master - Bug #8782 (Closed): Don't set rl_getc_function on editline
https://redmine.ruby-lang.org/issues/8782
2013-08-12T16:31:55Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>r42402 以来 OS X 等の editline 環境では #define rl_getc(f) EOF が使われるようになってしまって残念なことになっていたわけですが、<br>
そもそも editline の readline wrapper は non ASCII に対応していません。<br>
(editline 自体には UTF-8 のみの対応が入ったが、readline wrapper は src/readline.c の _getc_function を経由するので non ASCII は化ける)</p>
<p>ので、いっそ rl_getc_function を使わないようにしてはどうでしょう。<br>
以下のようなパッチを当てると、readline なしの OS X の irb で日本語が使えるようになります。</p>
<p>diff --git a/ext/readline/extconf.rb b/ext/readline/extconf.rb<br>
index 0b121c1..bc0ee77 100644<br>
--- a/ext/readline/extconf.rb<br>
+++ b/ext/readline/extconf.rb<br>
@@ -94,4 +94,5 @@ readline.have_func("clear_history")<br>
readline.have_func("rl_redisplay")<br>
readline.have_func("rl_insert_text")<br>
readline.have_func("rl_delete_text")<br>
+readline.have_func("el_init")<br>
create_makefile("readline")<br>
diff --git a/ext/readline/readline.c b/ext/readline/readline.c<br>
index 0f76d1a..85109f0 100644<br>
--- a/ext/readline/readline.c<br>
+++ b/ext/readline/readline.c<br>
@@ -130,12 +130,7 @@ static VALUE readline_instream;<br>
static VALUE readline_outstream;</p>
<a name="if-defined-HAVE_RL_GETC_FUNCTION"></a>
<h2 >#if defined HAVE_RL_GETC_FUNCTION<a href="#if-defined-HAVE_RL_GETC_FUNCTION" class="wiki-anchor">¶</a></h2>
<h2>-#ifndef HAVE_RL_GETC<br>
-#define rl_getc(f) EOF<br>
-#endif</h2>
<p>-static int readline_getc(FILE *);<br>
+# ifndef HAVE_EL_INIT<br>
static int<br>
readline_getc(FILE *input)<br>
{<br>
@@ -187,6 +182,7 @@ readline_getc(FILE *input)<br>
#endif<br>
return FIX2INT(c);<br>
}<br>
+# endif<br>
#elif defined HAVE_RL_EVENT_HOOK<br>
#define BUSY_WAIT 0</p>
<p>@@ -1771,7 +1767,9 @@ Init_readline()<br>
/* libedit check rl_getc_function only when rl_initialize() is called, <em>/<br>
/</em> and using_history() call rl_initialize(). <em>/<br>
/</em> This assignment should be placed before using_history() */<br>
+# ifndef HAVE_EL_INIT<br>
rl_getc_function = readline_getc;<br>
+# endif<br>
#elif defined HAVE_RL_EVENT_HOOK<br>
rl_event_hook = readline_event;<br>
#endif</p>
Ruby master - Bug #8711 (Closed): 最近NoMemoryErrorが多い
https://redmine.ruby-lang.org/issues/8711
2013-07-31T16:06:27Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>最近 rubyci で NoMemoryError を出して失敗することが多いので、それを追跡するスレ</p>
<p>= TestFiber#test_many_fibers<br>
<a href="http://u64b.rubyci.org/~chkbuild/ruby-trunk/log/20130730T233301Z.diff.html.gz" class="external">http://u64b.rubyci.org/~chkbuild/ruby-trunk/log/20130730T233301Z.diff.html.gz</a><br>
<a href="http://rbci.lakewood.privs.net/ruby-trunk/log/20130731T001002Z.diff.html.gz" class="external">http://rbci.lakewood.privs.net/ruby-trunk/log/20130731T001002Z.diff.html.gz</a></p>
<p>= FiberError: can't alloc machine stack to fiber<br>
<a href="http://u64.rubyci.org/~chkbuild/ruby-trunk/log/20130729T200302Z.diff.html.gz" class="external">http://u64.rubyci.org/~chkbuild/ruby-trunk/log/20130729T200302Z.diff.html.gz</a></p>
Ruby master - Bug #8492 (Closed): ObjectSpace.after_gc_start_hook aborts with GC.stress
https://redmine.ruby-lang.org/issues/8492
2013-06-05T12:45:13Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>以下を実行すると assert(during_gc > 0) に失敗して abort します。<br>
ruby -robjspace -e'ObjectSpace.after_gc_start_hook=proc{};GC.stress=true;{}'<br>
gc.c:3818 の<br>
gc_event_hook(objspace, RUBY_INTERNAL_EVENT_GC_START, 0 /* TODO: pass minor/immediate flag? */);<br>
実行後に、during_gc が 0 になっている模様。</p>
Ruby master - Bug #8484 (Closed): Restoring conditions through the ruby method call during VM pro...
https://redmine.ruby-lang.org/issues/8484
2013-06-04T12:33:15Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>r41041 で、ブロック呼び出し前の VM 内の処理中に Ruby のメソッドが何らかの理由で呼ばれると argv が壊れるという問題を直しました。<br>
具体的には、</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">y</span> <span class="o">=</span> <span class="no">Object</span><span class="p">.</span><span class="nf">new</span>
<span class="k">def</span> <span class="nc">y</span><span class="o">.</span><span class="nf">s</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="k">yield</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="k">end</span>
<span class="n">m</span> <span class="o">=</span> <span class="no">Object</span><span class="p">.</span><span class="nf">new</span>
<span class="k">def</span> <span class="nc">m</span><span class="o">.</span><span class="nf">method_missing</span><span class="p">(</span><span class="o">*</span><span class="n">a</span><span class="p">)</span>
<span class="k">super</span>
<span class="k">end</span>
<span class="n">assert_equal</span> <span class="p">[</span><span class="n">m</span><span class="p">,</span> <span class="kp">nil</span><span class="p">],</span> <span class="n">y</span><span class="p">.</span><span class="nf">s</span><span class="p">(</span><span class="n">m</span><span class="p">){</span><span class="o">|</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="o">|</span><span class="p">[</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">]}</span>
</code></pre>
<p>のようなコードの場合、</p>
<ul>
<li>
<code>y.s</code> に <code>m</code> と <code>block</code> が渡される</li>
<li>
<code>y.s</code> で <code>yield(a)</code> が呼ばれる</li>
<li>
<code>argv</code>が設定される</li>
<li>
<code>vm_invoke_block</code> 内の <code>VALUE * const rsp = GET_SP() - ci->argc; SET_SP(rsp);</code> で <code>argv</code> の先頭に <code>sp</code> が設定される</li>
<li><code>vm_yield_setup_args</code></li>
<li><code>vm_yield_setup_block_args</code></li>
<li>
<code>y.s</code> のブロックパラメータは2つなのに、引数は一つなので、<code>a.to_ary</code> が呼ばれる (<code>rb_check_array_type(arg0)</code>)</li>
<li>
<code>method_missing</code> が呼ばれる</li>
<li>
<code>super</code> が呼ばれる (このへんで <code>vm _push_frame</code> が呼ばれる)</li>
<li>
<code>vm_push_frame</code>のinitialize local variablesのところで<code>argv</code>に<code>nil</code>が代入されて破壊される</li>
</ul>
<p>で、これ自体は <code>argv</code> を対比しておいて戻せばよいです。<br>
また、<code>SET_SP(rsp)</code>のあたりは、ささださん曰く「 <code>argv</code> に書き込みがない、という前提でそこは作ってるんだよね」だそうな。<br>
しかし、「そんな前提わかるかっ」ですし、<br>
methodの方は <code>SAVE_RESTORE_CI(tmp = rb_check_convert_type(ary, T_ARRAY, "Array", "to_a"), ci);</code> ともうちょっとわかりやすく書いてあるので、<br>
「頂いた問題点を元に、一度全部総点検が必要そうです」とのことですので、お願いします。</p>
Ruby master - Bug #8408 (Closed): minitest's test may fail randomly
https://redmine.ruby-lang.org/issues/8408
2013-05-15T11:54:58Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>test/minitest/test_minitest_spec.rb may fail as following:<br>
<a href="http://c5664.rubyci.org/~chkbuild/ruby-trunk/log/20130515T013301Z.log.html.gz" class="external">http://c5664.rubyci.org/~chkbuild/ruby-trunk/log/20130515T013301Z.log.html.gz</a></p>
<ol start="9">
<li>
<p>Failure:<br>
TestMeta#test_structure_subclasses [/home/chkbuild/build/20130515T013301Z/ruby/test/minitest/test_minitest_spec.rb:751]:<br>
Expected #<#<a href="Class:0x002abd3bcfd7f8" class="external">Class:0x002abd3bcfd7f8</a>:0x002abd3bf000f0 @<strong>name</strong>=nil, @<strong>io</strong>=nil, @passed=nil> (top-level thingy::inner) to respond to #xyz.</p>
</li>
<li>
<p>Failure:<br>
TestMeta#test_name [/home/chkbuild/build/20130515T013301Z/ruby/test/minitest/test_minitest_spec.rb:668]:<br>
Expected: "ExampleA"<br>
Actual: "top-level thingy::ExampleA"</p>
</li>
<li>
<p>Failure:<br>
TestMeta#test_structure [/home/chkbuild/build/20130515T013301Z/ruby/test/minitest/test_minitest_spec.rb:687]:<br>
--- expected<br>
+++ actual<br>
@@ -1 +1 @@<br>
-"top-level thingy"<br>
+"top-level thingy::top-level thingy"</p>
</li>
<li>
<p>Failure:<br>
TestMeta#test_name2 [/home/chkbuild/build/20130515T013301Z/ruby/test/minitest/test_minitest_spec.rb:680]:<br>
Expected: "ExampleA"<br>
Actual: "top-level thingy::ExampleA"</p>
</li>
</ol>
<p>It seems because of minitest's bug.<br>
minitest's parallelize_me! make tests parallell but its describe method uses single stack.</p>
Ruby master - Bug #8252 (Closed): cgiのHTML tag makerに未定義の属性を渡した場合の挙動
https://redmine.ruby-lang.org/issues/8252
2013-04-11T19:58:41Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>r40237 で以下の通り、定義されていない属性を渡したときの挙動が変化しているのですが意図していますか</p>
<ul>
<li>)<br>
+CGI::HtmlExtension#html when passed a Hash returns an 'html'-element using the passed Hash for attributes FAILED<br>
+Expected ""<br>
+to equal "<HTML BLA="TEST">"</li>
</ul>
<p>+/extdisk/chkbuild/chkbuild/tmp/build//rubyspec/library/cgi/htmlextension/html_spec.rb:<line_a>:in <code>block (3 levels) in <top (required)>' +/extdisk/chkbuild/chkbuild/tmp/build/<buildtime>/rubyspec/library/cgi/htmlextension/html_spec.rb:<line_a>:in </code><top (required)>'</p>
<p><a href="http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20130411T081100Z.diff.html.gz" class="external">http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20130411T081100Z.diff.html.gz</a></p>
Ruby master - Bug #8203 (Closed): Rinda: recycled object
https://redmine.ruby-lang.org/issues/8203
2013-04-02T11:00:13Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>test-allで以下のメッセージが出ているんですが、これってなんですか?<br>
<a href="http://u32.rubyci.org/~chkbuild/ruby-trunk/log/20130402T010302Z.log.html.gz#test-all" class="external">http://u32.rubyci.org/~chkbuild/ruby-trunk/log/20130402T010302Z.log.html.gz#test-all</a></p>
<p>Rinda::TupleSpaceProxyTest#test_take_bug_8215 = /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:369:in <code>_id2ref': 0xda91ca76 is recycled object (RangeError) from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:369:in </code>to_obj'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1446:in <code>to_obj' from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1748:in </code>to_obj'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1025:in <code>_load' from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:590:in </code>load'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:590:in <code>block in load' from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:586:in </code>synchronize'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:586:in <code>load' from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:638:in </code>recv_reply'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:936:in <code>recv_reply' from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1222:in </code>send_message'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1110:in <code>block (2 levels) in method_missing' from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1197:in </code>open'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1109:in <code>block in method_missing' from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1132:in </code>with_friend'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/drb/drb.rb:1108:in <code>method_missing' from /home/chkbuild/build/20130402T010302Z/ruby/lib/rinda/rinda.rb:265:in </code>write'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/test/rinda/test_rinda.rb:506:in <code>block in test_take_bug_8215' from /home/chkbuild/build/20130402T010302Z/ruby/test/rinda/test_rinda.rb:502:in </code>fork'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/test/rinda/test_rinda.rb:502:in <code>test_take_bug_8215' from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:858:in </code>run_test'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:1301:in <code>run' from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit/testcase.rb:17:in </code>run'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:919:in <code>block in _run_suite' from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:912:in </code>map'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:912:in <code>_run_suite' from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:657:in </code>block in _run_suites'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:655:in <code>each' from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:655:in </code>_run_suites'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:867:in <code>_run_anything' from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:1060:in </code>run_tests'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:1047:in <code>block in _run' from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:1046:in </code>each'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:1046:in <code>_run' from /home/chkbuild/build/20130402T010302Z/ruby/lib/minitest/unit.rb:1035:in </code>run'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:21:in <code>run' from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:774:in </code>run'<br>
from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:834:in <code>run' from /home/chkbuild/build/20130402T010302Z/ruby/lib/test/unit.rb:838:in </code>run'<br>
from ./test/runner.rb:17:in `'<br>
1.42 s = .</p>
Ruby master - Bug #8157 (Closed): How to write document for __LINE__, __FILE__, __END__
https://redmine.ruby-lang.org/issues/8157
2013-03-24T01:12:41Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>How do I write document for <strong>LINE</strong>, <strong>FILE</strong>, <strong>END</strong> ?</p>
<p>Moreover, __ is expressed as _ in rdoc.<br>
How can I avoid it?</p>
Ruby master - Bug #7589 (Closed): parallel test-all で test_settracefunc が SEGV
https://redmine.ruby-lang.org/issues/7589
2012-12-19T12:01:03Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>while make TESTS='-qv -j1 ruby/test_settracefunc.rb' test-all;do done としていると以下の通りSEGVします。</p>
<p>前略<br>
TestSetTraceFunc#test_tracepoint_exception_at_line = 0.00 s = .<br>
/home/naruse/ruby/lib/test/unit/parallel.rb:38: [BUG] Segmentation fault<br>
ruby 2.0.0dev (2012-12-19 trunk 38456) [x86_64-linux]</p>
<p>-- Control frame information -----------------------------------------------<br>
c:0002 p:0014 s:0005 e:000004 BLOCK /home/naruse/ruby/lib/test/unit/parallel.rb:38 [FINISH]<br>
c:0001 p:---- s:0002 e:000001 TOP [FINISH]</p>
<p>-- Ruby level backtrace information ----------------------------------------<br>
/home/naruse/ruby/lib/test/unit/parallel.rb:38:in `block in _run_suite'</p>
<p>-- C level backtrace information -------------------------------------------<br>
/home/naruse/ruby/libruby.so.2.0.0(+0x1be874) [0x2b09de81b874] vm_dump.c:643<br>
/home/naruse/ruby/libruby.so.2.0.0(+0x662a7) [0x2b09de6c32a7] error.c:306<br>
/home/naruse/ruby/libruby.so.2.0.0(rb_bug+0x108) [0x2b09de6c33e5] error.c:325<br>
/home/naruse/ruby/libruby.so.2.0.0(+0x1382f2) [0x2b09de7952f2] signal.c:649<br>
/lib/libpthread.so.0(+0xf8f0) [0x2b09deb188f0] ../nptl/sysdeps/pthread/funlockfile.c:30<br>
/home/naruse/ruby/libruby.so.2.0.0(+0x1c13e8) [0x2b09de81e3e8] vm_trace.c:263<br>
/home/naruse/ruby/libruby.so.2.0.0(+0x1c160f) [0x2b09de81e60f] vm_trace.c:309<br>
/home/naruse/ruby/libruby.so.2.0.0(+0x1aba95) [0x2b09de808a95]<br>
/home/naruse/ruby/libruby.so.2.0.0(+0x1baaca) [0x2b09de817aca] vm.c:1169<br>
/home/naruse/ruby/libruby.so.2.0.0(+0x1b9618) [0x2b09de816618] vm.c:636<br>
/home/naruse/ruby/libruby.so.2.0.0(+0x1b9869) [0x2b09de816869] vm.c:684<br>
/home/naruse/ruby/libruby.so.2.0.0(+0x1b9917) [0x2b09de816917] vm.c:703<br>
/home/naruse/ruby/libruby.so.2.0.0(+0x1c56cf) [0x2b09de8226cf]<br>
/home/naruse/ruby/libruby.so.2.0.0(+0x1c4111) [0x2b09de821111] thread_pthread.c:722<br>
/lib/libpthread.so.0(+0x69ca) [0x2b09deb0f9ca] pthread_create.c:300<br>
/lib/libc.so.6(clone+0x6d) [0x2b09df6d921d] parse.y:10551</p>
<p>-- Other runtime information -----------------------------------------------</p>
<ul>
<li>
<p>Loaded script: /home/naruse/ruby/lib/test/unit/parallel.rb: TestSetTraceFunc#test_tracepoint_thread</p>
</li>
<li>
<p>Loaded features:</p>
</li>
</ul>
<p>Some worker was crashed. It seems ruby interpreter's bug<br>
or, a bug of test/unit/parallel.rb. try again without -j<br>
option.</p>
<p>make: *** [yes-test-all] Error 1</p>
<p>以下のパッチを当てると落ちなくなるので、パイプの読み込み部分があやしそうですが……。</p>
<p>diff --git a/lib/test/unit/parallel.rb b/lib/test/unit/parallel.rb<br>
index d189183..b044792 100644<br>
--- a/lib/test/unit/parallel.rb<br>
+++ b/lib/test/unit/parallel.rb<br>
@@ -34,8 +34,13 @@ module Test</p>
<pre><code> th = Thread.new do
begin
</code></pre>
<ul>
<li>
<pre><code> while buf = (self.verbose ? i.gets : i.read(5))
</code></pre>
</li>
<li>
<pre><code> _report "p", buf
</code></pre>
</li>
</ul>
<ul>
<li>
<pre><code> buf = i.read
</code></pre>
</li>
<li>
<pre><code> if self.verbose
</code></pre>
</li>
<li>
<pre><code> buf.each_line{|l|
</code></pre>
</li>
<li>
<pre><code> _report "p", l
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>
<pre><code> else
</code></pre>
</li>
<li>
<pre><code> raise
end
rescue IOError
rescue Errno::EPIPE
</code></pre>
</li>
</ul>
Ruby master - Bug #7559 (Closed): Wrong line number with method call syntax
https://redmine.ruby-lang.org/issues/7559
2012-12-14T04:06:51Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>以下のような場合に表示される行数がおかしくなります。</p>
<p>def foo(*args)<br>
p caller[0][/\d+/].to_i #=> expected 4 but 8<br>
end<br>
foo "a<br>
b<br>
c<br>
d<br>
e"</p>
<p>def bar(a, b, line)<br>
p a<br>
p line #=> expected 14 but 19<br>
end<br>
def baz<br>
bar <strong>LINE</strong>, <<eom, <strong>LINE</strong><br>
a<br>
b<br>
c<br>
d<br>
eom<br>
end<br>
baz</p>
Ruby master - Bug #7302 (Closed): r37497 changes rb_enumeratorize without NEWS
https://redmine.ruby-lang.org/issues/7302
2012-11-07T19:53:08Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>r37497 [Feature <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Feature: Enumerable#size (Closed)" href="https://redmine.ruby-lang.org/issues/6636">#6636</a>] changed the prototype of rb_enumeratorize.<br>
It is public Ruby CAPI.</p>
<p>I think it shouldn't be changed and add another CAPI like rb_enumeratorize_with_size.<br>
At least a description should be add to NEWS</p>
Ruby master - Bug #6577 (Closed): GC中にstack overflowが発生するとSEGVする
https://redmine.ruby-lang.org/issues/6577
2012-06-12T02:18:44Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>GC中にstack overflowが発生すると、例外作成時にrb_new_objするので[BUG]ります。</p>
<p>原因<br>
(1) caller のテストで Fiber を利用するようにした<br>
(2) caller 実行中に GC が発生<br>
(3) GC 中にマシンスタックオーバーフロー(SEGV)が発生<br>
(4) スタックオーバーフローエラーを作成<br>
(5) スタックオーバーフローエラーを作るときに object allocation している<br>
(6) -> [BUG]</p>
<p>対処法:<br>
スタックオーバーフローエラーを投げるときはオブジェクト作らないようにする<br>
対症療法:<br>
caller のテストで Fiber を使わないようにする<br>
対症療法その2:<br>
callerのテストで GC.disable</p>
<p>nariさんがGC で再帰しないようにするなんて構想も先日語っておられましたが。</p>
Ruby master - Bug #6556 (Closed): ネストした配列の inspect で segv
https://redmine.ruby-lang.org/issues/6556
2012-06-08T00:36:42Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>./miniruby -e'10000.times.inject(x=[]){|a,|a<<(b=[]);b};x.inspect'<br>
で segv します。</p>
<p>% ./miniruby -e'10000.times.inject(x=[]){|a,|a<<(b=[]);b};x.inspect'|&less<br>
-e:1: [BUG] Segmentation fault<br>
ruby 2.0.0dev (2012-06-06 trunk 35950) [x86_64-freebsd9.0]</p>
<p>-- Control frame information -----------------------------------------------<br>
c:3116 p:---- s:6234 b:6234 l:006233 d:006233 CFUNC :inspect<br>
c:3115 p:---- s:6232 b:6232 l:006231 d:006231 CFUNC :inspect<br>
c:3114 p:---- s:6230 b:6230 l:006229 d:006229 CFUNC :inspect<br>
(中略)<br>
c:0005 p:---- s:0012 b:0012 l:000011 d:000011 CFUNC :inspect<br>
c:0004 p:---- s:0010 b:0010 l:000009 d:000009 CFUNC :inspect<br>
c:0003 p:0041 s:0007 b:0007 l:001458 d:002430 EVAL -e:1<br>
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH<br>
c:0001 p:0000 s:0002 b:0002 l:001458 d:001458 TOP</p>
<p>-e:1:in <code><main>' -e:1:in </code>inspect'<br>
-e:1:in <code>inspect' (中略) -e:1:in </code>inspect'<br>
-e:1:in `inspect'</p>
<p>-- C level backtrace information -------------------------------------------<br>
0x44c8bd <rb_warning+734> at /home/naruse/obj/ruby/miniruby ../../ruby/error.c:269<br>
0x44c9d8 <rb_bug+228> at /home/naruse/obj/ruby/miniruby ../../ruby/error.c:288<br>
0x518181 <ruby_posix_signal+352> at /home/naruse/obj/ruby/miniruby ../../ruby/signal.c:577<br>
0x800ca7723 <_pthread_sigmask+707> at /lib/libthr.so.3<br>
0x800ca7897 <_pthread_sigmask+1079> at /lib/libthr.so.3<br>
0x7ffffffff003</p>
<p>-- Other runtime information -----------------------------------------------</p>
<ul>
<li>
<p>Loaded script: -e</p>
</li>
<li>
<p>Loaded features:</p>
<p>0 enumerator.so</p>
</li>
</ul>
<p>[NOTE]<br>
You may have encountered a bug in the Ruby interpreter or extension libraries.<br>
Bug reports are welcome.<br>
For details: <a href="http://www.ruby-lang.org/bugreport.html" class="external">http://www.ruby-lang.org/bugreport.html</a></p>
<p>zsh: abort (core dumped) ./miniruby -e'p 10000.times.inject(x=[]){|a,|a<<(b=[]);b};x.inspect'</p>
Ruby master - Bug #6441 (Rejected): IO.pipe on ENFILE
https://redmine.ruby-lang.org/issues/6441
2012-05-16T12:59:05Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>今の Ruby は open(2) などで、errno=ENFILE が発生した場合、<br>
すなわち fd を使いきっている場合には、rb_gc() を呼び、IO オブジェクトを GC して、<br>
fd が解放されないか試み、それでもダメだったら諦めるとしています。</p>
<p>しかし、IO.pipe の場合はこれに失敗することがあります。<br>
これは、lazy sweep が上記の目的のため T_FILE の場合は直ちに sweep することにしている所、<br>
pipe の場合はその例外にあたらないからです。</p>
Ruby master - Bug #6405 (Closed): Re: [ruby-cvs:42717] ryan:r35541 (trunk): Imported minitest 2....
https://redmine.ruby-lang.org/issues/6405
2012-05-05T17:27:47Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>After r35541, test-all fails as following:</p>
<ol start="2">
<li>
<p>Error:<br>
test_equals_tilde(TestGemPlatform):<br>
TypeError: can't convert Gem::Platform to String<br>
/home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/test/rubygems/test_gem_platform.rb:210:in <code>test_equals_tilde' /home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/lib/test/unit.rb:633:in </code>block in _run_suites'<br>
/home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/lib/test/unit.rb:631:in <code>each' /home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/lib/test/unit.rb:631:in </code>_run_suites'<br>
/home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/lib/test/unit.rb:21:in <code>run' /home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/lib/test/unit.rb:682:in </code>run'<br>
/home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/lib/test/unit.rb:714:in <code>run' /home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/lib/test/unit.rb:718:in </code>run'<br>
./test/runner.rb:15:in `'</p>
</li>
<li>
<p>Error:<br>
test_dir(TestGemInstaller):<br>
TypeError: can't convert Regexp to String<br>
/home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/test/rubygems/test_gem_installer.rb:1220:in <code>test_dir' /home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/lib/test/unit.rb:633:in </code>block in _run_suites'<br>
/home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/lib/test/unit.rb:631:in <code>each' /home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/lib/test/unit.rb:631:in </code>_run_suites'<br>
/home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/lib/test/unit.rb:21:in <code>run' /home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/lib/test/unit.rb:682:in </code>run'<br>
/home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/lib/test/unit.rb:714:in <code>run' /home/chkbuild/build/ruby-trunk/20120504T230101Z/ruby/lib/test/unit.rb:718:in </code>run'<br>
./test/runner.rb:15:in `'</p>
</li>
</ol>
<p>Why don't you run tests before commit.</p>
<p>(2012/05/05 6:46), <a href="mailto:ryan@ruby-lang.org" class="email">ryan@ruby-lang.org</a> wrote:</p>
<blockquote>
<p>ryan 2012-05-05 06:46:01 +0900 (Sat, 05 May 2012)</p>
<p>New Revision: 35541</p>
<p><a href="http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=35541" class="external">http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=35541</a></p>
<p>Log:<br>
Imported minitest 2.12.1 (r7323)</p>
<p>Added files:<br>
trunk/test/minitest/metametameta.rb<br>
Modified files:<br>
trunk/ChangeLog<br>
trunk/lib/minitest/README.txt<br>
trunk/lib/minitest/autorun.rb<br>
trunk/lib/minitest/benchmark.rb<br>
trunk/lib/minitest/mock.rb<br>
trunk/lib/minitest/pride.rb<br>
trunk/lib/minitest/spec.rb<br>
trunk/lib/minitest/unit.rb<br>
trunk/test/minitest/test_minitest_benchmark.rb<br>
trunk/test/minitest/test_minitest_mock.rb<br>
trunk/test/minitest/test_minitest_spec.rb<br>
trunk/test/minitest/test_minitest_unit.rb</p>
</blockquote>
<p>--<br>
NARUSE, Yui <a href="mailto:naruse@airemix.jp" class="email">naruse@airemix.jp</a></p>
Ruby master - Bug #6400 (Closed): dl/callback with fiddle occurs SEGV on NetBSD amd64
https://redmine.ruby-lang.org/issues/6400
2012-05-04T21:33:37Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>On NetBSD amd64, libffi with callback occurs SEGV as following.</p>
<p>kelvena% cat p<br>
require 'dl/callback'<br>
require 'dl/func'<br>
include DL<br>
Called_with = nil<br>
addr = set_callback(TYPE_VOID, 1) do |str|<br>
called_with = dlunwrap(str)<br>
end<br>
func = CFunc.new(addr, TYPE_VOID, 'test')<br>
f = Function.new(func, [TYPE_VOIDP])<br>
arg = 'foo'<br>
f.call(dlwrap(arg))<br>
kelvena% ./ruby p<br>
/home/naruse/local/ruby/lib/ruby/2.0.0/dl/func.rb:55: [BUG] Segmentation fault<br>
ruby 2.0.0dev (2012-04-30 trunk 35500) [x86_64-netbsd6.99.5]</p>
<p>-- Control frame information -----------------------------------------------<br>
c:0005 p:---- s:0022 b:0022 l:000021 d:000021 CFUNC :call<br>
c:0004 p:0059 s:0018 b:0018 l:000017 d:000017 METHOD /home/naruse/local/ruby/lib/ruby/2.0.0/dl/func.<br>
rb:55<br>
c:0003 p:0157 s:0010 b:0010 l:001db8 d:0021a8 EVAL p:11<br>
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH<br>
c:0001 p:0000 s:0002 b:0002 l:001db8 d:001db8 TOP</p>
<p>-- Ruby level backtrace information ----------------------------------------<br>
p:11:in <code><main>' /home/naruse/local/ruby/lib/ruby/2.0.0/dl/func.rb:55:in </code>call'<br>
/home/naruse/local/ruby/lib/ruby/2.0.0/dl/func.rb:55:in `call'</p>
<p>-- Other runtime information -----------------------------------------------</p>
<ul>
<li>
<p>Loaded script: p</p>
</li>
<li>
<p>Loaded features:</p>
<p>0 enumerator.so<br>
1 /home/naruse/local/ruby/lib/ruby/2.0.0/x86_64-netbsd6.99.5/enc/encdb.so<br>
2 /home/naruse/local/ruby/lib/ruby/2.0.0/x86_64-netbsd6.99.5/enc/trans/transdb.so<br>
3 /home/naruse/local/ruby/lib/ruby/2.0.0/rubygems/defaults.rb<br>
4 /home/naruse/local/ruby/lib/ruby/2.0.0/x86_64-netbsd6.99.5/rbconfig.rb<br>
5 /home/naruse/local/ruby/lib/ruby/2.0.0/rubygems/deprecate.rb<br>
6 /home/naruse/local/ruby/lib/ruby/2.0.0/rubygems/exceptions.rb<br>
7 /home/naruse/local/ruby/lib/ruby/2.0.0/rubygems/custom_require.rb<br>
8 /home/naruse/local/ruby/lib/ruby/2.0.0/rubygems.rb<br>
9 /home/naruse/local/ruby/lib/ruby/2.0.0/x86_64-netbsd6.99.5/dl.so<br>
10 /home/naruse/local/ruby/lib/ruby/2.0.0/x86_64-netbsd6.99.5/fiddle.so<br>
11 /home/naruse/local/ruby/lib/ruby/2.0.0/fiddle/function.rb<br>
12 /home/naruse/local/ruby/lib/ruby/2.0.0/fiddle/closure.rb<br>
13 /home/naruse/local/ruby/lib/ruby/2.0.0/fiddle.rb<br>
14 /home/naruse/local/ruby/lib/ruby/2.0.0/dl.rb<br>
15 /home/naruse/local/ruby/lib/ruby/2.0.0/thread.rb<br>
16 /home/naruse/local/ruby/lib/ruby/2.0.0/dl/callback.rb<br>
17 /home/naruse/local/ruby/lib/ruby/2.0.0/dl/stack.rb<br>
18 /home/naruse/local/ruby/lib/ruby/2.0.0/dl/value.rb<br>
19 /home/naruse/local/ruby/lib/ruby/2.0.0/dl/func.rb</p>
</li>
</ul>
<p>[NOTE]<br>
You may have encountered a bug in the Ruby interpreter or extension libraries.<br>
Bug reports are welcome.<br>
For details: <a href="http://www.ruby-lang.org/bugreport.html" class="external">http://www.ruby-lang.org/bugreport.html</a></p>
<p>zsh: abort (core dumped) ./ruby p</p>
Ruby master - Bug #6272 (Closed): Rinda sticks on some tests
https://redmine.ruby-lang.org/issues/6272
2012-04-08T22:27:08Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Rindaが例えば以下のようにすると刺さります。</p>
<p>while [ yes ];do;make test-all TESTS='-v -n test_ruby_talk_264062 rinda/test_rinda.rb' RUBYOPT=-w;done</p>
<p>しばらく追ってみたところ、Rinda は Monitor#synchronize をすることで同期を守っているのですが、<br>
そのテストでは時刻を Rinda::MockClock で扱い、その中で Rinda::MockClock::MyTS を用いて時刻を配信しているのですが、<br>
この TupleSpace は複数のスレッドから触られるため、同一のスレッドからなら何度入ってもロックしない<br>
Monitor#synchronize でも、デッドロックしてしまうからっぽい気がします。</p>
Ruby master - Bug #6140 (Rejected): test
https://redmine.ruby-lang.org/issues/6140
2012-03-14T17:28:04Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Redmineを1.3.2にしたのでテスト</p>
Ruby master - Bug #5868 (Closed): make failed on i686-linux from Bitmap Marking GC
https://redmine.ruby-lang.org/issues/5868
2012-01-09T10:54:12Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>i686-linux に置いて、r34225 以降 make に失敗します。</p>
<p><a href="http://c5632.rubyci.org/~chkbuild/ruby-trunk/log/20120109T010103Z.log.html.gz" class="external">http://c5632.rubyci.org/~chkbuild/ruby-trunk/log/20120109T010103Z.log.html.gz</a><br>
<a href="http://u32.rubyci.org/~chkbuild/ruby-trunk/log/20120108T230102Z.log.html.gz" class="external">http://u32.rubyci.org/~chkbuild/ruby-trunk/log/20120108T230102Z.log.html.gz</a><br>
<a href="http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20120109T000400Z.log.html.gz" class="external">http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20120109T000400Z.log.html.gz</a></p>
Ruby master - Bug #5813 (Closed): net/http's EOFError and Keep-Alive
https://redmine.ruby-lang.org/issues/5813
2011-12-27T14:56:52Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p><a href="https://blade.ruby-lang.org/ruby-dev/39421">[ruby-dev:39421]</a> describes exceptions thrown by open-uri, and raise a question why net/http raises EOFError.</p>
<p>net/http sometimes raises EOFError.<br>
I recently find it is because of Keep-Alive.<br>
On HTTP/1.1, connections are Keep-Alive and a Keep-Alive connection has a timeout.<br>
If a client of such connection doesn't send anything after some communication,<br>
server closes the connection because of Keep-Alive timeout,<br>
and the client's connection shall raise EOFError (sometimes it may be ECONNRESET).</p>
<p>HTTP/1.1 says a client should retry a request if the request is idempotent.<br>
<a href="http://tools.ietf.org/html/rfc2616#section-8.1.4" class="external">http://tools.ietf.org/html/rfc2616#section-8.1.4</a><br>
<a href="http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-17#section-6.1.5" class="external">http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-17#section-6.1.5</a><br>
<a href="http://www.studyinghttp.net/connections" class="external">http://www.studyinghttp.net/connections</a><br>
So I attached a patch to such retry to net/http.</p>
<p>FYI, this timeout of Keep-Alive, KeepAliveTimeout, is:<br>
Apache in FreeBSD ports or pkgsrc is 5 seconds,<br>
the on in Debian Packages or RPM is 15 seconds.</p>
<p>diff --git a/lib/net/http.rb b/lib/net/http.rb<br>
index 879cfe0..13bd1a7 100644<br>
--- a/lib/net/http.rb<br>
+++ b/lib/net/http.rb<br>
@@ -1332,7 +1332,10 @@ module Net #:nodoc:<br>
res<br>
end</p>
<ul>
<li>IDEMPOTENT_METHODS_ = %w/GET HEAD PUT DELETE OPTIONS TRACE/ # :nodoc:</li>
<li>def transport_request(req)</li>
<li>
<pre><code> count = 0
begin_transport req
res = catch(:response) {
req.exec @socket, @curr_http_version, edit_path(req.path)
</code></pre>
</li>
</ul>
<p>@@ -1346,6 +1349,16 @@ module Net #:nodoc:<br>
}<br>
end_transport req, res<br>
res</p>
<ul>
<li>rescue EOFError, Errno::ECONNRESET => exception</li>
<li>
<pre><code> if count == 0 && IDEMPOTENT_METHODS_.include?(req.method)
</code></pre>
</li>
<li>
<pre><code> count += 1
</code></pre>
</li>
<li>
<pre><code> @socket.close if @socket and not @socket.closed?
</code></pre>
</li>
<li>
<pre><code> D "Conn close because of error #{exception}, and retry"
</code></pre>
</li>
<li>
<pre><code> retry
</code></pre>
</li>
<li>
<pre><code> end
</code></pre>
</li>
<li>
<pre><code> D "Conn close because of error #{exception}"
</code></pre>
</li>
<li>
<pre><code> @socket.close if @socket and not @socket.closed?
</code></pre>
</li>
<li>
<pre><code> raise
</code></pre>
rescue => exception<br>
D "Conn close because of error #{exception}"<br>
@socket.close if @socket and not @socket.closed?<br>
diff --git a/test/net/http/test_http.rb b/test/net/http/test_http.rb<br>
index 1515854..2e7ab4e 100644<br>
--- a/test/net/http/test_http.rb<br>
+++ b/test/net/http/test_http.rb<br>
@@ -564,3 +564,29 @@ class TestNetHTTPContinue < Test::Unit::TestCase<br>
assert_not_match(/HTTP/1.1 100 continue/, @debug.string)<br>
end<br>
end</li>
<li>
</ul>
<p>+class TestNetHTTPKeepAlive < Test::Unit::TestCase</p>
<ul>
<li>CONFIG = {</li>
<li>'host' => '127.0.0.1',</li>
<li>'port' => 10081,</li>
<li>'proxy_host' => nil,</li>
<li>'proxy_port' => nil,</li>
<li>'RequestTimeout' => 0.1,</li>
<li>}</li>
<li>
<li>include TestNetHTTPUtils</li>
<li>
<li>def test_keep_alive_get</li>
<li>start {|http|</li>
<li>
<pre><code> res = http.get('/')
</code></pre>
</li>
<li>
<pre><code> assert_kind_of Net::HTTPResponse, res
</code></pre>
</li>
<li>
<pre><code> assert_kind_of String, res.body
</code></pre>
</li>
<li>
<pre><code> sleep 1
</code></pre>
</li>
<li>
<pre><code> assert_nothing_raised {
</code></pre>
</li>
<li>
<pre><code> res = http.get('/')
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>
<pre><code> assert_kind_of Net::HTTPResponse, res
</code></pre>
</li>
<li>
<pre><code> assert_kind_of String, res.body
</code></pre>
</li>
<li>}</li>
<li>end<br>
+end<br>
diff --git a/test/net/http/utils.rb b/test/net/http/utils.rb<br>
index 50f616f..07e0b9f 100644<br>
--- a/test/net/http/utils.rb<br>
+++ b/test/net/http/utils.rb<br>
@@ -51,6 +51,7 @@ module TestNetHTTPUtils<br>
:ServerType => Thread,<br>
}<br>
server_config[:OutputBufferSize] = 4 if config('chunked')</li>
<li>server_config[:RequestTimeout] = config('RequestTimeout') if config('RequestTimeout')<br>
if defined?(OpenSSL) and config('ssl_enable')<br>
server_config.update({<br>
:SSLEnable => true,</li>
</ul>
Ruby master - Bug #5790 (Closed): net/http の EOFError と Keep-Alive
https://redmine.ruby-lang.org/issues/5790
2011-12-22T18:49:13Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p><a href="https://blade.ruby-lang.org/ruby-dev/39421">[ruby-dev:39421]</a> がずっと心に残っていたので、思い立って調べてみたので、<br>
(正確には自分が高頻度で踏むようになったので調べてみた)<br>
その調査結果と対策案を提案します。</p>
<p>まず、投げられる原因ですが、根本的な原因は Keep-Alive のタイムアウトです。<br>
HTTP/1.1 ではデフォルトで持続的接続を行うので、複数回のリクエストに渡って<br>
一つの socket が使い回されます。</p>
<p>しかし、リクエスト同士で時間が開いていると、サーバー側でタイムアウトする<br>
可能性があります。この時にクライアント側の read(2) が 0 を返す、<br>
つまり EOFError となることがあります。</p>
<p>HTTP/1.1 は、冪等なメソッドの場合には確認なしにリトライすべきと言っているので、<br>
そのようにするパッチを添付します。<br>
冪等でないメソッドの場合にどうするべきかは悩ましいところです。<br>
<a href="http://tools.ietf.org/html/rfc2616#section-8.1.4" class="external">http://tools.ietf.org/html/rfc2616#section-8.1.4</a><br>
<a href="http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-17#section-6.1.5" class="external">http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-17#section-6.1.5</a><br>
<a href="http://www.studyinghttp.net/connections" class="external">http://www.studyinghttp.net/connections</a></p>
<p>なお、この Keep-Alive における Timeout は、<br>
Apache の場合、FreeBSD ports や pkgsrc では 5 秒、<br>
Debian Packages や RPM では 15 秒でした。</p>
<p>diff --git a/lib/net/http.rb b/lib/net/http.rb<br>
index 879cfe0..13bd1a7 100644<br>
--- a/lib/net/http.rb<br>
+++ b/lib/net/http.rb<br>
@@ -1332,7 +1332,10 @@ module Net #:nodoc:<br>
res<br>
end</p>
<ul>
<li>IDEMPOTENT_METHODS_ = %w/GET HEAD PUT DELETE OPTIONS TRACE/ # :nodoc:</li>
<li>def transport_request(req)</li>
<li>
<pre><code> count = 0
begin_transport req
res = catch(:response) {
req.exec @socket, @curr_http_version, edit_path(req.path)
</code></pre>
</li>
</ul>
<p>@@ -1346,6 +1349,16 @@ module Net #:nodoc:<br>
}<br>
end_transport req, res<br>
res</p>
<ul>
<li>rescue EOFError, Errno::ECONNRESET => exception</li>
<li>
<pre><code> if count == 0 && IDEMPOTENT_METHODS_.include?(req.method)
</code></pre>
</li>
<li>
<pre><code> count += 1
</code></pre>
</li>
<li>
<pre><code> @socket.close if @socket and not @socket.closed?
</code></pre>
</li>
<li>
<pre><code> D "Conn close because of error #{exception}, and retry"
</code></pre>
</li>
<li>
<pre><code> retry
</code></pre>
</li>
<li>
<pre><code> end
</code></pre>
</li>
<li>
<pre><code> D "Conn close because of error #{exception}"
</code></pre>
</li>
<li>
<pre><code> @socket.close if @socket and not @socket.closed?
</code></pre>
</li>
<li>
<pre><code> raise
</code></pre>
rescue => exception<br>
D "Conn close because of error #{exception}"<br>
@socket.close if @socket and not @socket.closed?<br>
diff --git a/test/net/http/test_http.rb b/test/net/http/test_http.rb<br>
index 1515854..2e7ab4e 100644<br>
--- a/test/net/http/test_http.rb<br>
+++ b/test/net/http/test_http.rb<br>
@@ -564,3 +564,29 @@ class TestNetHTTPContinue < Test::Unit::TestCase<br>
assert_not_match(/HTTP/1.1 100 continue/, @debug.string)<br>
end<br>
end</li>
<li>
</ul>
<p>+class TestNetHTTPKeepAlive < Test::Unit::TestCase</p>
<ul>
<li>CONFIG = {</li>
<li>'host' => '127.0.0.1',</li>
<li>'port' => 10081,</li>
<li>'proxy_host' => nil,</li>
<li>'proxy_port' => nil,</li>
<li>'RequestTimeout' => 0.1,</li>
<li>}</li>
<li>
<li>include TestNetHTTPUtils</li>
<li>
<li>def test_keep_alive_get</li>
<li>start {|http|</li>
<li>
<pre><code> res = http.get('/')
</code></pre>
</li>
<li>
<pre><code> assert_kind_of Net::HTTPResponse, res
</code></pre>
</li>
<li>
<pre><code> assert_kind_of String, res.body
</code></pre>
</li>
<li>
<pre><code> sleep 1
</code></pre>
</li>
<li>
<pre><code> assert_nothing_raised {
</code></pre>
</li>
<li>
<pre><code> res = http.get('/')
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>
<pre><code> assert_kind_of Net::HTTPResponse, res
</code></pre>
</li>
<li>
<pre><code> assert_kind_of String, res.body
</code></pre>
</li>
<li>}</li>
<li>end<br>
+end<br>
diff --git a/test/net/http/utils.rb b/test/net/http/utils.rb<br>
index 50f616f..07e0b9f 100644<br>
--- a/test/net/http/utils.rb<br>
+++ b/test/net/http/utils.rb<br>
@@ -51,6 +51,7 @@ module TestNetHTTPUtils<br>
:ServerType => Thread,<br>
}<br>
server_config[:OutputBufferSize] = 4 if config('chunked')</li>
<li>server_config[:RequestTimeout] = config('RequestTimeout') if config('RequestTimeout')<br>
if defined?(OpenSSL) and config('ssl_enable')<br>
server_config.update({<br>
:SSLEnable => true,</li>
</ul>
Ruby master - Bug #5768 (Closed): TestRequire#test_race_exceptionで競合するケースがまだある
https://redmine.ruby-lang.org/issues/5768
2011-12-17T10:48:22Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>まだrequireで競合するケースが残っています。<br>
現在のテストだと確率的にしか起きませんが、以下の通り変更すると確実に起きるようになります。</p>
<p>diff --git a/test/ruby/test_require.rb b/test/ruby/test_require.rb<br>
index 9186a6f..262a5ef 100644<br>
--- a/test/ruby/test_require.rb<br>
+++ b/test/ruby/test_require.rb<br>
@@ -352,7 +352,7 @@ class TestRequire < Test::Unit::TestCase<br>
TestRequire.scratch << :pre<br>
Thread.pass until t2 = TestRequire.scratch[1]<br>
Thread.pass until t2.stop?<br>
-open(<strong>FILE</strong>, "w") {|f| f.puts "TestRequire.scratch << :post"}<br>
+open(<strong>FILE</strong>, "w") {|f| f.puts "TestRequire.scratch << :post"; f.puts "t1,t2=TestRequire.scratch[1, 2];if Thread.current == t2; Thread.pass until t1.stopped?; end"}<br>
raise "con1"<br>
EOS<br>
tmp.close<br>
@@ -364,6 +364,7 @@ raise "con1"<br>
t2_res = nil</p>
<pre><code> t1 = Thread.new do
</code></pre>
<ul>
<li>
<pre><code> scratch << t1
begin
require(path)
rescue RuntimeError
</code></pre>
</li>
</ul>
<p>@@ -389,8 +390,8 @@ raise "con1"<br>
assert_nothing_raised(ThreadError, bug5754) {t1.join}<br>
assert_nothing_raised(ThreadError, bug5754) {t2.join}</p>
<ul>
<li>assert_equal(true, (t1_res ^ t2_res), bug5754)</li>
<li>assert_equal([:pre, t2, :post, :t2, :t1], scratch, bug5754)</li>
</ul>
<ul>
<li>assert_equal(true, (t1_res ^ t2_res), bug5754 + " t1:#{t1_res} t2:#{t2_res}")</li>
<li>assert_equal([:pre, t1, t2, :post, :t2, :t1], scratch, bug5754)<br>
ensure<br>
tmp.close(true) if tmp<br>
end</li>
</ul>
Ruby master - Bug #5691 (Closed): rb_path2class raises a NameError if a constant in the path exis...
https://redmine.ruby-lang.org/issues/5691
2011-11-30T22:21:39Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>An exception from rb_path2class differs on strange context.</p>
<p>% ./ruby -r./spec/rubyspec/optional/capi/ext/class_spec.so -e'CApiClassSpecs.new.rb_path2class("CApiClassSpecs::X")'<br>
-e:1:in <code>rb_path2class': undefined class/module CApiClassSpecs::X (ArgumentError) % ./ruby -r./spec/rubyspec/optional/capi/ext/class_spec.so -e'X=1;CApiClassSpecs.new.rb_path2class("CApiClassSpecs::X")' -e:1:in </code>rb_path2class': uninitialized constant CApiClassSpecs::X (NameError)</p>
Ruby master - Bug #5548 (Closed): OpenSSL::Engine can't load some old engines/new engines
https://redmine.ruby-lang.org/issues/5548
2011-11-02T11:20:11Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Current ext/openssl is missing a check for ENGINE_load_dynamic(),<br>
and doesn't have checks/functions for new engines.</p>
<p>diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb<br>
index 8d8cee3..8f13121 100644<br>
--- a/ext/openssl/extconf.rb<br>
+++ b/ext/openssl/extconf.rb<br>
@@ -118,6 +118,8 @@ if have_header("openssl/engine.h")<br>
have_func("ENGINE_get_digest")<br>
have_func("ENGINE_get_cipher")<br>
have_func("ENGINE_cleanup")<br>
+</p>
<ul>
<li>have_func("ENGINE_load_dynamic")<br>
have_func("ENGINE_load_4758cca")<br>
have_func("ENGINE_load_aep")<br>
have_func("ENGINE_load_atalla")<br>
@@ -126,6 +128,12 @@ if have_header("openssl/engine.h")<br>
have_func("ENGINE_load_nuron")<br>
have_func("ENGINE_load_sureware")<br>
have_func("ENGINE_load_ubsec")</li>
<li>have_func("ENGINE_load_padlock")</li>
<li>have_func("ENGINE_load_capi")</li>
<li>have_func("ENGINE_load_gmp")</li>
<li>have_func("ENGINE_load_gost")</li>
<li>have_func("ENGINE_load_cryptodev")</li>
<li>have_func("ENGINE_load_aesni")<br>
end<br>
have_func("DH_generate_parameters_ex")<br>
have_func("DSA_generate_parameters_ex")<br>
diff --git a/ext/openssl/ossl_engine.c b/ext/openssl/ossl_engine.c<br>
index 79f51b8..829680c 100644<br>
--- a/ext/openssl/ossl_engine.c<br>
+++ b/ext/openssl/ossl_engine.c<br>
@@ -64,29 +64,47 @@ ossl_engine_s_load(int argc, VALUE *argv, VALUE klass)<br>
#if HAVE_ENGINE_LOAD_DYNAMIC<br>
OSSL_ENGINE_LOAD_IF_MATCH(dynamic);<br>
#endif<br>
-#if HAVE_ENGINE_LOAD_CSWIFT</li>
</ul>
<ul>
<li>OSSL_ENGINE_LOAD_IF_MATCH(cswift);<br>
+#if HAVE_ENGINE_LOAD_4758CCA</li>
</ul>
<ul>
<li>OSSL_ENGINE_LOAD_IF_MATCH(4758cca);<br>
#endif<br>
-#if HAVE_ENGINE_LOAD_CHIL</li>
</ul>
<ul>
<li>OSSL_ENGINE_LOAD_IF_MATCH(chil);<br>
+#if HAVE_ENGINE_LOAD_AEP</li>
</ul>
<ul>
<li>OSSL_ENGINE_LOAD_IF_MATCH(aep);<br>
#endif<br>
#if HAVE_ENGINE_LOAD_ATALLA<br>
OSSL_ENGINE_LOAD_IF_MATCH(atalla);<br>
#endif<br>
+#if HAVE_ENGINE_LOAD_CHIL</li>
<li>OSSL_ENGINE_LOAD_IF_MATCH(chil);<br>
+#endif<br>
+#if HAVE_ENGINE_LOAD_CSWIFT</li>
<li>OSSL_ENGINE_LOAD_IF_MATCH(cswift);<br>
+#endif<br>
#if HAVE_ENGINE_LOAD_NURON<br>
OSSL_ENGINE_LOAD_IF_MATCH(nuron);<br>
#endif<br>
+#if HAVE_ENGINE_LOAD_SUREWARE</li>
<li>OSSL_ENGINE_LOAD_IF_MATCH(sureware);<br>
+#endif<br>
#if HAVE_ENGINE_LOAD_UBSEC<br>
OSSL_ENGINE_LOAD_IF_MATCH(ubsec);<br>
#endif<br>
-#if HAVE_ENGINE_LOAD_AEP</li>
</ul>
<ul>
<li>OSSL_ENGINE_LOAD_IF_MATCH(aep);<br>
+#if HAVE_ENGINE_LOAD_PADLOCK</li>
</ul>
<ul>
<li>OSSL_ENGINE_LOAD_IF_MATCH(padlock);<br>
#endif<br>
-#if HAVE_ENGINE_LOAD_SUREWARE</li>
</ul>
<ul>
<li>OSSL_ENGINE_LOAD_IF_MATCH(sureware);<br>
+#if HAVE_ENGINE_LOAD_CAPI</li>
</ul>
<ul>
<li>OSSL_ENGINE_LOAD_IF_MATCH(capi);<br>
#endif<br>
-#if HAVE_ENGINE_LOAD_4758CCA</li>
</ul>
<ul>
<li>OSSL_ENGINE_LOAD_IF_MATCH(4758cca);<br>
+#if HAVE_ENGINE_LOAD_GMP</li>
</ul>
<ul>
<li>OSSL_ENGINE_LOAD_IF_MATCH(gmp);<br>
+#endif<br>
+#if HAVE_ENGINE_LOAD_GOST</li>
<li>OSSL_ENGINE_LOAD_IF_MATCH(gost);<br>
+#endif<br>
+#if HAVE_ENGINE_LOAD_CRYPTODEV</li>
<li>OSSL_ENGINE_LOAD_IF_MATCH(cryptodev);<br>
+#endif<br>
+#if HAVE_ENGINE_LOAD_AESNI</li>
<li>OSSL_ENGINE_LOAD_IF_MATCH(aesni);<br>
#endif<br>
#endif<br>
#ifdef HAVE_ENGINE_LOAD_OPENBSD_DEV_CRYPTO</li>
</ul>
Ruby master - Bug #5547 (Closed): Cleanup engine after a test
https://redmine.ruby-lang.org/issues/5547
2011-11-02T11:16:21Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>OpenSSL::Engine.load() loads engines and register them, and it may change the behavior of some existing methods.</p>
<p>For example on NetBSD 6 with cryptodev, it effects DH as folloing:<br>
./ruby -ropenssl -e'p OpenSSL::PKey::DH.new(256).public_key.private?;p OpenSSL::Engine.load;p OpenSSL::PKey::DH.new(256).public_key.private?'<br>
false<br>
true<br>
true</p>
<p>After loads cryptodev and register it (yes, it needs register. current ext/openssl can't register a engine),<br>
OpenSSL::PKey::DH#private?'s behavior seems to be changed.</p>
<p>Whether it is a bug or not, test/openssl/test_engine.rb should be fixed.</p>
<a name="Index-testopenssltest_enginerb"></a>
<h1 >Index: test/openssl/test_engine.rb<a href="#Index-testopenssltest_enginerb" class="wiki-anchor">¶</a></h1>
<p>--- test/openssl/test_engine.rb (revision 33605)<br>
+++ test/openssl/test_engine.rb (working copy)<br>
@@ -8,6 +8,7 @@<br>
OpenSSL::Engine.load<br>
OpenSSL::Engine.engines<br>
OpenSSL::Engine.engines</p>
<ul>
<li>OpenSSL::Engine.cleanup<br>
end</li>
</ul>
<p>end</p>
Ruby master - Bug #5526 (Closed): SEGV: ./ruby -rfiber -ve'f=Fiber.new{f.resume};f.transfer'
https://redmine.ruby-lang.org/issues/5526
2011-11-01T00:02:47Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>FreeBSD 9 にて、./ruby -rfiber -ve'f=Fiber.new{f.resume};f.transfer' で SEGV します。<br>
他のプラットフォームでも dead fiber call 例外なのはおかしくて、<br>
double resume 例外になるべきでしょう。</p>
Ruby master - Bug #5524 (Closed): IO.wait_for_single_fd(closed fd) sticks on other than Linux
https://redmine.ruby-lang.org/issues/5524
2011-10-31T21:31:41Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>r31428 で、test_wait_for_invalid_fd ってテストを追加しており、<br>
IO.wait_for_single_fd(close 済みの fd) が EBADF になることを確認しているのですが、<br>
これ単体で動かすと FreeBSD で戻ってきません。</p>
<p>思うに、このテストって本来ポータブルに刺さる物なんじゃないでしょうか。<br>
test-allだと何かの弾みで通ってしまうだけで。</p>
<p>% cat poll.c<br>
#include <stdio.h><br>
#include <stdlib.h><br>
#include <poll.h><br>
#include <errno.h><br>
int<br>
main(void) {<br>
int pipes[2];<br>
int res = pipe(pipes);<br>
if (res != 0) abort();<br>
int r = pipes[0];<br>
int w = pipes[1];<br>
res = close(w);<br>
if (res != 0) abort();</p>
<pre><code>struct pollfd fds;
fds.fd = w;
fds.events = POLLOUT;
errno = 0;
res = poll(&fds, 1, 1000);
fprintf(stderr, "%d %d %d\n", res, errno, fds.revents);
return 0;
</code></pre>
<p>}</p>
<p>というプログラムではポータブルに POLLVAL が返り、</p>
<p>#include <stdio.h><br>
#include <stdlib.h><br>
#include <sys/select.h><br>
int<br>
main(void) {<br>
int pipes[2];<br>
int res = pipe(pipes);<br>
if (res != 0) abort();<br>
int r = pipes[0];<br>
int w = pipes[1];<br>
res = close(w);<br>
if (res != 0) abort();<br>
fd_set readfds; FD_ZERO(&readfds);<br>
fd_set writefds; FD_ZERO(&writefds);<br>
fd_set exceptfds; FD_ZERO(&exceptfds);<br>
//struct timeval *timeout = NULL;<br>
//FD_SET(r, &readfds);<br>
FD_SET(w, &writefds);<br>
res = select(1, &readfds, &writefds, &exceptfds, NULL);<br>
return 0;<br>
}</p>
<p>はポータブルにブロックされるあたり、このテストってLinux依存なんじゃ無いかという疑惑を持っているんですがどうでしょう。</p>
Ruby master - Bug #5114 (Closed): rake's tests imply the binary name of ruby
https://redmine.ruby-lang.org/issues/5114
2011-07-29T16:21:42Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>As Jeremy reported on <a href="/issues/5097">[ruby-core:38530]</a>, current rake tests imply the binary name of ruby as "ruby".<br>
They should use /#{Regexp.quote(RUBY)} -e/ as znz says on <a href="https://blade.ruby-lang.org/ruby-core/38579">[ruby-core:38579]</a>.</p>
Ruby master - Bug #5094 (Closed): Supported platforms of Ruby 1.9.3
https://redmine.ruby-lang.org/issues/5094
2011-07-26T00:15:52Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>はい、リリース前恒例! サポートプラットフォーム決めのお時間がやって参りました。</p>
<p>前回は 1.9.1 リリース時だったわけですが、あれからずいぶんと経ったので、<br>
改めてサポートするプラットフォームを決めましょう。</p>
<p>== これまでのあらすじ</p>
<p><a href="http://redmine.ruby-lang.org/projects/ruby-19/wiki/SupportedPlatformsJa" class="external">http://redmine.ruby-lang.org/projects/ruby-19/wiki/SupportedPlatformsJa</a></p>
<p>== 決め方</p>
<p>サポートしたいプラットフォームがある方は宣言してください。<br>
ただし、当該プラットフォーム固有っぽいバグがあった場合、そのチケットをアサインする事があるので、<br>
覚悟を決めてから宣言してください。</p>
<p>いつでも「サポート終了!」は宣言できるので [要出典] お気軽にご応募くださいませ。</p>
<p>なお、1.9.3 のリリースのちょっと前あたりで一度締めとする予定です。</p>
<p>== 成瀬の提案</p>
<p>さて、前回のサポートプラットフォーム決めでいくつか反省があるので、ここに一つ提案を行います。</p>
<blockquote>
<p>なお、「メンテナがいる」とは明確なプラットフォームメンテナがいるもの(mswin32など)のほかに、「日々その環境でRubyを開発しているコミッタがいるもの」を含む。</p>
</blockquote>
<p>この後半を削ることを提案します。<br>
例として、Debian はいまだに lenny 32bit が対象になってしまっています。<br>
ようするに切るタイミングが決まらなかったという話で、<br>
こういうのはえいやで決める人がいるべきだろうと思うわけです。</p>
<p>== 現在のメンテナ</p>
<p>ちなみに現在のメンテナは以下の通りです。</p>
<p>mswin32, mswin64 (Microsoft Windows):<br>
NAKAMURA Usaku (usa)<br>
mingw32 (Minimalist GNU for Windows):<br>
Nobuyoshi Nakada (nobu)<br>
IA-64 (Debian GNU/Linux):<br>
TAKANO Mitsuhiro (takano32)<br>
Symbian OS:<br>
Alexander Zavorine (azov)<br>
AIX:<br>
Yutaka Kanemoto (kanemoto)<br>
FreeBSD:<br>
Akinori MUSHA (knu)<br>
Solaris:<br>
Naohisa Goto</p>
<p>逆にメンテナがいない主なプラットフォーム(と備考)は以下の通りです。</p>
<ul>
<li>Debian</li>
<li>Ubuntu</li>
<li>CentOS</li>
<li>Mac OS X (LLVM絡みが微妙)</li>
<li>cygwin (動かない)</li>
<li>NetBSD (動く)</li>
<li>OpenBSD (動かない気がする)</li>
<li>DragonFlyBSD (動かない)</li>
</ul>
Ruby master - Bug #5076 (Closed): Mac OS X Lion Support
https://redmine.ruby-lang.org/issues/5076
2011-07-22T20:20:03Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Ruby doesn't work on Lion.</p>
Ruby master - Bug #5026 (Closed): 1.9.3 allows URI(uri, parser)
https://redmine.ruby-lang.org/issues/5026
2011-07-14T07:28:08Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>r28699 introduces a new API: the second argument of URI(uri [, parser]).<br>
But I object this because such parser argument should be obsolete.</p>
Ruby master - Bug #4886 (Closed): autoload in instance_eval doesn't work
https://redmine.ruby-lang.org/issues/4886
2011-06-15T09:53:15Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>autoload を instance_eval の中で使うとうまく動きません。</p>
<p>% ./ruby -e'instance_eval{autoload :R,"a";p R}'<br>
-e:1:in <code>block in <main>': uninitialized constant R (NameError) from -e:1:in </code>instance_eval'<br>
from -e:1:in `'</p>
Ruby master - Bug #4826 (Closed): Date fails RubySpec
https://redmine.ruby-lang.org/issues/4826
2011-06-04T21:44:01Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>最近の Date の変更で、以下のように RubySpec が失敗しています。<br>
RubySpec 側を直した方がいい物もあるような気がしますが、Date 側の問題もあるようなので確認頂けますか。<br>
spec 側を直すべきものについてはあるべき挙動を教えて頂ければそう直します。</p>
<p>なお、RubySpec は <a href="http://rubyspec.org/" class="external">http://rubyspec.org/</a> です。<br>
RubySpec を実行するには、git をインストールした上で、<br>
make update-rubyspec<br>
すると、spec/rubyspec 下に rubyspec のコードが持ってこられるので、<br>
make test-rubyspec MSPECOPT='-V -j -f s /library/date/civil_spec.rb'<br>
などとすれば該当のテストだけを走らせることができます。</p>
<ol start="6">
<li>
</ol>
<p>Date#civil creats a Date for different calendar reform dates FAILED<br>
Expected 2<br>
to equal 20</p>
<p>/usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/shared/civil.rb:61:in <code>block (2 levels) in <top (required)>' /usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/civil_spec.rb:5:in </code><top (required)>'</p>
<ol start="7">
<li>
</ol>
<p>Date#civil doesn't blow up (illegal instruction and segfault, respectively) when fed huge numbers FAILED<br>
Expected FloatDomainError but got RangeError (float Inf out of range of integer)<br>
/usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/shared/civil.rb:72:in <code>block (4 levels) in <top (required)>' /usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/shared/civil.rb:71:in </code>each'<br>
/usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/shared/civil.rb:71:in <code>block (3 levels) in <top (required)>' /usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/civil_spec.rb:5:in </code><top (required)>'</p>
<ol start="8">
<li>
</ol>
<p>Date#gregorian? marks a day before the calendar reform as Julian FAILED<br>
Expected true<br>
to equal false</p>
<p>/usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/gregorian_spec.rb:8:in <code>block (2 levels) in <top (required)>' /usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/gregorian_spec.rb:4:in </code><top (required)>'</p>
<ol start="9">
<li>
</ol>
<p>Date#gregorian? marks a day after the calendar reform as Julian FAILED<br>
Expected false<br>
to equal true</p>
<p>/usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/gregorian_spec.rb:13:in <code>block (2 levels) in <top (required)>' /usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/gregorian_spec.rb:4:in </code><top (required)>'</p>
<ol start="10">
<li>
</ol>
<p>Date#julian? should mark a day before the calendar reform as Julian FAILED<br>
Expected false<br>
to equal true</p>
<p>/usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/julian_spec.rb:20:in <code>block (2 levels) in <top (required)>' /usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/julian_spec.rb:16:in </code><top (required)>'</p>
<ol start="11">
<li>
</ol>
<p>Date#julian? should mark a day after the calendar reform as Julian FAILED<br>
Expected true<br>
to equal false</p>
<p>/usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/julian_spec.rb:25:in <code>block (2 levels) in <top (required)>' /usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/julian_spec.rb:16:in </code><top (required)>'</p>
<ol start="12">
<li>
</ol>
<p>Date#new creats a Date for different calendar reform dates FAILED<br>
Expected 2<br>
to equal 20</p>
<p>/usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/shared/civil.rb:61:in <code>block (2 levels) in <top (required)>' /usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/new_spec.rb:5:in </code><top (required)>'</p>
<ol start="13">
<li>
</ol>
<p>Date#new doesn't blow up (illegal instruction and segfault, respectively) when fed huge numbers FAILED<br>
Expected FloatDomainError but got RangeError (float Inf out of range of integer)<br>
/usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/shared/civil.rb:72:in <code>block (4 levels) in <top (required)>' /usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/shared/civil.rb:71:in </code>each'<br>
/usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/shared/civil.rb:71:in <code>block (3 levels) in <top (required)>' /usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/date/new_spec.rb:5:in </code><top (required)>'</p>
Ruby master - Bug #4825 (Closed): BigDecimal#new is broken
https://redmine.ruby-lang.org/issues/4825
2011-06-04T21:32:58Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>RubySpec にて以下のテストが失敗しています。</p>
<p>BigDecimal.new creates a new object of class BigDecimal FAILED<br>
Expected #<a href="BigDecimal:445ef968,'0.1E0',9(18)" class="external">BigDecimal:445ef968,'0.1E0',9(18)</a><br>
to equal (1/10)</p>
<p>/usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/bigdecimal/new_spec.rb:12:in <code>block (3 levels) in <top (required)>' /usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/bigdecimal/new_spec.rb:8:in </code>each'<br>
/usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/bigdecimal/new_spec.rb:8:in <code>block (2 levels) in <top (required)>' /usr/home/chkbuild/build/ruby-trunk/20110604T110102Z/rubyspec/library/bigdecimal/new_spec.rb:4:in </code><top (required)>'</p>
Ruby master - Bug #4815 (Closed): RubyGems test failed
https://redmine.ruby-lang.org/issues/4815
2011-06-02T12:04:59Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>Following tests are failed.<br>
This is because $LOAD_PATH includes the current directory which test-all is running,<br>
and top source directory of ruby has the directory named "missing".<br>
So test_execute_one_missing and test_execute_missing, they check the absence of "missing" directory, are failed.</p>
<ol start="29">
<li>
<p>Failure:<br>
test_execute_one_missing(TestGemCommandsWhichCommand) [/usr/home/chkbuild/build/ruby-trunk/20110602T010101Z/ruby/test/rubygems/test_gem_commands_which_command.rb:42]:<br>
--- expected<br>
+++ actual<br>
@@ -1,2 +1,3 @@<br>
"/usr/home/chkbuild/build/ruby-trunk/20110602T010101Z/tmp/test_rubygems_93491/gemhome/gems/foo_bar-2/lib/foo_bar.rb<br>
+/usr/home/chkbuild/build/ruby-trunk/20110602T010101Z/ruby/missing<br>
"</p>
</li>
<li>
<p>Failure:<br>
test_execute_missing(TestGemCommandsWhichCommand) [/usr/home/chkbuild/build/ruby-trunk/20110602T010101Z/ruby/test/rubygems/test_gem_commands_which_command.rb:51]:<br>
Gem::MockGemUi::TermError expected but nothing was raised.</p>
</li>
</ol>
Ruby master - Bug #4455 (Closed): rubygem's test fails when source directory and build directory ...
https://redmine.ruby-lang.org/issues/4455
2011-03-01T23:12:35Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
In lib/rubygems/test_case.rb, it sets @project_dir as Dir.pwd.<br>
But the use cases of @project_dir are both top of source and build directory.<br>
It breaks when they differ.</p>
<p>This happens when:</p>
<p>cd $HOME<br>
mkdir bin-ruby<br>
svn co <a href="http://svn.ruby-lang.org/repos/ruby/trunk" class="external">http://svn.ruby-lang.org/repos/ruby/trunk</a> src-ruby<br>
cd ruby<br>
autoconf<br>
mkdir ../build-ruby<br>
cd ../build-ruby<br>
../ruby/configure --prefix=$HOME/bin-ruby<br>
make<br>
make install<br>
make test-all</p>
<p>The error messages are following:<br>
2) Failure:<br>
test_self_prefix(TestGem) [/home/naruse/ruby/test/rubygems/test_gem.rb:779]:<br>
Expected "/home/naruse/obj/ruby", not "/home/naruse/ruby".</p>
<ol start="3">
<li>
<p>Failure:<br>
test_self_prefix_libdir(TestGem) [/home/naruse/ruby/test/rubygems/test_gem.rb:786]:<br>
Expected "/home/naruse/ruby" to be nil.</p>
</li>
<li>
<p>Failure:<br>
test_self_find_files(TestGem) [/home/naruse/ruby/test/rubygems/test_gem.rb:655]:<br>
Expected ["/home/naruse/obj/ruby/test/rubygems/sff/discover.rb",<br>
"/tmp/test-all/test_rubygems_56936/gemhome/gems/sff-2/lib/sff/discover.rb",<br>
"/tmp/test-all/test_rubygems_56936/gemhome/gems/sff-1/lib/sff/discover.rb"], not ["/home/naruse/ruby/test/rubygems/sff/discover.rb",<br>
"/tmp/test-all/test_rubygems_56936/gemhome/gems/sff-2/lib/sff/discover.rb",<br>
"/tmp/test-all/test_rubygems_56936/gemhome/gems/sff-1/lib/sff/discover.rb"].</p>
</li>
<li>
<p>Failure:<br>
test_self_prefix_sitelibdir(TestGem) [/home/naruse/ruby/test/rubygems/test_gem.rb:795]:<br>
Expected "/home/naruse/ruby" to be nil.</p>
</li>
<li>
<p>Error:<br>
test_execute_removes_executable(TestGemCommandsUninstallCommand):<br>
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.</p>
<p>/home/naruse/obj/ruby/ruby mkrf_conf.rb</p>
</li>
</ol>
<p>rake RUBYARCHDIR=/tmp/test-all/test_rubygems_56936/gemhome/gems/a-2/lib RUBYLIBDIR=/tmp/test-all/test_rubygems_56936/gemhome/gems/a-2/lib<br>
/home/naruse/obj/ruby/rbconfig.rb:7: ruby lib version (1.9.3) doesn't match executable version (1.8.7) (RuntimeError)<br>
from /home/naruse/ruby/lib/rubygems.rb:36:in <code>require' from /home/naruse/ruby/lib/rubygems.rb:36 from /usr/local/bin/rake:9:in </code>require'<br>
from /usr/local/bin/rake:9</p>
<p>Gem files will remain installed in /tmp/test-all/test_rubygems_56936/gemhome/gems/a-2 for inspection.<br>
Results logged to /tmp/test-all/test_rubygems_56936/gemhome/gems/a-2/ext/a/gem_make.out</p>
<pre><code>/home/naruse/ruby/test/rubygems/test_gem_commands_uninstall_command.rb:32:in `block (2 levels) in test_execute_removes_executable'
/home/naruse/ruby/test/rubygems/test_gem_commands_uninstall_command.rb:31:in `block in test_execute_removes_executable'
/home/naruse/ruby/test/rubygems/test_gem_commands_uninstall_command.rb:30:in `test_execute_removes_executable'
../../ruby/test/runner.rb:10:in `<main>'
</code></pre>
<ol start="7">
<li>
<p>Error:<br>
test_execute_prerelease(TestGemCommandsUninstallCommand):<br>
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.</p>
<p>/home/naruse/obj/ruby/ruby mkrf_conf.rb</p>
</li>
</ol>
<p>rake RUBYARCHDIR=/tmp/test-all/test_rubygems_56936/gemhome/gems/pre-2.b/lib RUBYLIBDIR=/tmp/test-all/test_rubygems_56936/gemhome/gems/pre-2.b/lib<br>
/home/naruse/obj/ruby/rbconfig.rb:7: ruby lib version (1.9.3) doesn't match executable version (1.8.7) (RuntimeError)<br>
from /home/naruse/ruby/lib/rubygems.rb:36:in <code>require' from /home/naruse/ruby/lib/rubygems.rb:36 from /usr/local/bin/rake:9:in </code>require'<br>
from /usr/local/bin/rake:9</p>
<p>Gem files will remain installed in /tmp/test-all/test_rubygems_56936/gemhome/gems/pre-2.b for inspection.<br>
Results logged to /tmp/test-all/test_rubygems_56936/gemhome/gems/pre-2.b/ext/a/gem_make.out</p>
<pre><code>/home/naruse/ruby/test/rubygems/test_gem_commands_uninstall_command.rb:100:in `block (2 levels) in test_execute_prerelease'
/home/naruse/ruby/test/rubygems/test_gem_commands_uninstall_command.rb:99:in `block in test_execute_prerelease'
/home/naruse/ruby/test/rubygems/test_gem_commands_uninstall_command.rb:98:in `test_execute_prerelease'
../../ruby/test/runner.rb:10:in `<main>'
</code></pre>
<ol start="8">
<li>Error:<br>
test_class_build(TestGemExtRakeBuilder):<br>
Gem::InstallError: rake failed:</li>
</ol>
<p>/home/naruse/obj/ruby/ruby mkrf_conf.rb</p>
<p>rake RUBYARCHDIR=/tmp/test-all/test_rubygems_56936/prefix RUBYLIBDIR=/tmp/test-all/test_rubygems_56936/prefix<br>
/home/naruse/obj/ruby/rbconfig.rb:7: ruby lib version (1.9.3) doesn't match executable version (1.8.7) (RuntimeError)<br>
from /home/naruse/ruby/lib/rubygems.rb:36:in <code>require' from /home/naruse/ruby/lib/rubygems.rb:36 from /usr/local/bin/rake:9:in </code>require'<br>
from /usr/local/bin/rake:9</p>
<pre><code>/home/naruse/ruby/test/rubygems/test_gem_ext_rake_builder.rb:36:in `block (2 levels) in test_class_build'
/home/naruse/ruby/test/rubygems/test_gem_ext_rake_builder.rb:34:in `chdir'
/home/naruse/ruby/test/rubygems/test_gem_ext_rake_builder.rb:34:in `block in test_class_build'
/home/naruse/ruby/test/rubygems/test_gem_ext_rake_builder.rb:33:in `test_class_build'
../../ruby/test/runner.rb:10:in `<main>'
</code></pre>
<ol start="9">
<li>
<p>Error:<br>
test_install_ignore_dependencies(TestGemInstaller):<br>
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.</p>
<p>/home/naruse/obj/ruby/ruby mkrf_conf.rb --build_arg1 --build_arg2</p>
</li>
</ol>
<p>rake RUBYARCHDIR=/tmp/test-all/test_rubygems_56936/gemhome/gems/a-2/lib RUBYLIBDIR=/tmp/test-all/test_rubygems_56936/gemhome/gems/a-2/lib<br>
/home/naruse/obj/ruby/rbconfig.rb:7: ruby lib version (1.9.3) doesn't match executable version (1.8.7) (RuntimeError)<br>
from /home/naruse/ruby/lib/rubygems.rb:36:in <code>require' from /home/naruse/ruby/lib/rubygems.rb:36 from /usr/local/bin/rake:9:in </code>require'<br>
from /usr/local/bin/rake:9</p>
<p>Gem files will remain installed in /tmp/test-all/test_rubygems_56936/gemhome/gems/a-2 for inspection.<br>
Results logged to /tmp/test-all/test_rubygems_56936/gemhome/gems/a-2/ext/a/gem_make.out</p>
<pre><code>/home/naruse/ruby/test/rubygems/test_gem_installer.rb:698:in `block (2 levels) in test_install_ignore_dependencies'
/home/naruse/ruby/test/rubygems/test_gem_installer.rb:697:in `block in test_install_ignore_dependencies'
/home/naruse/ruby/test/rubygems/test_gem_installer.rb:696:in `test_install_ignore_dependencies'
../../ruby/test/runner.rb:10:in `<main>'
</code></pre>
<ol start="10">
<li>
<p>Error:<br>
test_install_with_no_prior_files(TestGemInstaller):<br>
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.</p>
<p>/home/naruse/obj/ruby/ruby mkrf_conf.rb --build_arg1 --build_arg2</p>
</li>
</ol>
<p>rake RUBYARCHDIR=/tmp/test-all/test_rubygems_56936/gemhome/gems/a-2/lib RUBYLIBDIR=/tmp/test-all/test_rubygems_56936/gemhome/gems/a-2/lib<br>
/home/naruse/obj/ruby/rbconfig.rb:7: ruby lib version (1.9.3) doesn't match executable version (1.8.7) (RuntimeError)<br>
from /home/naruse/ruby/lib/rubygems.rb:36:in <code>require' from /home/naruse/ruby/lib/rubygems.rb:36 from /usr/local/bin/rake:9:in </code>require'<br>
from /usr/local/bin/rake:9</p>
<p>Gem files will remain installed in /tmp/test-all/test_rubygems_56936/gemhome/gems/a-2 for inspection.<br>
Results logged to /tmp/test-all/test_rubygems_56936/gemhome/gems/a-2/ext/a/gem_make.out</p>
<pre><code>/home/naruse/ruby/test/rubygems/test_gem_installer.rb:594:in `block (2 levels) in test_install_with_no_prior_files'
/home/naruse/ruby/test/rubygems/test_gem_installer.rb:593:in `block in test_install_with_no_prior_files'
/home/naruse/ruby/test/rubygems/test_gem_installer.rb:592:in `test_install_with_no_prior_files'
../../ruby/test/runner.rb:10:in `<main>'
</code></pre>
<ol start="11">
<li>
<p>Error:<br>
test_install_check_dependencies_install_dir(TestGemInstaller):<br>
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.</p>
<p>/home/naruse/obj/ruby/ruby mkrf_conf.rb --build_arg1 --build_arg2</p>
</li>
</ol>
<p>rake RUBYARCHDIR=/tmp/test-all/test_rubygems_56936/gemhome2/gems/a-2/lib RUBYLIBDIR=/tmp/test-all/test_rubygems_56936/gemhome2/gems/a-2/lib<br>
/home/naruse/obj/ruby/rbconfig.rb:7: ruby lib version (1.9.3) doesn't match executable version (1.8.7) (RuntimeError)<br>
from /home/naruse/ruby/lib/rubygems.rb:36:in <code>require' from /home/naruse/ruby/lib/rubygems.rb:36 from /usr/local/bin/rake:9:in </code>require'<br>
from /usr/local/bin/rake:9</p>
<p>Gem files will remain installed in /tmp/test-all/test_rubygems_56936/gemhome2/gems/a-2 for inspection.<br>
Results logged to /tmp/test-all/test_rubygems_56936/gemhome2/gems/a-2/ext/a/gem_make.out</p>
<pre><code>/home/naruse/ruby/test/rubygems/test_gem_installer.rb:673:in `block (2 levels) in test_install_check_dependencies_install_dir'
/home/naruse/ruby/test/rubygems/test_gem_installer.rb:672:in `block in test_install_check_dependencies_install_dir'
/home/naruse/ruby/test/rubygems/test_gem_installer.rb:671:in `test_install_check_dependencies_install_dir'
../../ruby/test/runner.rb:10:in `<main>'
</code></pre>
<ol start="12">
<li>
<p>Error:<br>
test_install(TestGemInstaller):<br>
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.</p>
<p>/home/naruse/obj/ruby/ruby mkrf_conf.rb --build_arg1 --build_arg2</p>
</li>
</ol>
<p>rake RUBYARCHDIR=/tmp/test-all/test_rubygems_56936/gemhome/gems/a-2/lib RUBYLIBDIR=/tmp/test-all/test_rubygems_56936/gemhome/gems/a-2/lib<br>
/home/naruse/obj/ruby/rbconfig.rb:7: ruby lib version (1.9.3) doesn't match executable version (1.8.7) (RuntimeError)<br>
from /home/naruse/ruby/lib/rubygems.rb:36:in <code>require' from /home/naruse/ruby/lib/rubygems.rb:36 from /usr/local/bin/rake:9:in </code>require'<br>
from /usr/local/bin/rake:9</p>
<p>Gem files will remain installed in /tmp/test-all/test_rubygems_56936/gemhome/gems/a-2 for inspection.<br>
Results logged to /tmp/test-all/test_rubygems_56936/gemhome/gems/a-2/ext/a/gem_make.out</p>
<pre><code>/home/naruse/ruby/test/rubygems/test_gem_installer.rb:560:in `block (2 levels) in test_install'
/home/naruse/ruby/test/rubygems/test_gem_installer.rb:559:in `block in test_install'
/home/naruse/ruby/test/rubygems/test_gem_installer.rb:558:in `test_install'
../../ruby/test/runner.rb:10:in `<main>'
</code></pre>
<p>=end</p>
Ruby master - Bug #4454 (Closed): Fails test by ext/date
https://redmine.ruby-lang.org/issues/4454
2011-03-01T13:34:19Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
ext/date 導入以降、以下の2テストが失敗します。</p>
<ol start="2">
<li>
<p>Failure:<br>
test_sub(TestDate) [/home/chkbuild/build/ruby-trunk/20110228T230101Z/ruby/test/date/test_date.rb:44]:<br>
<"#<DateSub: -4712-01-01 (-1/2,0,2299161)>"> expected but was<br>
<"#<DateSub[R]: -4712-01-01 (-1/2,0,2299161)>">.</p>
</li>
<li>
<p>Failure:<br>
test__attr(TestDateAttr) [/home/chkbuild/build/ruby-trunk/20110228T230101Z/ruby/test/date/test_date_attr.rb:12]:<br>
Expected /#<Date\d?: 1965-05-23 (4877807/2,0,2299161)>/ to match "#<Date[L]: 1965-05-23 (2438904j,0,2299161)>".<br>
=end</p>
</li>
</ol>
Ruby master - Bug #4426 (Closed): rubygems/test_gem_gemcutter_utilities.rb fails
https://redmine.ruby-lang.org/issues/4426
2011-02-22T20:57:18Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
When run make RUBYOPT=-w TESTS='-v rubygems/test_gem_gemcutter_utilities.rb' test-all, it fails as following:</p>
<ol>
<li>
<p>Error:<br>
test_sign_in(TestGemGemcutterUtilities):<br>
NameError: uninitialized constant Gem::Command<br>
/home/naruse/ruby/test/rubygems/test_gem_gemcutter_utilities.rb:19:in `setup'</p>
</li>
<li>
<p>Error:<br>
test_sign_in_skips_with_existing_credentials(TestGemGemcutterUtilities):<br>
NameError: uninitialized constant Gem::Command<br>
/home/naruse/ruby/test/rubygems/test_gem_gemcutter_utilities.rb:19:in `setup'</p>
</li>
<li>
<p>Error:<br>
test_sign_in_with_bad_credentials(TestGemGemcutterUtilities):<br>
NameError: uninitialized constant Gem::Command<br>
/home/naruse/ruby/test/rubygems/test_gem_gemcutter_utilities.rb:19:in `setup'</p>
</li>
<li>
<p>Error:<br>
test_sign_in_with_host(TestGemGemcutterUtilities):<br>
NameError: uninitialized constant Gem::Command<br>
/home/naruse/ruby/test/rubygems/test_gem_gemcutter_utilities.rb:19:in `setup'</p>
</li>
<li>
<p>Error:<br>
test_sign_in_with_other_credentials_doesnt_overwrite_other_keys(TestGemGemcutterUtilities):<br>
NameError: uninitialized constant Gem::Command<br>
/home/naruse/ruby/test/rubygems/test_gem_gemcutter_utilities.rb:19:in `setup'<br>
=end</p>
</li>
</ol>
Ruby master - Bug #4395 (Closed): Can't require test/rubygems/simple_gem when tests run in differ...
https://redmine.ruby-lang.org/issues/4395
2011-02-14T09:34:46Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
It fails as following:</p>
<ol>
<li>
<p>Skipped:<br>
test_require_failed(test/rubygems/simple_gem) [/home/naruse/ruby/test/rubygems/test_gem_format.rb:8]:<br>
cannot load such file -- test/rubygems/simple_gem</p>
</li>
<li>
<p>Skipped:<br>
test_require_failed(test/rubygems/simple_gem) [/home/naruse/ruby/test/rubygems/test_gem_validator.rb:8]:<br>
cannot load such file -- test/rubygems/simple_gem</p>
</li>
</ol>
<p>Line 8 of test/rubygems/test_gem_format.rb should use require_relative.<br>
=end</p>
Ruby master - Bug #4376 (Closed): rdoc can't handle correctly the return value when the file has ...
https://redmine.ruby-lang.org/issues/4376
2011-02-07T13:11:12Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
From r30806 to r30813, make rdoc raises error on LANG=C environment like:<br>
<a href="http://59.106.172.211/~chkbuild/ruby-trunk/log/20110207T010100Z.log.html.gz" class="external">http://59.106.172.211/~chkbuild/ruby-trunk/log/20110207T010100Z.log.html.gz</a></p>
<p>This is because the encoding of output is set to US-ASCII, failed character<br>
encoding conversion on doc/re.rdoc, and wrongly treated nil as String.</p>
<p>The main bug is set to US-ASCII, so I fixed it in r30813.<br>
But nil treatment should be rdoc's bug, so I report this.</p>
<p>Generating RDoc documentation<br>
Parsing sources...<br>
unable to convert U+6771 from UTF-8 to US-ASCII for ../../ruby/doc/re.rdoc, skipping<br>
Before reporting this, could you check that the file you're documenting<br>
has proper syntax:</p>
<p>/home/naruse/local/ruby/bin/ruby -c ../../ruby/re.c</p>
<p>RDoc is not a full Ruby parser and will fail when fed invalid ruby programs.</p>
<p>The internal error was:</p>
<pre><code> (NoMethodError) undefined method `sub' for nil:NilClass
</code></pre>
<p>/home/naruse/ruby/lib/rdoc/markup/pre_process.rb:126:in <code>include_file' /home/naruse/ruby/lib/rdoc/markup/pre_process.rb:76:in </code>block in handle'<br>
/home/naruse/ruby/lib/rdoc/markup/pre_process.rb:61:in <code>gsub!' /home/naruse/ruby/lib/rdoc/markup/pre_process.rb:61:in </code>handle'<br>
/home/naruse/ruby/lib/rdoc/parser/c.rb:867:in <code>look_for_directives_in' /home/naruse/ruby/lib/rdoc/parser/c.rb:516:in </code>find_class_comment'<br>
/home/naruse/ruby/lib/rdoc/parser/c.rb:687:in <code>handle_class_module' /home/naruse/ruby/lib/rdoc/parser/c.rb:204:in </code>block in do_classes'<br>
/home/naruse/ruby/lib/rdoc/parser/c.rb:199:in <code>scan' /home/naruse/ruby/lib/rdoc/parser/c.rb:199:in </code>do_classes'<br>
/home/naruse/ruby/lib/rdoc/parser/c.rb:987:in <code>scan' /home/naruse/ruby/lib/rdoc/rdoc.rb:322:in </code>parse_file'<br>
/home/naruse/ruby/lib/rdoc/rdoc.rb:367:in <code>block in parse_files' /home/naruse/ruby/lib/rdoc/rdoc.rb:365:in </code>map'<br>
/home/naruse/ruby/lib/rdoc/rdoc.rb:365:in <code>parse_files' /home/naruse/ruby/lib/rdoc/rdoc.rb:423:in </code>document'<br>
../../ruby/bin/rdoc:15:in <code><main>' uh-oh! RDoc had a problem: undefined method </code>sub' for nil:NilClass</p>
<p>run with --debug for full backtrace<br>
*** Error code 1</p>
<p>Stop in /home/naruse/obj/ruby.<br>
=end</p>
Ruby master - Bug #4163 (Closed): RubyGems uses deprecated API: YAML.quick_emit.
https://redmine.ruby-lang.org/issues/4163
2010-12-16T04:46:28Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
RubyGems::Specification#to_yaml uses depcrecated API: YAML.quick_emit,<br>
and it show many warnings on make test-all.<br>
/usr/home/chkbuild/build/ruby-trunk//ruby/lib/rubygems/specification.rb:706:in `to_yaml': YAML.quick_emit is deprecated<br>
=end</p>
Ruby master - Bug #4138 (Closed): Test Failure because of method redefined: test/irb/test_option.rb
https://redmine.ruby-lang.org/issues/4138
2010-12-09T03:51:04Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
test-all が以下のように失敗します。</p>
<ol start="2">
<li>Failure:<br>
test_end_of_option(TestIRB::TestOption) [/home/naruse/ruby/test/irb/test_option.rb:8]:<br>
<a href="/issues/4117">[ruby-core:33574]</a>.<br>
<[]> expected but was<br>
<["/home/naruse/ruby/lib/irb/ext/save-history.rb:29: warning: method redefined; discarding old save_history=",<br>
"/home/naruse/ruby/lib/irb/extend-command.rb:211: warning: previous definition of save_history= was here"]>.<br>
=end</li>
</ol>
Ruby master - Bug #4137 (Closed): Test Failure because of assigned but unused variable: ruby/test...
https://redmine.ruby-lang.org/issues/4137
2010-12-09T03:50:01Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
test-all が以下のように失敗します</p>
<ol start="3">
<li>Failure:<br>
test_shadowing_variable(TestRubyOptions) [/home/naruse/ruby/test/ruby/test_rubyoptions.rb:462]:<br>
<a href="/issues/4130">[ruby-dev:42718]</a>.<br>
<["-e:3: warning: shadowing outer local variable - a"]> expected but was<br>
<["-e:3: warning: shadowing outer local variable - a",<br>
"-e:3: warning: assigned but unused variable - a"]>.<br>
=end</li>
</ol>
Ruby master - Bug #3945 (Closed): Numeric#step with infinity unit
https://redmine.ruby-lang.org/issues/3945
2010-10-14T04:15:58Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
Numeric#step with infinity unit doesn't works well:</p>
<blockquote>
<p>1.step(0, Float::INFINITY) {|x| p x }<br>
1.0<br>
=> 1<br>
1.step(0, -Float::INFINITY) {|x| p x }<br>
=> 1</p>
</blockquote>
<p>Expected result is:</p>
<blockquote>
<p>1.step(0, Float::INFINITY) {|x| p x }<br>
=> 1<br>
1.step(0, -Float::INFINITY) {|x| p x }<br>
1.0<br>
=> 1<br>
=end</p>
</blockquote>
Ruby master - Bug #3816 (Closed): OpenSSL::BN#prime?の引数の取り扱いがおかしい
https://redmine.ruby-lang.org/issues/3816
2010-09-10T16:20:29Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
OpenSSL::BN#prime?を引数なしで呼ぶと以下の通り例外が出ます。</p>
<p>irb(main):001:0> require'openssl'=> trueirb(main):002:0> OpenSSL::BN.new("461166461445805738999").prime?<br>
TypeError: no implicit conversion from nil to integer<br>
from (irb):2:in <code>prime?' from (irb):2 from /home/naruse/local/ruby_1_9_2/bin/irb:12:in </code>'</p>
<p>コードを見るに、rb_scan_args の引数との比較が誤っているように見えるので、引数ありでもおかしいでしょう。<br>
以下の変更で直ります。</p>
<p>diff --git a/ext/openssl/ossl_bn.c b/ext/openssl/ossl_bn.c<br>
index bec5135..6adc59f 100644<br>
--- a/ext/openssl/ossl_bn.c<br>
+++ b/ext/openssl/ossl_bn.c<br>
@@ -669,7 +669,7 @@ ossl_bn_is_prime(int argc, VALUE *argv, VALUE self)<br>
VALUE vchecks;<br>
int checks = BN_prime_checks;</p>
<ul>
<li>if (rb_scan_args(argc, argv, "01", &vchecks) == 0) {</li>
</ul>
<ul>
<li>if (rb_scan_args(argc, argv, "01", &vchecks) == 1) {<br>
checks = NUM2INT(vchecks);<br>
}<br>
GetBN(self, bn);<br>
=end</li>
</ul>
Ruby master - Bug #3673 (Closed): PTY.getpty with IO.pipe doesn't finish on FreeBSD
https://redmine.ruby-lang.org/issues/3673
2010-08-10T10:53:16Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
以下のプログラムが FreeBSD で終了しません。<br>
(test/ruby/test_rubyoptions.rb の test_script_from_stdin より)<br>
Ubuntu 8.04 や Mac OS X 10.6 では終わることを確認しています。</p>
<p>require 'pty'<br>
#require 'timeout'<br>
s, w = IO.pipe<br>
PTY.getpty('./ruby', out: w) do |r, m|<br>
w.close<br>
#m.print("print 'abc'\n")<br>
m.print("\C-d")<br>
p s.read</p>
<a name="result-Timeouttimeout3-sread"></a>
<h1 >result = Timeout.timeout(3) {s.read}<a href="#result-Timeouttimeout3-sread" class="wiki-anchor">¶</a></h1>
<p>end<br>
puts :fin<br>
=end</p>
Ruby master - Bug #3672 (Closed): PTY.getpty with non exist program
https://redmine.ruby-lang.org/issues/3672
2010-08-10T10:48:52Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
存在しないプログラムを指定して PTY.getpty を呼ぶと [BUG] になります。<br>
PTY.getpty 側での対処と rb_fork_err 側での対処がありえますが、<br>
とりあえず後者側でも対処が必要でしょう。</p>
<p>% ./ruby -rpty -e'PTY.getpty"a"'<br>
-e:1: [BUG] rb_sys_fail(fork failed) - errno == 0<br>
ruby 1.9.3dev (2010-08-09 trunk 28938) [x86_64-freebsd8.1]</p>
<h2>-- control frame ----------<br>
c:0004 p:---- s:0010 b:0010 l:000009 d:000009 CFUNC :getpty<br>
c:0003 p:0017 s:0006 b:0006 l:0024b8 d:0010e8 EVAL -e:1<br>
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH<br>
c:0001 p:0000 s:0002 b:0002 l:0024b8 d:0024b8 TOP</h2>
<p>-- Ruby level backtrace information ----------------------------------------<br>
-e:1:in <code><main>' -e:1:in </code>getpty'</p>
<p>[NOTE]<br>
You may have encountered a bug in the Ruby interpreter or extension libraries.<br>
Bug reports are welcome.<br>
For details: <a href="http://www.ruby-lang.org/bugreport.html" class="external">http://www.ruby-lang.org/bugreport.html</a></p>
<p>zsh: abort (core dumped) ./ruby -rpty -e'PTY.getpty"a"'<br>
=end</p>
Ruby master - Bug #3593 (Closed): cont.cで"PAGE_SIZE" redefined
https://redmine.ruby-lang.org/issues/3593
2010-07-21T17:20:27Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
cont.cで以下のようなwarningがでます。<br>
ifndefを使うべきか、RB_PAGE_SIZEなどと別の名前を使うべきか迷ったので、対処お願いします。<br>
../../ruby/cont.c:45:1: warning: "PAGE_SIZE" redefined<br>
In file included from /usr/include/sys/param.h:110,<br>
from /usr/include/pthread_np.h:34,<br>
from ../../ruby/thread_pthread.h:16,<br>
from ../../ruby/vm_core.h:29,<br>
from ../../ruby/cont.c:13:<br>
/usr/include/machine/param.h:100:1: warning: this is the location of the previous definition<br>
../../ruby/cont.c:46:1: warning: "PAGE_MASK" redefined<br>
/usr/include/machine/param.h:101:1: warning: this is the location of the previous definition<br>
../../ruby/cont.c:45:1: warning: "PAGE_SIZE" redefined<br>
In file included from /usr/include/sys/param.h:111,<br>
from /usr/include/pthread_np.h:35,<br>
from ../../ruby/thread_pthread.h:17,<br>
from ../../ruby/vm_core.h:30,<br>
from ../../ruby/cont.c:14:<br>
/usr/include/machine/param.h:100:1: warning: this is the location of the previous definition<br>
../../ruby/cont.c:46:1: warning: "PAGE_MASK" redefined<br>
/usr/include/machine/param.h:101:1: warning: this is the location of the previous definition<br>
../../ruby/cont.c: In function 'fiber_initialize_machine_stack_context':<br>
../../ruby/cont.c:567: warning: assignment from incompatible pointer type<br>
=end</p>
Ruby master - Bug #3568 (Closed): /(?<=a).*b/ =~ "aab" doesn't match
https://redmine.ruby-lang.org/issues/3568
2010-07-14T12:09:42Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
「1.9.1で /(?<=a).*b/ =~ "aab" がマッチしないのはなぜ? 」<br>
<a href="http://pc12.2ch.net/test/read.cgi/tech/1272248179/735" class="external">http://pc12.2ch.net/test/read.cgi/tech/1272248179/735</a><br>
=end</p>
Ruby master - Bug #3515 (Closed): FreeBSD wrongly raises ECONNRESET on close(2)
https://redmine.ruby-lang.org/issues/3515
2010-07-02T12:20:40Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
FreeBSD 8 では現在以下のようなテストに失敗しています。</p>
<ol>
<li>
<p>Error:<br>
test_idle(IMAPTest):<br>
Errno::ECONNRESET: Connection reset by peer<br>
/home/naruse/ruby/test/net/imap/test_imap.rb:189:in `test_idle'</p>
</li>
<li>
<p>Failure:<br>
test_03(TestDRbSSLCore) [/home/naruse/ruby/test/drb/drbtest.rb:138]:<br>
[DRb::DRbConnError] exception expected, not<br>
Class: <a href="Errno::ECONNRESET" class="external">Errno::ECONNRESET</a><br>
Message: <"Connection reset by peer"><br>
---Backtrace---<br>
/home/naruse/ruby/test/drb/drbtest.rb:139:in <code>block in test_03' /home/naruse/ruby/test/drb/drbtest.rb:138:in </code>test_03'</p>
</li>
</ol>
<hr>
<ol start="3">
<li>Failure:<br>
test_07_public_private_protected_missing(TestDRbSSLCore) [/home/naruse/ruby/test/drb/drbtest.rb:182]:<br>
Exception raised:<br>
<#<Errno::ECONNRESET: Connection reset by peer>>.</li>
</ol>
<p>これらに共通するのは「Errno::ECONNRESET: Connection reset by peer」という例外が発生している点です。<br>
この例外は socket の close(2) を呼んだ際に errno に ECONNRESET がセットされたときに発生します。<br>
しかし、この挙動は POSIX 仕様外であり、FreeBSD 独自のものです。</p>
<p><a href="http://www.freebsd.org/cgi/man.cgi?query=close&apropos=0&sektion=0&manpath=FreeBSD+8.0-RELEASE&format=html" class="external">http://www.freebsd.org/cgi/man.cgi?query=close&apropos=0&sektion=0&manpath=FreeBSD+8.0-RELEASE&format=html</a><br>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/close.html" class="external">http://www.opengroup.org/onlinepubs/9699919799/functions/close.html</a><br>
<a href="http://netbsd.gw.com/cgi-bin/man-cgi?close++NetBSD-current" class="external">http://netbsd.gw.com/cgi-bin/man-cgi?close++NetBSD-current</a><br>
<a href="http://www.openbsd.org/cgi-bin/man.cgi?query=close&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html" class="external">http://www.openbsd.org/cgi-bin/man.cgi?query=close&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html</a><br>
<a href="http://leaf.dragonflybsd.org/cgi/web-man?command=close&section=ANY" class="external">http://leaf.dragonflybsd.org/cgi/web-man?command=close&section=ANY</a><br>
<a href="http://www.kernel.org/doc/man-pages/online/pages/man2/close.2.html" class="external">http://www.kernel.org/doc/man-pages/online/pages/man2/close.2.html</a><br>
<a href="http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man2/close.2.html" class="external">http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man2/close.2.html</a></p>
<p>これが結果的に、他の OS では例外が投げられない状況で例外が発生するという現象を生み出しています。<br>
以下は関連する議論です。<br>
<a href="http://old.nabble.com/close()-failing-with-ECONNRESET-td28817716.html" class="external">http://old.nabble.com/close()-failing-with-ECONNRESET-td28817716.html</a><br>
<a href="http://old.nabble.com/Re:-kern-146845:--libc--close(2)-returns-error-54-(connection-reset-by-peer)-wrongly-td28649525.html" class="external">http://old.nabble.com/Re:-kern-146845:--libc--close(2)-returns-error-54-(connection-reset-by-peer)-wrongly-td28649525.html</a></p>
<p>で、Ruby における対策ですが、close(2) で errno に ECONNRESET がセットされた場合、<br>
それを無視するべきだと思います。<br>
いかがそのパッチなのですがいかがでしょうか。</p>
<p>diff --git a/io.c b/io.c<br>
index 05b2d45..a1b49d2 100644<br>
--- a/io.c<br>
+++ b/io.c<br>
@@ -3436,7 +3436,7 @@ fptr_finalize(rb_io_t <em>fptr, int noraise)<br>
/</em> fptr->fd may be closed even if close fails.<br>
* POSIX doesn't specify it.<br>
* We assumes it is closed. */</p>
<ul>
<li>
<pre><code> if (close(fptr->fd) < 0 && NIL_P(err))
</code></pre>
</li>
</ul>
<ul>
<li>
<pre><code> if (close(fptr->fd) < 0 && NIL_P(err) && errno != ECONNRESET)
err = noraise ? Qtrue : INT2NUM(errno);
</code></pre>
}<br>
skip_fd_close:<br>
=end</li>
</ul>
Ruby master - Bug #2748 (Closed): fix for READ_CHECK causes failures on FreeBSD 8.0
https://redmine.ruby-lang.org/issues/2748
2010-02-16T03:41:08Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
間を置いてからの報告で申し訳ないのですが、例の READ_CHECK の修正 (r26625) が、<br>
FreeBSD での test-all の失敗を増やします。<br>
r26625 を revert するとこれらのテストは成功するようになります。</p>
<ol>
<li>
<p>Failure:<br>
test_read_error(TestIO) [/home/naruse/ruby/test/ruby/test_io.rb:869]:<br>
RuntimeError expected but nothing was raised.</p>
</li>
<li>
<p>Failure:<br>
test_readpartial_error(TestIO) [/home/naruse/ruby/test/ruby/test_io.rb:834]:<br>
RuntimeError expected but nothing was raised.<br>
=end</p>
</li>
</ol>
Ruby master - Bug #2724 (Third Party's Issue): fork from other than the main thread causes wrong ...
https://redmine.ruby-lang.org/issues/2724
2010-02-09T03:04:20Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>NetBSD 5.0.[01] において、main thread 以外の pthread から fork すると、<br>
pthread とカーネルスレッド (lwp) との関連が壊れるという現象が確認されています。</p>
<p>後述のパッチがあまりにアレなのでこの問題は Third Party's Issue とし、<br>
Ruby 側では修正を入れない事としますが、情報の共有と記録のために<br>
ここにチケットを切っておきます。</p>
<p>なお、この workaround の作成には @_enamiさんの助けがありました。</p>
<p>追記:<br>
NetBSD 側では kern/42772 として報告、修正されています。<br>
<a href="http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=42772" class="external">http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=42772</a></p>
<a name="Index-thread_pthreadc"></a>
<h1 >Index: thread_pthread.c<a href="#Index-thread_pthreadc" class="wiki-anchor">¶</a></h1>
<p>--- thread_pthread.c (revision 26615)<br>
+++ thread_pthread.c (working copy)<br>
@@ -17,6 +17,93 @@<br>
#include <sys/resource.h><br>
#endif</p>
<p>+#if defined(<strong>NetBSD_Version</strong>) && <strong>NetBSD_Version</strong> >= 500000000<br>
+/* Hack for NetBSD 5.0.x's broken pthread->pt_lid <em>/<br>
+/</em> Copied from /src/lib/libpthread/pthread_int.h <em>/<br>
+#define BROKEN_PTHREAD_T_PT_LID<br>
+#include <lwp.h><br>
+#include <pthread_queue.h><br>
+#include <sys/tree.h><br>
+<br>
+#define PTHREAD_KEYS_MAX 256<br>
+#define PTHREAD__UNPARK_MAX 32<br>
+<br>
+/</em></p>
<ul>
<li>
<ul>
<li>The size of this structure needs to be no larger than struct</li>
</ul>
</li>
<li>
<ul>
<li>__pthread_cleanup_store, defined in pthread.h.</li>
</ul>
</li>
<li>*/<br>
+struct pt_clean_t {</li>
<li>
<pre><code> PTQ_ENTRY(pt_clean_t) ptc_next;
</code></pre>
</li>
<li>
<pre><code> void (*ptc_cleanup)(void *);
</code></pre>
</li>
<li>
<pre><code> void *ptc_arg;
</code></pre>
</li>
</ul>
<p>+};<br>
+<br>
+struct pthread_lock_ops {</p>
<ul>
<li>
<pre><code> void (*plo_init)(__cpu_simple_lock_t *);
</code></pre>
</li>
<li>
<pre><code> int (*plo_try)(__cpu_simple_lock_t *);
</code></pre>
</li>
<li>
<pre><code> void (*plo_unlock)(__cpu_simple_lock_t *);
</code></pre>
</li>
<li>
<pre><code> void (*plo_lock)(__cpu_simple_lock_t *);
</code></pre>
</li>
</ul>
<p>+};<br>
+<br>
+struct __pthread_st {</p>
<ul>
<li>
<pre><code> pthread_t pt_self; /* Must be first. */
</code></pre>
</li>
<li>
<pre><code> unsigned int pt_magic; /* Magic number */
</code></pre>
</li>
<li>
<pre><code> int pt_state; /* running, blocked, etc. */
</code></pre>
</li>
<li>
<pre><code> pthread_mutex_t pt_lock; /* lock on state */
</code></pre>
</li>
<li>
<pre><code> int pt_flags; /* see PT_FLAG_* below */
</code></pre>
</li>
<li>
<pre><code> int pt_cancel; /* Deferred cancellation */
</code></pre>
</li>
<li>
<pre><code> int pt_errno; /* Thread-specific errno. */
</code></pre>
</li>
<li>
<pre><code> stack_t pt_stack; /* Our stack */
</code></pre>
</li>
<li>
<pre><code> void *pt_exitval; /* Read by pthread_join() */
</code></pre>
</li>
<li>
<pre><code> char *pt_name; /* Thread's name, set by the app. */
</code></pre>
</li>
<li>
<pre><code> int pt_willpark; /* About to park */
</code></pre>
</li>
<li>
<pre><code> lwpid_t pt_unpark; /* Unpark this when parking */
</code></pre>
</li>
<li>
<pre><code> struct pthread_lock_ops pt_lockops;/* Cached to avoid PIC overhead */
</code></pre>
</li>
<li>
<pre><code> pthread_mutex_t *pt_droplock; /* Drop this lock if cancelled */
</code></pre>
</li>
<li>
<pre><code> pthread_cond_t pt_joiners; /* Threads waiting to join. */
</code></pre>
</li>
<li>
<li>
<pre><code> /* Threads to defer waking, usually until pthread_mutex_unlock(). */
</code></pre>
</li>
<li>
<pre><code> lwpid_t pt_waiters[PTHREAD__UNPARK_MAX];
</code></pre>
</li>
<li>
<pre><code> size_t pt_nwaiters;
</code></pre>
</li>
<li>
<li>
<pre><code> /* Stack of cancellation cleanup handlers and their arguments */
</code></pre>
</li>
<li>
<pre><code> PTQ_HEAD(, pt_clean_t) pt_cleanup_stack;
</code></pre>
</li>
<li>
<li>
<pre><code> /* LWP ID and entry on the list of all threads. */
</code></pre>
</li>
<li>
<pre><code> lwpid_t pt_lid;
</code></pre>
</li>
<li>
<pre><code> RB_ENTRY(__pthread_st) pt_alltree;
</code></pre>
</li>
<li>
<pre><code> PTQ_ENTRY(__pthread_st) pt_allq;
</code></pre>
</li>
<li>
<pre><code> PTQ_ENTRY(__pthread_st) pt_deadq;
</code></pre>
</li>
<li>
<li>
<pre><code> /*
</code></pre>
</li>
<li>
<pre><code> * General synchronization data. We try to align, as threads
</code></pre>
</li>
<li>
<pre><code> * on other CPUs will access this data frequently.
</code></pre>
</li>
<li>
<pre><code> */
</code></pre>
</li>
<li>
<pre><code> int pt_dummy1 __aligned(128);
</code></pre>
</li>
<li>
<pre><code> struct lwpctl *pt_lwpctl; /* Kernel/user comms area */
</code></pre>
</li>
<li>
<pre><code> volatile int pt_blocking; /* Blocking in userspace */
</code></pre>
</li>
<li>
<pre><code> volatile int pt_rwlocked; /* Handed rwlock successfully */
</code></pre>
</li>
<li>
<pre><code> volatile int pt_signalled; /* Received pthread_cond_signal() */
</code></pre>
</li>
<li>
<pre><code> volatile int pt_mutexwait; /* Waiting to acquire mutex */
</code></pre>
</li>
<li>
<pre><code> void * volatile pt_mutexnext; /* Next thread in chain */
</code></pre>
</li>
<li>
<pre><code> void * volatile pt_sleepobj; /* Object slept on */
</code></pre>
</li>
<li>
<pre><code> PTQ_ENTRY(__pthread_st) pt_sleep;
</code></pre>
</li>
<li>
<pre><code> void (*pt_early)(void *);
</code></pre>
</li>
<li>
<pre><code> int pt_dummy2 __aligned(128);
</code></pre>
</li>
<li>
<li>
<pre><code> /* Thread-specific data. Large so it sits close to the end. */
</code></pre>
</li>
<li>
<pre><code> int pt_havespecific;
</code></pre>
</li>
<li>
<pre><code> void *pt_specific[PTHREAD_KEYS_MAX];
</code></pre>
</li>
<li>
<li>
<pre><code> /*
</code></pre>
</li>
<li>
<pre><code> * Context for thread creation. At the end as it's cached
</code></pre>
</li>
<li>
<pre><code> * and then only ever passed to _lwp_create().
</code></pre>
</li>
<li>
<pre><code> */
</code></pre>
</li>
<li>
<pre><code> ucontext_t pt_uc;
</code></pre>
</li>
</ul>
<p>+};<br>
+#endif /* <strong>NetBSD</strong> */<br>
+<br>
+<br>
static void native_mutex_lock(pthread_mutex_t *lock);<br>
static void native_mutex_unlock(pthread_mutex_t *lock);<br>
static int native_mutex_trylock(pthread_mutex_t *lock);<br>
@@ -833,6 +920,9 @@<br>
native_reset_timer_thread(void)<br>
{<br>
timer_thread_id = 0;<br>
+#ifdef BROKEN_PTHREAD_T_PT_LID</p>
<ul>
<li>((struct __pthread_st *)pthread_self())->pt_lid = _lwp_self();<br>
+#endif<br>
}</li>
</ul>
<p>#ifdef HAVE_SIGALTSTACK</p>
Ruby master - Bug #2386 (Closed): r25230 causes SEGV arround Marshal
https://redmine.ruby-lang.org/issues/2386
2009-11-20T07:54:42Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
以下のコミット以降、後述の現象が発生するそうです。</p>
<p>Author: nobu <a href="mailto:nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e" class="email">nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</a><br>
Date: Sun Oct 4 10:30:56 2009 +0000</p>
<pre><code>* marshal.c (struct {dump,load}_arg): manage with dfree, instead
of using local variable which may be moved by context switch.
<a href="https://blade.ruby-lang.org/ruby-dev/39425">[ruby-dev:39425]</a>
</code></pre>
<p><a href="http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25230" class="external">http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25230</a></p>
<hr>
<p>けいじゅ@いしつかです.</p>
<p>最新版のrubyで以下のメッセージが出るようになってしまったのですが, これ<br>
はどのような意味でしょうか?</p>
<p>% ruby -v<br>
ruby 1.9.2dev (2009-11-19 trunk 25848) [i686-linux]</p>
<p>each: method `to_s' called on hidden object (0x9438e48)</p>
<p>また, これを調べていたら: 以下のようなSEGVも発生するようになってしまい<br>
ました... なんか, 関係あるでしょうか?</p>
<a name="rubyのバージョンは微妙に違います"></a>
<h1 >rubyのバージョンは微妙に違います.<a href="#rubyのバージョンは微妙に違います" class="wiki-anchor">¶</a></h1>
<p>/usr/local/apps/rubyware/ruby-1.9.2-20091118/lib/ruby/1.9.1/delegate.rb:265: [BUG] Segmentation fault<br>
ruby 1.9.2dev (2009-11-18 trunk 25846) [i686-linux]</p>
<h2>-- control frame ----------<br>
c:0037 p:---- s:0130 b:0130 l:000129 d:000129 CFUNC :write<br>
c:0036 p:0026 s:0126 b:0126 l:000768 d:000125 LAMBDA /usr/local/apps/rubyware/ruby-1.9.2-20091118/lib/ruby/1.9.1/delegate.rb:265<br>
c:0035 p:---- s:0121 b:0121 l:000120 d:000120 FINISH<br>
c:0034 p:---- s:0119 b:0119 l:000118 d:000118 CFUNC :dump<br>
c:0033 p:0062 s:0114 b:0114 l:000ba8 d:000113 BLOCK /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/port.rb:863<br>
c:0032 p:0050 s:0110 b:0110 l:000109 d:000109 METHOD /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/port.rb:849<br>
c:0031 p:0011 s:0105 b:0105 l:000ba8 d:000ba8 METHOD /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/port.rb:859<br>
c:0030 p:0079 s:0101 b:0101 l:000095 d:000100 BLOCK /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/port.rb:787<br>
c:0029 p:0019 s:0099 b:0099 l:000098 d:000098 METHOD <a href="internal:prelude" class="external">internal:prelude</a>:8<br>
c:0028 p:0013 s:0096 b:0096 l:000095 d:000095 METHOD /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/port.rb:780<br>
c:0027 p:0015 s:0092 b:0092 l:000091 d:000091 METHOD /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/port.rb:303<br>
c:0026 p:0118 s:0088 b:0088 l:001e8c d:000087 BLOCK /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/n-group-by.rb:56<br>
c:0025 p:---- s:0083 b:0083 l:000082 d:000082 FINISH<br>
c:0024 p:---- s:0081 b:0081 l:000080 d:000080 CFUNC :call<br>
c:0023 p:0014 s:0077 b:0077 l:0011ec d:000076 BLOCK test/testc.rb:3196<br>
c:0022 p:---- s:0074 b:0074 l:000073 d:000073 FINISH<br>
c:0021 p:---- s:0072 b:0072 l:000071 d:000071 CFUNC :each<br>
c:0020 p:0032 s:0069 b:0069 l:0011ec d:00263c BLOCK test/testc.rb:3195<br>
c:0019 p:---- s:0065 b:0065 l:000064 d:000064 FINISH<br>
c:0018 p:---- s:0063 b:0063 l:000062 d:000062 CFUNC :each<br>
c:0017 p:0017 s:0060 b:0060 l:000059 d:000059 METHOD /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/nfile.rb:78<br>
c:0016 p:0073 s:0056 b:0056 l:000055 d:000055 METHOD /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/njob.rb:156<br>
c:0015 p:0011 s:0051 b:0051 l:0011ec d:00074c BLOCK test/testc.rb:3188<br>
c:0014 p:---- s:0047 b:0047 l:000046 d:000046 FINISH<br>
c:0013 p:---- s:0045 b:0045 l:000044 d:000044 CFUNC :yield<br>
c:0012 p:0014 s:0040 b:0040 l:0000dc d:000039 BLOCK /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/share/block-source.rb:81<br>
c:0011 p:0021 s:0038 b:0038 l:000037 d:000037 METHOD /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/share/stdout.rb:35<br>
c:0010 p:0014 s:0034 b:0034 l:0000dc d:0000dc METHOD /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/share/block-source.rb:80<br>
c:0009 p:0043 s:0029 b:0029 l:000028 d:000028 METHOD /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/n-each-substream-mapper.rb:26<br>
c:0008 p:0073 s:0025 b:0025 l:000024 d:000024 METHOD /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/njob.rb:156<br>
c:0007 p:0137 s:0020 b:0020 l:001e8c d:001f2c BLOCK /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/n-group-by.rb:47<br>
c:0006 p:---- s:0016 b:0016 l:000015 d:000015 FINISH<br>
c:0005 p:---- s:0014 b:0014 l:000013 d:000013 CFUNC :call<br>
c:0004 p:0012 s:0011 b:0011 l:000010 d:000010 METHOD /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/njob.rb:143<br>
c:0003 p:0077 s:0007 b:0007 l:0020f8 d:000006 BLOCK /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/njob.rb:125<br>
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH<br>
c:0001 p:---- s:0002 b:0002 l:000001 d:000001 TOP</h2>
<p>/home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/njob.rb:125:in <code>block in start' /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/njob.rb:143:in </code>basic_start'<br>
/home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/njob.rb:143:in <code>call' /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/n-group-by.rb:47:in </code>block in start_export'<br>
/home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/njob.rb:156:in <code>each' /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/n-each-substream-mapper.rb:26:in </code>basic_each'<br>
/home/keiju/public/a.research/fairy/git/fairy/lib/fairy/share/block-source.rb:80:in <code>yield19' /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/share/stdout.rb:35:in </code>replace_stdout'<br>
/home/keiju/public/a.research/fairy/git/fairy/lib/fairy/share/block-source.rb:81:in <code>block in yield19' /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/share/block-source.rb:81:in </code>yield'<br>
test/testc.rb:3188:in <code>block in context' /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/njob.rb:156:in </code>each'<br>
/home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/nfile.rb:78:in <code>basic_each' /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/nfile.rb:78:in </code>each'<br>
test/testc.rb:3195:in <code>block (2 levels) in context' test/testc.rb:3195:in </code>each'<br>
test/testc.rb:3196:in <code>block (3 levels) in context' test/testc.rb:3196:in </code>call'<br>
/home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/n-group-by.rb:56:in <code>block (2 levels) in start_export' /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/port.rb:303:in </code>push'<br>
/home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/port.rb:780:in <code>push' <internal:prelude>:8:in </code>synchronize'<br>
/home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/port.rb:787:in <code>block in push' /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/port.rb:859:in </code>store_2ndmemory'<br>
/home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/port.rb:849:in <code>open_2ndmemory' /home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/port.rb:863:in </code>block in store_2ndmemory'<br>
/home/keiju/public/a.research/fairy/git/fairy/lib/fairy/node/port.rb:863:in <code>dump' /usr/local/apps/rubyware/ruby-1.9.2-20091118/lib/ruby/1.9.1/delegate.rb:265:in </code>block in delegating_block'<br>
/usr/local/apps/rubyware/ruby-1.9.2-20091118/lib/ruby/1.9.1/delegate.rb:265:in `write'</p>
<p>-- C level backtrace information -------------------------------------------<br>
fairy processor --node 45566 --id 0(rb_vm_bugreport+0xb5) [0x81621a5]<br>
fairy processor --node 45566 --id 0 [0x819f3ce]<br>
fairy processor --node 45566 --id 0(rb_bug+0x28) [0x819f468]<br>
fairy processor --node 45566 --id 0 [0x80f71e5]<br>
[0xb801c40c]<br>
fairy processor --node 45566 --id 0(rb_funcall+0xe1) [0x815ee81]<br>
fairy processor --node 45566 --id 0(rb_obj_as_string+0x81) [0x8103811]<br>
fairy processor --node 45566 --id 0 [0x8079378]<br>
fairy processor --node 45566 --id 0 [0x8151689]<br>
fairy processor --node 45566 --id 0 [0x8152bbd]<br>
fairy processor --node 45566 --id 0 [0x815511d]<br>
fairy processor --node 45566 --id 0 [0x8159399]<br>
fairy processor --node 45566 --id 0(rb_vm_invoke_proc+0x81) [0x8159b61]<br>
fairy processor --node 45566 --id 0 [0x815aab5]<br>
fairy processor --node 45566 --id 0(rb_funcall+0x18e) [0x815ef2e]<br>
fairy processor --node 45566 --id 0(rb_io_write+0x29) [0x80712a9]<br>
fairy processor --node 45566 --id 0 [0x8089f38]<br>
fairy processor --node 45566 --id 0 [0x814d71d]<br>
fairy processor --node 45566 --id 0 [0x8151689]<br>
fairy processor --node 45566 --id 0 [0x8152bbd]<br>
fairy processor --node 45566 --id 0 [0x815511d]<br>
fairy processor --node 45566 --id 0 [0x8159399]<br>
fairy processor --node 45566 --id 0(rb_vm_invoke_proc+0x81) [0x8159b61]<br>
fairy processor --node 45566 --id 0 [0x8062ec4]<br>
fairy processor --node 45566 --id 0 [0x814d71d]<br>
fairy processor --node 45566 --id 0 [0x8151689]<br>
fairy processor --node 45566 --id 0 [0x8152bbd]<br>
fairy processor --node 45566 --id 0 [0x815511d]<br>
fairy processor --node 45566 --id 0 [0x8159399]<br>
fairy processor --node 45566 --id 0(rb_yield+0x4f) [0x816103f]<br>
fairy processor --node 45566 --id 0(rb_ary_each+0x41) [0x81716a1]<br>
fairy processor --node 45566 --id 0 [0x8151689]<br>
fairy processor --node 45566 --id 0 [0x8152bbd]<br>
fairy processor --node 45566 --id 0 [0x815511d]<br>
fairy processor --node 45566 --id 0 [0x8159399]<br>
fairy processor --node 45566 --id 0(rb_yield+0x4f) [0x816103f]<br>
fairy processor --node 45566 --id 0 [0x8082bf8]<br>
fairy processor --node 45566 --id 0 [0x814d71d]<br>
fairy processor --node 45566 --id 0 [0x8151689]<br>
fairy processor --node 45566 --id 0 [0x8152bbd]<br>
fairy processor --node 45566 --id 0 [0x815511d]<br>
fairy processor --node 45566 --id 0 [0x8159399]<br>
fairy processor --node 45566 --id 0(rb_vm_invoke_proc+0x81) [0x8159b61]<br>
fairy processor --node 45566 --id 0 [0x8062ec4]<br>
fairy processor --node 45566 --id 0 [0x814d71d]<br>
fairy processor --node 45566 --id 0 [0x8151689]<br>
fairy processor --node 45566 --id 0 [0x8152bbd]<br>
fairy processor --node 45566 --id 0 [0x815511d]<br>
fairy processor --node 45566 --id 0 [0x8159399]<br>
fairy processor --node 45566 --id 0(rb_vm_invoke_proc+0x81) [0x8159b61]<br>
fairy processor --node 45566 --id 0 [0x8062ec4]<br>
fairy processor --node 45566 --id 0 [0x814d71d]<br>
fairy processor --node 45566 --id 0 [0x8151689]<br>
fairy processor --node 45566 --id 0 [0x8152bbd]<br>
fairy processor --node 45566 --id 0 [0x815511d]<br>
fairy processor --node 45566 --id 0 [0x8159399]<br>
fairy processor --node 45566 --id 0(rb_vm_invoke_proc+0x81) [0x8159b61]<br>
fairy processor --node 45566 --id 0 [0x81682ed]<br>
fairy processor --node 45566 --id 0 [0x81683a1]<br>
/lib/i686/cmov/libpthread.so.0 [0xb7fe84b5]<br>
/lib/i686/cmov/libc.so.6(clone+0x5e) [0xb7efea5e]</p>
<p>--<br>
NARUSE, Yui <a href="mailto:naruse@airemix.jp" class="email">naruse@airemix.jp</a><br>
=end</p>
Ruby master - Bug #2327 (Closed): String#upto で beg が非英数の時破壊的変更がその後に影響する
https://redmine.ruby-lang.org/issues/2327
2009-11-04T00:02:15Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
String の場合、upto のブロックパラメータを破壊的に変更することが出来ますが、<br>
非英数の際にこれがその後の挙動に影響を与えることがあります。</p>
<p>irb(main):001:0> "1".upto("9"){|x|print x;x.replace("9")}<br>
123456789=> "1"<br>
irb(main):002:0> "a".upto("z"){|x|print x;x.replace("z")}<br>
abcdefghijklmnopqrstuvwxyz=> "a"<br>
irb(main):003:0> "\u3041".upto("\u3093"){|x|print x;x.replace("\u3093")}<br>
ぁ=> "ん"<br>
irb(main):004:0> s="\u3041";s.upto("\u3093"){|x|print x;x.replace("\u3093")}<br>
ぁ=> "ん"</p>
<p>以上のように、"ぁ"のみで終わってしまったり、戻り値が変わってしまったりします。<br>
=end</p>
Ruby master - Bug #2208 (Rejected): Exception#inspect の message 部が inspect されていない
https://redmine.ruby-lang.org/issues/2208
2009-10-14T17:38:54Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
通常 Object#inspect の結果にでてくる文字列は inspect されています。<br>
しかし、Exception#inspect はそのままになっています。<br>
<a href="http://shinh.skr.jp/m/?date=20091014#c02" class="external">http://shinh.skr.jp/m/?date=20091014#c02</a></p>
<p>class Foo;def initialize;@a="\t";end;end<br>
Foo.new.inspect #=> #<Foo:0x000008012dffd8 <a class="user active user-mention" href="https://redmine.ruby-lang.org/users/52980">@A (A A)</a>="\t"></p>
<p>Exception.new("\t") #=> #<Exception: " "></p>
<p>単なるかけ忘れな気がするのですがどうでしょう。</p>
<p>diff --git a/error.c b/error.c<br>
index a7342de..3a5580a 100644<br>
--- a/error.c<br>
+++ b/error.c<br>
@@ -458,7 +458,7 @@ exc_exception(int argc, VALUE *argv, VALUE self)<br>
static VALUE<br>
exc_to_s(VALUE exc)<br>
{</p>
<ul>
<li>VALUE mesg = rb_attr_get(exc, rb_intern("mesg"));</li>
</ul>
<ul>
<li>
<p>VALUE mesg = rb_inspect(rb_attr_get(exc, rb_intern("mesg")));</p>
<p>if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc));<br>
if (OBJ_TAINTED(exc)) OBJ_TAINT(mesg);<br>
=end</p>
</li>
</ul>
Ruby master - Bug #1433 (Closed): test_sprintf_p fails
https://redmine.ruby-lang.org/issues/1433
2009-05-05T09:52:09Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
test_sprintf_p(TestM17N) [/home/naruse/git/ruby/test/ruby/test_m17n.rb:773]:<br>
<#<a href="Encoding:US-ASCII" class="external">Encoding:US-ASCII</a>> expected but was<br>
<#<a href="Encoding:ASCII-8BIT" class="external">Encoding:ASCII-8BIT</a>>.</p>
<p>1.9.1のパッチリリースのblocking bugである本件ですが、<br>
これはテスト側を動作に合わせるべきだと思っています。</p>
<p>この部分を最後に修正したのはうささんのようですが、どう思われますか。<br>
あと他の方も。<br>
=end</p>
Ruby master - Bug #941 (Closed): ignores SIGQUIT on FreeBSD 7.1
https://redmine.ruby-lang.org/issues/941
2008-12-29T11:14:42Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
FreeBSD 7.1-PRERELEASE amd64 にて、SIGQUIT を無視してしまうようです。</p>
<ol>
<li>Failure:<br>
test_status_kill(TestProcess) [test/ruby/test_process.rb:941]:<br>
Expected ["#<Process::Status: pid 53404 SIGQUIT (signal )>",<br>
"#<Process::Status: pid 53404 SIGQUIT (signal ) (core dumped)>"].include?(*["#<Process::Status: pid 53404 exit 0>"]) to return true.</li>
</ol>
<p>書き換えると以下の通り</p>
<p>% cat wait.rb<br>
sleep 10;<br>
print "finished\n";<br>
% ruby19 -e'pid=spawn("ruby19","wait.rb"); Thread.new{sleep 3; Process.kill(:SIGQUIT, pid) }; Process.wait(pid);;p $?'<br>
finished<br>
#<Process::Status: pid 53220 exit 0></p>
<p>なお、spawn("perl" に書き換えるとちゃんと殺せます<br>
=end</p>
Ruby master - Bug #624 (Closed): ArgumentError on "%c" % 0x80
https://redmine.ruby-lang.org/issues/624
2008-10-09T19:59:42Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
成瀬です。</p>
<p>Tanaka Akira wrote:</p>
<blockquote>
<p>In article <a href="mailto:874p3mqm1s.fsf@fsij.org" class="email">874p3mqm1s.fsf@fsij.org</a>,<br>
Tanaka Akira <a href="mailto:akr@fsij.org" class="email">akr@fsij.org</a> writes:</p>
<blockquote>
<p>"%c" % 0x80 が例外になります。</p>
</blockquote>
<p>うぅむ。ロケールに依存しているようですね。</p>
<p>EUC-JP ではおきます。</p>
<p>% LANG=ja_JP.EUC-JP ./ruby -ve '"%c" % 0x80'<br>
ruby 1.9.0 (2008-10-09 revision 19725) [i686-linux]<br>
-e:1: warning: useless use of % in void context<br>
-e:1:in <code>%': negative string size (or size too big) (ArgumentError) from -e:1:in </code>'<br>
zsh: exit 1 LANG=ja_JP.EUC-JP ./ruby -ve '"%c" % 0x80'</p>
<p>UTF-8 ではおきません。</p>
<p>% LANG=ja_JP.UTF-8 ./ruby -ve '"%c" % 0x80'<br>
ruby 1.9.0 (2008-10-09 revision 19725) [i686-linux]<br>
-e:1: warning: useless use of % in void context</p>
<p>7bit な文字列のエンコーディングを US-ASCII にしなくなったこ<br>
との影響ともいえるかなぁ。</p>
</blockquote>
<p>printf("%c", codepoint) という解釈になりますので、<br>
EUC-JP で例外というのは妥当な動作だと思います。</p>
<p>例外の内容が誤っている気はしますね。</p>
<p>--<br>
NARUSE, Yui <a href="mailto:naruse@airemix.jp" class="email">naruse@airemix.jp</a><br>
=end</p>
Ruby master - Bug #527 (Closed): test_execopts_pgroup(TestProcess) fails on NetBSD
https://redmine.ruby-lang.org/issues/527
2008-08-31T15:54:10Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
以下のテストが NetBSD 4.99.72 i386 にて失敗します。</p>
<p>test_execopts_pgroup(TestProcess) [/home/naruse/src/ruby-trunk/test/ruby/test_process.rb:141]:<br>
<a href="Errno::EPERM" class="external">Errno::EPERM</a> exception expected but none was thrown.<br>
=end</p>
Ruby master - Bug #525 (Closed): test_convert(TestBignum) on NETBSD
https://redmine.ruby-lang.org/issues/525
2008-08-31T14:42:12Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
NetBSD 4.99.72 i386 にて、test/ruby/test_bignum.rb が以下のとおり失敗します。</p>
<h2>test_convert(TestBignum) [/home/naruse/src/ruby-trunk/test/ruby/test_bignum.rb:199]:<br>
<a href="Errno::EINVAL" class="external">Errno::EINVAL</a> exception expected but was<br>
Class: <br>
Message: <"bignum too big to convert into <code>unsigned long'"> ---Backtrace--- /home/naruse/src/ruby-trunk/test/ruby/test_bignum.rb:201:in </code>wait'<br>
/home/naruse/src/ruby-trunk/test/ruby/test_bignum.rb:201:in <code>block in test_convert' /home/naruse/src/ruby-trunk/test/ruby/test_bignum.rb:199:in </code>test_convert'</h2>
<p>=end</p>
Ruby master - Bug #368 (Closed): 境界における Math.atanh 等の動作
https://redmine.ruby-lang.org/issues/368
2008-07-28T02:53:11Z
naruse (Yui NARUSE)
naruse@airemix.jp
<p>=begin<br>
現在の Ruby trunk では、FreeBSD 7 において、<br>
test/ruby/test_math.rb は以下のように失敗します。</p>
<p>y% ruby19 test/ruby/test_math.rb<br>
Loaded suite test/ruby/test_math<br>
Started<br>
......F...........FFF.....<br>
Finished in 0.036791548 seconds.</p>
<ol>
<li>
<p>Failure:<br>
test_atanh(TestMath) [test/ruby/test_math.rb:97]:<br>
<[Errno::EDOM, Errno::ERANGE]> exception expected but none was thrown.</p>
</li>
<li>
<p>Failure:<br>
test_log(TestMath) [test/ruby/test_math.rb:113]:<br>
<[Errno::EDOM, Errno::ERANGE]> exception expected but none was thrown.</p>
</li>
<li>
<p>Failure:<br>
test_log10(TestMath) [test/ruby/test_math.rb:129]:<br>
<[Errno::EDOM, Errno::ERANGE]> exception expected but none was thrown.</p>
</li>
<li>
<p>Failure:<br>
test_log2(TestMath) [test/ruby/test_math.rb:121]:<br>
<[Errno::EDOM, Errno::ERANGE]> exception expected but none was thrown.</p>
</li>
</ol>
<p>26 tests, 126 assertions, 4 failures, 0 errors</p>
<p>これらの原因はいずれも境界における定義の違いに由来しているものと思わます。</p>
<p>例えば、NetBSD4 だと atanh のマニュアルには以下のようにあり、<br>
atanh(1) は NaN となります。</p>
<p>RETURN VALUES<br>
If |x|>=1, atanh(x) and atanhf(x) return +inf, -inf or NaN, and sets the<br>
global variable errno to EDOM.</p>
<p>しかし、FreeBSD7 では以下のようになっており、atanh(1) は infinity を返します。</p>
<p>RETURN VALUES<br>
The atanh() and the atanhf() functions return the inverse hyperbolic tan-<br>
gent of x if successful. If the argument has absolute value 1, a divide-<br>
by-zero exception is raised and an infinity is returned. If |x| > 1, an<br>
invalid exception is raised and an NaN is returned.</p>
<p>参考:<br>
<a href="http://www.hiroshima-cu.ac.jp/japanese/IPC/hunet99/sun/WorkShop/ja/html_docs/common-tools/numerical_comp_guide/standard.doc.html" class="external">http://www.hiroshima-cu.ac.jp/japanese/IPC/hunet99/sun/WorkShop/ja/html_docs/common-tools/numerical_comp_guide/standard.doc.html</a><br>
=end</p>