Skip to content

Commit

Permalink
pythongh-85283: Build _scproxy extension with limited C API (python#1…
Browse files Browse the repository at this point in the history
…11008)

* Replace Py_SETREF(v, NULL) with Py_CLEAR(v).
* Reformat the code.
  • Loading branch information
vstinner authored and Glyphack committed Jan 27, 2024
1 parent 934d648 commit 0bde3ae
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 18 deletions.
4 changes: 2 additions & 2 deletions Doc/whatsnew/3.13.rst
Original file line number Diff line number Diff line change
Expand Up @@ -933,8 +933,8 @@ Build Changes
library, GCC built-in atomic functions, or MSVC interlocked intrinsics.

* The ``errno``, ``md5``, ``resource``, ``winsound``, ``_ctypes_test``,
``_stat`` and ``_testimportmultiple`` C extensions are now built with the
:ref:`limited C API <limited-c-api>`.
``_scproxy``, ``_stat`` and ``_testimportmultiple`` C extensions are now
built with the :ref:`limited C API <limited-c-api>`.
(Contributed by Victor Stinner in :gh:`85283`.)


Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
The ``errno``, ``md5``, ``resource``, ``winsound``, ``_ctypes_test``, ``_stat``
and ``_testimportmultiple`` C extensions are now built with the :ref:`limited C
API <limited-c-api>`.
The ``errno``, ``md5``, ``resource``, ``winsound``, ``_ctypes_test``,
``_scproxy``, ``_stat`` and ``_testimportmultiple`` C extensions are now built
with the :ref:`limited C API <limited-c-api>`.
Patch by Victor Stinner.
24 changes: 11 additions & 13 deletions Modules/_scproxy.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
* Helper method for urllib to fetch the proxy configuration settings
* using the SystemConfiguration framework.
*/

// Need limited C API version 3.13 for Py_MOD_PER_INTERPRETER_GIL_SUPPORTED
#define Py_LIMITED_API 0x030d0000

#include <Python.h>
#include <SystemConfiguration/SystemConfiguration.h>

Expand All @@ -21,8 +25,7 @@ cfstring_to_pystring(CFStringRef ref)

s = CFStringGetCStringPtr(ref, kCFStringEncodingUTF8);
if (s) {
return PyUnicode_DecodeUTF8(
s, strlen(s), NULL);
return PyUnicode_DecodeUTF8(s, strlen(s), NULL);

} else {
CFIndex len = CFStringGetLength(ref);
Expand All @@ -43,8 +46,7 @@ cfstring_to_pystring(CFStringRef ref)
PyMem_Free(buf);
return NULL;
} else {
result = PyUnicode_DecodeUTF8(
buf, strlen(buf), NULL);
result = PyUnicode_DecodeUTF8(buf, strlen(buf), NULL);
PyMem_Free(buf);
}
return result;
Expand Down Expand Up @@ -84,7 +86,7 @@ get_proxy_settings(PyObject* Py_UNUSED(mod), PyObject *Py_UNUSED(ignored))
if (v == NULL) goto error;

r = PyDict_SetItemString(result, "exclude_simple", v);
Py_SETREF(v, NULL);
Py_CLEAR(v);
if (r == -1) goto error;

anArray = CFDictionaryGetValue(proxyDict,
Expand All @@ -104,13 +106,11 @@ get_proxy_settings(PyObject* Py_UNUSED(mod), PyObject *Py_UNUSED(ignored))

aString = CFArrayGetValueAtIndex(anArray, i);
if (aString == NULL) {
PyTuple_SetItem(v, i, Py_None);
Py_INCREF(Py_None);
PyTuple_SetItem(v, i, Py_NewRef(Py_None));
} else {
PyObject* t = cfstring_to_pystring(aString);
if (!t) {
PyTuple_SetItem(v, i, Py_None);
Py_INCREF(Py_None);
PyTuple_SetItem(v, i, Py_NewRef(Py_None));
} else {
PyTuple_SetItem(v, i, t);
}
Expand Down Expand Up @@ -148,15 +148,13 @@ set_proxy(PyObject* proxies, const char* proto, CFDictionaryRef proxyDict,
if (h) {
if (aNum) {
int32_t port = cfnum_to_int32(aNum);
v = PyUnicode_FromFormat("http://%U:%ld",
h, (long)port);
v = PyUnicode_FromFormat("http://%U:%ld", h, (long)port);
} else {
v = PyUnicode_FromFormat("http://%U", h);
}
Py_DECREF(h);
if (!v) return -1;
r = PyDict_SetItemString(proxies, proto,
v);
r = PyDict_SetItemString(proxies, proto, v);
Py_DECREF(v);
return r;
}
Expand Down

0 comments on commit 0bde3ae

Please sign in to comment.