2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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つのことを確認します。

  1. 既にissueとして報告されていないか?
  2. 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)
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?