diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c
index d7bf018..66d743f 100644
--- a/Objects/rangeobject.c
+++ b/Objects/rangeobject.c
@@ -20,8 +20,7 @@
    NULL on error.
 */
 static PyObject *
-validate_step(PyObject *step)
-{
+validate_step(PyObject *step) {
     /* No step specified, use a step of 1. */
     if (!step)
         return PyLong_FromLong(1);
@@ -49,8 +48,7 @@
    range(0, 5, -1)
 */
 static PyObject *
-range_new(PyTypeObject *type, PyObject *args, PyObject *kw)
-{
+range_new(PyTypeObject *type, PyObject *args, PyObject *kw) {
     rangeobject *obj = NULL;
     PyObject *start = NULL, *stop = NULL, *step = NULL;
 
@@ -118,8 +116,7 @@
 Returns an iterator that generates the numbers in the range on demand.");
 
 static void
-range_dealloc(rangeobject *r)
-{
+range_dealloc(rangeobject *r) {
     Py_DECREF(r->start);
     Py_DECREF(r->stop);
     Py_DECREF(r->step);
@@ -131,8 +128,7 @@
  * PyLong_Check().  Return NULL when there is an error.
  */
 static PyObject*
-range_length_obj(rangeobject *r)
-{
+range_length_obj(rangeobject *r) {
     /* -------------------------------------------------------------
     Algorithm is equal to that of get_len_of_range(), but it operates
     on PyObjects (which are assumed to be PyLong objects).
@@ -204,8 +200,7 @@
 }
 
 static Py_ssize_t
-range_length(rangeobject *r)
-{
+range_length(rangeobject *r) {
     PyObject *len = range_length_obj(r);
     Py_ssize_t result = -1;
     if (len) {
@@ -218,8 +213,7 @@
 /* range(...)[x] is necessary for:  seq[:] = range(...) */
 
 static PyObject *
-range_item(rangeobject *r, Py_ssize_t i)
-{
+range_item(rangeobject *r, Py_ssize_t i) {
     Py_ssize_t len = range_length(r);
     PyObject *rem, *incr, *result;
 
@@ -246,8 +240,7 @@
 }
 
 static PyObject *
-range_repr(rangeobject *r)
-{
+range_repr(rangeobject *r) {
     Py_ssize_t istep;
 
     /* Check for special case values for printing.  We don't always
@@ -267,16 +260,14 @@
 
 /* Pickling support */
 static PyObject *
-range_reduce(rangeobject *r, PyObject *args)
-{
+range_reduce(rangeobject *r, PyObject *args) {
         return Py_BuildValue("(O(OOO))", Py_TYPE(r),
                          r->start, r->stop, r->step);
 }
 
 /* Assumes (PyLong_CheckExact(ob) || PyBool_Check(ob)) */
 static int
-range_contains_long(rangeobject *r, PyObject *ob)
-{
+range_contains_long(rangeobject *r, PyObject *ob) {
     int cmp1, cmp2, cmp3;
     PyObject *tmp1 = NULL;
     PyObject *tmp2 = NULL;
@@ -334,8 +325,7 @@
 }
 
 static PyObject *
-range_count(rangeobject *r, PyObject *ob)
-{
+range_count(rangeobject *r, PyObject *ob) {
     if (PyLong_CheckExact(ob) || PyBool_Check(ob)) {
         int result = range_contains_long(r, ob);
         if (result == -1)
@@ -354,12 +344,8 @@
 }
 
 static PyObject *
-range_index(rangeobject *r, PyObject *ob)
-{
-    PyObject *idx, *tmp;
+range_index(rangeobject *r, PyObject *ob) {
     int contains;
-    PyObject *format_tuple, *err_string;
-    static PyObject *err_format = NULL;
 
     if (!PyLong_CheckExact(ob) && !PyBool_Check(ob)) {
         Py_ssize_t index;
@@ -373,35 +359,18 @@
     if (contains == -1)
         return NULL;
 
-    if (!contains)
-        goto value_error;
-
-    tmp = PyNumber_Subtract(ob, r->start);
-    if (tmp == NULL)
-        return NULL;
-
-    /* idx = (ob - r.start) // r.step */
-    idx = PyNumber_FloorDivide(tmp, r->step);
-    Py_DECREF(tmp);
-    return idx;
-
-value_error:
+    if (contains) {
+        PyObject *idx, *tmp = PyNumber_Subtract(ob, r->start);
+        if (tmp == NULL)
+            return NULL;
+        /* idx = (ob - r.start) // r.step */
+        idx = PyNumber_FloorDivide(tmp, r->step);
+        Py_DECREF(tmp);
+        return idx;
+    }
 
     /* object is not in the range */
-    if (err_format == NULL) {
-        err_format = PyUnicode_FromString("%r is not in range");
-        if (err_format == NULL)
-            return NULL;
-    }
-    format_tuple = PyTuple_Pack(1, ob);
-    if (format_tuple == NULL)
-        return NULL;
-    err_string = PyUnicode_Format(err_format, format_tuple);
-    Py_DECREF(format_tuple);
-    if (err_string == NULL)
-        return NULL;
-    PyErr_SetObject(PyExc_ValueError, err_string);
-    Py_DECREF(err_string);
+    PyErr_Format(PyExc_ValueError, "%R is not in range", ob);
     return NULL;
 }
 
@@ -494,8 +463,7 @@
 } rangeiterobject;
 
 static PyObject *
-rangeiter_next(rangeiterobject *r)
-{
+rangeiter_next(rangeiterobject *r) {
     if (r->index < r->len)
         /* cast to unsigned to avoid possible signed overflow
            in intermediate calculations. */
@@ -505,8 +473,7 @@
 }
 
 static PyObject *
-rangeiter_len(rangeiterobject *r)
-{
+rangeiter_len(rangeiterobject *r) {
     return PyLong_FromLong(r->len - r->index);
 }
 
@@ -519,8 +486,7 @@
 } longrangeiterobject;
 
 static PyObject *
-longrangeiter_len(longrangeiterobject *r, PyObject *no_args)
-{
+longrangeiter_len(longrangeiterobject *r, PyObject *no_args) {
     return PyNumber_Subtract(r->len, r->index);
 }
 
@@ -581,8 +547,7 @@
  * required.  The result always fits in an unsigned long.
  */
 static unsigned long
-get_len_of_range(long lo, long hi, long step)
-{
+get_len_of_range(long lo, long hi, long step) {
     /* -------------------------------------------------------------
     If step > 0 and lo >= hi, or step < 0 and lo <= hi, the range is empty.
     Else for step > 0, if n values are in the range, the last one is
@@ -609,8 +574,7 @@
    is not representable as a C long, OverflowError is raised. */
 
 static PyObject *
-int_range_iter(long start, long stop, long step)
-{
+int_range_iter(long start, long stop, long step) {
     rangeiterobject *it = PyObject_New(rangeiterobject, &PyRangeIter_Type);
     unsigned long ulen;
     if (it == NULL)
@@ -630,8 +594,7 @@
 }
 
 static PyObject *
-rangeiter_new(PyTypeObject *type, PyObject *args, PyObject *kw)
-{
+rangeiter_new(PyTypeObject *type, PyObject *args, PyObject *kw) {
     long start, stop, step;
 
     if (!_PyArg_NoKeywords("rangeiter()", kw))
@@ -651,8 +614,7 @@
 };
 
 static void
-longrangeiter_dealloc(longrangeiterobject *r)
-{
+longrangeiter_dealloc(longrangeiterobject *r) {
     Py_XDECREF(r->index);
     Py_XDECREF(r->start);
     Py_XDECREF(r->step);
@@ -661,8 +623,7 @@
 }
 
 static PyObject *
-longrangeiter_next(longrangeiterobject *r)
-{
+longrangeiter_next(longrangeiterobject *r) {
     PyObject *one, *product, *new_index, *result;
     if (PyObject_RichCompareBool(r->index, r->len, Py_LT) != 1)
         return NULL;
@@ -729,8 +690,7 @@
 };
 
 static PyObject *
-range_iter(PyObject *seq)
-{
+range_iter(PyObject *seq) {
     rangeobject *r = (rangeobject *)seq;
     longrangeiterobject *it;
     long lstart, lstop, lstep;
@@ -790,8 +750,7 @@
 }
 
 static PyObject *
-range_reverse(PyObject *seq)
-{
+range_reverse(PyObject *seq) {
     rangeobject *range = (rangeobject*) seq;
     longrangeiterobject *it;
     PyObject *one, *sum, *diff, *len = NULL, *product;
