Heads up: folks using #lgi with #glib might run into this issue. #Lua #Linux
lgi crashes with error "bad argument #1 to 'fromarray' (lgi.record expected, got table)"
This is the fix:
ffi: Adapt load_enum to glib 2.87 changes
--- lgi/ffi.lua.orig 2026-07-08 08:32:43.919979810 -0700
+++ lgi/ffi.lua 2026-07-08 08:48:20.173243433 -0700
@@ -76,16 +76,22 @@
-- Creates new enum/flags table with all values from specified gtype.
function ffi.load_enum(gtype, name)
- local GObject = core.repo.GObject
+ local GLib, GObject = core.repo.GLib, core.repo.GObject
local is_flags = GObject.Type.is_a(gtype, GObject.Type.FLAGS)
local enum_component = component.create(
gtype, is_flags and enum.bitflags_mt or enum.enum_mt, name)
local type_class = GObject.TypeClass.ref(gtype)
local enum_class = core.record.cast(
type_class, is_flags and GObject.FlagsClass or GObject.EnumClass)
- for i = 0, enum_class.n_values - 1 do
- local val = core.record.fromarray(enum_class.values, i)
- enum_component[core.upcase(val.value_nick):gsub('%-', '_')] = val.value
+ if GLib.check_version(2, 87, 0) then
+ for i = 0, enum_class.n_values - 1 do
+ local val = core.record.fromarray(enum_class.values, i)
+ enum_component[core.upcase(val.value_nick):gsub('%-', '_')] = val.value
+ end
+ else
+ for _, val in ipairs(enum_class.values) do
+ enum_component[core.upcase(val.value_nick):gsub('%-', '_')] = val.value
+ end
end
type_class:unref()
return enum_component
1