table.remove()が正しく動作しない

Issue #5 resolved
Kenji Idematsu repo owner created an issue

花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)

  1. Kenji Idematsu reporter

    バグの具体的な原因は定かではないが、LuaJIT関連と思われる。

    sandboxのレベルでtable.removeを自前実装に置き換えれば正しく動作することを確認した。

  2. Kenji Idematsu 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系関数も怪しいのではないか。

  3. Kenji Idematsu reporter

    selectもバグる。

    バグが発生するメソッドはいずれもlj_ffrecord.cで定義され、かつrecff_nyiuが呼ばれる。関連があるのか?

  4. Kenji Idematsu reporter

    table.removeとtable.insertについてはrecff_nyiuが呼ばれるケースでバグっているので怪しい。

  5. Kenji Idematsu reporter

    対処方法は2種類

    • sandboxのレベルでtable.remove,table.insert,selectの実装を差し替える
    • LuaJITから本家Luaに戻す

    LuaJITのまま根本原因を突き止めるのはしんどそう。

  6. Log in to comment