- edited description
table.remove()が正しく動作しない
Issue #5
resolved
花AI塚 ver 1.2~1.3でtable.remove()を呼んでもテーブルの要素が削除されないケースがある。
最初にmain関数が呼ばれた以降、table.remove()で要素が削除されない。
再現コード
local fp = io.open("output.txt","w")
function main()
local arr = {1,2,3}
local ret = table.remove(arr,1)
fp:write(tostring(#arr)..","..tostring(ret))
end
このコードではoutput.txtに 2,1 と出力されるべきだが 3,nil と表示されてしまう。
Comments (8)
-
reporter -
reporter バグの具体的な原因は定かではないが、LuaJIT関連と思われる。
sandboxのレベルでtable.removeを自前実装に置き換えれば正しく動作することを確認した。
-
reporter バグの発生条件について
table.remove(tbl)のように1引数で呼んだ場合(末尾が削除される)はバグらない。 table.remove(tbl, 1)のように第2引数を指定した場合にバグる。指定位置が末尾かどうかは関係ない。
table.insertについて
table.insertでもバグるorz
table.insert(tbl, 1)のように2引数で呼んだときはバグらない。 table.insert(tbl, 1, 2)のように3引数で呼んだときはバグる。
この調子だと他のtable系関数も怪しいのではないか。
-
reporter selectもバグる。
バグが発生するメソッドはいずれもlj_ffrecord.cで定義され、かつrecff_nyiuが呼ばれる。関連があるのか?
-
reporter table.removeとtable.insertについてはrecff_nyiuが呼ばれるケースでバグっているので怪しい。
-
reporter 対処方法は2種類
- sandboxのレベルでtable.remove,table.insert,selectの実装を差し替える
- LuaJITから本家Luaに戻す
LuaJITのまま根本原因を突き止めるのはしんどそう。
-
reporter 前者の方法で対応。 d2741da
-
reporter - changed status to resolved
花AI塚ver1.4で修正
- Log in to comment