tolua++ 1.0.93 bug – crash on application finished. embedded lua code does not work. default parameters will cause linker error. cannot access variables in namespace.

まぁ、いろいろあるんだけど、なんで放置されているのか分からない不可解なバグが多い(^^;
toluaxxでは一応全部直したつもり。
覚えてるのだけメモっておきます。

アプリケーションが終了する際にクラッシュする事がある

これは、tolua++ 1.0.93の sourceを公式から落として動かすとすぐにわかるんですが、
class_gc_eventが tableに対して呼ばれるときに型チェックをしていないのが原因。
tolua5.2.0ではuserdata以外では無視して戻るようになっていたので、それにならって直してます。

埋め込みlua scriptが動かない事がある

code.luaを見るとわかりますが、埋め込みをする時になぜか、埋め込み対象のソースコードが16byte境界にそろっていない場合、
paddingをしています(そのわりに最後の,をなんとかするために1バイト足しちゃってて結局アライメントずれてるんですけど、、、(^^;)。
そのときになぜか ‘-‘ を paddingしています。
paddingが2bytes以上あれば’–‘でコメント扱いになるのですが、1バイトしか足せない場合に – 一個でエラーに(^^;。
このためtolua++のluaをいじると偶に動かなくなります。
しかもエラー「最終行の-あたりでエラーだよ」と出てきて、ソース見ても「-なんてねーよ!」と。

デフォルトパラメータをpkgだけで指定するとlinkでエラー

toluaでは元々pkg内で関数パラメータのdefaultを書いておけば、luaで省略した場合になんとかしてくれるという仕様があったみたいです。
正常に動かないケースがありました。
Cの関数で実態をint func(A, B, C);と定義してあった場合に、pkg側で int func(A, B, C=hoge);と書いてやると、
tolua++では、func(A, B)を呼び出すコードとfunc(A, B, C)で呼び出す二つのbindingコードが生成されてしまいます。
このため、Cではlinkエラーになります。ただ、必ずしもこうなるわけではなく、int func(int, int, int = 0)などは
問題なく生成されるようです。

この問題は追いきれてなくて、C++側でもDefault Parameterを定義してやれば良いだけなので
toluaxxでは仕様って事にしちゃいました(^^;。

namespace内で定義された変数を参照できない

namespace内で定義された変数を参照できません。
これ不可解なんですが、故意にA::aという変数があると、Aだけ残して全部ざっくり削除してるんですよね、、、(逆ならまだ意図を想像できるんですが)。

toluaのlua埋め込みコード内に${ $}があるとbindingコード内に出力されてしまう。

これはlua-CodeGenを使うとゴミがbindingコードに出力されるようになってなんだなんだと調べたら出てきました。

ほかにも色々修正したんですが、覚えてないです(^^;。
src/tests の中の.luaなんかを見ると断片が残ってるかもしれません。

あと、ソース読んでると実は細かい制約がいっぱいあって、しかもdocumentに書かれていないというのが結構あるので、そのうちまとめたいな。
tolua++は四年も放置されているので、これをtoluaxxとして改良するよりもswig使ったりしたほうが有益かなと思いつつ。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.