Opalはruby/specをもとに互換性がテストされており(参考)、完成度はとても高いですが、それでもたまに細かいところでバグを見つけることがあります。今回は別記事の執筆中にちょうどバグを見つけたので、本家にレポートするまでを解説します。
バグ発見?
今回問題を見つけたのは、こんなコードを書いていたときでした。以下は正しく動くのですが、
draw_thick_box(260, 240, 380, 360, C_WHITE, 4)
これを少し変形して座標をsplatで渡すようにしたところ、undefined method 'length' for 255
というエラーが出るようになりました。
PLAYAREA = [260, 240, 380, 360]
# ...
draw_thick_box(*PLAYAREA, C_WHITE, 4)
どこでエラーが出ているのかはわかりませんが、この変形は同じ動作になるはずなので、ここでOpalのバグである可能性を考え始めました。
再現ケースを作る
Opalのバグは、githubで報告すればそのうちに直してもらえたりします。とはいえ、まずはOpal側のバグである(ライブラリやアプリのエラーではない)ことを明確にしなければなりません。ということで、この現象を再現できる最小のプログラムを作ることを考えます。
もとのプログラムから関係なさそうな部分を削っていくと、最終的に以下の例で問題が再現することが分かりました。
def draw_thick_box(x1, y1, x2, y2, color, thickness)
p color: color
end
draw_thick_box(1,2,3,4,[255,255,255,255], 4) #=> {"color"=>[255, 255, 255, 255]}
a = [1,2,3,4]
draw_thick_box(*a,[255,255,255,255], 4) #=> {"color"=>255}
issueを立てる前に
それではレポートを…と行きたいところですが、先に2つのことを確認します。
- 既にissueとして報告されていないか?
- masterでは既に直っていたりしないか?
1.を確かめるためにgithub issuesを「splat」で検索してみますしたが、この現象を報告したものはなさそうです。(このことを厳密に確認するのは大変なので、ざっと見てなさそうならissueを作って良いと思います。重複を恐れて報告が0個になるよりは、報告が複数あるほうが良いので)
2.はopalのリポジトリをcloneして確かめます。
Opalのmasterで試す
環境構築はbundle installだけなので簡単です。
$ git clone https://github.com/opal/opal.git
$ cd opal
$ bundle install
あとは、./bin/opalを起動して確かめてみると…
$ ./bin/opal -e 'def draw_thick_box(x1, y1, x2, y2, color, thickness); p color: color; end; a = [1,2,3,4]; draw_thick_box(*a,[255,255,255,255], 4)'
{"color"=>[255, 255, 255, 255]}
あれ、直ってる?
念のためgemで入れたopalでも試します。
$ opal -v
Opal v0.11.4
$ opal -e 'def draw_thick_box(x1, y1, x2, y2, color, thickness); p color: color; end; a = [1,2,3,4]; draw_thick_box(*a,[255,255,255,255], 4)'
{"color"=>255}
こっちだと再現します。フーム。
そういえばさっきgithub issueを検索したとき、openなissueしか見ていませんでした。closedなissueも探すようにすると、それっぽい報告が見つかりました。
レポートする
はい、ということで「本家にレポートするまでを解説します」と書きましたが、今回は報告する必要はなさそうでした。まあこういうこともありますよね。直っててよかったです。
ただmasterにしか入ってないようなので、0.11.xには入らないのかな?もし早急にこの修正が必要な人がいたら、backportをお願いしたほうが良いかもしれません。個人的には別の書き方(例えば以下)で回避できるのでとりあえずいいかという気分ですが。
args = PLAYAREA + [C_WHITE, 4]
draw_thick_box(*args)