Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

[3.12] gh-117482: Fix Builtin Types Slot Wrappers (gh-121602)#121632

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
Show file tree
Hide file tree
Changes fromall commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletionsLib/test/test_types.py
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
import pickle
import locale
import sys
import textwrap
import types
import unittest.mock
import weakref
Expand DownExpand Up@@ -2252,5 +2253,39 @@ def coro():
'close', 'throw'}))


class SubinterpreterTests(unittest.TestCase):

@classmethod
def setUpClass(cls):
global interpreters
try:
from test.support import interpreters
except ModuleNotFoundError:
raise unittest.SkipTest('subinterpreters required')

@cpython_only
def test_slot_wrappers(self):
rch, sch = interpreters.create_channel()

# For now it's sufficient to check int.__str__.
# See https://github.com/python/cpython/issues/117482
# and https://github.com/python/cpython/pull/117660.
script = textwrap.dedent(f'''
text = repr(int.__str__)
sch = interpreters.SendChannel({sch.id})
sch.send_nowait(text)
''')

exec(script)
expected = rch.recv()

interp = interpreters.create()
interp.run('from test.support import interpreters')
interp.run(script)
results = rch.recv()

self.assertEqual(results, expected)


if __name__ == '__main__':
unittest.main()
View file
Open in desktop
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
Unexpected slot wrappers are no longer created for builtin static types in
subinterpreters.
41 changes: 32 additions & 9 deletionsObjects/typeobject.c
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -116,6 +116,18 @@ static_builtin_index_clear(PyTypeObject *self)
self->tp_subclasses = NULL;
}


/* In 3.13+ this is stored in _PyRuntimeState. */
static PyTypeObject static_type_defs[_Py_MAX_STATIC_BUILTIN_TYPES];

static inline PyTypeObject *
static_builtin_get_def(PyTypeObject *type)
{
size_t index = static_builtin_index_get(type);
return &static_type_defs[index];
}


static inline static_builtin_state *
static_builtin_state_get(PyInterpreterState *interp, PyTypeObject *self)
{
Expand DownExpand Up@@ -6982,7 +6994,7 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base)
return 0;
}

static int add_operators(PyTypeObject *);
static int add_operators(PyTypeObject *, PyTypeObject *);
static int add_tp_new_wrapper(PyTypeObject *type);

#define COLLECTION_FLAGS (Py_TPFLAGS_SEQUENCE | Py_TPFLAGS_MAPPING)
Expand DownExpand Up@@ -7147,10 +7159,10 @@ type_dict_set_doc(PyTypeObject *type)


static int
type_ready_fill_dict(PyTypeObject *type)
type_ready_fill_dict(PyTypeObject *type, PyTypeObject *def)
{
/* Add type-specific descriptors to tp_dict */
if (add_operators(type) < 0) {
if (add_operators(type, def) < 0) {
return -1;
}
if (type_add_methods(type) < 0) {
Expand DownExpand Up@@ -7462,7 +7474,7 @@ type_ready_post_checks(PyTypeObject *type)


static int
type_ready(PyTypeObject *type, int rerunbuiltin)
type_ready(PyTypeObject *type,PyTypeObject *def,int rerunbuiltin)
{
_PyObject_ASSERT((PyObject *)type, !is_readying(type));
start_readying(type);
Expand DownExpand Up@@ -7499,7 +7511,7 @@ type_ready(PyTypeObject *type, int rerunbuiltin)
if (type_ready_set_new(type, rerunbuiltin) < 0) {
goto error;
}
if (type_ready_fill_dict(type) < 0) {
if (type_ready_fill_dict(type, def) < 0) {
goto error;
}
if (!rerunbuiltin) {
Expand DownExpand Up@@ -7551,7 +7563,7 @@ PyType_Ready(PyTypeObject *type)
type->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE;
}

return type_ready(type, 0);
return type_ready(type,NULL,0);
}

int
Expand DownExpand Up@@ -7581,10 +7593,16 @@ _PyStaticType_InitBuiltin(PyInterpreterState *interp, PyTypeObject *self)

static_builtin_state_init(interp, self);

int res = type_ready(self, !ismain);
PyTypeObject *def = static_builtin_get_def(self);
if (ismain) {
memcpy(def, self, sizeof(PyTypeObject));
}

int res = type_ready(self, def, !ismain);
if (res < 0) {
static_builtin_state_clear(interp, self);
}

return res;
}

Expand DownExpand Up@@ -10108,17 +10126,22 @@ recurse_down_subclasses(PyTypeObject *type, PyObject *attr_name,
infinite recursion here.) */

static int
add_operators(PyTypeObject *type)
add_operators(PyTypeObject *type, PyTypeObject *def)
{
PyObject *dict = lookup_tp_dict(type);
pytype_slotdef *p;
PyObject *descr;
void **ptr;

assert(def == NULL || (type->tp_flags & _Py_TPFLAGS_STATIC_BUILTIN));
if (def == NULL) {
def = type;
}

for (p = slotdefs; p->name; p++) {
if (p->wrapper == NULL)
continue;
ptr = slotptr(type, p->offset);
ptr = slotptr(def, p->offset);
if (!ptr || !*ptr)
continue;
int r = PyDict_Contains(dict, p->name_strobj);
Expand Down
5 changes: 5 additions & 0 deletionsTools/c-analyzer/cpython/globals-to-fix.tsv
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -305,6 +305,11 @@ Objects/sliceobject.c-_Py_EllipsisObject-
Python/instrumentation.c-_PyInstrumentation_DISABLE-
Python/instrumentation.c-_PyInstrumentation_MISSING-

##-----------------------
## other

Objects/typeobject.c-static_type_defs-


##################################
## global non-objects to fix in core code
Expand Down

[8]ページ先頭

©2009-2025 Movatter.jp