https://github.com/python/cpython/commit/4265854d96c907ce7bd5cde164ebb2b7e99b8f3f
commit: 4265854d96c907ce7bd5cde164ebb2b7e99b8f3f
branch: main
author: Serhiy Storchaka <storch...@gmail.com>
committer: serhiy-storchaka <storch...@gmail.com>
date: 2025-04-29T19:27:07+03:00
summary:

gh-132987: Support __index__() in the socket module (GH-133093)

ntohl(), htonl(), if_indextoname(), getaddrinfo() now use __index__() if
available.

Also fix the Argument Clinic names for module-level functions (although
this does not affect the user).

files:
M Lib/test/test_socket.py
M Modules/clinic/socketmodule.c.h
M Modules/socketmodule.c

diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
index e88611ee3147ba..ace97ce0cbe422 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -1169,7 +1169,7 @@ def testInterfaceNameIndex(self):
     @support.skip_android_selinux('if_indextoname')
     def testInvalidInterfaceIndexToName(self):
         self.assertRaises(OSError, socket.if_indextoname, 0)
-        self.assertRaises(OverflowError, socket.if_indextoname, -1)
+        self.assertRaises(ValueError, socket.if_indextoname, -1)
         self.assertRaises(OverflowError, socket.if_indextoname, 2**1000)
         self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
         if hasattr(socket, 'if_nameindex'):
@@ -1225,24 +1225,23 @@ def testNtoH(self):
             self.assertEqual(swapped & mask, mask)
             self.assertRaises(OverflowError, func, 1<<34)
 
-    @support.cpython_only
-    @unittest.skipIf(_testcapi is None, "requires _testcapi")
     def testNtoHErrors(self):
-        import _testcapi
         s_good_values = [0, 1, 2, 0xffff]
         l_good_values = s_good_values + [0xffffffff]
-        l_bad_values = [-1, -2, 1<<32, 1<<1000]
-        s_bad_values = (
-            l_bad_values +
-            [_testcapi.INT_MIN-1, _testcapi.INT_MAX+1] +
-            [1 << 16, _testcapi.INT_MAX]
-        )
+        neg_values = [-1, -2, -(1<<15)-1, -(1<<31)-1, -(1<<63)-1, -1<<1000]
+        l_bad_values = [1<<32, 1<<1000]
+        s_bad_values = l_bad_values + [1 << 16, (1<<31)-1, 1<<31]
         for k in s_good_values:
             socket.ntohs(k)
             socket.htons(k)
         for k in l_good_values:
             socket.ntohl(k)
             socket.htonl(k)
+        for k in neg_values:
+            self.assertRaises(ValueError, socket.ntohs, k)
+            self.assertRaises(ValueError, socket.htons, k)
+            self.assertRaises(ValueError, socket.ntohl, k)
+            self.assertRaises(ValueError, socket.htonl, k)
         for k in s_bad_values:
             self.assertRaises(OverflowError, socket.ntohs, k)
             self.assertRaises(OverflowError, socket.htons, k)
diff --git a/Modules/clinic/socketmodule.c.h b/Modules/clinic/socketmodule.c.h
index 174fb46590f5d1..70ebbaa876b32b 100644
--- a/Modules/clinic/socketmodule.c.h
+++ b/Modules/clinic/socketmodule.c.h
@@ -115,76 +115,128 @@ sock_initobj(PyObject *self, PyObject *args, PyObject 
*kwargs)
     return return_value;
 }
 
