sbkerrors.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright (C) 2022 The Qt Company Ltd.
  2. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
  3. #ifndef SBKERRORS_H
  4. #define SBKERRORS_H
  5. #include "sbkpython.h"
  6. #include "shibokenmacros.h"
  7. #include <memory>
  8. /// Craving for C++20 and std::source_location::current()
  9. #if defined(_MSC_VER)
  10. # define SBK_FUNC_INFO __FUNCSIG__
  11. #elif defined(__GNUC__)
  12. # define SBK_FUNC_INFO __PRETTY_FUNCTION__
  13. #else
  14. # define SBK_FUNC_INFO __FUNCTION__
  15. #endif
  16. namespace Shiboken
  17. {
  18. struct LIBSHIBOKEN_API PythonContextMarker
  19. {
  20. public:
  21. PythonContextMarker(const PythonContextMarker &) = delete;
  22. PythonContextMarker(PythonContextMarker &&) = delete;
  23. PythonContextMarker &operator=(const PythonContextMarker &) = delete;
  24. PythonContextMarker &operator=(PythonContextMarker &&) = delete;
  25. explicit PythonContextMarker();
  26. ~PythonContextMarker();
  27. void setBlocking();
  28. };
  29. namespace Errors
  30. {
  31. struct ErrorStore;
  32. /// Temporarily stash an error set in Python
  33. class Stash
  34. {
  35. public:
  36. Stash(const Stash &) = delete;
  37. Stash &operator=(const Stash &) = delete;
  38. Stash(Stash &&) = delete;
  39. Stash &operator=(Stash &&) = delete;
  40. LIBSHIBOKEN_API Stash();
  41. LIBSHIBOKEN_API ~Stash();
  42. LIBSHIBOKEN_API operator bool() const { return getException() != nullptr; }
  43. [[nodiscard]] LIBSHIBOKEN_API PyObject *getException() const;
  44. /// Restore the stored error
  45. LIBSHIBOKEN_API void restore();
  46. /// Discard the stored error
  47. LIBSHIBOKEN_API void release();
  48. private:
  49. std::unique_ptr<ErrorStore> m_store;
  50. };
  51. LIBSHIBOKEN_API void setIndexOutOfBounds(Py_ssize_t value, Py_ssize_t minValue,
  52. Py_ssize_t maxValue);
  53. LIBSHIBOKEN_API void setInstantiateAbstractClass(const char *name);
  54. LIBSHIBOKEN_API void setInstantiateAbstractClassDisabledWrapper(const char *name);
  55. LIBSHIBOKEN_API void setInstantiateNamespace(const char *name);
  56. LIBSHIBOKEN_API void setInstantiateNonConstructible(const char *name);
  57. LIBSHIBOKEN_API void setInvalidTypeDeletion(const char *name);
  58. LIBSHIBOKEN_API void setOperatorNotImplemented();
  59. LIBSHIBOKEN_API void setPureVirtualMethodError(const char *name);
  60. LIBSHIBOKEN_API void setPrivateMethod(const char *name);
  61. LIBSHIBOKEN_API void setReverseOperatorNotImplemented();
  62. LIBSHIBOKEN_API void setSequenceTypeError(const char *expectedType);
  63. LIBSHIBOKEN_API void setSetterTypeError(const char *name, const char *expectedType);
  64. LIBSHIBOKEN_API void setWrongContainerType();
  65. /// Report an error ASAP: Instead of printing, store for later re-raise.
  66. /// This replaces `PyErr_Print`, which cannot report errors as exception.
  67. /// To be used in contexts where raising errors is impossible.
  68. LIBSHIBOKEN_API void storeErrorOrPrint();
  69. /// Call storeErrorOrPrint() and print the context to report
  70. /// errors when calling Python overrides of virtual functions.
  71. LIBSHIBOKEN_API void storePythonOverrideErrorOrPrint(const char *className, const char *funcName);
  72. /// Handle an error as in PyErr_Occurred(), but also check for errors which
  73. /// were captured by `storeErrorOrPrint`.
  74. /// To be used in normal error checks.
  75. LIBSHIBOKEN_API PyObject *occurred();
  76. } // namespace Errors
  77. namespace Warnings
  78. {
  79. /// Warn about invalid return value of overwritten virtual
  80. LIBSHIBOKEN_API void warnInvalidReturnValue(const char *className, const char *functionName,
  81. const char *expectedType, const char *actualType);
  82. LIBSHIBOKEN_API void warnDeprecated(const char *functionName);
  83. LIBSHIBOKEN_API void warnDeprecated(const char *className, const char *functionName);
  84. LIBSHIBOKEN_API void warnDeprecatedEnum(const char *enumName);
  85. LIBSHIBOKEN_API void warnDeprecatedEnumValue(const char *enumName, const char *valueName);
  86. } // namespace Warnings
  87. } // namespace Shiboken
  88. #endif // SBKERRORS_H