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