FileData *luax_getfiledata(lua_State *L, int idx) { FileData *data = nullptr; File *file = nullptr; if (lua_isstring(L, idx) || luax_istype(L, idx, FILESYSTEM_FILE_ID)) { file = luax_getfile(L, idx); file->retain(); } else if (luax_istype(L, idx, FILESYSTEM_FILE_DATA_ID)) { data = luax_checkfiledata(L, idx); data->retain(); } if (!data && !file) { luaL_argerror(L, idx, "filename, File, or FileData expected"); return nullptr; // Never reached. } if (file) { luax_catchexcept(L, [&]() { data = file->read(); }, [&](bool) { file->release(); } ); } return data; }