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