-PyDoc_STRVAR(_socket_socket_ntohs__doc__,
-"ntohs($self, x, /)\n"
+PyDoc_STRVAR(_socket_ntohs__doc__,
+"ntohs($module, integer, /)\n"
 "--\n"
 "\n"
 "Convert a 16-bit unsigned integer from network to host byte order.");
 
-#define _SOCKET_SOCKET_NTOHS_METHODDEF    \
-    {"ntohs", (PyCFunction)_socket_socket_ntohs, METH_O, 
_socket_socket_ntohs__doc__},
+#define _SOCKET_NTOHS_METHODDEF    \
+    {"ntohs", (PyCFunction)_socket_ntohs, METH_O, _socket_ntohs__doc__},
 
 static PyObject *
-_socket_socket_ntohs_impl(PySocketSockObject *self, int x);
+_socket_ntohs_impl(PyObject *module, uint16_t x);
 
 static PyObject *
-_socket_socket_ntohs(PyObject *self, PyObject *arg)
+_socket_ntohs(PyObject *module, PyObject *arg)
 {
     PyObject *return_value = NULL;
-    int x;
+    uint16_t x;
 
-    x = PyLong_AsInt(arg);
-    if (x == -1 && PyErr_Occurred()) {
+    if (!_PyLong_UInt16_Converter(arg, &x)) {
         goto exit;
     }
-    return_value = _socket_socket_ntohs_impl((PySocketSockObject *)self, x);
+    return_value = _socket_ntohs_impl(module, x);
 
 exit:
     return return_value;
 }
 
-PyDoc_STRVAR(_socket_socket_htons__doc__,
-"htons($self, x, /)\n"
+PyDoc_STRVAR(_socket_ntohl__doc__,
+"ntohl($module, integer, /)\n"
+"--\n"
+"\n"
+"Convert a 32-bit unsigned integer from network to host byte order.");
+
+#define _SOCKET_NTOHL_METHODDEF    \
+    {"ntohl", (PyCFunction)_socket_ntohl, METH_O, _socket_ntohl__doc__},
+
+static PyObject *
+_socket_ntohl_impl(PyObject *module, uint32_t x);
+
+static PyObject *
+_socket_ntohl(PyObject *module, PyObject *arg)
+{
+    PyObject *return_value = NULL;
+    uint32_t x;
+
+    if (!_PyLong_UInt32_Converter(arg, &x)) {
+        goto exit;
+    }
+    return_value = _socket_ntohl_impl(module, x);
+
+exit:
+    return return_value;
+}
+
+PyDoc_STRVAR(_socket_htons__doc__,
+"htons($module, integer, /)\n"
 "--\n"
 "\n"
 "Convert a 16-bit unsigned integer from host to network byte order.");
 
-#define _SOCKET_SOCKET_HTONS_METHODDEF    \
-    {"htons", (PyCFunction)_socket_socket_htons, METH_O, 
_socket_socket_htons__doc__},
+#define _SOCKET_HTONS_METHODDEF    \
+    {"htons", (PyCFunction)_socket_htons, METH_O, _socket_htons__doc__},
+
+static PyObject *
+_socket_htons_impl(PyObject *module, uint16_t x);
+
+static PyObject *
+_socket_htons(PyObject *module, PyObject *arg)
+{
+    PyObject *return_value = NULL;
+    uint16_t x;
+
+    if (!_PyLong_UInt16_Converter(arg, &x)) {
+        goto exit;
+    }
+    return_value = _socket_htons_impl(module, x);
+
+exit:
+    return return_value;
+}
+
+PyDoc_STRVAR(_socket_htonl__doc__,
+"htonl($module, integer, /)\n"
+"--\n"
+"\n"
+"Convert a 32-bit unsigned integer from host to network byte order.");
+
+#define _SOCKET_HTONL_METHODDEF    \
+    {"htonl", (PyCFunction)_socket_htonl, METH_O, _socket_htonl__doc__},
 
 static PyObject *
-_socket_socket_htons_impl(PySocketSockObject *self, int x);
+_socket_htonl_impl(PyObject *module, uint32_t x);
 
 static PyObject *
-_socket_socket_htons(PyObject *self, PyObject *arg)
+_socket_htonl(PyObject *module, PyObject *arg)
 {
     PyObject *return_value = NULL;
-    int x;
+    uint32_t x;
 
-    x = PyLong_AsInt(arg);
-    if (x == -1 && PyErr_Occurred()) {
+    if (!_PyLong_UInt32_Converter(arg, &x)) {
         goto exit;
     }
-    return_value = _socket_socket_htons_impl((PySocketSockObject *)self, x);
+    return_value = _socket_htonl_impl(module, x);
 
 exit:
     return return_value;
 }
 
-PyDoc_STRVAR(_socket_socket_inet_aton__doc__,
-"inet_aton($self, ip_addr, /)\n"
+PyDoc_STRVAR(_socket_inet_aton__doc__,
+"inet_aton($module, ip_addr, /)\n"
 "--\n"
 "\n"
 "Convert an IP address in string format (123.45.67.89) to the 32-bit packed 
binary format used in low-level network functions.");
 
-#define _SOCKET_SOCKET_INET_ATON_METHODDEF    \
-    {"inet_aton", (PyCFunction)_socket_socket_inet_aton, METH_O, 
_socket_socket_inet_aton__doc__},
+#define _SOCKET_INET_ATON_METHODDEF    \
+    {"inet_aton", (PyCFunction)_socket_inet_aton, METH_O, 
_socket_inet_aton__doc__},
 
 static PyObject *
-_socket_socket_inet_aton_impl(PySocketSockObject *self, const char *ip_addr);
+_socket_inet_aton_impl(PyObject *module, const char *ip_addr);
 
 static PyObject *
-_socket_socket_inet_aton(PyObject *self, PyObject *arg)
+_socket_inet_aton(PyObject *module, PyObject *arg)
 {
     PyObject *return_value = NULL;
     const char *ip_addr;
@@ -202,7 +254,7 @@ _socket_socket_inet_aton(PyObject *self, PyObject *arg)
         PyErr_SetString(PyExc_ValueError, "embedded null character");
         goto exit;
     }
-    return_value = _socket_socket_inet_aton_impl((PySocketSockObject *)self, 
ip_addr);
+    return_value = _socket_inet_aton_impl(module, ip_addr);
 
 exit:
     return return_value;
@@ -210,20 +262,20 @@ _socket_socket_inet_aton(PyObject *self, PyObject *arg)
 
 #if defined(HAVE_INET_NTOA)
 
-PyDoc_STRVAR(_socket_socket_inet_ntoa__doc__,
-"inet_ntoa($self, packed_ip, /)\n"
+PyDoc_STRVAR(_socket_inet_ntoa__doc__,
+"inet_ntoa($module, packed_ip, /)\n"
 "--\n"
 "\n"
 "Convert an IP address from 32-bit packed binary format to string format.");
 
-#define _SOCKET_SOCKET_INET_NTOA_METHODDEF    \
-    {"inet_ntoa", (PyCFunction)_socket_socket_inet_ntoa, METH_O, 
_socket_socket_inet_ntoa__doc__},
+#define _SOCKET_INET_NTOA_METHODDEF    \
+    {"inet_ntoa", (PyCFunction)_socket_inet_ntoa, METH_O, 
_socket_inet_ntoa__doc__},
 
 static PyObject *
-_socket_socket_inet_ntoa_impl(PySocketSockObject *self, Py_buffer *packed_ip);
+_socket_inet_ntoa_impl(PyObject *module, Py_buffer *packed_ip);
 
 static PyObject *
-_socket_socket_inet_ntoa(PyObject *self, PyObject *arg)
+_socket_inet_ntoa(PyObject *module, PyObject *arg)
 {
     PyObject *return_value = NULL;
     Py_buffer packed_ip = {NULL, NULL};
@@ -231,7 +283,7 @@ _socket_socket_inet_ntoa(PyObject *self, PyObject *arg)
     if (PyObject_GetBuffer(arg, &packed_ip, PyBUF_SIMPLE) != 0) {
         goto exit;
     }
-    return_value = _socket_socket_inet_ntoa_impl((PySocketSockObject *)self, 
&packed_ip);
+    return_value = _socket_inet_ntoa_impl(module, &packed_ip);
 
 exit:
     /* Cleanup for packed_ip */
@@ -246,20 +298,20 @@ _socket_socket_inet_ntoa(PyObject *self, PyObject *arg)
 
 #if (defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS))
 
-PyDoc_STRVAR(_socket_socket_if_nametoindex__doc__,
-"if_nametoindex($self, oname, /)\n"
+PyDoc_STRVAR(_socket_if_nametoindex__doc__,
+"if_nametoindex($module, oname, /)\n"
 "--\n"
 "\n"
 "Returns the interface index corresponding to the interface name if_name.");
 
-#define _SOCKET_SOCKET_IF_NAMETOINDEX_METHODDEF    \
-    {"if_nametoindex", (PyCFunction)_socket_socket_if_nametoindex, METH_O, 
_socket_socket_if_nametoindex__doc__},
+#define _SOCKET_IF_NAMETOINDEX_METHODDEF    \
+    {"if_nametoindex", (PyCFunction)_socket_if_nametoindex, METH_O, 
_socket_if_nametoindex__doc__},
 
 static PyObject *
-_socket_socket_if_nametoindex_impl(PySocketSockObject *self, PyObject *oname);
+_socket_if_nametoindex_impl(PyObject *module, PyObject *oname);
 
 static PyObject *
-_socket_socket_if_nametoindex(PyObject *self, PyObject *arg)
+_socket_if_nametoindex(PyObject *module, PyObject *arg)
 {
     PyObject *return_value = NULL;
     PyObject *oname;
@@ -267,7 +319,38 @@ _socket_socket_if_nametoindex(PyObject *self, PyObject 
*arg)
     if (!PyUnicode_FSConverter(arg, &oname)) {
         goto exit;
     }
-    return_value = _socket_socket_if_nametoindex_impl((PySocketSockObject 
*)self, oname);
+    return_value = _socket_if_nametoindex_impl(module, oname);
+
+exit:
+    return return_value;
+}
+
+#endif /* (defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)) */
+
+#if (defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS))
+
+PyDoc_STRVAR(_socket_if_indextoname__doc__,
+"if_indextoname($module, if_index, /)\n"
+"--\n"
+"\n"
+"Returns the interface name corresponding to the interface index if_index.");
+
+#define _SOCKET_IF_INDEXTONAME_METHODDEF    \
+    {"if_indextoname", (PyCFunction)_socket_if_indextoname, METH_O, 
_socket_if_indextoname__doc__},
+
+static PyObject *
+_socket_if_indextoname_impl(PyObject *module, NET_IFINDEX index);
+
+static PyObject *
+_socket_if_indextoname(PyObject *module, PyObject *arg)
+{
+    PyObject *return_value = NULL;
+    NET_IFINDEX index;
+
+    if (!_PyLong_NetIfindex_Converter(arg, &index)) {
+        goto exit;
+    }
+    return_value = _socket_if_indextoname_impl(module, index);
 
 exit:
     return return_value;
@@ -275,11 +358,15 @@ _socket_socket_if_nametoindex(PyObject *self, PyObject 
*arg)
 
 #endif /* (defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)) */
 
-#ifndef _SOCKET_SOCKET_INET_NTOA_METHODDEF
-    #define _SOCKET_SOCKET_INET_NTOA_METHODDEF
-#endif /* !defined(_SOCKET_SOCKET_INET_NTOA_METHODDEF) */
+#ifndef _SOCKET_INET_NTOA_METHODDEF
+    #define _SOCKET_INET_NTOA_METHODDEF
+#endif /* !defined(_SOCKET_INET_NTOA_METHODDEF) */
+
+#ifndef _SOCKET_IF_NAMETOINDEX_METHODDEF
+    #define _SOCKET_IF_NAMETOINDEX_METHODDEF
+#endif /* !defined(_SOCKET_IF_NAMETOINDEX_METHODDEF) */
 
-#ifndef _SOCKET_SOCKET_IF_NAMETOINDEX_METHODDEF
-    #define _SOCKET_SOCKET_IF_NAMETOINDEX_METHODDEF
-#endif /* !defined(_SOCKET_SOCKET_IF_NAMETOINDEX_METHODDEF) */
-/*[clinic end generated code: output=27bc54006551ab0c input=a9049054013a1b77]*/
+#ifndef _SOCKET_IF_INDEXTONAME_METHODDEF
+    #define _SOCKET_IF_INDEXTONAME_METHODDEF
+#endif /* !defined(_SOCKET_IF_INDEXTONAME_METHODDEF) */
+/*[clinic end generated code: output=c971b79d2193b426 input=a9049054013a1b77]*/
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index d5525c4eb3bfc0..47958379263793 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -344,12 +344,6 @@ static FlagRuntimeInfo win_runtime_flags[] = {
     {14393, "TCP_FASTOPEN"}
 };
 
-/*[clinic input]
-module _socket
-class _socket.socket "PySocketSockObject *" "clinic_state()->sock_type"
-[clinic start generated code]*/
-/*[clinic end generated code: output=da39a3ee5e6b4b0d input=2db2489bd2219fd8]*/
-
 static int
 remove_unusable_flags(PyObject *m)
 {
@@ -624,6 +618,60 @@ find_module_state_by_def(PyTypeObject *type)
     return get_module_state(mod);
 }
 
+#define UNSIGNED_INT_CONVERTER(NAME, TYPE)                          \
+static int                                                          \
+_PyLong_##NAME##_Converter(PyObject *obj, void *ptr)                \
+{                                                                   \
+    Py_ssize_t bytes = PyLong_AsNativeBytes(obj, ptr, sizeof(TYPE), \
+            Py_ASNATIVEBYTES_NATIVE_ENDIAN |                        \
+            Py_ASNATIVEBYTES_ALLOW_INDEX |                          \
+            Py_ASNATIVEBYTES_REJECT_NEGATIVE |                      \
+            Py_ASNATIVEBYTES_UNSIGNED_BUFFER);                      \
+    if (bytes < 0) {                                                \
+        return 0;                                                   \
+    }                                                               \
+    if ((size_t)bytes > sizeof(TYPE)) {                             \
+        PyErr_SetString(PyExc_OverflowError,                        \
+                        "Python int too large for C " #TYPE);       \
+        return 0;                                                   \
+    }                                                               \
+    return 1;                                                       \
+}
+
+UNSIGNED_INT_CONVERTER(UInt16, uint16_t)
+UNSIGNED_INT_CONVERTER(UInt32, uint32_t)
+
+#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
+# ifdef MS_WINDOWS
+    UNSIGNED_INT_CONVERTER(NetIfindex, NET_IFINDEX)
+# else
+    UNSIGNED_INT_CONVERTER(NetIfindex, unsigned int)
+#   define NET_IFINDEX unsigned int
+# endif
+#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
+
+/*[python input]
+class uint16_converter(CConverter):
+    type = "uint16_t"
+    converter = '_PyLong_UInt16_Converter'
+
+class uint32_converter(CConverter):
+    type = "uint32_t"
+    converter = '_PyLong_UInt32_Converter'
+
+class NET_IFINDEX_converter(CConverter):
+    type = "NET_IFINDEX"
+    converter = '_PyLong_NetIfindex_Converter'
+
+[python start generated code]*/
+/*[python end generated code: output=da39a3ee5e6b4b0d input=3de2e4a03fbf83b8]*/
+
+/*[clinic input]
+module _socket
+class _socket.socket "PySocketSockObject *" "clinic_state()->sock_type"
+[clinic start generated code]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=2db2489bd2219fd8]*/
+
 #define clinic_state() (find_module_state_by_def(type))
 #include "clinic/socketmodule.c.h"
 #undef clinic_state
@@ -2157,7 +2205,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
 #if defined(HAVE_BLUETOOTH_BLUETOOTH_H)
             unsigned short dev;
             unsigned short channel = HCI_CHANNEL_RAW;
-            if (PyLong_Check(args)) {
+            if (PyIndex_Check(args)) {
                 if (!PyArg_Parse(args, "H", &dev)) {
                     return 0;
                 }
@@ -6575,132 +6623,72 @@ AF_UNIX if defined on the platform; otherwise, the 
default is AF_INET.");
 
 
 /*[clinic input]
-_socket.socket.ntohs
-    x: int
+_socket.ntohs
+    integer as x: uint16
     /
 
 Convert a 16-bit unsigned integer from network to host byte order.
 [clinic start generated code]*/
 
 static PyObject *
-_socket_socket_ntohs_impl(PySocketSockObject *self, int x)
-/*[clinic end generated code: output=a828a61a9fb205b2 input=9a79cb3a71652147]*/
+_socket_ntohs_impl(PyObject *module, uint16_t x)
+/*[clinic end generated code: output=8e991859ddcedcc9 input=a702372437396511]*/
 {
-    if (x < 0) {
-        PyErr_SetString(PyExc_OverflowError,
-                        "ntohs: can't convert negative Python int to C "
-                        "16-bit unsigned integer");
-        return NULL;
-    }
-    if (x > 0xffff) {
-        PyErr_SetString(PyExc_OverflowError,
-                        "ntohs: Python int too large to convert to C "
-                        "16-bit unsigned integer");
-        return NULL;
-    }
-    return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
+    return PyLong_FromUnsignedLong(ntohs(x));
 }
 
 
+/*[clinic input]
+_socket.ntohl
+    integer as x: uint32
+    /
+
+Convert a 32-bit unsigned integer from network to host byte order.
+[clinic start generated code]*/
+
 static PyObject *
-socket_ntohl(PyObject *self, PyObject *arg)
+_socket_ntohl_impl(PyObject *module, uint32_t x)
+/*[clinic end generated code: output=158bcc5ba449f795 input=a0406faf2236bd1f]*/
 {
-    unsigned long x;
-
-    if (PyLong_Check(arg)) {
-        x = PyLong_AsUnsignedLong(arg);
-        if (x == (unsigned long) -1 && PyErr_Occurred())
-            return NULL;
-#if SIZEOF_LONG > 4
-        {
-            unsigned long y;
-            /* only want the trailing 32 bits */
-            y = x & 0xFFFFFFFFUL;
-            if (y ^ x)
-                return PyErr_Format(PyExc_OverflowError,
-                            "int larger than 32 bits");
-            x = y;
-        }
-#endif
-    }
-    else
-        return PyErr_Format(PyExc_TypeError,
-                            "expected int, %s found",
-                            Py_TYPE(arg)->tp_name);
     return PyLong_FromUnsignedLong(ntohl(x));
 }
 
-PyDoc_STRVAR(ntohl_doc,
-"ntohl(integer) -> integer\n\
-\n\
-Convert a 32-bit integer from network to host byte order.");
-
 
 /*[clinic input]
-_socket.socket.htons
-    x: int
+_socket.htons
+    integer as x: uint16
     /
 
 Convert a 16-bit unsigned integer from host to network byte order.
 [clinic start generated code]*/
 
 static PyObject *
-_socket_socket_htons_impl(PySocketSockObject *self, int x)
-/*[clinic end generated code: output=d785ee692312da47 input=053252d8416f4337]*/
+_socket_htons_impl(PyObject *module, uint16_t x)
+/*[clinic end generated code: output=35aa2bcc370fd80b input=78047a26d51866d1]*/
 {
-    if (x < 0) {
-        PyErr_SetString(PyExc_OverflowError,
-                        "htons: can't convert negative Python int to C "
-                        "16-bit unsigned integer");
-        return NULL;
-    }
-    if (x > 0xffff) {
-        PyErr_SetString(PyExc_OverflowError,
-                        "htons: Python int too large to convert to C "
-                        "16-bit unsigned integer");
-        return NULL;
-    }
-    return PyLong_FromUnsignedLong(htons((unsigned short)x));
+    return PyLong_FromUnsignedLong(htons(x));
 }
 
 
+/*[clinic input]
+_socket.htonl
+    integer as x: uint32
+    /
+
+Convert a 32-bit unsigned integer from host to network byte order.
+[clinic start generated code]*/
+
 static PyObject *
-socket_htonl(PyObject *self, PyObject *arg)
+_socket_htonl_impl(PyObject *module, uint32_t x)
+/*[clinic end generated code: output=283eb6857d5f7e0d input=89a9077647082806]*/
 {
-    unsigned long x;
-
-    if (PyLong_Check(arg)) {
-        x = PyLong_AsUnsignedLong(arg);
-        if (x == (unsigned long) -1 && PyErr_Occurred())
-            return NULL;
-#if SIZEOF_LONG > 4
-        {
-            unsigned long y;
-            /* only want the trailing 32 bits */
-            y = x & 0xFFFFFFFFUL;
-            if (y ^ x)
-                return PyErr_Format(PyExc_OverflowError,
-                            "int larger than 32 bits");
-            x = y;
-        }
-#endif
-    }
-    else
-        return PyErr_Format(PyExc_TypeError,
-                            "expected int, %s found",
-                            Py_TYPE(arg)->tp_name);
-    return PyLong_FromUnsignedLong(htonl((unsigned long)x));
+    return PyLong_FromUnsignedLong(htonl(x));
 }
 
-PyDoc_STRVAR(htonl_doc,
-"htonl(integer) -> integer\n\
-\n\
-Convert a 32-bit integer from host to network byte order.");
-
 /* socket.inet_aton() and socket.inet_ntoa() functions. */
 
 /*[clinic input]
-_socket.socket.inet_aton
+_socket.inet_aton
     ip_addr: str
     /
 
@@ -6708,8 +6696,8 @@ Convert an IP address in string format (123.45.67.89) to 
the 32-bit packed binar
 [clinic start generated code]*/
 
 static PyObject *
-_socket_socket_inet_aton_impl(PySocketSockObject *self, const char *ip_addr)
-/*[clinic end generated code: output=5bfe11a255423d8c input=a120e20cb52b9488]*/
+_socket_inet_aton_impl(PyObject *module, const char *ip_addr)
+/*[clinic end generated code: output=f2c2f772eb721b6e input=3a52dec207bf8956]*/
 {
 #ifdef HAVE_INET_ATON
     struct in_addr buf;
@@ -6771,7 +6759,7 @@ _socket_socket_inet_aton_impl(PySocketSockObject *self, 
const char *ip_addr)
 
 #ifdef HAVE_INET_NTOA
 /*[clinic input]
-_socket.socket.inet_ntoa
+_socket.inet_ntoa
     packed_ip: Py_buffer
     /
 
@@ -6779,8 +6767,8 @@ Convert an IP address from 32-bit packed binary format to 
string format.
 [clinic start generated code]*/
 
 static PyObject *
-_socket_socket_inet_ntoa_impl(PySocketSockObject *self, Py_buffer *packed_ip)
-/*[clinic end generated code: output=b671880a3f62461b input=95c2c4a1b2ee957c]*/
+_socket_inet_ntoa_impl(PyObject *module, Py_buffer *packed_ip)
+/*[clinic end generated code: output=3077324c50af0935 input=2850d4f57e4db345]*/
 {
     struct in_addr packed_addr;
 
@@ -6952,8 +6940,12 @@ socket_getaddrinfo(PyObject *self, PyObject *args, 
PyObject* kwargs)
                         "getaddrinfo() argument 1 must be string or None");
         return NULL;
     }
-    if (PyLong_CheckExact(pobj)) {
-        pstr = PyObject_Str(pobj);
+    if (PyIndex_Check(pobj)) {
+        pstr = PyNumber_Index(pobj);
+        if (pstr == NULL)
+            goto err;
+        assert(PyLong_CheckExact(pstr));
+        Py_SETREF(pstr, PyObject_Str(pstr));
         if (pstr == NULL)
             goto err;
         assert(PyUnicode_Check(pstr));
@@ -7288,7 +7280,7 @@ PyDoc_STRVAR(if_nameindex_doc,
 Returns a list of network interface information (index, name) tuples.");
 
 /*[clinic input]
-_socket.socket.if_nametoindex
+_socket.if_nametoindex
     oname: object(converter="PyUnicode_FSConverter")
     /
 
@@ -7296,8 +7288,8 @@ Returns the interface index corresponding to the 
interface name if_name.
 [clinic start generated code]*/
 
 static PyObject *
-_socket_socket_if_nametoindex_impl(PySocketSockObject *self, PyObject *oname)
-/*[clinic end generated code: output=f7fc00511a309a8e input=662688054482cd46]*/
+_socket_if_nametoindex_impl(PyObject *module, PyObject *oname)
+/*[clinic end generated code: output=289a411614f30244 input=01e0f1205307fb77]*/
 {
 #ifdef MS_WINDOWS
     NET_IFINDEX index;
@@ -7317,25 +7309,18 @@ _socket_socket_if_nametoindex_impl(PySocketSockObject 
*self, PyObject *oname)
 }
 
 
-static PyObject *
-socket_if_indextoname(PyObject *self, PyObject *arg)
-{
-    unsigned long index_long = PyLong_AsUnsignedLong(arg);
-    if (index_long == (unsigned long) -1 && PyErr_Occurred()) {
-        return NULL;
-    }
-
-#ifdef MS_WINDOWS
-    NET_IFINDEX index = (NET_IFINDEX)index_long;
-#else
-    unsigned int index = (unsigned int)index_long;
-#endif
+/*[clinic input]
+_socket.if_indextoname
+    if_index as index: NET_IFINDEX
+    /
 
-    if ((unsigned long)index != index_long) {
-        PyErr_SetString(PyExc_OverflowError, "index is too large");
-        return NULL;
-    }
+Returns the interface name corresponding to the interface index if_index.
+[clinic start generated code]*/
 
+static PyObject *
+_socket_if_indextoname_impl(PyObject *module, NET_IFINDEX index)
+/*[clinic end generated code: output=e48bc324993052e0 input=c93f753d0cf6d7d1]*/
+{
     char name[IF_NAMESIZE + 1];
     if (if_indextoname(index, name) == NULL) {
         PyErr_SetFromErrno(PyExc_OSError);
@@ -7345,11 +7330,6 @@ socket_if_indextoname(PyObject *self, PyObject *arg)
     return PyUnicode_DecodeFSDefault(name);
 }
 
-PyDoc_STRVAR(if_indextoname_doc,
-"if_indextoname(if_index)\n\
-\n\
-Returns the interface name corresponding to the interface index if_index.");
-
 #endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
 
 
@@ -7460,15 +7440,13 @@ static PyMethodDef socket_methods[] = {
     {"socketpair",              socket_socketpair,
      METH_VARARGS, socketpair_doc},
 #endif
-    _SOCKET_SOCKET_NTOHS_METHODDEF
-    {"ntohl",                   socket_ntohl,
-     METH_O, ntohl_doc},
-    _SOCKET_SOCKET_HTONS_METHODDEF
-    {"htonl",                   socket_htonl,
-     METH_O, htonl_doc},
-    _SOCKET_SOCKET_INET_ATON_METHODDEF
+    _SOCKET_NTOHS_METHODDEF
+    _SOCKET_NTOHL_METHODDEF
+    _SOCKET_HTONS_METHODDEF
+    _SOCKET_HTONL_METHODDEF
+    _SOCKET_INET_ATON_METHODDEF
 #ifdef HAVE_INET_NTOA
-    _SOCKET_SOCKET_INET_NTOA_METHODDEF
+    _SOCKET_INET_NTOA_METHODDEF
 #endif
 #ifdef HAVE_INET_PTON
     {"inet_pton",               socket_inet_pton,
@@ -7491,9 +7469,8 @@ static PyMethodDef socket_methods[] = {
 #if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
     {"if_nameindex", socket_if_nameindex,
      METH_NOARGS, if_nameindex_doc},
-    _SOCKET_SOCKET_IF_NAMETOINDEX_METHODDEF
-    {"if_indextoname", socket_if_indextoname,
-     METH_O, if_indextoname_doc},
+    _SOCKET_IF_NAMETOINDEX_METHODDEF
+    _SOCKET_IF_INDEXTONAME_METHODDEF
 #endif
 #ifdef CMSG_LEN
     {"CMSG_LEN",                socket_CMSG_LEN,

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to