ffi.lua:87: bad argument #1 to 'fromarray' (lgi.record expected, got table) with glib 2.88
<!--
Warning: Do not ignore this template!
Failure to provide the required information risks automatic closure.
Please read our Bug reporting guidelines before opening a bug:
https://wiki.archlinux.org/title/Bug_reporting_guidelines
If you want to help catching more bugs upfront, consider joining the Arch Testing Team:
https://wiki.archlinux.org/title/Arch_Testing_Team
-->
# Description:
Since the upgrade to glib 2.88, the following code fails:
```
$ lua5.3 -e 'print(require("lgi").cairo.Pattern.create_rgba)'
lua5.3: /usr/share/lua/5.3/lgi/ffi.lua:87: bad argument #1 to 'fromarray' (lgi.record expected, got table)
stack traceback:
[C]: in field 'fromarray'
/usr/share/lua/5.3/lgi/ffi.lua:87: in function 'lgi.ffi.load_enum'
/usr/share/lua/5.3/lgi/override/cairo.lua:55: in main chunk
[C]: in function 'require'
/usr/share/lua/5.3/lgi/namespace.lua:183: in function 'lgi.namespace.require'
(...tail calls...)
(command line):1: in main chunk
[C]: in ?
```
It breaks, amongst other things, Awesome WM:
```
error while running function!
stack traceback:
[C]: in field 'fromarray'
/usr/share/lua/5.3/lgi/ffi.lua:87: in function 'lgi.ffi.load_enum'
/usr/share/lua/5.3/lgi/override/cairo.lua:55: in main chunk
[C]: in function 'require'
/usr/share/lua/5.3/lgi/namespace.lua:183: in function 'lgi.require'
(...tail calls...)
/usr/share/awesome/lib/gears/color.lua:54: in main chunk
[C]: in function 'require'
/usr/share/awesome/lib/gears/init.lua:10: in main chunk
[C]: in function 'require'
/home/arch/.config/awesome/rc.lua:2: in main chunk
```
# Additional info:
<!-- The exact package version is compulsory. -->
* package version(s): 0.9.2-13
* config and/or log files: N/A
* link to upstream bug report, if any: https://github.com/lgi-devs/lgi/issues/358
# Steps to reproduce:
<!-- Describe how to reproduce the bug step by step including the commands -->
1. Run the example snippet
# Suggested patch
I manually applied changes from https://github.com/lgi-devs/lgi/pull/352 and it works again:
```
$ lua5.3 -e 'print(require("lgi").cairo.Pattern.create_rgba)'
lgi.efn (0x7f9606fa8350): cairo.SolidPattern.create_rgba
```
```diff
--- usr/share/lua/5.3/lgi/ffi.lua 2026-01-05 22:31:33.000000000 +0100
+++ /usr/share/lua/5.3/lgi/ffi.lua 2026-04-08 03:42:56.894702128 +0200
@@ -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.get(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
return enum_component
end
```
issue