hotchpotch/hparser — pull request #2 by nitoyon (2014-08-10 07:49:49+00:00)
Title: require 'prime' のあとに require 'hparser' するとフリーズする

Prime は無限の素数配列を `Enumerable` として扱う機能がある。また、`Enumerable` のメソッドをクラスメソッドとしても定義している。そのため、`Prime.include?(mod)` を実行すると、`Class#include?` ではなく `Enumerable#include?` のほうが呼ばれて、無限の素数数列からmod を探し続けてしまう。

一方、HParser には次のような処理があった。

```ruby
parser = []
ObjectSpace.each_object(Class){|klass|
if klass.include?(HParser::Inline::Collectable) then
parser.push klass
end
}
```

つまり、`require 'prime'` していると、上記の処理で「無限数列から ‘HParser::Inline::Collectable` を探す」という処理になってしまう。

本来は `prime` 側の挙動を修正したいところだが、`prime` は標準モジュールであり、最新安定板の Ruby 2.1.2 でもこの挙動は変わらない。そのため、HParser 側で「パーサーが列挙するクラスを HParser モジュール配下のものに限定する」こと修正している。