Cleaned up ListFields sorting.
diff --git a/python/message.c b/python/message.c
index ba83c8c..f017905 100644
--- a/python/message.c
+++ b/python/message.c
@@ -962,14 +962,37 @@
   }
 }
 
-static PyObject* PyUpb_CMessage_ListFieldsLessThan(PyObject* self,
-                                                   PyObject* val) {
+static PyObject* PyUpb_CMessage_ListFieldsItemKey(PyObject* self,
+                                                  PyObject* val) {
   assert(PyTuple_Check(val));
   PyObject* field = PyTuple_GetItem(val, 0);
   const upb_fielddef* f = PyUpb_FieldDescriptor_GetDef(field);
   return PyLong_FromLong(upb_fielddef_number(f));
 }
 
+static bool PyUpb_CMessage_SortFieldList(PyObject* list) {
+  PyUpb_ModuleState* state = PyUpb_ModuleState_Get();
+  bool ok = false;
+  PyObject* args = PyList_New(0);
+  PyObject* kwargs = PyDict_New();
+  PyObject* m = PyObject_GetAttrString(list, "sort");
+  PyObject* ret = NULL;
+  if (!args || !kwargs || !m) goto err;
+  if (PyDict_SetItemString(kwargs, "key", state->listfields_item_key) < 0) {
+    goto err;
+  }
+  ret = PyObject_Call(m, args, kwargs);
+  if (!ret) goto err;
+  ok = true;
+
+ err:
+  Py_XDECREF(m);
+  Py_XDECREF(args);
+  Py_XDECREF(kwargs);
+  Py_XDECREF(ret);
+  return ret;
+}
+
 static PyObject* PyUpb_CMessage_ListFields(PyObject* _self, PyObject* arg) {
   PyObject* list = PyList_New(0);
   upb_msg* msg = PyUpb_CMessage_GetIfReified(_self);
@@ -1001,23 +1024,7 @@
     tuple = NULL;
   }
 
-  if (!in_order) {
-    PyUpb_ModuleState* state = PyUpb_ModuleState_Get();
-    PyObject* args = PyList_New(0);
-    PyObject* kwargs = PyDict_New();
-    PyDict_SetItemString(kwargs, "key", state->listfields_cmp_lt);
-    PyObject* m = PyObject_GetAttrString(list, "sort");
-    assert(m);
-    assert(args);
-    assert(kwargs);
-    PyObject* ret = PyObject_Call(m, args, kwargs);
-    Py_XDECREF(ret);
-    Py_XDECREF(m);
-    Py_XDECREF(args);
-    Py_XDECREF(kwargs);
-    if (!ret) return NULL;
-  }
-
+  if (!in_order && !PyUpb_CMessage_SortFieldList(list)) goto err;
   return list;
 
 err:
@@ -1465,7 +1472,7 @@
     {"WhichOneof", PyUpb_CMessage_WhichOneof, METH_O,
      "Returns the name of the field set inside a oneof, "
      "or None if no field is set."},
-    {"_ListFieldsLessThan", PyUpb_CMessage_ListFieldsLessThan,
+    {"_ListFieldsItemKey", PyUpb_CMessage_ListFieldsItemKey,
      METH_O | METH_STATIC,
      "Compares ListFields() list entries by field number"},
     {NULL, NULL}};
@@ -1736,8 +1743,8 @@
 
   if (!state->cmessage_type || !state->message_meta_type) return false;
   if (PyModule_AddObject(m, "MessageMeta", message_meta_type)) return false;
-  state->listfields_cmp_lt =
-      PyObject_GetAttrString((PyObject*)state->cmessage_type, "_ListFieldsLessThan");
+  state->listfields_item_key =
+      PyObject_GetAttrString((PyObject*)state->cmessage_type, "_ListFieldsItemKey");
 
   PyObject* mod = PyImport_ImportModule("google.protobuf.message");
   if (mod == NULL) return false;
@@ -1756,7 +1763,7 @@
   Py_DECREF(enum_type_wrapper);
 
   if (!state->encode_error_class || !state->decode_error_class ||
-      !state->message_class || !state->listfields_cmp_lt ||
+      !state->message_class || !state->listfields_item_key ||
       !state->enum_type_wrapper_class) {
     return false;
   }