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

Commit88f8102

Browse files
gh-132775: Support Fallbacks in _PyObject_GetXIData() (gh-133482)
It now supports a "full" fallback to _PyFunction_GetXIData() and then `_PyPickle_GetXIData()`. There's also room for other fallback modes if that later makes sense.
1 parent0c5a8b0 commit88f8102

11 files changed

+581
-139
lines changed

‎Include/internal/pycore_crossinterp.h

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,23 @@ PyAPI_FUNC(void) _PyXIData_Clear(PyInterpreterState *, _PyXIData_t *);
131131

132132
/* getting cross-interpreter data */
133133

134-
typedefint (*xidatafunc)(PyThreadState*tstate,PyObject*,_PyXIData_t*);
134+
typedefintxidata_fallback_t;
135+
#define_PyXIDATA_XIDATA_ONLY (0)
136+
#define_PyXIDATA_FULL_FALLBACK (1)
137+
138+
// Technically, we don't need two different function types;
139+
// we could go with just the fallback one. However, only container
140+
// types like tuple need it, so always having the extra arg would be
141+
// a bit unfortunate. It's also nice to be able to clearly distinguish
142+
// between types that might call _PyObject_GetXIData() and those that won't.
143+
//
144+
typedefint (*xidatafunc)(PyThreadState*,PyObject*,_PyXIData_t*);
145+
typedefint (*xidatafbfunc)(
146+
PyThreadState*,PyObject*,xidata_fallback_t,_PyXIData_t*);
147+
typedefstruct {
148+
xidatafuncbasic;
149+
xidatafbfuncfallback;
150+
}_PyXIData_getdata_t;
135151

136152
PyAPI_FUNC(PyObject*)_PyXIData_GetNotShareableErrorType(PyThreadState*);
137153
PyAPI_FUNC(void)_PyXIData_SetNotShareableError(PyThreadState*,constchar*);
@@ -140,16 +156,21 @@ PyAPI_FUNC(void) _PyXIData_FormatNotShareableError(
140156
constchar*,
141157
...);
142158

143-
PyAPI_FUNC(xidatafunc)_PyXIData_Lookup(
159+
PyAPI_FUNC(_PyXIData_getdata_t)_PyXIData_Lookup(
144160
PyThreadState*,
145161
PyObject*);
146162
PyAPI_FUNC(int)_PyObject_CheckXIData(
147163
PyThreadState*,
148164
PyObject*);
149165

166+
PyAPI_FUNC(int)_PyObject_GetXIDataNoFallback(
167+
PyThreadState*,
168+
PyObject*,
169+
_PyXIData_t*);
150170
PyAPI_FUNC(int)_PyObject_GetXIData(
151171
PyThreadState*,
152172
PyObject*,
173+
xidata_fallback_t,
153174
_PyXIData_t*);
154175

155176
// _PyObject_GetXIData() for bytes

‎Include/internal/pycore_crossinterp_data_registry.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ typedef struct _xid_regitem {
1717
/* This is NULL for builtin types. */
1818
PyObject*weakref;
1919
size_trefcount;
20-
xidatafuncgetdata;
20+
_PyXIData_getdata_tgetdata;
2121
}_PyXIData_regitem_t;
2222

2323
typedefstruct {
@@ -30,7 +30,7 @@ typedef struct {
3030
PyAPI_FUNC(int)_PyXIData_RegisterClass(
3131
PyThreadState*,
3232
PyTypeObject*,
33-
xidatafunc);
33+
_PyXIData_getdata_t);
3434
PyAPI_FUNC(int)_PyXIData_UnregisterClass(
3535
PyThreadState*,
3636
PyTypeObject*);

‎Lib/test/support/import_helper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,5 +438,5 @@ def ensure_module_imported(name, *, clearnone=True):
438438
ifsys.modules.get(name)isnotNone:
439439
mod=sys.modules[name]
440440
else:
441-
mod,_,_=_force_import(name,False,True,clearnone)
441+
mod,_,_=_ensure_module(name,False,True,clearnone)
442442
returnmod

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp