Skip to content

Commit d00156a

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

File tree

8 files changed

+53
-31
lines changed

8 files changed

+53
-31
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, _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, _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
@@ -509,7 +510,7 @@ typedef struct {
509510

510511
#define COMPARISON_NOT_EQUALS (COMPARISON_UNORDERED | COMPARISON_LESS_THAN | COMPARISON_GREATER_THAN)
511512

512-
extern int _Py_Instrument(PyCodeObject *co, PyInterpreterState *interp);
513+
PyAPI_FUNC(int) _Py_Instrument(PyCodeObject *co, PyInterpreterState *interp);
513514

514515
extern _Py_CODEUNIT _Py_GetBaseCodeUnit(PyCodeObject *code, int offset);
515516

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_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
@@ -650,6 +650,22 @@ lookup_tp_subclasses(PyTypeObject *self)
650650
return (PyObject *)self->tp_subclasses;
651651
}
652652

653+
PyObject *
654+
_PyType_LookupSubclasses(PyTypeObject *self)
655+
{
656+
return lookup_tp_subclasses(self);
657+
}
658+
659+
PyObject *
660+
_PyType_InitSubclasses(PyTypeObject *self)
661+
{
662+
PyObject *existing = lookup_tp_subclasses(self);
663+
if (existing != NULL) {
664+
return existing;
665+
}
666+
return init_tp_subclasses(self);
667+
}
668+
653669
int
654670
_PyType_HasSubclasses(PyTypeObject *self)
655671
{

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy