Bug #4159
closedtest_block_variables(TestRipper::ParserEvents) が失敗する
Description
=begin
test_block_variables(TestRipper::ParserEvents) が失敗することがあります。
どうも環境依存らしく、CentOS 5.5のマシンでは再現しますが、Debian lennyのマシンでは再現しません。
$ make test-all TESTS="-n test_block_variables ripper/test_parser_events.rb"
./miniruby -I./lib -I.ext/common ./tool/runruby.rb --extout=.ext -- "./test/runner.rb" -n test_block_variables ripper/test_parser_events.rb
Run options:
Running tests:¶
F
Finished tests in 0.040230s, 24.8571 tests/s, 49.7141 assertions/s.
- Failure:
test_block_variables(TestRipper::ParserEvents) [/home/yanagi/tmp/ruby/test/ripper/test_parser_events.rb:1099]:
[ruby-dev:39423].
<["[fcall(proc,[],&block([],[unary(!,ref(y))]))]"]> expected but was
<[]>.
1 tests, 2 assertions, 1 failures, 0 errors, 0 skips
make: *** [yes-test-all] Error 1
$ while true; do make test-all TESTS="-n test_block_variables ripper/test_parser_events.rb"; done 2> /dev/null | grep assertions
Finished tests in 0.040161s, 24.8998 tests/s, 49.7996 assertions/s.
1 tests, 2 assertions, 1 failures, 0 errors, 0 skips
Finished tests in 0.040164s, 24.8979 tests/s, 49.7958 assertions/s.
1 tests, 2 assertions, 1 failures, 0 errors, 0 skips
Finished tests in 0.040066s, 24.9588 tests/s, 49.9176 assertions/s.
1 tests, 2 assertions, 1 failures, 0 errors, 0 skips
Finished tests in 0.037648s, 26.5618 tests/s, 53.1237 assertions/s.
1 tests, 2 assertions, 1 failures, 0 errors, 0 skips
Finished tests in 0.038193s, 26.1828 tests/s, 52.3656 assertions/s.
1 tests, 2 assertions, 1 failures, 0 errors, 0 skips
Finished tests in 0.036932s, 27.0768 tests/s, 81.2304 assertions/s.
1 tests, 3 assertions, 0 failures, 0 errors, 0 skips
Finished tests in 0.036826s, 27.1547 tests/s, 81.4642 assertions/s.
1 tests, 3 assertions, 0 failures, 0 errors, 0 skips
Finished tests in 0.037533s, 26.6432 tests/s, 53.2864 assertions/s.
1 tests, 2 assertions, 1 failures, 0 errors, 0 skips
Finished tests in 0.036618s, 27.3090 tests/s, 81.9269 assertions/s.
1 tests, 3 assertions, 0 failures, 0 errors, 0 skips
(略)
=end
Updated by kosaki (Motohiro KOSAKI) over 13 years ago
エラーメッセージからポイントされている [ruby-dev:39423] は以下のようです
以下のように、アドレス空間を 100Mbytes に制限した状況で
Ripper.new("proc{|;y|}").parse
が
NoMemoryError
になります。% limit addressspace 100m % ./ruby -rripper -ve 'Ripper.new("proc{|;y|}").parse' ruby 1.9.2dev (2009-10-03 trunk 25201) [i686-linux] -e:1:in `parse': failed to allocate memory (NoMemoryError) from -e:1:in `<main>'
--
[田中 哲][たなか あきら][Tanaka Akira]
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/39423
で前後のメールをみるとそもそも誰も対策してないように見えるのですが、どうでしょう?
Updated by kosaki (Motohiro KOSAKI) over 13 years ago
すいません。誰も対策していないは勘違いだったようです。
以下のようなコミットを発見してしまいました。くすん
commit 72ad8595f2032cfcf73084083306eef909eb42a5
Author: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat Oct 3 13:14:19 2009 +0000
* parse.y (bv_decls, bvar): fix for block variables.
[ruby-dev:39423]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25209 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
diff --git a/ChangeLog b/ChangeLog
index 07893ce..efc175d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sat Oct 3 22:14:18 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (bv_decls, bvar): fix for block variables.
+ [ruby-dev:39423]
+
Sat Oct 3 21:19:18 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* vm_method.c (rb_add_method_def): no redefinition warning on
diff --git a/parse.y b/parse.y
index 953eaa7..07ee4bc 100644
--- a/parse.y
+++ b/parse.y
@@ -3403,7 +3403,7 @@ bv_decls : bvar
/*%c%*/
/*%c
{
- $$ = rb_ary_new2($1);
+ $$ = rb_ary_new3(1, $1);
}
%*/
| bv_decls ',' bvar
@@ -3417,10 +3417,10 @@ bv_decls : bvar
bvar : tIDENTIFIER
{
- new_bv($1);
+ new_bv(get_id($1));
/*%%%*/
/*%
- $$ = $1;
+ $$ = get_value($1);
%*/
}
| f_bad_arg
diff --git a/test/ripper/test_parser_events.rb b/test/ripper/test_parser_events.rb
index 4a4854b..80199ec 100644
--- a/test/ripper/test_parser_events.rb
+++ b/test/ripper/test_parser_events.rb
@@ -1,6 +1,7 @@
begin
require_relative 'dummyparser'
+require_relative '../ruby/envutil'
require 'test/unit'
class TestRipper_ParserEvents < Test::Unit::TestCase
@@ -566,6 +567,15 @@ class TestRipper_ParserEvents < Test::Unit::TestCase
assert_equal("[fcall(p,[],&block([w],[#{div}]))]", parse("p{|w|w /25 # /\n}"), bug1939)
assert_equal("[def(p,[w],bodystmt([#{div}]))]", parse("def p(w)\nw /25 # /\nend"), bug1939)
end
+
+ def test_block_variables
+ assert_equal("[fcall(proc,[],&block([],[void()]))]", parse("proc{|;y|}"))
+ if defined?(Process::RLIMIT_AS)
+ assert_in_out_err(["-I#{File.dirname(__FILE__)}", "-rdummyparser"],
+ 'Process.setrlimit(Process::RLIMIT_AS,102400); puts DummyParser.new("proc{|;y|}").parse',
+ ["[fcall(proc,[],&block([],[void()]))]"], [], '[ruby-dev:39423]')
+ end
+ end
end
rescue LoadError
Updated by usa (Usaku NAKAMURA) over 13 years ago
こんにちは、なかむら(う)です。
In message "[ruby-dev:42763] [Ruby 1.9-Bug#4159][Open] test_block_variables(TestRipper::ParserEvents) が失敗する"
on Dec.14,2010 23:40:45, redmine@ruby-lang.org wrote:
test_block_variables(TestRipper::ParserEvents) が失敗することがあります。
どうも環境依存らしく、CentOS 5.5のマシンでは再現しますが、Debian lennyのマシンでは再現しません。
たぶん、テストのバグです。
以下のパッチで直るんじゃないかと期待してるのですが、いかがで
しょう?
Index: test/ripper/test_parser_events.rb
===================================================================
--- test/ripper/test_parser_events.rb (revision 30206)
+++ test/ripper/test_parser_events.rb (working copy)
@@ -1097,7 +1097,7 @@ class TestRipper::ParserEvents < Test::U
assert_equal("[fcall(proc,[],&block([],[void()]))]", parse("proc{|;y|}"))
if defined?(Process::RLIMIT_AS)
assert_in_out_err(["-I#{File.dirname(__FILE__)}", "-rdummyparser"],
- 'Process.setrlimit(Process::RLIMIT_AS,102400); puts DummyParser.new("proc{|;y|!y}").parse',
+ 'Process.setrlimit(Process::RLIMIT_AS,100*1024*1024); puts DummyParser.new("proc{|;y|!y}").parse',
["[fcall(proc,[],&block([],[unary(!,ref(y))]))]"], [], '[ruby-dev:39423]')
end
end
それでは。
--
U.Nakamura usa@garbagecollect.jp
Updated by kosaki (Motohiro KOSAKI) over 13 years ago
2010年12月15日2:38 U.Nakamura usa@garbagecollect.jp:
こんにちは、なかむら(う)です。
In message "[ruby-dev:42763] [Ruby 1.9-Bug#4159][Open] test_block_variables(TestRipper::ParserEvents) が失敗する"
on Dec.14,2010 23:40:45, redmine@ruby-lang.org wrote:test_block_variables(TestRipper::ParserEvents) が失敗することがあります。
どうも環境依存らしく、CentOS 5.5のマシンでは再現しますが、Debian lennyのマシンでは再現しません。たぶん、テストのバグです。
以下のパッチで直るんじゃないかと期待してるのですが、いかがで
しょう?
Index: test/ripper/test_parser_events.rb =================================================================== --- test/ripper/test_parser_events.rb (revision 30206) +++ test/ripper/test_parser_events.rb (working copy) @@ -1097,7 +1097,7 @@ class TestRipper::ParserEvents < Test::U assert_equal("[fcall(proc,[],&block([],[void()]))]", parse("proc{|;y|}")) if defined?(Process::RLIMIT_AS) assert_in_out_err(["-I#{File.dirname(__FILE__)}", "-rdummyparser"], - 'Process.setrlimit(Process::RLIMIT_AS,102400); puts DummyParser.new("proc{|;y|!y}").parse', + 'Process.setrlimit(Process::RLIMIT_AS,100*1024*1024); puts DummyParser.new("proc{|;y|!y}").parse', ["[fcall(proc,[],&block([],[unary(!,ref(y))]))]"], [], '[ruby-dev:39423]') end end
それでは。
直りました。コミットしておきます
Updated by kosaki (Motohiro KOSAKI) over 13 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r30212.
Kouhei, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
Updated by kyanagi (Kouhei Yanagita) over 13 years ago
ありがとうございます。
問題ないことを確認しました。
Updated by kosaki (Motohiro KOSAKI) over 13 years ago
ありがとうございます。
問題ないことを確認しました。
まさか1000倍間違ってるとは盲点でしたねぇ :-p
unakさんと議論したときの結論は、setrlimit()した段階ではAS超過チェックはされないので、
次にmmap, brkするときまでエラー発生は遅延されるが、ヒープをうまくつかいまわすことが
出来るとmmap, brkが発生しないのではないか。ってあたりの推測になっておりますです。
たぶんタイミング問題になるのは本体スレッドとタイマースレッドが同時にメモリ使う処理をするかどうかなんでしょうなぁ・・・