jingooのv1.2.5をリリースしました。
ひょんなことからjingoov1.2.4にバグ(割りとでかい)を見つけてしまい…緊急でリリースしました。
旧バージョンを使用中の方は、アップデートすることをおすすめします。
バグの詳細
具体的なバグは何かというと、オブジェクトをドットで展開する際に、対象が以下の様な入れ子のオブジェクトだったとき、evalが失敗して例外が投げられていたことです。
{{ user.image.filename }}
原因
原因はASTの評価処理で、ドットでプロパティにアクセスする評価式を、次のようなパターンマッチでのみ受け取っていたからでした。
| DotExpr(Ident(name), Ident(prop)) -> jg_obj_lookup_by_name env ctx name prop
オブジェクトのドット展開は左結合で、右にドットが2つ以上続く場合は左辺が再帰的にオブジェクトを返すはずですが、DotExprの評価式で左辺がIdentのみの評価しかしていなかったので、左辺がobjectを返すようなASTだったときにマッチするパターンがなく、SyntaxErrorがthrowされていたわけです。
今までこれに気づかなかったのは、単に入れ子のオブジェクトを扱っていなかったからなんですが、今回キャラクタ機能というのをリリースした際に、キャラクタオブジェクトの画像オブジェクト、という入れ子のオブジェクトを展開する必要があって、初めてバグに気づきました。
修正
対応自体は簡単で、パターンマッチのケースを一つ追加するだけで大丈夫でした。
| DotExpr(Ident(name), Ident(prop) -> jg_obj_lookup_by_name env ctx name prop (** 左辺がオブジェクト *) | DotExpr(left, Ident(prop)) -> jg_obj_lookup env ctx (eval_expr env ctx left) prop
おまけ
久しぶりのソースだったので「思い出せるかなあ」と憂鬱だったのですが、OCamlってコンパイラに型エラーで怒られているうちに、徐々に思い出すんですよね。
改めて型システムは偉大だなあ…などと思いました。