Skip to content

Commit bfb3b1d

Browse files
committed
gh-131776: Expose functions called from the interpreter loop via PyAPI_FUNC
1 parent c419af9 commit bfb3b1d

File tree

9 files changed

+54
-32
lines changed

9 files changed

+54
-32
lines changed

Include/internal/pycore_call.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ _PyObject_CallNoArgs(PyObject *func) {
186186
}
187187

188188

189-
extern PyObject *const *
189+
PyAPI_FUNC(PyObject *const *)
190190
_PyStack_UnpackDict(PyThreadState *tstate,
191191
PyObject *const *args, Py_ssize_t nargs,
192192
PyObject *kwargs, PyObject **p_kwnames);
@@ -196,7 +196,7 @@ extern void _PyStack_UnpackDict_Free(
196196
Py_ssize_t nargs,
197197
PyObject *kwnames);
198198

199-
extern void _PyStack_UnpackDict_FreeNoDecRef(
199+
PyAPI_FUNC(void) _PyStack_UnpackDict_FreeNoDecRef(
200200
PyObject *const *stack,
201201
PyObject *kwnames);
202202

Include/internal/pycore_ceval.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ PyAPI_FUNC(int) _Py_CheckRecursiveCall(
208208
PyThreadState *tstate,
209209
const char *where);
210210

211-
int _Py_CheckRecursiveCallPy(
211+
PyAPI_FUNC(int) _Py_CheckRecursiveCallPy(
212212
PyThreadState *tstate);
213213

214214
static inline int _Py_EnterRecursiveCallTstate(PyThreadState *tstate,

Include/internal/pycore_code.h

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ extern PyObject* _PyCode_GetFreevars(PyCodeObject *);
262262
extern PyObject* _PyCode_GetCode(PyCodeObject *);
263263

264264
/** API for initializing the line number tables. */
265-
extern int _PyCode_InitAddressRange(PyCodeObject* co, PyCodeAddressRange *bounds);
265+
PyAPI_FUNC(int) _PyCode_InitAddressRange(PyCodeObject* co, PyCodeAddressRange *bounds);
266266

267267
/** Out of process API for initializing the location table. */
268268
extern void _PyLineTable_InitAddressRange(
@@ -272,7 +272,7 @@ extern void _PyLineTable_InitAddressRange(
272272
PyCodeAddressRange *range);
273273

274274
/** API for traversing the line number table. */
275-
extern int _PyLineTable_NextAddressRange(PyCodeAddressRange *range);
275+
PyAPI_FUNC(int) _PyLineTable_NextAddressRange(PyCodeAddressRange *range);
276276
extern int _PyLineTable_PreviousAddressRange(PyCodeAddressRange *range);
277277

278278
/** API for executors */
@@ -291,33 +291,34 @@ extern void _PyCode_Clear_Executors(PyCodeObject *code);
291291
#define ENABLE_SPECIALIZATION_FT ENABLE_SPECIALIZATION
292292
#endif
293293

294-
/* Specialization functions */
294+
/* Specialization functions, these are exported only for other re-generated
295+
* interpreters to call */
295296

296-
extern void _Py_Specialize_LoadSuperAttr(_PyStackRef global_super, _PyStackRef cls,
297+
PyAPI_FUNC(void) _Py_Specialize_LoadSuperAttr(_PyStackRef global_super, _PyStackRef cls,
297298
_Py_CODEUNIT *instr, int load_method);
298-
extern void _Py_Specialize_LoadAttr(_PyStackRef owner, _Py_CODEUNIT *instr,
299+
PyAPI_FUNC(void) _Py_Specialize_LoadAttr(_PyStackRef owner, _Py_CODEUNIT *instr,
299300
PyObject *name);
300-
extern void _Py_Specialize_StoreAttr(_PyStackRef owner, _Py_CODEUNIT *instr,
301+
PyAPI_FUNC(void) _Py_Specialize_StoreAttr(_PyStackRef owner, _Py_CODEUNIT *instr,
301302
PyObject *name);
302-
extern void _Py_Specialize_LoadGlobal(PyObject *globals, PyObject *builtins,
303+
PyAPI_FUNC(void) _Py_Specialize_LoadGlobal(PyObject *globals, PyObject *builtins,
303304
_Py_CODEUNIT *instr, PyObject *name);
304-
extern void _Py_Specialize_StoreSubscr(_PyStackRef container, _PyStackRef sub,
305+
PyAPI_FUNC(void) _Py_Specialize_StoreSubscr(_PyStackRef container, _PyStackRef sub,
305306
_Py_CODEUNIT *instr);
306-
extern void _Py_Specialize_Call(_PyStackRef callable, _Py_CODEUNIT *instr,
307+
PyAPI_FUNC(void) _Py_Specialize_Call(_PyStackRef callable, _Py_CODEUNIT *instr,
307308
int nargs);
308-
extern void _Py_Specialize_CallKw(_PyStackRef callable, _Py_CODEUNIT *instr,
309+
PyAPI_FUNC(void) _Py_Specialize_CallKw(_PyStackRef callable, _Py_CODEUNIT *instr,
309310
int nargs);
310-
extern void _Py_Specialize_BinaryOp(_PyStackRef lhs, _PyStackRef rhs, _Py_CODEUNIT *instr,
311+
PyAPI_FUNC(void) _Py_Specialize_BinaryOp(_PyStackRef lhs, _PyStackRef rhs, _Py_CODEUNIT *instr,
311312
int oparg, _PyStackRef *locals);
312-
extern void _Py_Specialize_CompareOp(_PyStackRef lhs, _PyStackRef rhs,
313+
PyAPI_FUNC(void) _Py_Specialize_CompareOp(_PyStackRef lhs, _PyStackRef rhs,
313314
_Py_CODEUNIT *instr, int oparg);
314-
extern void _Py_Specialize_UnpackSequence(_PyStackRef seq, _Py_CODEUNIT *instr,
315+
PyAPI_FUNC(void) _Py_Specialize_UnpackSequence(_PyStackRef seq, _Py_CODEUNIT *instr,
315316
int oparg);
316-
extern void _Py_Specialize_ForIter(_PyStackRef iter, _PyStackRef null_or_index, _Py_CODEUNIT *instr, int oparg);
317-
extern void _Py_Specialize_Send(_PyStackRef receiver, _Py_CODEUNIT *instr);
318-
extern void _Py_Specialize_ToBool(_PyStackRef value, _Py_CODEUNIT *instr);
319-
extern void _Py_Specialize_ContainsOp(_PyStackRef value, _Py_CODEUNIT *instr);
320-
extern void _Py_GatherStats_GetIter(_PyStackRef iterable);
317+
PyAPI_FUNC(void) _Py_Specialize_ForIter(_PyStackRef iter, _PyStackRef null_or_index, _Py_CODEUNIT *instr, int oparg);
318+
PyAPI_FUNC(void) _Py_Specialize_Send(_PyStackRef receiver, _Py_CODEUNIT *instr);
319+
PyAPI_FUNC(void) _Py_Specialize_ToBool(_PyStackRef value, _Py_CODEUNIT *instr);
320+
PyAPI_FUNC(void) _Py_Specialize_ContainsOp(_PyStackRef value, _Py_CODEUNIT *instr);
321+
PyAPI_FUNC(void) _Py_GatherStats_GetIter(_PyStackRef iterable);
321322

322323
// Utility functions for reading/writing 32/64-bit values in the inline caches.
323324
// Great care should be taken to ensure that these functions remain correct and
@@ -512,7 +513,7 @@ typedef struct {
512513

513514
#define COMPARISON_NOT_EQUALS (COMPARISON_UNORDERED | COMPARISON_LESS_THAN | COMPARISON_GREATER_THAN)
514515

515-
extern int _Py_Instrument(PyCodeObject *co, PyInterpreterState *interp);
516+
PyAPI_FUNC(int) _Py_Instrument(PyCodeObject *co, PyInterpreterState *interp);
516517

517518
extern _Py_CODEUNIT _Py_GetBaseCodeUnit(PyCodeObject *code, int offset);
518519

Include/internal/pycore_dict.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ PyAPI_FUNC(int) _PyDict_SetItem_KnownHash_LockHeld(PyDictObject *mp, PyObject *k
142142
PyAPI_FUNC(int) _PyDict_GetItemRef_KnownHash_LockHeld(PyDictObject *op, PyObject *key, Py_hash_t hash, PyObject **result);
143143
extern int _PyDict_GetItemRef_KnownHash(PyDictObject *op, PyObject *key, Py_hash_t hash, PyObject **result);
144144
extern int _PyDict_GetItemRef_Unicode_LockHeld(PyDictObject *op, PyObject *key, PyObject **result);
145-
extern int _PyObjectDict_SetItem(PyTypeObject *tp, PyObject *obj, PyObject **dictptr, PyObject *name, PyObject *value);
145+
PyAPI_FUNC(int) _PyObjectDict_SetItem(PyTypeObject *tp, PyObject *obj, PyObject **dictptr, PyObject *name, PyObject *value);
146146

147147
extern int _PyDict_Pop_KnownHash(
148148
PyDictObject *dict,

Include/internal/pycore_function.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ extern "C" {
88
# error "this header requires Py_BUILD_CORE define"
99
#endif
1010

11-
extern PyObject* _PyFunction_Vectorcall(
11+
PyAPI_FUNC(PyObject *) _PyFunction_Vectorcall(
1212
PyObject *func,
1313
PyObject *const *stack,
1414
size_t nargsf,

Include/internal/pycore_genobject.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ PyAPI_FUNC(int) _PyGen_SetStopIterationValue(PyObject *);
3131
PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **);
3232

3333
PyAPI_FUNC(PyObject *)_PyCoro_GetAwaitableIter(PyObject *o);
34-
extern PyObject *_PyAsyncGenValueWrapperNew(PyThreadState *state, PyObject *);
34+
PyAPI_FUNC(PyObject *)_PyAsyncGenValueWrapperNew(PyThreadState *state, PyObject *);
3535

3636
extern PyTypeObject _PyCoroWrapper_Type;
3737
extern PyTypeObject _PyAsyncGenWrappedValue_Type;

Include/internal/pycore_instruments.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,32 +33,34 @@ int _PyMonitoring_SetEvents(int tool_id, _PyMonitoringEventSet events);
3333
int _PyMonitoring_SetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEventSet events);
3434
int _PyMonitoring_GetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEventSet *events);
3535

36-
extern int
36+
37+
// these are exported only for other re-generated interpreters to call
38+
PyAPI_FUNC(int)
3739
_Py_call_instrumentation(PyThreadState *tstate, int event,
3840
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr);
3941

40-
extern int
42+
PyAPI_FUNC(int)
4143
_Py_call_instrumentation_line(PyThreadState *tstate, _PyInterpreterFrame* frame,
4244
_Py_CODEUNIT *instr, _Py_CODEUNIT *prev);
4345

44-
extern int
46+
PyAPI_FUNC(int)
4547
_Py_call_instrumentation_instruction(
4648
PyThreadState *tstate, _PyInterpreterFrame* frame, _Py_CODEUNIT *instr);
4749

48-
_Py_CODEUNIT *
50+
PyAPI_FUNC(_Py_CODEUNIT *)
4951
_Py_call_instrumentation_jump(
5052
_Py_CODEUNIT *instr, PyThreadState *tstate, int event,
5153
_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNIT *dest);
5254

53-
extern int
55+
PyAPI_FUNC(int)
5456
_Py_call_instrumentation_arg(PyThreadState *tstate, int event,
5557
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg);
5658

57-
extern int
59+
PyAPI_FUNC(int)
5860
_Py_call_instrumentation_2args(PyThreadState *tstate, int event,
5961
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1);
6062

61-
extern void
63+
PyAPI_FUNC(void)
6264
_Py_call_instrumentation_exc2(PyThreadState *tstate, int event,
6365
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1);
6466

Include/internal/pycore_typeobject.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ _PyType_GetModuleState(PyTypeObject *type)
8989
// function
9090
PyAPI_FUNC(PyObject *) _PyType_GetDict(PyTypeObject *);
9191

92+
PyAPI_FUNC(PyObject *) _PyType_LookupSubclasses(PyTypeObject *);
93+
PyAPI_FUNC(PyObject *) _PyType_InitSubclasses(PyTypeObject *);
94+
9295
extern PyObject * _PyType_GetBases(PyTypeObject *type);
9396
extern PyObject * _PyType_GetMRO(PyTypeObject *type);
9497
extern PyObject* _PyType_GetSubclasses(PyTypeObject *);

Objects/typeobject.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,22 @@ lookup_tp_subclasses(PyTypeObject *self)
753753
return (PyObject *)self->tp_subclasses;
754754
}
755755

756+
PyObject *
757+
_PyType_LookupSubclasses(PyTypeObject *self)
758+
{
759+
return lookup_tp_subclasses(self);
760+
}
761+
762+
PyObject *
763+
_PyType_InitSubclasses(PyTypeObject *self)
764+
{
765+
PyObject *existing = lookup_tp_subclasses(self);
766+
if (existing != NULL) {
767+
return existing;
768+
}
769+
return init_tp_subclasses(self);
770+
}
771+
756772
int
757773
_PyType_HasSubclasses(PyTypeObject *self)
758774
{

0 commit comments

Comments
 (0)