| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533 |
- // Copyright (C) 2018 The Qt Company Ltd.
- // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
- #ifndef PEP384IMPL_H
- #define PEP384IMPL_H
- #include "sbkpython.h"
- #include "shibokenmacros.h"
- extern "C"
- {
- /*****************************************************************************
- *
- * RESOLVED: object.h
- *
- */
- #ifdef Py_LIMITED_API
- // Why the hell is this useful debugging function not allowed?
- // BTW: When used, it breaks on Windows, intentionally!
- LIBSHIBOKEN_API void _PyObject_Dump(PyObject *);
- #endif
- /*
- * There are a few structures that are needed, but cannot be used without
- * breaking the API. We use some heuristics to get those fields anyway
- * and validate that we really found them, see pep384impl.cpp .
- */
- #ifdef Py_LIMITED_API
- /*
- * These are the type object fields that we use.
- * We will verify that they never change.
- * The unused fields are intentionally named as "void *Xnn" because
- * the chance is smaller to forget to validate a field.
- * When we need more fields, we replace it back and add it to the
- * validation.
- */
- typedef struct _typeobject {
- PyVarObject ob_base;
- const char *tp_name;
- Py_ssize_t tp_basicsize;
- void *X03; // Py_ssize_t tp_itemsize;
- #ifdef PEP384_INTERN
- destructor tp_dealloc;
- #else
- destructor X04;
- #endif
- void *X05; // Py_ssize_t tp_vectorcall_offset;
- void *X06; // getattrfunc tp_getattr;
- void *X07; // setattrfunc tp_setattr;
- void *X08; // PyAsyncMethods *tp_as_async;
- #ifdef PEP384_INTERN
- reprfunc tp_repr;
- #else
- reprfunc X09;
- #endif
- void *X10; // PyNumberMethods *tp_as_number;
- void *X11; // PySequenceMethods *tp_as_sequence;
- void *X12; // PyMappingMethods *tp_as_mapping;
- void *X13; // hashfunc tp_hash;
- #ifdef PEP384_INTERN
- ternaryfunc tp_call;
- #else
- ternaryfunc X14;
- #endif
- reprfunc tp_str; // Only used for PEP384_INTERN and a shiboken test
- getattrofunc tp_getattro;
- setattrofunc tp_setattro;
- void *X18; // PyBufferProcs *tp_as_buffer;
- unsigned long tp_flags;
- void *X20; // const char *tp_doc;
- #ifdef PEP384_INTERN
- traverseproc tp_traverse;
- inquiry tp_clear;
- #else
- traverseproc X21;
- inquiry X22;
- #endif
- void *X23; // richcmpfunc tp_richcompare;
- Py_ssize_t tp_weaklistoffset;
- void *X25; // getiterfunc tp_iter;
- #ifdef PEP384_INTERN
- iternextfunc tp_iternext;
- #else
- iternextfunc X26;
- #endif
- struct PyMethodDef *tp_methods;
- struct PyMemberDef *tp_members;
- struct PyGetSetDef *tp_getset;
- struct _typeobject *tp_base;
- #ifdef PEP384_INTERN
- PyObject *tp_dict;
- descrgetfunc tp_descr_get;
- descrsetfunc tp_descr_set;
- #else
- void *X31;
- descrgetfunc X32;
- descrsetfunc X33;
- #endif
- Py_ssize_t tp_dictoffset;
- #ifdef PEP384_INTERN
- initproc tp_init;
- allocfunc tp_alloc;
- #else
- initproc X39;
- allocfunc X40;
- #endif
- newfunc tp_new;
- #ifdef PEP384_INTERN
- freefunc tp_free;
- inquiry tp_is_gc; /* For PyObject_IS_GC */
- #else
- freefunc X41;
- inquiry X42; /* For PyObject_IS_GC */
- #endif
- PyObject *tp_bases;
- PyObject *tp_mro; /* method resolution order */
- } PyTypeObject;
- #ifndef PyObject_IS_GC
- /* Test if an object has a GC head */
- #define PyObject_IS_GC(o) \
- (PyType_IS_GC(Py_TYPE(o)) \
- && (Py_TYPE(o)->tp_is_gc == NULL || Py_TYPE(o)->tp_is_gc(o)))
- #endif
- LIBSHIBOKEN_API PyObject *_PepType_Lookup(PyTypeObject *type, PyObject *name);
- #else // Py_LIMITED_API
- #define _PepType_Lookup(type, name) _PyType_Lookup(type, name)
- #endif // Py_LIMITED_API
- /// PYSIDE-939: We need the runtime version, given major << 16 + minor << 8 + micro
- LIBSHIBOKEN_API long _PepRuntimeVersion();
- /*****************************************************************************
- *
- * PYSIDE-535: Implement a clean type extension for PyPy
- *
- */
- struct SbkObjectTypePrivate;
- LIBSHIBOKEN_API SbkObjectTypePrivate *PepType_SOTP(PyTypeObject *type);
- LIBSHIBOKEN_API void PepType_SOTP_delete(PyTypeObject *type);
- struct SbkEnumType;
- struct SbkEnumTypePrivate;
- LIBSHIBOKEN_API SbkEnumTypePrivate *PepType_SETP(SbkEnumType *type);
- LIBSHIBOKEN_API void PepType_SETP_delete(SbkEnumType *enumType);
- struct PySideQFlagsType;
- struct SbkQFlagsTypePrivate;
- /*****************************************************************************/
- // functions used everywhere
- /// (convenience) Return the unqualified type name
- LIBSHIBOKEN_API const char *PepType_GetNameStr(PyTypeObject *type);
- /// (convenience) Return the fully qualified type name(PepType_GetFullyQualifiedNameStr())
- /// as C-string
- LIBSHIBOKEN_API const char *PepType_GetFullyQualifiedNameStr(PyTypeObject *type);
- LIBSHIBOKEN_API PyObject *Pep_GetPartialFunction(void);
- /*****************************************************************************
- *
- * RESOLVED: pydebug.h
- *
- */
- #ifdef Py_LIMITED_API
- /*
- * We have no direct access to Py_VerboseFlag because debugging is not
- * supported. The python developers are partially a bit too rigorous.
- * Instead, we compute the value and use a function call macro.
- * Was before: extern LIBSHIBOKEN_API int Py_VerboseFlag;
- */
- LIBSHIBOKEN_API int Pep_GetFlag(const char *name);
- LIBSHIBOKEN_API int Pep_GetVerboseFlag(void);
- #endif
- #if (defined(Py_LIMITED_API) && Py_LIMITED_API < 0x030C0000) || PY_VERSION_HEX < 0x030C0000
- # define PEP_OLD_ERR_API
- #endif
- // pyerrors.h
- #ifdef PEP_OLD_ERR_API
- LIBSHIBOKEN_API PyObject *PepErr_GetRaisedException();
- LIBSHIBOKEN_API PyObject *PepException_GetArgs(PyObject *ex);
- LIBSHIBOKEN_API void PepException_SetArgs(PyObject *ex, PyObject *args);
- #else
- inline PyObject *PepErr_GetRaisedException() { return PyErr_GetRaisedException(); }
- inline PyObject *PepException_GetArgs(PyObject *ex) { return PyException_GetArgs(ex); }
- inline void PepException_SetArgs(PyObject *ex, PyObject *args)
- { PyException_SetArgs(ex, args); }
- #endif
- /*****************************************************************************
- *
- * RESOLVED: unicodeobject.h
- *
- */
- ///////////////////////////////////////////////////////////////////////
- //
- // PYSIDE-813: About The Length Of Unicode Objects
- // -----------------------------------------------
- //
- // In Python 2 and before Python 3.3, the macro PyUnicode_GET_SIZE
- // worked fine and really like a macro.
- //
- // Meanwhile, the unicode objects have changed their layout very much,
- // and the former cheap macro call has become a real function call
- // that converts objects and needs PyMemory.
- //
- // That is not only inefficient, but also requires the GIL!
- // This problem was visible by debug Python and qdatastream_test.py .
- // It was found while fixing the refcount problem of PYSIDE-813 which
- // needed a debug Python.
- //
- // Unfortunately, we cannot ask this at runtime
- // #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000
- // FIXME: Python 3.10: Replace _PepUnicode_AsString by PyUnicode_AsUTF8
- #ifdef Py_LIMITED_API
- LIBSHIBOKEN_API const char *_PepUnicode_AsString(PyObject *);
- enum PepUnicode_Kind {
- #if PY_VERSION_HEX < 0x030C0000
- PepUnicode_WCHAR_KIND = 0,
- #endif
- PepUnicode_1BYTE_KIND = 1,
- PepUnicode_2BYTE_KIND = 2,
- PepUnicode_4BYTE_KIND = 4
- };
- LIBSHIBOKEN_API int _PepUnicode_KIND(PyObject *);
- LIBSHIBOKEN_API int _PepUnicode_IS_ASCII(PyObject *str);
- LIBSHIBOKEN_API int _PepUnicode_IS_COMPACT(PyObject *str);
- LIBSHIBOKEN_API void *_PepUnicode_DATA(PyObject *str);
- #else
- enum PepUnicode_Kind {
- #if PY_VERSION_HEX < 0x030C0000
- PepUnicode_WCHAR_KIND = PyUnicode_WCHAR_KIND,
- #endif
- PepUnicode_1BYTE_KIND = PyUnicode_1BYTE_KIND,
- PepUnicode_2BYTE_KIND = PyUnicode_2BYTE_KIND,
- PepUnicode_4BYTE_KIND = PyUnicode_4BYTE_KIND
- };
- #define _PepUnicode_AsString PyUnicode_AsUTF8
- #define _PepUnicode_KIND PyUnicode_KIND
- #define _PepUnicode_DATA PyUnicode_DATA
- #define _PepUnicode_IS_COMPACT PyUnicode_IS_COMPACT
- #define _PepUnicode_IS_ASCII PyUnicode_IS_ASCII
- #endif
- /*****************************************************************************
- *
- * RESOLVED: methodobject.h
- *
- */
- #ifdef Py_LIMITED_API
- using PyCFunctionObject = struct _pycfunc;
- #define PepCFunction_GET_NAMESTR(func) \
- _PepUnicode_AsString(PyObject_GetAttrString((PyObject *)func, "__name__"))
- #else
- #define PepCFunction_GET_NAMESTR(func) \
- (reinterpret_cast<const PyCFunctionObject *>(func)->m_ml->ml_name)
- #endif
- /*****************************************************************************
- *
- * RESOLVED: pythonrun.h
- *
- */
- #ifdef Py_LIMITED_API
- LIBSHIBOKEN_API PyObject *PyRun_String(const char *, int, PyObject *, PyObject *);
- #endif
- /*****************************************************************************
- *
- * RESOLVED: funcobject.h
- *
- */
- #ifdef Py_LIMITED_API
- typedef struct _func PyFunctionObject;
- extern LIBSHIBOKEN_API PyTypeObject *PepFunction_TypePtr;
- LIBSHIBOKEN_API PyObject *PepFunction_Get(PyObject *, const char *);
- #define PyFunction_Check(op) (Py_TYPE(op) == PepFunction_TypePtr)
- #define PyFunction_GET_CODE(func) PyFunction_GetCode(func)
- #define PyFunction_GetCode(func) PepFunction_Get((PyObject *)func, "__code__")
- #define PepFunction_GetName(func) PepFunction_Get((PyObject *)func, "__name__")
- #else
- #define PepFunction_TypePtr (&PyFunction_Type)
- #define PepFunction_GetName(func) (((PyFunctionObject *)func)->func_name)
- #endif
- /*****************************************************************************
- *
- * RESOLVED: classobject.h
- *
- */
- #ifdef Py_LIMITED_API
- typedef struct _meth PyMethodObject;
- extern LIBSHIBOKEN_API PyTypeObject *PepMethod_TypePtr;
- LIBSHIBOKEN_API PyObject *PyMethod_New(PyObject *, PyObject *);
- LIBSHIBOKEN_API PyObject *PyMethod_Function(PyObject *);
- LIBSHIBOKEN_API PyObject *PyMethod_Self(PyObject *);
- #define PyMethod_Check(op) ((op)->ob_type == PepMethod_TypePtr)
- #define PyMethod_GET_SELF(op) PyMethod_Self(op)
- #define PyMethod_GET_FUNCTION(op) PyMethod_Function(op)
- #endif
- /*****************************************************************************
- *
- * RESOLVED: code.h
- *
- */
- #ifdef Py_LIMITED_API
- /* Bytecode object */
- // we have to grab the code object from python
- typedef struct _code PepCodeObject;
- LIBSHIBOKEN_API int PepCode_Get(PepCodeObject *co, const char *name);
- LIBSHIBOKEN_API int PepCode_Check(PyObject *o);
- # define PepCode_GET_FLAGS(o) PepCode_Get(o, "co_flags")
- # define PepCode_GET_ARGCOUNT(o) PepCode_Get(o, "co_argcount")
- LIBSHIBOKEN_API PyObject *PepFunction_GetDefaults(PyObject *function);
- /* Masks for co_flags above */
- # define CO_OPTIMIZED 0x0001
- # define CO_NEWLOCALS 0x0002
- # define CO_VARARGS 0x0004
- # define CO_VARKEYWORDS 0x0008
- # define CO_NESTED 0x0010
- # define CO_GENERATOR 0x0020
- #else
- # define PepCodeObject PyCodeObject
- # define PepCode_GET_FLAGS(o) ((o)->co_flags)
- # define PepCode_GET_ARGCOUNT(o) ((o)->co_argcount)
- # define PepCode_Check PyCode_Check
- # ifdef PYPY_VERSION
- LIBSHIBOKEN_API PyObject *PepFunction_GetDefaults(PyObject *function);
- # else
- # define PepFunction_GetDefaults PyFunction_GetDefaults
- # endif
- #endif
- /*****************************************************************************
- *
- * RESOLVED: datetime.h
- *
- */
- #ifdef Py_LIMITED_API
- LIBSHIBOKEN_API int PyDateTime_Get(PyObject *ob, const char *name);
- #define PyDateTime_GetYear(o) PyDateTime_Get(o, "year")
- #define PyDateTime_GetMonth(o) PyDateTime_Get(o, "month")
- #define PyDateTime_GetDay(o) PyDateTime_Get(o, "day")
- #define PyDateTime_GetHour(o) PyDateTime_Get(o, "hour")
- #define PyDateTime_GetMinute(o) PyDateTime_Get(o, "minute")
- #define PyDateTime_GetSecond(o) PyDateTime_Get(o, "second")
- #define PyDateTime_GetMicrosecond(o) PyDateTime_Get(o, "microsecond")
- #define PyDateTime_GetFold(o) PyDateTime_Get(o, "fold")
- #define PyDateTime_GET_YEAR(o) PyDateTime_GetYear(o)
- #define PyDateTime_GET_MONTH(o) PyDateTime_GetMonth(o)
- #define PyDateTime_GET_DAY(o) PyDateTime_GetDay(o)
- #define PyDateTime_DATE_GET_HOUR(o) PyDateTime_GetHour(o)
- #define PyDateTime_DATE_GET_MINUTE(o) PyDateTime_GetMinute(o)
- #define PyDateTime_DATE_GET_SECOND(o) PyDateTime_GetSecond(o)
- #define PyDateTime_DATE_GET_MICROSECOND(o) PyDateTime_GetMicrosecond(o)
- #define PyDateTime_DATE_GET_FOLD(o) PyDateTime_GetFold(o)
- #define PyDateTime_TIME_GET_HOUR(o) PyDateTime_GetHour(o)
- #define PyDateTime_TIME_GET_MINUTE(o) PyDateTime_GetMinute(o)
- #define PyDateTime_TIME_GET_SECOND(o) PyDateTime_GetSecond(o)
- #define PyDateTime_TIME_GET_MICROSECOND(o) PyDateTime_GetMicrosecond(o)
- #define PyDateTime_TIME_GET_FOLD(o) PyDateTime_GetFold(o)
- /* Define structure slightly similar to C API. */
- typedef struct {
- PyObject *module;
- /* type objects */
- PyTypeObject *DateType;
- PyTypeObject *DateTimeType;
- PyTypeObject *TimeType;
- PyTypeObject *DeltaType;
- PyTypeObject *TZInfoType;
- } datetime_struc;
- LIBSHIBOKEN_API datetime_struc *init_DateTime(void);
- #define PyDateTime_IMPORT PyDateTimeAPI = init_DateTime()
- extern LIBSHIBOKEN_API datetime_struc *PyDateTimeAPI;
- #define PyDate_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateType)
- #define PyDateTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateTimeType)
- #define PyTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TimeType)
- LIBSHIBOKEN_API PyObject *PyDate_FromDate(int year, int month, int day);
- LIBSHIBOKEN_API PyObject *PyDateTime_FromDateAndTime(
- int year, int month, int day, int hour, int min, int sec, int usec);
- LIBSHIBOKEN_API PyObject *PyTime_FromTime(
- int hour, int minute, int second, int usecond);
- #endif /* Py_LIMITED_API */
- /*****************************************************************************
- *
- * Extra support for name mangling
- *
- */
- // PYSIDE-772: This function supports the fix, but is not meant as public.
- LIBSHIBOKEN_API PyObject *_Pep_PrivateMangle(PyObject *self, PyObject *name);
- /*****************************************************************************
- *
- * Extra support for signature.cpp
- *
- */
- #ifdef Py_LIMITED_API
- extern LIBSHIBOKEN_API PyTypeObject *PepStaticMethod_TypePtr;
- LIBSHIBOKEN_API PyObject *PyStaticMethod_New(PyObject *callable);
- #else
- #define PepStaticMethod_TypePtr &PyStaticMethod_Type
- #endif
- #ifdef PYPY_VERSION
- extern LIBSHIBOKEN_API PyTypeObject *PepBuiltinMethod_TypePtr;
- #endif
- // Although not PEP specific, we resolve this similar issue, here:
- #define PepMethodDescr_TypePtr &PyMethodDescr_Type
- /*****************************************************************************
- *
- * Newly introduced convenience functions
- *
- * This is not defined if Py_LIMITED_API is defined.
- */
- // Evaluate a script and return the variable `result`
- LIBSHIBOKEN_API PyObject *PepRun_GetResult(const char *command);
- // Call PyType_Type.tp_new returning a PyType object.
- LIBSHIBOKEN_API PyTypeObject *PepType_Type_tp_new(PyTypeObject *metatype,
- PyObject *args,
- PyObject *kwds);
- /*****************************************************************************
- *
- * Runtime support for Python 3.8 incompatibilities
- *
- */
- #ifndef Py_TPFLAGS_METHOD_DESCRIPTOR
- /* Objects behave like an unbound method */
- #define Py_TPFLAGS_METHOD_DESCRIPTOR (1UL << 17)
- #endif
- /*****************************************************************************
- *
- * Runtime support for Python 3.12 incompatibility
- *
- */
- LIBSHIBOKEN_API PyObject *PepType_GetDict(PyTypeObject *type);
- // This function does not exist as PyType_SetDict. But because tp_dict
- // is no longer considered to be accessible, we treat it as such.
- LIBSHIBOKEN_API int PepType_SetDict(PyTypeObject *type, PyObject *dict);
- LIBSHIBOKEN_API void *PepType_GetSlot(PyTypeObject *type, int aSlot);
- // Runtime support for Python 3.13 stable ABI
- // Return dictionary of the global variables in the current execution frame
- LIBSHIBOKEN_API PyObject *PepEval_GetFrameGlobals();
- // Return a dictionary of the builtins in the current execution frame
- LIBSHIBOKEN_API PyObject *PepEval_GetFrameBuiltins();
- LIBSHIBOKEN_API int PepModule_AddType(PyObject *module, PyTypeObject *type);
- LIBSHIBOKEN_API int PepModule_Add(PyObject *module, const char *name, PyObject *value);
- /*****************************************************************************
- *
- * Module Initialization
- *
- */
- LIBSHIBOKEN_API void Pep384_Init(void);
- } // extern "C"
- #endif // PEP384IMPL_H
|