mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
gh-131776: Expose functions called from the interpreter loop via PyAPI_FUNC (#134242)
This commit is contained in:
parent
dd15a2e11e
commit
299de38e61
9 changed files with 54 additions and 32 deletions
|
|
@ -186,7 +186,7 @@ _PyObject_CallNoArgs(PyObject *func) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern PyObject *const *
|
PyAPI_FUNC(PyObject *const *)
|
||||||
_PyStack_UnpackDict(PyThreadState *tstate,
|
_PyStack_UnpackDict(PyThreadState *tstate,
|
||||||
PyObject *const *args, Py_ssize_t nargs,
|
PyObject *const *args, Py_ssize_t nargs,
|
||||||
PyObject *kwargs, PyObject **p_kwnames);
|
PyObject *kwargs, PyObject **p_kwnames);
|
||||||
|
|
@ -196,7 +196,7 @@ extern void _PyStack_UnpackDict_Free(
|
||||||
Py_ssize_t nargs,
|
Py_ssize_t nargs,
|
||||||
PyObject *kwnames);
|
PyObject *kwnames);
|
||||||
|
|
||||||
extern void _PyStack_UnpackDict_FreeNoDecRef(
|
PyAPI_FUNC(void) _PyStack_UnpackDict_FreeNoDecRef(
|
||||||
PyObject *const *stack,
|
PyObject *const *stack,
|
||||||
PyObject *kwnames);
|
PyObject *kwnames);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -226,7 +226,7 @@ PyAPI_FUNC(int) _Py_CheckRecursiveCall(
|
||||||
PyThreadState *tstate,
|
PyThreadState *tstate,
|
||||||
const char *where);
|
const char *where);
|
||||||
|
|
||||||
int _Py_CheckRecursiveCallPy(
|
PyAPI_FUNC(int) _Py_CheckRecursiveCallPy(
|
||||||
PyThreadState *tstate);
|
PyThreadState *tstate);
|
||||||
|
|
||||||
static inline int _Py_EnterRecursiveCallTstate(PyThreadState *tstate,
|
static inline int _Py_EnterRecursiveCallTstate(PyThreadState *tstate,
|
||||||
|
|
|
||||||
|
|
@ -262,7 +262,7 @@ extern PyObject* _PyCode_GetFreevars(PyCodeObject *);
|
||||||
extern PyObject* _PyCode_GetCode(PyCodeObject *);
|
extern PyObject* _PyCode_GetCode(PyCodeObject *);
|
||||||
|
|
||||||
/** API for initializing the line number tables. */
|
/** API for initializing the line number tables. */
|
||||||
extern int _PyCode_InitAddressRange(PyCodeObject* co, PyCodeAddressRange *bounds);
|
PyAPI_FUNC(int) _PyCode_InitAddressRange(PyCodeObject* co, PyCodeAddressRange *bounds);
|
||||||
|
|
||||||
/** Out of process API for initializing the location table. */
|
/** Out of process API for initializing the location table. */
|
||||||
extern void _PyLineTable_InitAddressRange(
|
extern void _PyLineTable_InitAddressRange(
|
||||||
|
|
@ -272,7 +272,7 @@ extern void _PyLineTable_InitAddressRange(
|
||||||
PyCodeAddressRange *range);
|
PyCodeAddressRange *range);
|
||||||
|
|
||||||
/** API for traversing the line number table. */
|
/** API for traversing the line number table. */
|
||||||
extern int _PyLineTable_NextAddressRange(PyCodeAddressRange *range);
|
PyAPI_FUNC(int) _PyLineTable_NextAddressRange(PyCodeAddressRange *range);
|
||||||
extern int _PyLineTable_PreviousAddressRange(PyCodeAddressRange *range);
|
extern int _PyLineTable_PreviousAddressRange(PyCodeAddressRange *range);
|
||||||
// This is used in dump_frame() in traceback.c without an attached tstate.
|
// This is used in dump_frame() in traceback.c without an attached tstate.
|
||||||
extern int _PyCode_Addr2LineNoTstate(PyCodeObject *co, int addr);
|
extern int _PyCode_Addr2LineNoTstate(PyCodeObject *co, int addr);
|
||||||
|
|
@ -293,33 +293,34 @@ extern void _PyCode_Clear_Executors(PyCodeObject *code);
|
||||||
#define ENABLE_SPECIALIZATION_FT ENABLE_SPECIALIZATION
|
#define ENABLE_SPECIALIZATION_FT ENABLE_SPECIALIZATION
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Specialization functions */
|
/* Specialization functions, these are exported only for other re-generated
|
||||||
|
* interpreters to call */
|
||||||
|
|
||||||
extern void _Py_Specialize_LoadSuperAttr(_PyStackRef global_super, _PyStackRef cls,
|
PyAPI_FUNC(void) _Py_Specialize_LoadSuperAttr(_PyStackRef global_super, _PyStackRef cls,
|
||||||
_Py_CODEUNIT *instr, int load_method);
|
_Py_CODEUNIT *instr, int load_method);
|
||||||
extern void _Py_Specialize_LoadAttr(_PyStackRef owner, _Py_CODEUNIT *instr,
|
PyAPI_FUNC(void) _Py_Specialize_LoadAttr(_PyStackRef owner, _Py_CODEUNIT *instr,
|
||||||
PyObject *name);
|
PyObject *name);
|
||||||
extern void _Py_Specialize_StoreAttr(_PyStackRef owner, _Py_CODEUNIT *instr,
|
PyAPI_FUNC(void) _Py_Specialize_StoreAttr(_PyStackRef owner, _Py_CODEUNIT *instr,
|
||||||
PyObject *name);
|
PyObject *name);
|
||||||
extern void _Py_Specialize_LoadGlobal(PyObject *globals, PyObject *builtins,
|
PyAPI_FUNC(void) _Py_Specialize_LoadGlobal(PyObject *globals, PyObject *builtins,
|
||||||
_Py_CODEUNIT *instr, PyObject *name);
|
_Py_CODEUNIT *instr, PyObject *name);
|
||||||
extern void _Py_Specialize_StoreSubscr(_PyStackRef container, _PyStackRef sub,
|
PyAPI_FUNC(void) _Py_Specialize_StoreSubscr(_PyStackRef container, _PyStackRef sub,
|
||||||
_Py_CODEUNIT *instr);
|
_Py_CODEUNIT *instr);
|
||||||
extern void _Py_Specialize_Call(_PyStackRef callable, _Py_CODEUNIT *instr,
|
PyAPI_FUNC(void) _Py_Specialize_Call(_PyStackRef callable, _Py_CODEUNIT *instr,
|
||||||
int nargs);
|
int nargs);
|
||||||
extern void _Py_Specialize_CallKw(_PyStackRef callable, _Py_CODEUNIT *instr,
|
PyAPI_FUNC(void) _Py_Specialize_CallKw(_PyStackRef callable, _Py_CODEUNIT *instr,
|
||||||
int nargs);
|
int nargs);
|
||||||
extern void _Py_Specialize_BinaryOp(_PyStackRef lhs, _PyStackRef rhs, _Py_CODEUNIT *instr,
|
PyAPI_FUNC(void) _Py_Specialize_BinaryOp(_PyStackRef lhs, _PyStackRef rhs, _Py_CODEUNIT *instr,
|
||||||
int oparg, _PyStackRef *locals);
|
int oparg, _PyStackRef *locals);
|
||||||
extern void _Py_Specialize_CompareOp(_PyStackRef lhs, _PyStackRef rhs,
|
PyAPI_FUNC(void) _Py_Specialize_CompareOp(_PyStackRef lhs, _PyStackRef rhs,
|
||||||
_Py_CODEUNIT *instr, int oparg);
|
_Py_CODEUNIT *instr, int oparg);
|
||||||
extern void _Py_Specialize_UnpackSequence(_PyStackRef seq, _Py_CODEUNIT *instr,
|
PyAPI_FUNC(void) _Py_Specialize_UnpackSequence(_PyStackRef seq, _Py_CODEUNIT *instr,
|
||||||
int oparg);
|
int oparg);
|
||||||
extern void _Py_Specialize_ForIter(_PyStackRef iter, _PyStackRef null_or_index, _Py_CODEUNIT *instr, int oparg);
|
PyAPI_FUNC(void) _Py_Specialize_ForIter(_PyStackRef iter, _PyStackRef null_or_index, _Py_CODEUNIT *instr, int oparg);
|
||||||
extern void _Py_Specialize_Send(_PyStackRef receiver, _Py_CODEUNIT *instr);
|
PyAPI_FUNC(void) _Py_Specialize_Send(_PyStackRef receiver, _Py_CODEUNIT *instr);
|
||||||
extern void _Py_Specialize_ToBool(_PyStackRef value, _Py_CODEUNIT *instr);
|
PyAPI_FUNC(void) _Py_Specialize_ToBool(_PyStackRef value, _Py_CODEUNIT *instr);
|
||||||
extern void _Py_Specialize_ContainsOp(_PyStackRef value, _Py_CODEUNIT *instr);
|
PyAPI_FUNC(void) _Py_Specialize_ContainsOp(_PyStackRef value, _Py_CODEUNIT *instr);
|
||||||
extern void _Py_GatherStats_GetIter(_PyStackRef iterable);
|
PyAPI_FUNC(void) _Py_GatherStats_GetIter(_PyStackRef iterable);
|
||||||
|
|
||||||
// Utility functions for reading/writing 32/64-bit values in the inline caches.
|
// Utility functions for reading/writing 32/64-bit values in the inline caches.
|
||||||
// Great care should be taken to ensure that these functions remain correct and
|
// Great care should be taken to ensure that these functions remain correct and
|
||||||
|
|
@ -514,7 +515,7 @@ typedef struct {
|
||||||
|
|
||||||
#define COMPARISON_NOT_EQUALS (COMPARISON_UNORDERED | COMPARISON_LESS_THAN | COMPARISON_GREATER_THAN)
|
#define COMPARISON_NOT_EQUALS (COMPARISON_UNORDERED | COMPARISON_LESS_THAN | COMPARISON_GREATER_THAN)
|
||||||
|
|
||||||
extern int _Py_Instrument(PyCodeObject *co, PyInterpreterState *interp);
|
PyAPI_FUNC(int) _Py_Instrument(PyCodeObject *co, PyInterpreterState *interp);
|
||||||
|
|
||||||
extern _Py_CODEUNIT _Py_GetBaseCodeUnit(PyCodeObject *code, int offset);
|
extern _Py_CODEUNIT _Py_GetBaseCodeUnit(PyCodeObject *code, int offset);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -144,7 +144,7 @@ PyAPI_FUNC(int) _PyDict_SetItem_KnownHash_LockHeld(PyDictObject *mp, PyObject *k
|
||||||
PyAPI_FUNC(int) _PyDict_GetItemRef_KnownHash_LockHeld(PyDictObject *op, PyObject *key, Py_hash_t hash, PyObject **result);
|
PyAPI_FUNC(int) _PyDict_GetItemRef_KnownHash_LockHeld(PyDictObject *op, PyObject *key, Py_hash_t hash, PyObject **result);
|
||||||
extern int _PyDict_GetItemRef_KnownHash(PyDictObject *op, PyObject *key, Py_hash_t hash, PyObject **result);
|
extern int _PyDict_GetItemRef_KnownHash(PyDictObject *op, PyObject *key, Py_hash_t hash, PyObject **result);
|
||||||
extern int _PyDict_GetItemRef_Unicode_LockHeld(PyDictObject *op, PyObject *key, PyObject **result);
|
extern int _PyDict_GetItemRef_Unicode_LockHeld(PyDictObject *op, PyObject *key, PyObject **result);
|
||||||
extern int _PyObjectDict_SetItem(PyTypeObject *tp, PyObject *obj, PyObject **dictptr, PyObject *name, PyObject *value);
|
PyAPI_FUNC(int) _PyObjectDict_SetItem(PyTypeObject *tp, PyObject *obj, PyObject **dictptr, PyObject *name, PyObject *value);
|
||||||
|
|
||||||
extern int _PyDict_Pop_KnownHash(
|
extern int _PyDict_Pop_KnownHash(
|
||||||
PyDictObject *dict,
|
PyDictObject *dict,
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ extern "C" {
|
||||||
# error "this header requires Py_BUILD_CORE define"
|
# error "this header requires Py_BUILD_CORE define"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern PyObject* _PyFunction_Vectorcall(
|
PyAPI_FUNC(PyObject *) _PyFunction_Vectorcall(
|
||||||
PyObject *func,
|
PyObject *func,
|
||||||
PyObject *const *stack,
|
PyObject *const *stack,
|
||||||
size_t nargsf,
|
size_t nargsf,
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ PyAPI_FUNC(int) _PyGen_SetStopIterationValue(PyObject *);
|
||||||
PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **);
|
PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **);
|
||||||
|
|
||||||
PyAPI_FUNC(PyObject *)_PyCoro_GetAwaitableIter(PyObject *o);
|
PyAPI_FUNC(PyObject *)_PyCoro_GetAwaitableIter(PyObject *o);
|
||||||
extern PyObject *_PyAsyncGenValueWrapperNew(PyThreadState *state, PyObject *);
|
PyAPI_FUNC(PyObject *)_PyAsyncGenValueWrapperNew(PyThreadState *state, PyObject *);
|
||||||
|
|
||||||
extern PyTypeObject _PyCoroWrapper_Type;
|
extern PyTypeObject _PyCoroWrapper_Type;
|
||||||
extern PyTypeObject _PyAsyncGenWrappedValue_Type;
|
extern PyTypeObject _PyAsyncGenWrappedValue_Type;
|
||||||
|
|
|
||||||
|
|
@ -33,32 +33,34 @@ int _PyMonitoring_SetEvents(int tool_id, _PyMonitoringEventSet events);
|
||||||
int _PyMonitoring_SetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEventSet events);
|
int _PyMonitoring_SetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEventSet events);
|
||||||
int _PyMonitoring_GetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEventSet *events);
|
int _PyMonitoring_GetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEventSet *events);
|
||||||
|
|
||||||
extern int
|
|
||||||
|
// these are exported only for other re-generated interpreters to call
|
||||||
|
PyAPI_FUNC(int)
|
||||||
_Py_call_instrumentation(PyThreadState *tstate, int event,
|
_Py_call_instrumentation(PyThreadState *tstate, int event,
|
||||||
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr);
|
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr);
|
||||||
|
|
||||||
extern int
|
PyAPI_FUNC(int)
|
||||||
_Py_call_instrumentation_line(PyThreadState *tstate, _PyInterpreterFrame* frame,
|
_Py_call_instrumentation_line(PyThreadState *tstate, _PyInterpreterFrame* frame,
|
||||||
_Py_CODEUNIT *instr, _Py_CODEUNIT *prev);
|
_Py_CODEUNIT *instr, _Py_CODEUNIT *prev);
|
||||||
|
|
||||||
extern int
|
PyAPI_FUNC(int)
|
||||||
_Py_call_instrumentation_instruction(
|
_Py_call_instrumentation_instruction(
|
||||||
PyThreadState *tstate, _PyInterpreterFrame* frame, _Py_CODEUNIT *instr);
|
PyThreadState *tstate, _PyInterpreterFrame* frame, _Py_CODEUNIT *instr);
|
||||||
|
|
||||||
_Py_CODEUNIT *
|
PyAPI_FUNC(_Py_CODEUNIT *)
|
||||||
_Py_call_instrumentation_jump(
|
_Py_call_instrumentation_jump(
|
||||||
_Py_CODEUNIT *instr, PyThreadState *tstate, int event,
|
_Py_CODEUNIT *instr, PyThreadState *tstate, int event,
|
||||||
_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNIT *dest);
|
_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNIT *dest);
|
||||||
|
|
||||||
extern int
|
PyAPI_FUNC(int)
|
||||||
_Py_call_instrumentation_arg(PyThreadState *tstate, int event,
|
_Py_call_instrumentation_arg(PyThreadState *tstate, int event,
|
||||||
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg);
|
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg);
|
||||||
|
|
||||||
extern int
|
PyAPI_FUNC(int)
|
||||||
_Py_call_instrumentation_2args(PyThreadState *tstate, int event,
|
_Py_call_instrumentation_2args(PyThreadState *tstate, int event,
|
||||||
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1);
|
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1);
|
||||||
|
|
||||||
extern void
|
PyAPI_FUNC(void)
|
||||||
_Py_call_instrumentation_exc2(PyThreadState *tstate, int event,
|
_Py_call_instrumentation_exc2(PyThreadState *tstate, int event,
|
||||||
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1);
|
_PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,9 @@ _PyType_GetModuleState(PyTypeObject *type)
|
||||||
// function
|
// function
|
||||||
PyAPI_FUNC(PyObject *) _PyType_GetDict(PyTypeObject *);
|
PyAPI_FUNC(PyObject *) _PyType_GetDict(PyTypeObject *);
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) _PyType_LookupSubclasses(PyTypeObject *);
|
||||||
|
PyAPI_FUNC(PyObject *) _PyType_InitSubclasses(PyTypeObject *);
|
||||||
|
|
||||||
extern PyObject * _PyType_GetBases(PyTypeObject *type);
|
extern PyObject * _PyType_GetBases(PyTypeObject *type);
|
||||||
extern PyObject * _PyType_GetMRO(PyTypeObject *type);
|
extern PyObject * _PyType_GetMRO(PyTypeObject *type);
|
||||||
extern PyObject* _PyType_GetSubclasses(PyTypeObject *);
|
extern PyObject* _PyType_GetSubclasses(PyTypeObject *);
|
||||||
|
|
|
||||||
|
|
@ -752,6 +752,22 @@ lookup_tp_subclasses(PyTypeObject *self)
|
||||||
return (PyObject *)self->tp_subclasses;
|
return (PyObject *)self->tp_subclasses;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject *
|
||||||
|
_PyType_LookupSubclasses(PyTypeObject *self)
|
||||||
|
{
|
||||||
|
return lookup_tp_subclasses(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject *
|
||||||
|
_PyType_InitSubclasses(PyTypeObject *self)
|
||||||
|
{
|
||||||
|
PyObject *existing = lookup_tp_subclasses(self);
|
||||||
|
if (existing != NULL) {
|
||||||
|
return existing;
|
||||||
|
}
|
||||||
|
return init_tp_subclasses(self);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
_PyType_HasSubclasses(PyTypeObject *self)
|
_PyType_HasSubclasses(PyTypeObject *self)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue