summaryrefslogtreecommitdiff
path: root/dev-python/gst-python/files/gst-python-1.18.4-avoid-treating-float-as-int.patch
blob: d9cc6bca086bc9e44e06157369eec135b82c2bec (plain)
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
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Thibault Saunier <tsaunier@igalia.com>
Date: Tue, 16 Nov 2021 23:36:10 -0300
Subject: [PATCH] python: Avoid treating float as int

Since python 3.10 implicit conversion to integers using `__int__` as
been completely removed (was deprecated behavior in 3.9) so we need
to cleanly handle it now.

See https://gitlab.gnome.org/GNOME/pitivi/-/issues/2589

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1358>
---
 .../gst-python/gi/overrides/gstmodule.c       | 54 ++++++++++++++++---
 1 file changed, 47 insertions(+), 7 deletions(-)

diff --git a/subprojects/gst-python/gi/overrides/gstmodule.c b/subprojects/gst-python/gi/overrides/gstmodule.c
index 167a1c27539a..2308eb7dcde6 100644
--- a/gi/overrides/gstmodule.c
+++ b/gi/overrides/gstmodule.c
@@ -104,18 +104,58 @@ gi_gst_fraction_from_value (const GValue * value)
 static int
 gi_gst_fraction_to_value (GValue * value, PyObject * object)
 {
-  PyObject *numerator, *denominator;
+  glong numerator, denominator;
+  PyObject *numerator_obj, *denominator_obj, *is_integer;
 
-  numerator = PyObject_GetAttrString (object, "num");
-  if (numerator == NULL)
+  numerator_obj = PyObject_GetAttrString (object, "num");
+  if (numerator_obj == NULL)
     goto fail;
 
-  denominator = PyObject_GetAttrString (object, "denom");
-  if (denominator == NULL)
+  is_integer = PyObject_CallMethod (numerator_obj, "is_integer", NULL);
+  if (is_integer != Py_True) {
+    PyErr_Format (PyExc_TypeError,
+        "numerator %f is not an integer.", PyFloat_AsDouble (numerator_obj));
+    Py_DECREF (is_integer);
+    goto fail;
+  }
+  Py_DECREF (is_integer);
+
+  numerator = PyFloat_AsDouble (numerator_obj);
+  if (numerator < -G_MAXINT || numerator > G_MAXINT) {
+    PyErr_Format (PyExc_ValueError,
+        "numerator %" G_GINT64_FORMAT " is out of bound. [-%d - %d]",
+        numerator, G_MAXINT, G_MAXINT);
+    goto fail;
+  }
+
+  denominator_obj = PyObject_GetAttrString (object, "denom");
+  if (denominator_obj == NULL)
     goto fail;
 
-  gst_value_set_fraction (value,
-      PyLong_AsLong (numerator), PyLong_AsLong (denominator));
+  is_integer = PyObject_CallMethod (denominator_obj, "is_integer", NULL);
+  if (is_integer != Py_True) {
+    PyErr_Format (PyExc_TypeError,
+        "denominator %f is not an integer.",
+        PyFloat_AsDouble (denominator_obj));
+    Py_DECREF (is_integer);
+    goto fail;
+  }
+  Py_DECREF (is_integer);
+
+  denominator = PyFloat_AsDouble (denominator_obj);
+  if (denominator == 0) {
+    PyErr_SetString (PyExc_ValueError, "denominator is 0.");
+    goto fail;
+  }
+
+  if (denominator < -G_MAXINT || denominator > G_MAXINT) {
+    PyErr_Format (PyExc_ValueError,
+        "denominator %" G_GINT64_FORMAT " is out of bound. [-%d - %d]",
+        denominator, G_MAXINT, G_MAXINT);
+    goto fail;
+  }
+
+  gst_value_set_fraction (value, numerator, denominator);
 
   return 0;