1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
https://bugs.gentoo.org/983043
https://github.com/libratbag/libratbag/pull/1878
https://github.com/libratbag/libratbag/commit/1f4efda9553a5efbbd5be49def22f993ef1410ca
From 1f4efda9553a5efbbd5be49def22f993ef1410ca Mon Sep 17 00:00:00 2001
From: Ayoze Torres <53948812+ayozetr@users.noreply.github.com>
Date: Wed, 12 Aug 2026 19:07:56 +0100
Subject: [PATCH] swig: use the Python 3 C API instead of the removed PyInt_*
aliases (#1878)
src/libratbag.i calls PyInt_Check(), PyInt_AsLong() and PyInt_FromLong().
Those are Python 2 functions; they only ever worked because SWIG emitted
compatibility macros mapping them onto their PyLong_* counterparts in the
generated wrapper. SWIG 4.5.0 dropped those macros, so the generated
libratbag.c no longer compiles:
libratbag.c: In function '_wrap_ratbag_device_get_vendor_id':
libratbag.c:4583:17: error: implicit declaration of function
'PyInt_FromLong'; did you mean 'PyLong_FromLong'?
libratbag.c:4583:15: error: assignment to 'PyObject *' from 'int' makes
pointer from integer without a cast [-Wint-conversion]
Call the PyLong_* functions directly. The bindings are generated with
swig -py3, so there is no Python 2 build to keep working, and the macros
they replace expanded to exactly these functions.
Built and verified on Arch Linux with swig 4.5.0, Python 3.14, meson 1.12.0, gcc 15: `_libratbag.so` and `_hidpp.so` link cleanly with the change and fail without it.
Co-authored-by: Jitka Plesnikova <jplesnik@redhat.com>
Signed-off-by: Stephen Kitt <skitt@debian.org>
--- a/src/libratbag.i
+++ b/src/libratbag.i
@@ -21,12 +21,12 @@
$1 = (unsigned int *) malloc(($2 + 1) * sizeof(unsigned int));
for (i = 0; i < $2; i++) {
PyObject *s = PyList_GetItem($input, i);
- if (!PyInt_Check(s)) {
+ if (!PyLong_Check(s)) {
free($1);
PyErr_SetString(PyExc_ValueError, "List items must be integers");
return NULL;
}
- $1[i] = PyInt_AsLong(s);
+ $1[i] = PyLong_AsLong(s);
}
$1[i] = 0;
}
@@ -34,7 +34,7 @@
%typemap(argout) (unsigned int *resolutions, size_t nres) {
unsigned int i;
for (i = 0; i < $2; i++) {
- PyList_SetItem($input, i, PyInt_FromLong($1[i]));
+ PyList_SetItem($input, i, PyLong_FromLong($1[i]));
}
}
@@ -61,24 +61,24 @@
/* uintXX_t mapping: Python -> C */
%typemap(in) uint8_t {
- $1 = (uint8_t) PyInt_AsLong($input);
+ $1 = (uint8_t) PyLong_AsLong($input);
}
%typemap(in) uint16_t {
- $1 = (uint16_t) PyInt_AsLong($input);
+ $1 = (uint16_t) PyLong_AsLong($input);
}
%typemap(in) uint32_t {
- $1 = (uint32_t) PyInt_AsLong($input);
+ $1 = (uint32_t) PyLong_AsLong($input);
}
/* uintXX_t mapping: C -> Python */
%typemap(out) uint8_t {
- $result = PyInt_FromLong((long) $1);
+ $result = PyLong_FromLong((long) $1);
}
%typemap(out) uint16_t {
- $result = PyInt_FromLong((long) $1);
+ $result = PyLong_FromLong((long) $1);
}
%typemap(out) uint32_t {
- $result = PyInt_FromLong((long) $1);
+ $result = PyLong_FromLong((long) $1);
}
/* Parse the header file to generate wrappers */
|