Nuitka-winsvc 1.8__cp311-cp311-win_amd64.whl → 2.4.8__cp311-cp311-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of Nuitka-winsvc might be problematic. Click here for more details.

Files changed (704) hide show
  1. Nuitka_winsvc-1.8.data/scripts/nuitka-run.bat → Nuitka_winsvc-2.4.8.data/scripts/nuitka-run.cmd +9 -9
  2. Nuitka_winsvc-1.8.data/scripts/nuitka.bat → Nuitka_winsvc-2.4.8.data/scripts/nuitka.cmd +15 -15
  3. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/METADATA +4 -3
  4. Nuitka_winsvc-2.4.8.dist-info/RECORD +954 -0
  5. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/WHEEL +1 -1
  6. nuitka/Builtins.py +18 -17
  7. nuitka/BytecodeCaching.py +24 -20
  8. nuitka/Bytecodes.py +23 -19
  9. nuitka/CacheCleanup.py +28 -23
  10. nuitka/Constants.py +19 -17
  11. nuitka/Errors.py +23 -17
  12. nuitka/HardImportRegistry.py +400 -0
  13. nuitka/MainControl.py +200 -112
  14. nuitka/ModuleRegistry.py +83 -20
  15. nuitka/OptionParsing.py +368 -175
  16. nuitka/Options.py +632 -213
  17. nuitka/OutputDirectories.py +40 -21
  18. nuitka/PostProcessing.py +73 -50
  19. nuitka/Progress.py +58 -24
  20. nuitka/PythonFlavors.py +141 -32
  21. nuitka/PythonOperators.py +18 -17
  22. nuitka/PythonVersions.py +106 -19
  23. nuitka/Serialization.py +68 -55
  24. nuitka/SourceCodeReferences.py +19 -17
  25. nuitka/Tracing.py +108 -70
  26. nuitka/TreeXML.py +31 -26
  27. nuitka/Variables.py +39 -41
  28. nuitka/Version.py +21 -7
  29. nuitka/__init__.py +5 -4
  30. nuitka/__main__.py +95 -29
  31. nuitka/__past__.py +44 -34
  32. nuitka/build/Backend.scons +202 -140
  33. nuitka/build/CCompilerVersion.scons +39 -31
  34. nuitka/build/DataComposerInterface.py +20 -17
  35. nuitka/build/Onefile.scons +50 -54
  36. nuitka/build/SconsCaching.py +93 -90
  37. nuitka/build/SconsCompilerSettings.py +157 -69
  38. nuitka/build/SconsHacks.py +25 -19
  39. nuitka/build/SconsInterface.py +154 -54
  40. nuitka/build/SconsProgress.py +19 -18
  41. nuitka/build/SconsSpawn.py +62 -33
  42. nuitka/build/SconsUtils.py +147 -55
  43. nuitka/build/__init__.py +5 -4
  44. nuitka/build/include/nuitka/allocator.h +105 -22
  45. nuitka/build/include/nuitka/builtins.h +17 -17
  46. nuitka/build/include/nuitka/calling.h +18 -18
  47. nuitka/build/include/nuitka/checkers.h +17 -18
  48. nuitka/build/include/nuitka/checksum_tools.h +14 -19
  49. nuitka/build/include/nuitka/compiled_asyncgen.h +18 -18
  50. nuitka/build/include/nuitka/compiled_cell.h +33 -18
  51. nuitka/build/include/nuitka/compiled_coroutine.h +18 -18
  52. nuitka/build/include/nuitka/compiled_frame.h +91 -53
  53. nuitka/build/include/nuitka/compiled_function.h +42 -20
  54. nuitka/build/include/nuitka/compiled_generator.h +24 -18
  55. nuitka/build/include/nuitka/compiled_method.h +17 -18
  56. nuitka/build/include/nuitka/constants.h +29 -18
  57. nuitka/build/include/nuitka/constants_blob.h +17 -17
  58. nuitka/build/include/nuitka/environment_variables.h +30 -0
  59. nuitka/build/include/nuitka/environment_variables_system.h +45 -0
  60. nuitka/build/include/nuitka/exception_groups.h +23 -26
  61. nuitka/build/include/nuitka/exceptions.h +593 -190
  62. nuitka/build/include/nuitka/filesystem_paths.h +26 -20
  63. nuitka/build/include/nuitka/freelists.h +38 -18
  64. nuitka/build/include/nuitka/helper/attributes.h +24 -18
  65. nuitka/build/include/nuitka/helper/boolean.h +17 -17
  66. nuitka/build/include/nuitka/helper/bytearrays.h +17 -17
  67. nuitka/build/include/nuitka/helper/bytes.h +14 -15
  68. nuitka/build/include/nuitka/helper/calling_generated.h +17 -17
  69. nuitka/build/include/nuitka/helper/comparisons_eq.h +17 -17
  70. nuitka/build/include/nuitka/helper/comparisons_ge.h +17 -17
  71. nuitka/build/include/nuitka/helper/comparisons_gt.h +17 -17
  72. nuitka/build/include/nuitka/helper/comparisons_le.h +17 -17
  73. nuitka/build/include/nuitka/helper/comparisons_lt.h +17 -17
  74. nuitka/build/include/nuitka/helper/comparisons_ne.h +17 -17
  75. nuitka/build/include/nuitka/helper/complex.h +17 -17
  76. nuitka/build/include/nuitka/helper/dictionaries.h +24 -22
  77. nuitka/build/include/nuitka/helper/floats.h +17 -18
  78. nuitka/build/include/nuitka/helper/import_hard.h +25 -17
  79. nuitka/build/include/nuitka/helper/indexes.h +17 -18
  80. nuitka/build/include/nuitka/helper/ints.h +32 -20
  81. nuitka/build/include/nuitka/helper/iterators.h +17 -17
  82. nuitka/build/include/nuitka/helper/lists.h +26 -24
  83. nuitka/build/include/nuitka/helper/lists_generated.h +22 -22
  84. nuitka/build/include/nuitka/helper/mappings.h +17 -18
  85. nuitka/build/include/nuitka/helper/operations.h +17 -17
  86. nuitka/build/include/nuitka/helper/operations_binary_add.h +17 -17
  87. nuitka/build/include/nuitka/helper/operations_binary_bitand.h +17 -17
  88. nuitka/build/include/nuitka/helper/operations_binary_bitor.h +17 -17
  89. nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +17 -17
  90. nuitka/build/include/nuitka/helper/operations_binary_divmod.h +17 -17
  91. nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +17 -17
  92. nuitka/build/include/nuitka/helper/operations_binary_lshift.h +17 -17
  93. nuitka/build/include/nuitka/helper/operations_binary_matmult.h +17 -17
  94. nuitka/build/include/nuitka/helper/operations_binary_mod.h +17 -17
  95. nuitka/build/include/nuitka/helper/operations_binary_mult.h +17 -17
  96. nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +17 -17
  97. nuitka/build/include/nuitka/helper/operations_binary_pow.h +17 -17
  98. nuitka/build/include/nuitka/helper/operations_binary_rshift.h +17 -17
  99. nuitka/build/include/nuitka/helper/operations_binary_sub.h +17 -17
  100. nuitka/build/include/nuitka/helper/operations_binary_truediv.h +17 -17
  101. nuitka/build/include/nuitka/helper/operations_builtin_types.h +17 -17
  102. nuitka/build/include/nuitka/helper/operations_inplace_add.h +17 -17
  103. nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +17 -17
  104. nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +17 -17
  105. nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +17 -17
  106. nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +17 -17
  107. nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +17 -17
  108. nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +17 -17
  109. nuitka/build/include/nuitka/helper/operations_inplace_mod.h +17 -17
  110. nuitka/build/include/nuitka/helper/operations_inplace_mult.h +17 -17
  111. nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +17 -17
  112. nuitka/build/include/nuitka/helper/operations_inplace_pow.h +17 -17
  113. nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +17 -17
  114. nuitka/build/include/nuitka/helper/operations_inplace_sub.h +17 -17
  115. nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +17 -17
  116. nuitka/build/include/nuitka/helper/raising.h +29 -17
  117. nuitka/build/include/nuitka/helper/rangeobjects.h +17 -17
  118. nuitka/build/include/nuitka/helper/richcomparisons.h +14 -14
  119. nuitka/build/include/nuitka/helper/sequences.h +19 -13
  120. nuitka/build/include/nuitka/helper/sets.h +11 -12
  121. nuitka/build/include/nuitka/helper/slices.h +31 -25
  122. nuitka/build/include/nuitka/helper/strings.h +16 -17
  123. nuitka/build/include/nuitka/helper/subscripts.h +18 -201
  124. nuitka/build/include/nuitka/helper/tuples.h +64 -52
  125. nuitka/build/include/nuitka/helpers.h +38 -20
  126. nuitka/build/include/nuitka/importing.h +28 -21
  127. nuitka/build/include/nuitka/jit_sources.h +25 -0
  128. nuitka/build/include/nuitka/prelude.h +128 -46
  129. nuitka/build/include/nuitka/printing.h +22 -17
  130. nuitka/build/include/nuitka/python_pgo.h +19 -18
  131. nuitka/build/include/nuitka/safe_string_ops.h +20 -18
  132. nuitka/build/include/nuitka/threading.h +32 -33
  133. nuitka/build/include/nuitka/tracing.h +28 -18
  134. nuitka/build/include/nuitka/type_aliases.h +27 -0
  135. nuitka/build/include/nuitka/unfreezing.h +29 -23
  136. nuitka/build/inline_copy/bin/scons.py +14 -0
  137. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +6 -6
  138. nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +0 -3
  139. nuitka/build/inline_copy/python_hacl/LICENSE.txt +201 -0
  140. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.c +1430 -0
  141. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.h +66 -0
  142. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.c +463 -0
  143. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.h +66 -0
  144. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.c +1273 -0
  145. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.h +204 -0
  146. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.c +734 -0
  147. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.h +131 -0
  148. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Streaming_Types.h +83 -0
  149. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt128_Verified.h +346 -0
  150. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt_8_16_32_64.h +107 -0
  151. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/fstar_uint128_struct_endianness.h +68 -0
  152. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/internal/target.h +293 -0
  153. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/lowstar_endianness.h +231 -0
  154. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/types.h +14 -0
  155. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_MD5.h +56 -0
  156. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA1.h +56 -0
  157. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA2.h +164 -0
  158. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA3.h +65 -0
  159. nuitka/build/inline_copy/python_hacl/hacl_312/python_hacl_namespaces.h +89 -0
  160. nuitka/build/inline_copy/tqdm/tqdm/__init__.py +2 -2
  161. nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +4 -1
  162. nuitka/build/inline_copy/tqdm/tqdm/utils.py +14 -8
  163. nuitka/build/inline_copy/tqdm/tqdm/version.py +1 -8
  164. nuitka/build/inline_copy/zlib/LICENSE +22 -0
  165. nuitka/build/inline_copy/zlib/crc32.c +1049 -0
  166. nuitka/build/inline_copy/zlib/crc32.h +9446 -0
  167. nuitka/build/inline_copy/zlib/zconf.h +551 -0
  168. nuitka/build/inline_copy/zlib/zlib.h +1938 -0
  169. nuitka/build/inline_copy/zlib/zutil.h +275 -0
  170. nuitka/build/static_src/CompiledAsyncgenType.c +176 -182
  171. nuitka/build/static_src/CompiledCellType.c +63 -40
  172. nuitka/build/static_src/CompiledCodeHelpers.c +181 -128
  173. nuitka/build/static_src/CompiledCoroutineType.c +196 -203
  174. nuitka/build/static_src/CompiledFrameType.c +287 -133
  175. nuitka/build/static_src/CompiledFunctionType.c +389 -95
  176. nuitka/build/static_src/CompiledGeneratorType.c +376 -252
  177. nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +185 -198
  178. nuitka/build/static_src/CompiledMethodType.c +83 -71
  179. nuitka/build/static_src/HelpersAllocator.c +88 -19
  180. nuitka/build/static_src/HelpersAttributes.c +33 -54
  181. nuitka/build/static_src/HelpersBuiltin.c +43 -33
  182. nuitka/build/static_src/HelpersBuiltinTypeMethods.c +17 -17
  183. nuitka/build/static_src/HelpersBytes.c +19 -20
  184. nuitka/build/static_src/HelpersCalling.c +33 -30
  185. nuitka/build/static_src/HelpersCallingGenerated.c +1000 -181
  186. nuitka/build/static_src/HelpersChecksumTools.c +35 -21
  187. nuitka/build/static_src/HelpersClasses.c +17 -17
  188. nuitka/build/static_src/HelpersComparisonEq.c +518 -492
  189. nuitka/build/static_src/HelpersComparisonEqUtils.c +21 -19
  190. nuitka/build/static_src/HelpersComparisonGe.c +513 -497
  191. nuitka/build/static_src/HelpersComparisonGt.c +512 -496
  192. nuitka/build/static_src/HelpersComparisonLe.c +513 -497
  193. nuitka/build/static_src/HelpersComparisonLt.c +512 -496
  194. nuitka/build/static_src/HelpersComparisonNe.c +520 -492
  195. nuitka/build/static_src/HelpersConsole.c +96 -0
  196. nuitka/build/static_src/HelpersConstantsBlob.c +542 -519
  197. nuitka/build/static_src/HelpersDeepcopy.c +33 -33
  198. nuitka/build/static_src/HelpersDictionaries.c +51 -29
  199. nuitka/build/static_src/HelpersDictionariesGenerated.c +177 -68
  200. nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
  201. nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
  202. nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +93 -0
  203. nuitka/build/static_src/HelpersExceptions.c +161 -50
  204. nuitka/build/static_src/HelpersFiles.c +37 -17
  205. nuitka/build/static_src/HelpersFilesystemPaths.c +292 -181
  206. nuitka/build/static_src/HelpersFloats.c +37 -31
  207. nuitka/build/static_src/HelpersHeapStorage.c +21 -17
  208. nuitka/build/static_src/HelpersImport.c +48 -20
  209. nuitka/build/static_src/HelpersImportHard.c +53 -17
  210. nuitka/build/static_src/HelpersJitSources.c +46 -0
  211. nuitka/build/static_src/HelpersLists.c +140 -50
  212. nuitka/build/static_src/HelpersListsGenerated.c +41 -41
  213. nuitka/build/static_src/HelpersMappings.c +17 -17
  214. nuitka/build/static_src/HelpersMatching.c +137 -51
  215. nuitka/build/static_src/HelpersOperationBinaryAdd.c +173 -146
  216. nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +99 -52
  217. nuitka/build/static_src/HelpersOperationBinaryBitand.c +50 -50
  218. nuitka/build/static_src/HelpersOperationBinaryBitor.c +50 -50
  219. nuitka/build/static_src/HelpersOperationBinaryBitxor.c +50 -50
  220. nuitka/build/static_src/HelpersOperationBinaryDivmod.c +41 -41
  221. nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +17 -17
  222. nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +41 -41
  223. nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +20 -21
  224. nuitka/build/static_src/HelpersOperationBinaryLshift.c +47 -47
  225. nuitka/build/static_src/HelpersOperationBinaryMatmult.c +24 -24
  226. nuitka/build/static_src/HelpersOperationBinaryMod.c +107 -107
  227. nuitka/build/static_src/HelpersOperationBinaryMult.c +81 -75
  228. nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +33 -30
  229. nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +41 -41
  230. nuitka/build/static_src/HelpersOperationBinaryPow.c +44 -44
  231. nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +12 -12
  232. nuitka/build/static_src/HelpersOperationBinaryRshift.c +47 -47
  233. nuitka/build/static_src/HelpersOperationBinarySub.c +80 -80
  234. nuitka/build/static_src/HelpersOperationBinaryTruediv.c +41 -41
  235. nuitka/build/static_src/HelpersOperationInplaceAdd.c +171 -153
  236. nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +24 -22
  237. nuitka/build/static_src/HelpersOperationInplaceBitand.c +53 -53
  238. nuitka/build/static_src/HelpersOperationInplaceBitor.c +53 -53
  239. nuitka/build/static_src/HelpersOperationInplaceBitxor.c +53 -53
  240. nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +62 -62
  241. nuitka/build/static_src/HelpersOperationInplaceLshift.c +44 -44
  242. nuitka/build/static_src/HelpersOperationInplaceMatmult.c +37 -37
  243. nuitka/build/static_src/HelpersOperationInplaceMod.c +134 -134
  244. nuitka/build/static_src/HelpersOperationInplaceMult.c +78 -78
  245. nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +62 -62
  246. nuitka/build/static_src/HelpersOperationInplacePow.c +62 -62
  247. nuitka/build/static_src/HelpersOperationInplaceRshift.c +44 -44
  248. nuitka/build/static_src/HelpersOperationInplaceSub.c +112 -112
  249. nuitka/build/static_src/HelpersOperationInplaceTruediv.c +62 -62
  250. nuitka/build/static_src/HelpersProfiling.c +24 -23
  251. nuitka/build/static_src/HelpersPythonPgo.c +22 -22
  252. nuitka/build/static_src/HelpersRaising.c +88 -20
  253. nuitka/build/static_src/HelpersSafeStrings.c +34 -22
  254. nuitka/build/static_src/HelpersSequences.c +18 -19
  255. nuitka/build/static_src/HelpersSlices.c +29 -23
  256. nuitka/build/static_src/HelpersStrings.c +234 -37
  257. nuitka/build/static_src/HelpersTuples.c +46 -34
  258. nuitka/build/static_src/HelpersTypes.c +68 -23
  259. nuitka/build/static_src/InspectPatcher.c +108 -27
  260. nuitka/build/static_src/MainProgram.c +359 -263
  261. nuitka/build/static_src/MetaPathBasedLoader.c +367 -242
  262. nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +39 -26
  263. nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +17 -18
  264. nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +97 -22
  265. nuitka/build/static_src/OnefileBootstrap.c +276 -164
  266. nuitka/build/static_src/OnefileSplashScreen.cpp +51 -27
  267. nuitka/code_generation/AsyncgenCodes.py +19 -17
  268. nuitka/code_generation/AttributeCodes.py +31 -27
  269. nuitka/code_generation/BinaryOperationHelperDefinitions.py +24 -20
  270. nuitka/code_generation/BranchCodes.py +19 -17
  271. nuitka/code_generation/BuiltinCodes.py +20 -17
  272. nuitka/code_generation/CallCodes.py +19 -17
  273. nuitka/code_generation/ClassCodes.py +19 -17
  274. nuitka/code_generation/CodeGeneration.py +48 -27
  275. nuitka/code_generation/CodeHelperSelection.py +19 -17
  276. nuitka/code_generation/CodeHelpers.py +24 -20
  277. nuitka/code_generation/CodeObjectCodes.py +34 -24
  278. nuitka/code_generation/ComparisonCodes.py +38 -20
  279. nuitka/code_generation/ComparisonHelperDefinitions.py +19 -17
  280. nuitka/code_generation/ConditionalCodes.py +19 -17
  281. nuitka/code_generation/ConstantCodes.py +82 -28
  282. nuitka/code_generation/Contexts.py +152 -26
  283. nuitka/code_generation/CoroutineCodes.py +19 -17
  284. nuitka/code_generation/CtypesCodes.py +19 -17
  285. nuitka/code_generation/DictCodes.py +25 -23
  286. nuitka/code_generation/Emission.py +21 -18
  287. nuitka/code_generation/ErrorCodes.py +27 -33
  288. nuitka/code_generation/EvalCodes.py +24 -20
  289. nuitka/code_generation/ExceptionCodes.py +27 -18
  290. nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +20 -17
  291. nuitka/code_generation/ExpressionCodes.py +19 -17
  292. nuitka/code_generation/FrameCodes.py +24 -20
  293. nuitka/code_generation/FunctionCodes.py +24 -21
  294. nuitka/code_generation/GeneratorCodes.py +23 -20
  295. nuitka/code_generation/GlobalConstants.py +43 -23
  296. nuitka/code_generation/GlobalsLocalsCodes.py +21 -19
  297. nuitka/code_generation/IdCodes.py +19 -17
  298. nuitka/code_generation/ImportCodes.py +90 -50
  299. nuitka/code_generation/Indentation.py +23 -22
  300. nuitka/code_generation/IndexCodes.py +19 -17
  301. nuitka/code_generation/InjectCCodes.py +14 -12
  302. nuitka/code_generation/IntegerCodes.py +19 -17
  303. nuitka/code_generation/IteratorCodes.py +19 -17
  304. nuitka/code_generation/JitCodes.py +44 -0
  305. nuitka/code_generation/LabelCodes.py +19 -17
  306. nuitka/code_generation/LineNumberCodes.py +19 -17
  307. nuitka/code_generation/ListCodes.py +32 -36
  308. nuitka/code_generation/LoaderCodes.py +22 -17
  309. nuitka/code_generation/LocalsDictCodes.py +56 -32
  310. nuitka/code_generation/LoopCodes.py +19 -17
  311. nuitka/code_generation/MatchCodes.py +42 -22
  312. nuitka/code_generation/ModuleCodes.py +43 -25
  313. nuitka/code_generation/Namify.py +27 -23
  314. nuitka/code_generation/NetworkxCodes.py +51 -0
  315. nuitka/code_generation/OperationCodes.py +29 -31
  316. nuitka/code_generation/PackageResourceCodes.py +59 -23
  317. nuitka/code_generation/PrintCodes.py +19 -17
  318. nuitka/code_generation/PythonAPICodes.py +19 -17
  319. nuitka/code_generation/RaisingCodes.py +19 -17
  320. nuitka/code_generation/Reports.py +19 -17
  321. nuitka/code_generation/ReturnCodes.py +19 -17
  322. nuitka/code_generation/SetCodes.py +19 -17
  323. nuitka/code_generation/SliceCodes.py +22 -20
  324. nuitka/code_generation/StringCodes.py +19 -17
  325. nuitka/code_generation/SubscriptCodes.py +24 -30
  326. nuitka/code_generation/TensorflowCodes.py +54 -0
  327. nuitka/code_generation/TryCodes.py +19 -17
  328. nuitka/code_generation/TupleCodes.py +20 -18
  329. nuitka/code_generation/TypeAliasCodes.py +71 -0
  330. nuitka/code_generation/VariableCodes.py +26 -22
  331. nuitka/code_generation/VariableDeclarations.py +20 -17
  332. nuitka/code_generation/YieldCodes.py +22 -20
  333. nuitka/code_generation/__init__.py +5 -4
  334. nuitka/code_generation/c_types/CTypeBases.py +19 -17
  335. nuitka/code_generation/c_types/CTypeBooleans.py +19 -17
  336. nuitka/code_generation/c_types/CTypeCFloats.py +19 -17
  337. nuitka/code_generation/c_types/CTypeCLongs.py +19 -18
  338. nuitka/code_generation/c_types/CTypeModuleDictVariables.py +19 -17
  339. nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +19 -17
  340. nuitka/code_generation/c_types/CTypeNuitkaInts.py +19 -18
  341. nuitka/code_generation/c_types/CTypeNuitkaVoids.py +19 -17
  342. nuitka/code_generation/c_types/CTypePyObjectPointers.py +27 -25
  343. nuitka/code_generation/c_types/CTypeVoids.py +20 -17
  344. nuitka/code_generation/c_types/__init__.py +5 -4
  345. nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +18 -17
  346. nuitka/code_generation/templates/CodeTemplatesConstants.py +132 -36
  347. nuitka/code_generation/templates/CodeTemplatesCoroutines.py +18 -17
  348. nuitka/code_generation/templates/CodeTemplatesExceptions.py +19 -18
  349. nuitka/code_generation/templates/CodeTemplatesFrames.py +18 -17
  350. nuitka/code_generation/templates/CodeTemplatesFunction.py +18 -17
  351. nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +19 -17
  352. nuitka/code_generation/templates/CodeTemplatesIterators.py +18 -18
  353. nuitka/code_generation/templates/CodeTemplatesLoader.py +25 -19
  354. nuitka/code_generation/templates/CodeTemplatesModules.py +244 -165
  355. nuitka/code_generation/templates/CodeTemplatesVariables.py +42 -27
  356. nuitka/code_generation/templates/TemplateDebugWrapper.py +19 -18
  357. nuitka/code_generation/templates/__init__.py +5 -4
  358. nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +19 -19
  359. nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +18 -18
  360. nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +76 -25
  361. nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +22 -22
  362. nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +19 -19
  363. nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +19 -19
  364. nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +17 -17
  365. nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +121 -48
  366. nuitka/code_generation/templates_c/HelperImportHard.c.j2 +18 -18
  367. nuitka/code_generation/templates_c/HelperLongTools.c.j2 +18 -18
  368. nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +6 -6
  369. nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +23 -23
  370. nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +35 -35
  371. nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +28 -28
  372. nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +17 -17
  373. nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +18 -18
  374. nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +44 -32
  375. nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +20 -20
  376. nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +28 -28
  377. nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +24 -24
  378. nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +33 -29
  379. nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +20 -20
  380. nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +27 -27
  381. nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +17 -17
  382. nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +17 -17
  383. nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +17 -17
  384. nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +17 -17
  385. nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +21 -18
  386. nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +26 -24
  387. nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +17 -17
  388. nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +17 -17
  389. nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +21 -18
  390. nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +17 -17
  391. nuitka/containers/Namedtuples.py +19 -18
  392. nuitka/containers/OrderedSetsFallback.py +19 -17
  393. nuitka/containers/__init__.py +5 -4
  394. nuitka/distutils/Build.py +19 -18
  395. nuitka/distutils/DistutilCommands.py +34 -23
  396. nuitka/distutils/__init__.py +5 -4
  397. nuitka/finalizations/Finalization.py +20 -17
  398. nuitka/finalizations/FinalizeMarkups.py +21 -41
  399. nuitka/finalizations/__init__.py +5 -4
  400. nuitka/freezer/DependsExe.py +48 -28
  401. nuitka/freezer/DllDependenciesCommon.py +47 -20
  402. nuitka/freezer/DllDependenciesMacOS.py +147 -57
  403. nuitka/freezer/DllDependenciesPosix.py +29 -19
  404. nuitka/freezer/DllDependenciesWin32.py +29 -21
  405. nuitka/freezer/ImportDetection.py +20 -17
  406. nuitka/freezer/IncludedDataFiles.py +118 -47
  407. nuitka/freezer/IncludedEntryPoints.py +102 -38
  408. nuitka/freezer/Onefile.py +32 -22
  409. nuitka/freezer/Standalone.py +105 -50
  410. nuitka/freezer/__init__.py +5 -4
  411. nuitka/importing/IgnoreListing.py +19 -17
  412. nuitka/importing/ImportCache.py +24 -21
  413. nuitka/importing/ImportResolving.py +103 -95
  414. nuitka/importing/Importing.py +286 -92
  415. nuitka/importing/PreloadedPackages.py +21 -18
  416. nuitka/importing/Recursion.py +131 -47
  417. nuitka/importing/StandardLibrary.py +46 -28
  418. nuitka/importing/__init__.py +5 -4
  419. nuitka/nodes/AsyncgenNodes.py +19 -17
  420. nuitka/nodes/AttributeLookupNodes.py +19 -17
  421. nuitka/nodes/AttributeNodes.py +19 -17
  422. nuitka/nodes/AttributeNodesGenerated.py +49 -24
  423. nuitka/nodes/BuiltinAllNodes.py +19 -17
  424. nuitka/nodes/BuiltinAnyNodes.py +19 -17
  425. nuitka/nodes/BuiltinComplexNodes.py +20 -17
  426. nuitka/nodes/BuiltinDecodingNodes.py +19 -17
  427. nuitka/nodes/BuiltinDecoratorNodes.py +19 -17
  428. nuitka/nodes/BuiltinDictNodes.py +19 -17
  429. nuitka/nodes/BuiltinFormatNodes.py +20 -17
  430. nuitka/nodes/BuiltinHashNodes.py +19 -17
  431. nuitka/nodes/BuiltinInputNodes.py +19 -17
  432. nuitka/nodes/BuiltinIntegerNodes.py +19 -17
  433. nuitka/nodes/BuiltinIteratorNodes.py +24 -20
  434. nuitka/nodes/BuiltinLenNodes.py +19 -17
  435. nuitka/nodes/BuiltinNextNodes.py +19 -17
  436. nuitka/nodes/BuiltinOpenNodes.py +52 -18
  437. nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +40 -23
  438. nuitka/nodes/BuiltinRangeNodes.py +21 -19
  439. nuitka/nodes/BuiltinRefNodes.py +68 -19
  440. nuitka/nodes/BuiltinSumNodes.py +20 -18
  441. nuitka/nodes/BuiltinTypeNodes.py +19 -17
  442. nuitka/nodes/BuiltinVarsNodes.py +19 -18
  443. nuitka/nodes/BytesNodes.py +19 -17
  444. nuitka/nodes/CallNodes.py +19 -17
  445. nuitka/nodes/Checkers.py +19 -17
  446. nuitka/nodes/ChildrenHavingMixins.py +1250 -302
  447. nuitka/nodes/ClassNodes.py +49 -29
  448. nuitka/nodes/CodeObjectSpecs.py +29 -18
  449. nuitka/nodes/ComparisonNodes.py +19 -17
  450. nuitka/nodes/ConditionalNodes.py +21 -23
  451. nuitka/nodes/ConstantRefNodes.py +57 -17
  452. nuitka/nodes/ContainerMakingNodes.py +19 -17
  453. nuitka/nodes/ContainerOperationNodes.py +19 -17
  454. nuitka/nodes/CoroutineNodes.py +19 -17
  455. nuitka/nodes/CtypesNodes.py +19 -18
  456. nuitka/nodes/DictionaryNodes.py +19 -18
  457. nuitka/nodes/ExceptionNodes.py +29 -17
  458. nuitka/nodes/ExecEvalNodes.py +19 -17
  459. nuitka/nodes/ExpressionBases.py +34 -26
  460. nuitka/nodes/ExpressionBasesGenerated.py +54 -32
  461. nuitka/nodes/ExpressionShapeMixins.py +19 -17
  462. nuitka/nodes/FrameNodes.py +19 -17
  463. nuitka/nodes/FunctionAttributeNodes.py +19 -17
  464. nuitka/nodes/FunctionNodes.py +81 -35
  465. nuitka/nodes/FutureSpecs.py +35 -20
  466. nuitka/nodes/GeneratorNodes.py +21 -19
  467. nuitka/nodes/GlobalsLocalsNodes.py +22 -17
  468. nuitka/nodes/HardImportNodesGenerated.py +545 -129
  469. nuitka/nodes/ImportHardNodes.py +46 -38
  470. nuitka/nodes/ImportNodes.py +436 -446
  471. nuitka/nodes/IndicatorMixins.py +19 -17
  472. nuitka/nodes/InjectCNodes.py +19 -18
  473. nuitka/nodes/IterationHandles.py +55 -34
  474. nuitka/nodes/KeyValuePairNodes.py +19 -17
  475. nuitka/nodes/ListOperationNodes.py +33 -21
  476. nuitka/nodes/LocalsDictNodes.py +19 -17
  477. nuitka/nodes/LocalsScopes.py +41 -41
  478. nuitka/nodes/LoopNodes.py +28 -17
  479. nuitka/nodes/MatchNodes.py +37 -24
  480. nuitka/nodes/ModuleAttributeNodes.py +18 -35
  481. nuitka/nodes/ModuleNodes.py +90 -31
  482. nuitka/nodes/NetworkxNodes.py +45 -0
  483. nuitka/nodes/NodeBases.py +45 -43
  484. nuitka/nodes/NodeMakingHelpers.py +21 -19
  485. nuitka/nodes/NodeMetaClasses.py +45 -28
  486. nuitka/nodes/OperatorNodes.py +28 -26
  487. nuitka/nodes/OperatorNodesUnary.py +20 -17
  488. nuitka/nodes/OsSysNodes.py +66 -18
  489. nuitka/nodes/OutlineNodes.py +22 -20
  490. nuitka/nodes/PackageMetadataNodes.py +37 -27
  491. nuitka/nodes/PackageResourceNodes.py +29 -23
  492. nuitka/nodes/PrintNodes.py +19 -17
  493. nuitka/nodes/ReturnNodes.py +20 -18
  494. nuitka/nodes/SideEffectNodes.py +19 -17
  495. nuitka/nodes/SliceNodes.py +20 -18
  496. nuitka/nodes/StatementBasesGenerated.py +125 -77
  497. nuitka/nodes/StatementNodes.py +19 -17
  498. nuitka/nodes/StrNodes.py +19 -17
  499. nuitka/nodes/StringConcatenationNodes.py +20 -17
  500. nuitka/nodes/SubscriptNodes.py +26 -24
  501. nuitka/nodes/TensorflowNodes.py +38 -0
  502. nuitka/nodes/TryNodes.py +19 -17
  503. nuitka/nodes/TypeMatchNodes.py +19 -17
  504. nuitka/nodes/TypeNodes.py +40 -17
  505. nuitka/nodes/VariableAssignNodes.py +122 -64
  506. nuitka/nodes/VariableDelNodes.py +19 -17
  507. nuitka/nodes/VariableNameNodes.py +19 -17
  508. nuitka/nodes/VariableRefNodes.py +63 -26
  509. nuitka/nodes/VariableReleaseNodes.py +19 -17
  510. nuitka/nodes/YieldNodes.py +21 -19
  511. nuitka/nodes/__init__.py +5 -4
  512. nuitka/nodes/shapes/BuiltinTypeShapes.py +145 -39
  513. nuitka/nodes/shapes/ControlFlowDescriptions.py +19 -17
  514. nuitka/nodes/shapes/ShapeMixins.py +40 -17
  515. nuitka/nodes/shapes/StandardShapes.py +27 -20
  516. nuitka/nodes/shapes/__init__.py +5 -4
  517. nuitka/optimizations/BytecodeDemotion.py +19 -17
  518. nuitka/optimizations/FunctionInlining.py +22 -23
  519. nuitka/optimizations/Graphs.py +19 -17
  520. nuitka/optimizations/Optimization.py +39 -35
  521. nuitka/optimizations/OptimizeBuiltinCalls.py +31 -27
  522. nuitka/optimizations/Tags.py +19 -18
  523. nuitka/optimizations/TraceCollections.py +67 -24
  524. nuitka/optimizations/ValueTraces.py +92 -25
  525. nuitka/optimizations/__init__.py +5 -4
  526. nuitka/pgo/PGO.py +33 -23
  527. nuitka/pgo/__init__.py +5 -4
  528. nuitka/plugins/PluginBase.py +610 -109
  529. nuitka/plugins/Plugins.py +241 -58
  530. nuitka/plugins/YamlPluginBase.py +121 -0
  531. nuitka/plugins/__init__.py +5 -4
  532. nuitka/plugins/standard/AntiBloatPlugin.py +357 -129
  533. nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +20 -19
  534. nuitka/plugins/standard/DataFilesPlugin.py +65 -29
  535. nuitka/plugins/standard/DelvewheelPlugin.py +32 -24
  536. nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
  537. nuitka/plugins/standard/DillPlugin/dill-postLoad.py +256 -0
  538. nuitka/plugins/standard/DillPlugin.py +42 -134
  539. nuitka/plugins/standard/DllFilesPlugin.py +125 -42
  540. nuitka/plugins/standard/EnumPlugin.py +19 -17
  541. nuitka/plugins/standard/EventletPlugin.py +19 -17
  542. nuitka/plugins/standard/GeventPlugin.py +19 -17
  543. nuitka/plugins/standard/GiPlugin.py +44 -28
  544. nuitka/plugins/standard/GlfwPlugin.py +20 -17
  545. nuitka/plugins/standard/ImplicitImports.py +407 -46
  546. nuitka/plugins/standard/KivyPlugin.py +30 -17
  547. nuitka/plugins/standard/MatplotlibPlugin.py +88 -42
  548. nuitka/plugins/standard/MultiprocessingPlugin.py +25 -20
  549. nuitka/plugins/standard/NumpyPlugin.py +19 -17
  550. nuitka/plugins/standard/OptionsNannyPlugin.py +48 -76
  551. nuitka/plugins/standard/PbrPlugin.py +21 -19
  552. nuitka/plugins/standard/PkgResourcesPlugin.py +34 -23
  553. nuitka/plugins/standard/PmwPlugin.py +30 -27
  554. nuitka/plugins/standard/PySidePyQtPlugin.py +74 -80
  555. nuitka/plugins/standard/PywebViewPlugin.py +19 -17
  556. nuitka/plugins/standard/SpacyPlugin.py +136 -0
  557. nuitka/plugins/standard/TensorflowPlugin.py +20 -17
  558. nuitka/plugins/standard/TkinterPlugin.py +103 -53
  559. nuitka/plugins/standard/TorchPlugin.py +20 -17
  560. nuitka/plugins/standard/TransformersPlugin.py +94 -30
  561. nuitka/plugins/standard/TrioPlugin.py +18 -15
  562. nuitka/plugins/standard/UpxPlugin.py +21 -19
  563. nuitka/plugins/standard/__init__.py +5 -4
  564. nuitka/plugins/standard/standard.nuitka-package.config.yml +3449 -1299
  565. nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +14 -14
  566. nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +121 -66
  567. nuitka/reports/CompilationReportReader.py +67 -0
  568. nuitka/reports/LicenseReport.rst.j2 +21 -21
  569. nuitka/reports/Reports.py +352 -76
  570. nuitka/reports/__init__.py +5 -4
  571. nuitka/specs/BuiltinBytesOperationSpecs.py +18 -17
  572. nuitka/specs/BuiltinDictOperationSpecs.py +18 -17
  573. nuitka/specs/BuiltinListOperationSpecs.py +18 -17
  574. nuitka/specs/BuiltinParameterSpecs.py +30 -20
  575. nuitka/specs/BuiltinStrOperationSpecs.py +19 -18
  576. nuitka/specs/BuiltinTypeOperationSpecs.py +18 -18
  577. nuitka/specs/BuiltinUnicodeOperationSpecs.py +18 -17
  578. nuitka/specs/HardImportSpecs.py +67 -22
  579. nuitka/specs/ParameterSpecs.py +56 -41
  580. nuitka/specs/__init__.py +5 -4
  581. nuitka/tools/Basics.py +20 -18
  582. nuitka/tools/__init__.py +5 -4
  583. nuitka/tools/commercial/__init__.py +7 -6
  584. nuitka/tools/data_composer/DataComposer.py +78 -62
  585. nuitka/tools/data_composer/__init__.py +5 -4
  586. nuitka/tools/data_composer/__main__.py +18 -17
  587. nuitka/tools/environments/CreateEnvironment.py +20 -17
  588. nuitka/tools/environments/Virtualenv.py +60 -32
  589. nuitka/tools/environments/__init__.py +5 -4
  590. nuitka/tools/general/__init__.py +5 -4
  591. nuitka/tools/general/dll_report/__init__.py +5 -4
  592. nuitka/tools/general/dll_report/__main__.py +19 -21
  593. nuitka/tools/general/find_module/FindModuleCode.py +35 -22
  594. nuitka/tools/general/find_module/__init__.py +5 -4
  595. nuitka/tools/onefile_compressor/OnefileCompressor.py +213 -131
  596. nuitka/tools/onefile_compressor/__init__.py +5 -4
  597. nuitka/tools/onefile_compressor/__main__.py +18 -17
  598. nuitka/tools/podman/Podman.py +19 -17
  599. nuitka/tools/podman/__init__.py +5 -4
  600. nuitka/tools/podman/__main__.py +35 -19
  601. nuitka/tools/profiler/__init__.py +5 -4
  602. nuitka/tools/profiler/__main__.py +18 -17
  603. nuitka/tools/scanning/DisplayPackageDLLs.py +47 -22
  604. nuitka/tools/scanning/DisplayPackageData.py +31 -19
  605. nuitka/tools/scanning/__init__.py +5 -4
  606. nuitka/tools/specialize/CTypeDescriptions.py +93 -71
  607. nuitka/tools/specialize/Common.py +18 -17
  608. nuitka/tools/specialize/SpecializeC.py +31 -27
  609. nuitka/tools/specialize/SpecializePython.py +108 -45
  610. nuitka/tools/specialize/__init__.py +5 -4
  611. nuitka/tools/testing/Common.py +106 -52
  612. nuitka/tools/testing/Constructs.py +19 -17
  613. nuitka/tools/testing/OutputComparison.py +54 -18
  614. nuitka/tools/testing/Pythons.py +19 -18
  615. nuitka/tools/testing/RuntimeTracing.py +20 -19
  616. nuitka/tools/testing/SearchModes.py +26 -20
  617. nuitka/tools/testing/Valgrind.py +19 -17
  618. nuitka/tools/testing/__init__.py +5 -4
  619. nuitka/tools/testing/check_reference_counts/__init__.py +5 -4
  620. nuitka/tools/testing/check_reference_counts/__main__.py +18 -18
  621. nuitka/tools/testing/compare_with_cpython/__init__.py +5 -4
  622. nuitka/tools/testing/compare_with_cpython/__main__.py +36 -29
  623. nuitka/tools/testing/find_sxs_modules/__init__.py +5 -4
  624. nuitka/tools/testing/find_sxs_modules/__main__.py +17 -17
  625. nuitka/tools/testing/measure_construct_performance/__init__.py +5 -4
  626. nuitka/tools/testing/measure_construct_performance/__main__.py +22 -25
  627. nuitka/tools/testing/run_nuitka_tests/__init__.py +5 -4
  628. nuitka/tools/testing/run_nuitka_tests/__main__.py +57 -40
  629. nuitka/tools/watch/AutoStage.py +144 -0
  630. nuitka/tools/watch/GitHub.py +113 -0
  631. nuitka/tools/watch/__init__.py +5 -4
  632. nuitka/tools/watch/__main__.py +322 -91
  633. nuitka/tree/Building.py +176 -147
  634. nuitka/tree/ComplexCallHelperFunctions.py +80 -58
  635. nuitka/tree/Extractions.py +19 -17
  636. nuitka/tree/InternalModule.py +29 -20
  637. nuitka/tree/Operations.py +19 -17
  638. nuitka/tree/ReformulationAssertStatements.py +20 -17
  639. nuitka/tree/ReformulationAssignmentStatements.py +92 -91
  640. nuitka/tree/ReformulationBooleanExpressions.py +19 -17
  641. nuitka/tree/ReformulationCallExpressions.py +20 -18
  642. nuitka/tree/ReformulationClasses.py +45 -39
  643. nuitka/tree/ReformulationClasses3.py +146 -98
  644. nuitka/tree/ReformulationComparisonExpressions.py +29 -35
  645. nuitka/tree/ReformulationContractionExpressions.py +58 -55
  646. nuitka/tree/ReformulationDictionaryCreation.py +40 -35
  647. nuitka/tree/ReformulationExecStatements.py +42 -39
  648. nuitka/tree/ReformulationForLoopStatements.py +30 -34
  649. nuitka/tree/ReformulationFunctionStatements.py +58 -54
  650. nuitka/tree/ReformulationImportStatements.py +34 -29
  651. nuitka/tree/ReformulationLambdaExpressions.py +23 -24
  652. nuitka/tree/ReformulationMatchStatements.py +244 -92
  653. nuitka/tree/ReformulationMultidist.py +22 -18
  654. nuitka/tree/ReformulationNamespacePackages.py +55 -46
  655. nuitka/tree/ReformulationPrintStatements.py +23 -24
  656. nuitka/tree/ReformulationSequenceCreation.py +50 -49
  657. nuitka/tree/ReformulationSubscriptExpressions.py +19 -17
  658. nuitka/tree/ReformulationTryExceptStatements.py +19 -17
  659. nuitka/tree/ReformulationTryFinallyStatements.py +34 -17
  660. nuitka/tree/ReformulationWhileLoopStatements.py +19 -17
  661. nuitka/tree/ReformulationWithStatements.py +39 -41
  662. nuitka/tree/ReformulationYieldExpressions.py +21 -19
  663. nuitka/tree/SourceHandling.py +76 -31
  664. nuitka/tree/SyntaxErrors.py +19 -17
  665. nuitka/tree/TreeHelpers.py +33 -20
  666. nuitka/tree/VariableClosure.py +35 -39
  667. nuitka/tree/__init__.py +5 -4
  668. nuitka/utils/AppDirs.py +41 -20
  669. nuitka/utils/CStrings.py +66 -21
  670. nuitka/utils/CommandLineOptions.py +84 -19
  671. nuitka/utils/Distributions.py +445 -54
  672. nuitka/utils/Download.py +89 -57
  673. nuitka/utils/Execution.py +73 -34
  674. nuitka/utils/FileOperations.py +318 -74
  675. nuitka/utils/Hashing.py +55 -33
  676. nuitka/utils/Images.py +26 -19
  677. nuitka/utils/Importing.py +118 -24
  678. nuitka/utils/InstalledPythons.py +80 -75
  679. nuitka/utils/InstanceCounters.py +20 -17
  680. nuitka/utils/Jinja2.py +30 -22
  681. nuitka/utils/Json.py +19 -17
  682. nuitka/utils/MacOSApp.py +26 -18
  683. nuitka/utils/MemoryUsage.py +20 -18
  684. nuitka/utils/ModuleNames.py +42 -26
  685. nuitka/utils/ReExecute.py +50 -28
  686. nuitka/utils/Rest.py +20 -17
  687. nuitka/utils/SharedLibraries.py +161 -75
  688. nuitka/utils/Shebang.py +20 -17
  689. nuitka/utils/Signing.py +63 -18
  690. nuitka/utils/SlotMetaClasses.py +57 -0
  691. nuitka/utils/StaticLibraries.py +83 -56
  692. nuitka/utils/ThreadedExecutor.py +18 -17
  693. nuitka/utils/Timing.py +22 -20
  694. nuitka/utils/Utils.py +115 -25
  695. nuitka/utils/WindowsFileUsage.py +22 -20
  696. nuitka/utils/WindowsResources.py +25 -18
  697. nuitka/utils/Yaml.py +62 -24
  698. nuitka/utils/__init__.py +5 -4
  699. Nuitka_winsvc-1.8.dist-info/RECORD +0 -905
  700. nuitka/build/inline_copy/tqdm/tqdm/_tqdm_gui.py +0 -9
  701. nuitka/build/inline_copy/tqdm/tqdm/gui.py +0 -191
  702. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/LICENSE.txt +0 -0
  703. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/entry_points.txt +0 -0
  704. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/top_level.txt +0 -0
@@ -1,20 +1,5 @@
1
- // Copyright 2023, Kay Hayen, mailto:kay.hayen@gmail.com
2
- //
3
- // Part of "Nuitka", an optimizing Python compiler that is compatible and
4
- // integrates with CPython, but also works on its own.
5
- //
6
- // Licensed under the Apache License, Version 2.0 (the "License");
7
- // you may not use this file except in compliance with the License.
8
- // You may obtain a copy of the License at
9
- //
10
- // http://www.apache.org/licenses/LICENSE-2.0
11
- //
12
- // Unless required by applicable law or agreed to in writing, software
13
- // distributed under the License is distributed on an "AS IS" BASIS,
14
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- // See the License for the specific language governing permissions and
16
- // limitations under the License.
17
- //
1
+ // Copyright 2024, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
2
+
18
3
  #ifndef __NUITKA_EXCEPTIONS_H__
19
4
  #define __NUITKA_EXCEPTIONS_H__
20
5
 
@@ -26,7 +11,7 @@
26
11
  #include "nuitka/printing.h"
27
12
 
28
13
  // Did an error occur.
29
- NUITKA_MAY_BE_UNUSED static inline bool HAS_ERROR_OCCURRED(PyThreadState *tstate) {
14
+ NUITKA_MAY_BE_UNUSED static inline bool HAS_ERROR_OCCURRED(PyThreadState const *tstate) {
30
15
  #if PYTHON_VERSION < 0x3c0
31
16
  return tstate->curexc_type != NULL;
32
17
  #else
@@ -34,16 +19,57 @@ NUITKA_MAY_BE_UNUSED static inline bool HAS_ERROR_OCCURRED(PyThreadState *tstate
34
19
  #endif
35
20
  }
36
21
 
37
- // Get the error type occurred.
38
- NUITKA_MAY_BE_UNUSED static inline PyObject *GET_ERROR_OCCURRED(PyThreadState *tstate) {
22
+ // Get the error type occurred, no reference given.
23
+ NUITKA_MAY_BE_UNUSED static inline PyObject *GET_ERROR_OCCURRED(PyThreadState const *const tstate) {
39
24
  #if PYTHON_VERSION < 0x3c0
40
25
  return tstate->curexc_type;
41
26
  #else
42
- return (PyObject *)Py_TYPE(tstate->current_exception);
27
+ return tstate->current_exception ? (PyObject *)PyExceptionInstance_Class(tstate->current_exception) : NULL;
28
+ #endif
29
+ }
30
+
31
+ // Checks that an exception value is normalized or NULL.
32
+ NUITKA_MAY_BE_UNUSED static inline void ASSERT_NORMALIZED_EXCEPTION_VALUE_X(PyObject const *const exception_value) {
33
+ CHECK_OBJECT_X(exception_value);
34
+ assert(exception_value == NULL || PyExceptionInstance_Check(exception_value));
35
+ }
36
+
37
+ // Checks that an exception value is normalized and not NULL.
38
+ NUITKA_MAY_BE_UNUSED static inline void ASSERT_NORMALIZED_EXCEPTION_VALUE(PyObject *exception_value) {
39
+ CHECK_OBJECT(exception_value);
40
+ assert(PyExceptionInstance_Check(exception_value));
41
+ }
42
+
43
+ extern void Nuitka_Err_NormalizeException(PyThreadState *tstate, PyObject **exc, PyObject **val,
44
+ PyTracebackObject **tb);
45
+
46
+ // Normalize an exception, may release old values and replace them, expects
47
+ // references passed and returns them.
48
+ NUITKA_MAY_BE_UNUSED static inline void NORMALIZE_EXCEPTION(PyThreadState *tstate, PyObject **exception_type,
49
+ PyObject **exception_value,
50
+ PyTracebackObject **exception_tb) {
51
+ #if _DEBUG_EXCEPTIONS
52
+ PRINT_STRING("NORMALIZE_EXCEPTION: Enter\n");
53
+ PRINT_EXCEPTION(*exception_type, *exception_value, *exception_tb);
54
+ #endif
55
+ CHECK_OBJECT_X(*exception_type);
56
+ CHECK_OBJECT_X(*exception_value);
57
+ if (exception_tb) {
58
+ CHECK_OBJECT_X(*exception_tb);
59
+ }
60
+
61
+ // TODO: Often we already know this to be true.
62
+ if (*exception_type != Py_None && *exception_type != NULL) {
63
+ Nuitka_Err_NormalizeException(tstate, exception_type, exception_value, exception_tb);
64
+ }
65
+
66
+ #if _DEBUG_EXCEPTIONS
67
+ PRINT_STRING("NORMALIZE_EXCEPTION: Leave\n");
68
+ PRINT_EXCEPTION(*exception_type, *exception_value, exception_tb ? *exception_tb : NULL);
43
69
  #endif
44
70
  }
45
71
 
46
- // Clear error, which likely set, similar to _PyErr_Clear(tstate)
72
+ // Clear error, which likely set, similar to "_PyErr_Clear(tstate)" and "PyErr_Clear"
47
73
  NUITKA_MAY_BE_UNUSED static inline void CLEAR_ERROR_OCCURRED(PyThreadState *tstate) {
48
74
  #if PYTHON_VERSION < 0x3c0
49
75
  PyObject *old_type = tstate->curexc_type;
@@ -58,13 +84,16 @@ NUITKA_MAY_BE_UNUSED static inline void CLEAR_ERROR_OCCURRED(PyThreadState *tsta
58
84
  Py_XDECREF(old_value);
59
85
  Py_XDECREF(old_tb);
60
86
  #else
61
- PyObject *old_exception = tstate->current_exception;
87
+ PyObject *old_exception_value = tstate->current_exception;
88
+ ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
89
+
62
90
  tstate->current_exception = NULL;
63
- Py_XDECREF(old_exception);
91
+
92
+ Py_XDECREF(old_exception_value);
64
93
  #endif
65
94
  }
66
95
 
67
- // Clear error, which is not likely set, use CLEAR_ERROR_OCCURRED not sure there is an error.
96
+ // Clear error, which is not likely set, use "CLEAR_ERROR_OCCURRED" not sure there is an error.
68
97
  NUITKA_MAY_BE_UNUSED static inline bool DROP_ERROR_OCCURRED(PyThreadState *tstate) {
69
98
 
70
99
  #if PYTHON_VERSION < 0x3c0
@@ -85,11 +114,12 @@ NUITKA_MAY_BE_UNUSED static inline bool DROP_ERROR_OCCURRED(PyThreadState *tstat
85
114
  }
86
115
  #else
87
116
  if (unlikely(tstate->current_exception != NULL)) {
88
- PyObject *old_exception = tstate->current_exception;
117
+ PyObject *old_exception_value = tstate->current_exception;
118
+ ASSERT_NORMALIZED_EXCEPTION_VALUE(old_exception_value);
89
119
 
90
120
  tstate->current_exception = NULL;
91
121
 
92
- Py_DECREF(old_exception);
122
+ Py_DECREF(old_exception_value);
93
123
 
94
124
  return true;
95
125
  }
@@ -97,9 +127,8 @@ NUITKA_MAY_BE_UNUSED static inline bool DROP_ERROR_OCCURRED(PyThreadState *tstat
97
127
  return false;
98
128
  }
99
129
 
100
- // Python3.12: TODO, fetching into a structure is probably needed.
101
130
  #if PYTHON_VERSION < 0x3c0
102
- // Fetch the current error into object variables.
131
+ // Fetch the current error into object variables, transfers reference coming from tstate ownership
103
132
  NUITKA_MAY_BE_UNUSED static void FETCH_ERROR_OCCURRED(PyThreadState *tstate, PyObject **exception_type,
104
133
  PyObject **exception_value,
105
134
  PyTracebackObject **exception_traceback) {
@@ -315,7 +344,7 @@ NUITKA_MAY_BE_UNUSED inline static void SET_CURRENT_EXCEPTION(PyThreadState *tst
315
344
  #endif
316
345
 
317
346
  #if _NUITKA_MAINTAIN_SYS_EXC_VARS
318
- // Set sys attributes in the fastest possible way.
347
+ // Set sys attributes in the fastest possible way, spell-checker: ignore sysdict
319
348
  PyObject *sys_dict = tstate->interp->sysdict;
320
349
  CHECK_OBJECT(sys_dict);
321
350
 
@@ -338,7 +367,7 @@ NUITKA_MAY_BE_UNUSED inline static void SET_CURRENT_EXCEPTION(PyThreadState *tst
338
367
  }
339
368
 
340
369
  // Helper that sets the current thread exception, and has no reference passed.
341
- // Similar to PyErr_SetNone.
370
+ // Similar to "PyErr_SetNone".
342
371
  NUITKA_MAY_BE_UNUSED inline static void SET_CURRENT_EXCEPTION_TYPE0(PyThreadState *tstate, PyObject *exception_type) {
343
372
  CHECK_OBJECT(exception_type);
344
373
 
@@ -362,9 +391,12 @@ NUITKA_MAY_BE_UNUSED inline static void SET_CURRENT_EXCEPTION_TYPE0(PyThreadStat
362
391
  Py_XDECREF(old_exception_traceback);
363
392
  #else
364
393
  PyObject *old_exception = tstate->current_exception;
365
-
366
- tstate->current_exception = exception_type;
367
- Py_INCREF(exception_type);
394
+ ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception);
395
+ PyObject *exception_value = NULL;
396
+ NORMALIZE_EXCEPTION(tstate, &exception_type, &exception_value, NULL);
397
+ ASSERT_NORMALIZED_EXCEPTION_VALUE(exception_value);
398
+ tstate->current_exception = exception_value;
399
+ Py_DECREF(exception_type);
368
400
 
369
401
  #if _DEBUG_EXCEPTIONS
370
402
  PRINT_STRING("SET_CURRENT_EXCEPTION_TYPE0:\n");
@@ -376,9 +408,12 @@ NUITKA_MAY_BE_UNUSED inline static void SET_CURRENT_EXCEPTION_TYPE0(PyThreadStat
376
408
  }
377
409
 
378
410
  // Same as "PyErr_SetObject" CPython API, use this instead.
379
- #if PYTHON_VERSION < 0x3c0
380
411
  NUITKA_MAY_BE_UNUSED inline static void
381
412
  SET_CURRENT_EXCEPTION_TYPE0_VALUE0(PyThreadState *tstate, PyObject *exception_type, PyObject *exception_value) {
413
+ CHECK_OBJECT(exception_type);
414
+ CHECK_OBJECT(exception_value);
415
+
416
+ #if PYTHON_VERSION < 0x3c0
382
417
  PyObject *old_exception_type = tstate->curexc_type;
383
418
  PyObject *old_exception_value = tstate->curexc_value;
384
419
  PyObject *old_exception_traceback = tstate->curexc_traceback;
@@ -397,10 +432,27 @@ SET_CURRENT_EXCEPTION_TYPE0_VALUE0(PyThreadState *tstate, PyObject *exception_ty
397
432
  Py_XDECREF(old_exception_type);
398
433
  Py_XDECREF(old_exception_value);
399
434
  Py_XDECREF(old_exception_traceback);
435
+ #else
436
+ PyObject *old_exception_value = tstate->current_exception;
437
+ ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
438
+
439
+ NORMALIZE_EXCEPTION(tstate, &exception_type, &exception_value, NULL);
440
+ ASSERT_NORMALIZED_EXCEPTION_VALUE(exception_value);
441
+ tstate->current_exception = exception_value;
442
+ Py_INCREF(exception_value);
443
+
444
+ #if _DEBUG_EXCEPTIONS
445
+ PRINT_STRING("SET_CURRENT_EXCEPTION_TYPE_0VALUE0:\n");
446
+ PRINT_CURRENT_EXCEPTION();
447
+ #endif
448
+
449
+ Py_XDECREF(old_exception_value);
450
+ #endif
400
451
  }
401
452
 
402
453
  NUITKA_MAY_BE_UNUSED inline static void
403
454
  SET_CURRENT_EXCEPTION_TYPE0_VALUE1(PyThreadState *tstate, PyObject *exception_type, PyObject *exception_value) {
455
+ #if PYTHON_VERSION < 0x3c0
404
456
  PyObject *old_exception_type = tstate->curexc_type;
405
457
  PyObject *old_exception_value = tstate->curexc_value;
406
458
  PyObject *old_exception_traceback = tstate->curexc_traceback;
@@ -418,10 +470,23 @@ SET_CURRENT_EXCEPTION_TYPE0_VALUE1(PyThreadState *tstate, PyObject *exception_ty
418
470
  Py_XDECREF(old_exception_type);
419
471
  Py_XDECREF(old_exception_value);
420
472
  Py_XDECREF(old_exception_traceback);
421
- }
473
+ #else
474
+ PyObject *old_exception_value = tstate->current_exception;
475
+ ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
476
+
477
+ NORMALIZE_EXCEPTION(tstate, &exception_type, &exception_value, NULL);
478
+ ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_value);
479
+ tstate->current_exception = exception_value;
422
480
 
481
+ #if _DEBUG_EXCEPTIONS
482
+ PRINT_STRING("SET_CURRENT_EXCEPTION_TYPE0_VALUE1:\n");
483
+ PRINT_CURRENT_EXCEPTION();
423
484
  #endif
424
485
 
486
+ Py_XDECREF(old_exception_value);
487
+ #endif
488
+ }
489
+
425
490
  // Helper that sets the current thread exception, and has no reference passed.
426
491
  // Same as CPython API PyErr_SetString
427
492
 
@@ -429,6 +494,10 @@ NUITKA_MAY_BE_UNUSED inline static void SET_CURRENT_EXCEPTION_TYPE0_STR(PyThread
429
494
  char const *value) {
430
495
  PyObject *exception_value = Nuitka_String_FromString(value);
431
496
 
497
+ #if PYTHON_VERSION >= 0x3c0
498
+ NORMALIZE_EXCEPTION(tstate, &exception_type, &exception_value, NULL);
499
+ #endif
500
+
432
501
  SET_CURRENT_EXCEPTION_TYPE0_VALUE1(tstate, exception_type, exception_value);
433
502
  }
434
503
 
@@ -466,7 +535,7 @@ NUITKA_MAY_BE_UNUSED static inline void PRESERVE_FRAME_EXCEPTION(PyThreadState *
466
535
  PRINT_STRING("PRESERVE_FRAME_EXCEPTION: no exception to preserve\n");
467
536
  #endif
468
537
  frame->f_exc_type = Py_None;
469
- Py_INCREF(frame->f_exc_type);
538
+ Py_INCREF_IMMORTAL(frame->f_exc_type);
470
539
  frame->f_exc_value = NULL;
471
540
  frame->f_exc_traceback = NULL;
472
541
  }
@@ -517,32 +586,33 @@ NUITKA_MAY_BE_UNUSED static inline void RESTORE_FRAME_EXCEPTION(PyThreadState *t
517
586
 
518
587
  #endif
519
588
 
520
- // Similar to PyException_SetTraceback, only done for Python3.
589
+ // Similar to "PyException_SetTraceback", only done for Python3.
521
590
  #if PYTHON_VERSION < 0x300
522
591
  #define ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(exception_value, exception_tb) ;
523
592
  #else
524
593
  NUITKA_MAY_BE_UNUSED static inline void ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(PyObject *exception_value,
525
594
  PyTracebackObject *exception_tb) {
526
595
  CHECK_OBJECT(exception_value);
527
- CHECK_OBJECT(exception_tb);
596
+ CHECK_OBJECT_X(exception_tb);
528
597
 
529
- if (exception_tb == (PyTracebackObject *)Py_None || exception_tb == NULL) {
530
- return;
598
+ if (exception_tb == (PyTracebackObject *)Py_None) {
599
+ exception_tb = NULL;
531
600
  }
532
601
 
533
602
  assert(PyExceptionInstance_Check(exception_value));
534
- assert(PyTraceBack_Check(exception_tb));
603
+ assert(exception_tb == NULL || PyTraceBack_Check(exception_tb));
535
604
 
536
605
  PyBaseExceptionObject *e = (PyBaseExceptionObject *)exception_value;
537
606
 
538
607
  PyObject *old = e->traceback;
539
- Py_INCREF(exception_tb);
608
+ Py_XINCREF(exception_tb);
540
609
  e->traceback = (PyObject *)exception_tb;
541
610
  Py_XDECREF(old);
542
611
  }
543
612
 
544
613
  // Much like "PyException_GetTraceback", but does not give a reference.
545
614
  NUITKA_MAY_BE_UNUSED static inline PyTracebackObject *GET_EXCEPTION_TRACEBACK(PyObject *exception_value) {
615
+ CHECK_OBJECT(exception_value);
546
616
  assert(PyExceptionInstance_Check(exception_value));
547
617
 
548
618
  PyBaseExceptionObject *exc_object = (PyBaseExceptionObject *)(exception_value);
@@ -550,36 +620,6 @@ NUITKA_MAY_BE_UNUSED static inline PyTracebackObject *GET_EXCEPTION_TRACEBACK(Py
550
620
  }
551
621
  #endif
552
622
 
553
- #if PYTHON_VERSION < 0x3c0
554
- extern void Nuitka_Err_NormalizeException(PyThreadState *tstate, PyObject **exc, PyObject **val,
555
- PyTracebackObject **tb);
556
-
557
- // Normalize an exception.
558
- NUITKA_MAY_BE_UNUSED static inline void NORMALIZE_EXCEPTION(PyThreadState *tstate, PyObject **exception_type,
559
- PyObject **exception_value,
560
- PyTracebackObject **exception_tb) {
561
- #if _DEBUG_EXCEPTIONS
562
- PRINT_STRING("NORMALIZE_EXCEPTION: Enter\n");
563
- PRINT_EXCEPTION(*exception_type, *exception_value, *exception_tb);
564
- #endif
565
- CHECK_OBJECT_X(*exception_type);
566
- CHECK_OBJECT_X(*exception_value);
567
- if (exception_tb) {
568
- CHECK_OBJECT_X(*exception_tb);
569
- }
570
-
571
- // TODO: Often we already know this to be true.
572
- if (*exception_type != Py_None && *exception_type != NULL) {
573
- Nuitka_Err_NormalizeException(tstate, exception_type, exception_value, exception_tb);
574
- }
575
-
576
- #if _DEBUG_EXCEPTIONS
577
- PRINT_STRING("NORMALIZE_EXCEPTION: Leave\n");
578
- PRINT_EXCEPTION(*exception_type, *exception_value, exception_tb ? *exception_tb : NULL);
579
- #endif
580
- }
581
- #endif
582
-
583
623
  // Publish an exception, erasing the values of the variables.
584
624
  NUITKA_MAY_BE_UNUSED static inline void PUBLISH_CURRENT_EXCEPTION(PyThreadState *tstate, PyObject **exception_type,
585
625
  PyObject **exception_value,
@@ -614,6 +654,444 @@ NUITKA_MAY_BE_UNUSED static inline void PUBLISH_CURRENT_EXCEPTION(PyThreadState
614
654
  *exception_tb = NULL;
615
655
  }
616
656
 
657
+ #if PYTHON_VERSION >= 0x300
658
+ // Attach the exception context if necessary.
659
+ NUITKA_MAY_BE_UNUSED static inline void ADD_EXCEPTION_CONTEXT(PyThreadState *tstate, PyObject **exception_type,
660
+ PyObject **exception_value) {
661
+ PyObject *context = EXC_VALUE(tstate);
662
+
663
+ if (context != NULL) {
664
+ NORMALIZE_EXCEPTION(tstate, exception_type, exception_value, NULL);
665
+
666
+ Py_INCREF(context);
667
+ PyException_SetContext(*exception_value, context);
668
+ }
669
+ }
670
+ #endif
671
+
672
+ NUITKA_MAY_BE_UNUSED static bool EXCEPTION_MATCH_BOOL_SINGLE(PyThreadState *tstate, PyObject *exception_value,
673
+ PyObject *exception_checked);
674
+
675
+ NUITKA_MAY_BE_UNUSED static bool _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(PyThreadState *tstate, PyObject *exception_type) {
676
+ #if PYTHON_VERSION < 0x3c0
677
+ PyObject *exception_current = tstate->curexc_type;
678
+ #else
679
+ PyObject *exception_current = tstate->current_exception;
680
+ ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_current);
681
+ #endif
682
+ if (exception_current == NULL) {
683
+ return true;
684
+ } else if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_current, exception_type)) {
685
+ CHECK_OBJECT(exception_current);
686
+
687
+ #if PYTHON_VERSION < 0x3c0
688
+ // Clear the exception first, we believe we know it doesn't have side effects.
689
+ Py_DECREF(exception_current);
690
+ tstate->curexc_type = NULL;
691
+
692
+ PyObject *old_value = tstate->curexc_value;
693
+ PyObject *old_tb = tstate->curexc_traceback;
694
+
695
+ tstate->curexc_value = NULL;
696
+ tstate->curexc_traceback = NULL;
697
+
698
+ Py_XDECREF(old_value);
699
+ Py_XDECREF(old_tb);
700
+ #else
701
+ tstate->current_exception = NULL;
702
+ Py_DECREF(exception_current);
703
+ #endif
704
+
705
+ return true;
706
+ } else {
707
+ return false;
708
+ }
709
+ }
710
+
711
+ /* Special helper that checks for StopIteration and if so clears it, only
712
+ indicating if it was set in the return value.
713
+
714
+ Equivalent to if(PyErr_ExceptionMatches(PyExc_StopIteration) PyErr_Clear();
715
+
716
+ If error is raised by built-in function next() and an iterator’s __next__()
717
+ method to signal that there are no further items produced by the iterator then
718
+ it resets the TSTATE to NULL and returns True else return False
719
+
720
+ */
721
+ NUITKA_MAY_BE_UNUSED static bool CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(PyThreadState *tstate) {
722
+ return _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(tstate, PyExc_StopIteration);
723
+ }
724
+
725
+ /* Special helper that checks for KeyError and if so clears it, only
726
+ indicating if it was set in the return value.
727
+
728
+ Equivalent to if(PyErr_ExceptionMatches(PyExc_KeyError) PyErr_Clear();
729
+
730
+ */
731
+ NUITKA_MAY_BE_UNUSED static bool CHECK_AND_CLEAR_KEY_ERROR_OCCURRED(PyThreadState *tstate) {
732
+ return _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(tstate, PyExc_KeyError);
733
+ }
734
+
735
+ NUITKA_MAY_BE_UNUSED static bool CHECK_AND_CLEAR_ATTRIBUTE_ERROR_OCCURRED(PyThreadState *tstate) {
736
+ return _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(tstate, PyExc_AttributeError);
737
+ }
738
+
739
+ // Format a NameError exception for a variable name, chains with existing exception.
740
+ extern void SET_CURRENT_EXCEPTION_NAME_ERROR(PyThreadState *tstate, PyObject *variable_name);
741
+
742
+ #if PYTHON_VERSION < 0x340
743
+ // Same as SET_CURRENT_EXCEPTION_NAME_ERROR with different wording, sometimes for Python2.
744
+ extern void SET_CURRENT_EXCEPTION_GLOBAL_NAME_ERROR(PyThreadState *tstate, PyObject *variable_name);
745
+ #endif
746
+
747
+ // Format a UnboundLocalError exception for a variable name.
748
+ extern void FORMAT_UNBOUND_LOCAL_ERROR(PyObject **exception_type, PyObject **exception_value, PyObject *variable_name);
749
+
750
+ extern void FORMAT_UNBOUND_CLOSURE_ERROR(PyObject **exception_type, PyObject **exception_value,
751
+ PyObject *variable_name);
752
+
753
+ #if PYTHON_VERSION >= 0x3c0
754
+ NUITKA_MAY_BE_UNUSED static PyObject *MAKE_TUPLE1(PyThreadState *tstate, PyObject *element1);
755
+
756
+ NUITKA_MAY_BE_UNUSED static PyObject *MAKE_EXCEPTION_FROM_TYPE_ARG0(PyThreadState *tstate, PyObject *type,
757
+ PyObject *arg) {
758
+ PyBaseExceptionObject *self;
759
+
760
+ PyTypeObject *type_object = (PyTypeObject *)type;
761
+
762
+ self = (PyBaseExceptionObject *)(type_object->tp_alloc(type_object, 0));
763
+
764
+ self->dict = NULL;
765
+ self->notes = NULL;
766
+ self->traceback = self->cause = self->context = NULL;
767
+ self->suppress_context = 0;
768
+
769
+ assert(arg != NULL);
770
+
771
+ if (!PyTuple_Check(arg)) {
772
+ self->args = MAKE_TUPLE1(tstate, arg);
773
+ } else {
774
+ self->args = Py_NewRef(arg);
775
+ }
776
+
777
+ return (PyObject *)self;
778
+ }
779
+ #else
780
+
781
+ extern PyObject *CALL_FUNCTION_WITH_SINGLE_ARG(PyThreadState *tstate, PyObject *called, PyObject *arg);
782
+
783
+ NUITKA_MAY_BE_UNUSED static PyObject *MAKE_EXCEPTION_FROM_TYPE_ARG0(PyThreadState *tstate, PyObject *type,
784
+ PyObject *arg) {
785
+ return CALL_FUNCTION_WITH_SINGLE_ARG(tstate, type, arg);
786
+ }
787
+
788
+ #endif
789
+
790
+ #if PYTHON_VERSION < 0x3c0
791
+ struct Nuitka_ExceptionPreservationItem {
792
+ PyObject *exception_type;
793
+ PyObject *exception_value;
794
+ PyTracebackObject *exception_tb;
795
+ };
796
+
797
+ // Fetch the current exception into state, transfers reference coming from tstate ownership. Old values are overwritten.
798
+ NUITKA_MAY_BE_UNUSED static void FETCH_ERROR_OCCURRED_STATE(PyThreadState *tstate,
799
+ struct Nuitka_ExceptionPreservationItem *exception_state) {
800
+ FETCH_ERROR_OCCURRED(tstate, &exception_state->exception_type, &exception_state->exception_value,
801
+ &exception_state->exception_tb);
802
+ }
803
+
804
+ // Restore the current exception from state, transfers reference from state to tstate ownership.
805
+ NUITKA_MAY_BE_UNUSED static void
806
+ RESTORE_ERROR_OCCURRED_STATE(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
807
+ RESTORE_ERROR_OCCURRED(tstate, exception_state->exception_type, exception_state->exception_value,
808
+ exception_state->exception_tb);
809
+ }
810
+
811
+ NUITKA_MAY_BE_UNUSED static void
812
+ FETCH_ERROR_OCCURRED_STATE_UNTRACED(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
813
+ FETCH_ERROR_OCCURRED_UNTRACED(tstate, &exception_state->exception_type, &exception_state->exception_value,
814
+ &exception_state->exception_tb);
815
+ }
816
+
817
+ NUITKA_MAY_BE_UNUSED static void
818
+ RESTORE_ERROR_OCCURRED_STATE_UNTRACED(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
819
+ RESTORE_ERROR_OCCURRED_UNTRACED(tstate, exception_state->exception_type, exception_state->exception_value,
820
+ exception_state->exception_tb);
821
+ }
822
+
823
+ NUITKA_MAY_BE_UNUSED static void
824
+ ASSERT_SAME_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem const *exception_state1,
825
+ struct Nuitka_ExceptionPreservationItem const *exception_state2) {
826
+ assert(exception_state1->exception_type == exception_state2->exception_type);
827
+ assert(exception_state1->exception_value == exception_state2->exception_value);
828
+ assert(exception_state1->exception_tb == exception_state2->exception_tb);
829
+ }
830
+
831
+ NUITKA_MAY_BE_UNUSED static void
832
+ ASSERT_EMPTY_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem const *exception_state) {
833
+ assert(exception_state->exception_type == NULL);
834
+ assert(exception_state->exception_value == NULL);
835
+ assert(exception_state->exception_tb == NULL);
836
+ }
837
+
838
+ NUITKA_MAY_BE_UNUSED static void INIT_ERROR_OCCURRED_STATE(struct Nuitka_ExceptionPreservationItem *exception_state) {
839
+ exception_state->exception_type = NULL;
840
+ exception_state->exception_value = NULL;
841
+ exception_state->exception_tb = NULL;
842
+ }
843
+
844
+ NUITKA_MAY_BE_UNUSED static void
845
+ RELEASE_ERROR_OCCURRED_STATE(struct Nuitka_ExceptionPreservationItem *exception_state) {
846
+ CHECK_OBJECT(exception_state->exception_type);
847
+ CHECK_OBJECT_X(exception_state->exception_value);
848
+ CHECK_OBJECT_X(exception_state->exception_tb);
849
+ Py_DECREF(exception_state->exception_type);
850
+ Py_XDECREF(exception_state->exception_value);
851
+ Py_XDECREF(exception_state->exception_tb);
852
+ }
853
+
854
+ NUITKA_MAY_BE_UNUSED static void
855
+ RELEASE_ERROR_OCCURRED_STATE_X(struct Nuitka_ExceptionPreservationItem *exception_state) {
856
+ CHECK_OBJECT_X(exception_state->exception_type);
857
+ CHECK_OBJECT_X(exception_state->exception_value);
858
+ CHECK_OBJECT_X(exception_state->exception_tb);
859
+
860
+ Py_XDECREF(exception_state->exception_type);
861
+ Py_XDECREF(exception_state->exception_value);
862
+ Py_XDECREF(exception_state->exception_tb);
863
+ }
864
+
865
+ NUITKA_MAY_BE_UNUSED static void SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(
866
+ PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state, PyObject *exception_type,
867
+ PyObject *exception_value, PyTracebackObject *exception_tb) {
868
+ Py_INCREF(exception_type);
869
+ Py_XINCREF(exception_value);
870
+ Py_XINCREF(exception_tb);
871
+
872
+ exception_state->exception_type = exception_type;
873
+ exception_state->exception_value = exception_value;
874
+ exception_state->exception_tb = exception_tb;
875
+ }
876
+
877
+ NUITKA_MAY_BE_UNUSED static void
878
+ ASSIGN_ARGS_FROM_EXCEPTION_PRESERVATION_STATE(struct Nuitka_ExceptionPreservationItem *exception_state,
879
+ PyObject **exception_type, PyObject **exception_value,
880
+ PyTracebackObject **exception_tb) {
881
+
882
+ *exception_type = exception_state->exception_type;
883
+ Py_INCREF(*exception_type);
884
+ *exception_value = exception_state->exception_value;
885
+ Py_XINCREF(*exception_value);
886
+ *exception_tb = exception_state->exception_tb;
887
+ Py_XINCREF(*exception_tb);
888
+ }
889
+
890
+ NUITKA_MAY_BE_UNUSED static PyTracebackObject *
891
+ GET_EXCEPTION_STATE_TRACEBACK(struct Nuitka_ExceptionPreservationItem const *exception_state) {
892
+ return exception_state->exception_tb;
893
+ }
894
+
895
+ // Transfer ownership of the traceback to the exception state.
896
+ NUITKA_MAY_BE_UNUSED static void SET_EXCEPTION_STATE_TRACEBACK(struct Nuitka_ExceptionPreservationItem *exception_state,
897
+ PyTracebackObject *exception_tb) {
898
+ CHECK_OBJECT_X(exception_state->exception_tb);
899
+ CHECK_OBJECT_X(exception_tb);
900
+ Py_XDECREF(exception_state->exception_tb);
901
+ exception_state->exception_tb = exception_tb;
902
+ }
903
+
904
+ NUITKA_MAY_BE_UNUSED static bool HAS_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem const *exception_state) {
905
+ return exception_state->exception_type != NULL;
906
+ }
907
+
908
+ NUITKA_MAY_BE_UNUSED static bool
909
+ EXCEPTION_STATE_MATCH_BOOL_SINGLE(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state,
910
+ PyObject *exception_checked) {
911
+ return EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_state->exception_type, exception_checked);
912
+ }
913
+
914
+ NUITKA_MAY_BE_UNUSED inline static void
915
+ CHECK_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem const *exception_state) {
916
+ CHECK_OBJECT(exception_state->exception_type);
917
+ CHECK_OBJECT_X(exception_state->exception_value);
918
+ CHECK_OBJECT_X(exception_state->exception_tb);
919
+ }
920
+
921
+ NUITKA_MAY_BE_UNUSED inline static void
922
+ CHECK_EXCEPTION_STATE_X(struct Nuitka_ExceptionPreservationItem const *exception_state) {
923
+ CHECK_OBJECT_X(exception_state->exception_type);
924
+ CHECK_OBJECT_X(exception_state->exception_value);
925
+ CHECK_OBJECT_X(exception_state->exception_tb);
926
+ }
927
+
928
+ #else
929
+ struct Nuitka_ExceptionPreservationItem {
930
+ PyObject *exception_value;
931
+ };
932
+
933
+ // Fetch the current exception into state, transfers reference coming from tstate ownership. Old value is overwritten.
934
+ NUITKA_MAY_BE_UNUSED static void FETCH_ERROR_OCCURRED_STATE(PyThreadState *tstate,
935
+ struct Nuitka_ExceptionPreservationItem *exception_state) {
936
+ exception_state->exception_value = tstate->current_exception;
937
+ ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
938
+
939
+ #if _DEBUG_EXCEPTIONS
940
+ PRINT_STRING("FETCH_ERROR_OCCURRED_STATE:\n");
941
+ PRINT_CURRENT_EXCEPTION();
942
+ #endif
943
+
944
+ tstate->current_exception = NULL;
945
+ }
946
+
947
+ NUITKA_MAY_BE_UNUSED static void
948
+ FETCH_ERROR_OCCURRED_STATE_UNTRACED(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
949
+ exception_state->exception_value = tstate->current_exception;
950
+ tstate->current_exception = NULL;
951
+
952
+ ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
953
+ }
954
+
955
+ NUITKA_MAY_BE_UNUSED static void
956
+ RESTORE_ERROR_OCCURRED_STATE(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
957
+ PyObject *old_exception_value = tstate->current_exception;
958
+ ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
959
+
960
+ ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
961
+ tstate->current_exception = exception_state->exception_value;
962
+
963
+ #if _DEBUG_EXCEPTIONS
964
+ PRINT_STRING("RESTORE_ERROR_OCCURRED:\n");
965
+ PRINT_CURRENT_EXCEPTION();
966
+ #endif
967
+
968
+ Py_XDECREF(old_exception_value);
969
+ }
970
+
971
+ NUITKA_MAY_BE_UNUSED static void
972
+ RESTORE_ERROR_OCCURRED_STATE_UNTRACED(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
973
+ PyObject *old_exception_value = tstate->current_exception;
974
+ ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
975
+
976
+ ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
977
+ tstate->current_exception = exception_state->exception_value;
978
+
979
+ Py_XDECREF(old_exception_value);
980
+ }
981
+
982
+ NUITKA_MAY_BE_UNUSED static void
983
+ ASSERT_SAME_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem *exception_state1,
984
+ struct Nuitka_ExceptionPreservationItem *exception_state2) {
985
+ assert(exception_state1->exception_value == exception_state2->exception_value);
986
+ }
987
+
988
+ NUITKA_MAY_BE_UNUSED static void
989
+ ASSERT_EMPTY_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem const *exception_state) {
990
+ assert(exception_state->exception_value == NULL);
991
+ }
992
+
993
+ NUITKA_MAY_BE_UNUSED static void INIT_ERROR_OCCURRED_STATE(struct Nuitka_ExceptionPreservationItem *exception_state) {
994
+ exception_state->exception_value = NULL;
995
+ }
996
+
997
+ NUITKA_MAY_BE_UNUSED static void
998
+ RELEASE_ERROR_OCCURRED_STATE(struct Nuitka_ExceptionPreservationItem *exception_state) {
999
+ CHECK_OBJECT(exception_state->exception_value);
1000
+ Py_DECREF(exception_state->exception_value);
1001
+ }
1002
+
1003
+ NUITKA_MAY_BE_UNUSED static void
1004
+ RELEASE_ERROR_OCCURRED_STATE_X(struct Nuitka_ExceptionPreservationItem *exception_state) {
1005
+ CHECK_OBJECT_X(exception_state->exception_value);
1006
+ Py_XDECREF(exception_state->exception_value);
1007
+ }
1008
+
1009
+ NUITKA_MAY_BE_UNUSED static void SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(
1010
+ PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state, PyObject *exception_type,
1011
+ PyObject *exception_value, PyTracebackObject *exception_tb) {
1012
+
1013
+ Py_XINCREF(exception_type);
1014
+ Py_XINCREF(exception_value);
1015
+ Py_XINCREF(exception_tb);
1016
+
1017
+ NORMALIZE_EXCEPTION(tstate, &exception_type, &exception_value, &exception_tb);
1018
+ ASSERT_NORMALIZED_EXCEPTION_VALUE(exception_value);
1019
+
1020
+ exception_state->exception_value = exception_value;
1021
+ Py_INCREF(exception_value);
1022
+
1023
+ ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(exception_value, exception_tb);
1024
+
1025
+ Py_XDECREF(exception_type);
1026
+ Py_XDECREF(exception_value);
1027
+ Py_XDECREF(exception_tb);
1028
+ }
1029
+
1030
+ NUITKA_MAY_BE_UNUSED static void
1031
+ ASSIGN_ARGS_FROM_EXCEPTION_PRESERVATION_STATE(struct Nuitka_ExceptionPreservationItem *exception_state,
1032
+ PyObject **exception_type, PyObject **exception_value,
1033
+ PyTracebackObject **exception_tb) {
1034
+
1035
+ *exception_value = exception_state->exception_value;
1036
+
1037
+ if (*exception_value) {
1038
+ Py_INCREF(*exception_value);
1039
+
1040
+ *exception_type = (PyObject *)PyExceptionInstance_Class(*exception_value);
1041
+ Py_INCREF(*exception_type);
1042
+ *exception_tb = GET_EXCEPTION_TRACEBACK(*exception_value);
1043
+ Py_XINCREF(*exception_tb);
1044
+ } else {
1045
+ *exception_type = NULL;
1046
+ *exception_tb = NULL;
1047
+ }
1048
+ }
1049
+
1050
+ NUITKA_MAY_BE_UNUSED static PyTracebackObject *
1051
+ GET_EXCEPTION_STATE_TRACEBACK(struct Nuitka_ExceptionPreservationItem *exception_state) {
1052
+ return GET_EXCEPTION_TRACEBACK(exception_state->exception_value);
1053
+ }
1054
+
1055
+ // Transfer ownership of the traceback to the exception state.
1056
+ NUITKA_MAY_BE_UNUSED static void SET_EXCEPTION_STATE_TRACEBACK(struct Nuitka_ExceptionPreservationItem *exception_state,
1057
+ PyTracebackObject *exception_tb) {
1058
+ ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(exception_state->exception_value, exception_tb);
1059
+ Py_XDECREF(exception_tb);
1060
+ CHECK_OBJECT_X(exception_tb);
1061
+ }
1062
+
1063
+ NUITKA_MAY_BE_UNUSED static bool HAS_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem const *exception_state) {
1064
+ return exception_state->exception_value != NULL;
1065
+ }
1066
+
1067
+ NUITKA_MAY_BE_UNUSED static bool
1068
+ EXCEPTION_STATE_MATCH_BOOL_SINGLE(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem const *exception_state,
1069
+ PyObject *exception_checked) {
1070
+ return EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_state->exception_value, exception_checked);
1071
+ }
1072
+
1073
+ NUITKA_MAY_BE_UNUSED inline static void
1074
+ CHECK_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem const *exception_state) {
1075
+ ASSERT_NORMALIZED_EXCEPTION_VALUE(exception_state->exception_value);
1076
+ }
1077
+
1078
+ NUITKA_MAY_BE_UNUSED inline static void
1079
+ CHECK_EXCEPTION_STATE_X(struct Nuitka_ExceptionPreservationItem const *exception_state) {
1080
+ ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
1081
+ }
1082
+
1083
+ #endif
1084
+
1085
+ NUITKA_MAY_BE_UNUSED inline static void
1086
+ SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_STR(PyThreadState *tstate,
1087
+ struct Nuitka_ExceptionPreservationItem *exception_state,
1088
+ PyObject *exception_type, char const *value) {
1089
+ PyObject *exception_value = Nuitka_String_FromString(value);
1090
+
1091
+ SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, exception_state, exception_type, exception_value, NULL);
1092
+ Py_DECREF(exception_value);
1093
+ }
1094
+
617
1095
  NUITKA_MAY_BE_UNUSED static bool EXCEPTION_MATCH_GENERATOR(PyThreadState *tstate, PyObject *exception_value) {
618
1096
  CHECK_OBJECT(exception_value);
619
1097
 
@@ -629,9 +1107,8 @@ NUITKA_MAY_BE_UNUSED static bool EXCEPTION_MATCH_GENERATOR(PyThreadState *tstate
629
1107
 
630
1108
  if (PyExceptionClass_Check(exception_value)) {
631
1109
  // Save the current exception, if any, we must preserve it.
632
- PyObject *save_exception_type, *save_exception_value;
633
- PyTracebackObject *save_exception_tb;
634
- FETCH_ERROR_OCCURRED(tstate, &save_exception_type, &save_exception_value, &save_exception_tb);
1110
+ struct Nuitka_ExceptionPreservationItem saved_exception_state;
1111
+ FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
635
1112
 
636
1113
  int res = PyObject_IsSubclass(exception_value, PyExc_GeneratorExit);
637
1114
 
@@ -651,7 +1128,7 @@ NUITKA_MAY_BE_UNUSED static bool EXCEPTION_MATCH_GENERATOR(PyThreadState *tstate
651
1128
  PyErr_WriteUnraisable(exception_value);
652
1129
  }
653
1130
 
654
- RESTORE_ERROR_OCCURRED(tstate, save_exception_type, save_exception_value, save_exception_tb);
1131
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
655
1132
 
656
1133
  return res == 1;
657
1134
  }
@@ -676,9 +1153,8 @@ NUITKA_MAY_BE_UNUSED static bool EXCEPTION_MATCH_BOOL_SINGLE(PyThreadState *tsta
676
1153
 
677
1154
  if (PyExceptionClass_Check(exception_value)) {
678
1155
  // Save the current exception, if any, we must preserve it.
679
- PyObject *save_exception_type, *save_exception_value;
680
- PyTracebackObject *save_exception_tb;
681
- FETCH_ERROR_OCCURRED(tstate, &save_exception_type, &save_exception_value, &save_exception_tb);
1156
+ struct Nuitka_ExceptionPreservationItem saved_exception_state;
1157
+ FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
682
1158
 
683
1159
  int res = PyObject_IsSubclass(exception_value, exception_checked);
684
1160
 
@@ -687,7 +1163,7 @@ NUITKA_MAY_BE_UNUSED static bool EXCEPTION_MATCH_BOOL_SINGLE(PyThreadState *tsta
687
1163
  PyErr_WriteUnraisable(exception_value);
688
1164
  }
689
1165
 
690
- RESTORE_ERROR_OCCURRED(tstate, save_exception_type, save_exception_value, save_exception_tb);
1166
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
691
1167
 
692
1168
  return res == 1;
693
1169
  }
@@ -711,9 +1187,8 @@ NUITKA_MAY_BE_UNUSED static inline int _EXCEPTION_MATCH_BOOL(PyThreadState *tsta
711
1187
  #if PYTHON_VERSION < 0x300
712
1188
  if (PyExceptionClass_Check(exception_class) && PyExceptionClass_Check(exception_checked)) {
713
1189
  // Save the current exception, if any, we must preserve it.
714
- PyObject *save_exception_type, *save_exception_value;
715
- PyTracebackObject *save_exception_tb;
716
- FETCH_ERROR_OCCURRED(tstate, &save_exception_type, &save_exception_value, &save_exception_tb);
1190
+ struct Nuitka_ExceptionPreservationItem saved_exception_state;
1191
+ FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
717
1192
 
718
1193
  // Avoid recursion limit being exceeded just then
719
1194
  int recursion_limit = Py_GetRecursionLimit();
@@ -731,7 +1206,7 @@ NUITKA_MAY_BE_UNUSED static inline int _EXCEPTION_MATCH_BOOL(PyThreadState *tsta
731
1206
  res = 0;
732
1207
  }
733
1208
 
734
- RESTORE_ERROR_OCCURRED(tstate, save_exception_type, save_exception_value, save_exception_tb);
1209
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
735
1210
 
736
1211
  return res;
737
1212
  } else {
@@ -795,118 +1270,46 @@ NUITKA_MAY_BE_UNUSED static inline int EXCEPTION_MATCH_BOOL(PyThreadState *tstat
795
1270
  }
796
1271
  }
797
1272
 
798
- #if PYTHON_VERSION >= 0x300
799
- // Attach the exception context if necessary.
800
- NUITKA_MAY_BE_UNUSED static inline void ADD_EXCEPTION_CONTEXT(PyThreadState *tstate, PyObject **exception_type,
801
- PyObject **exception_value) {
802
- PyObject *context = EXC_VALUE(tstate);
803
-
804
- if (context != NULL) {
805
- NORMALIZE_EXCEPTION(tstate, exception_type, exception_value, NULL);
806
-
807
- Py_INCREF(context);
808
- PyException_SetContext(*exception_value, context);
809
- }
810
- }
811
- #endif
812
-
813
- NUITKA_MAY_BE_UNUSED static bool _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(PyThreadState *tstate, PyObject *exception_type) {
814
- #if PYTHON_VERSION < 0x3c0
815
- PyObject *exception_current = tstate->curexc_type;
816
- #else
817
- PyObject *exception_current = tstate->current_exception;
818
-
819
- #endif
820
- if (exception_current == NULL) {
821
- return true;
822
- } else if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_current, exception_type)) {
823
- // Clear the exception first, we believe we know it doesn't have side effects.
824
- Py_DECREF(exception_current);
825
-
826
- #if PYTHON_VERSION < 0x3c0
827
- tstate->curexc_type = NULL;
828
-
829
- PyObject *old_value = tstate->curexc_value;
830
- PyObject *old_tb = tstate->curexc_traceback;
831
-
832
- tstate->curexc_value = NULL;
833
- tstate->curexc_traceback = NULL;
834
-
835
- Py_XDECREF(old_value);
836
- Py_XDECREF(old_tb);
837
- #else
838
- tstate->current_exception = NULL;
839
- #endif
840
-
841
- return true;
842
- } else {
843
- return false;
844
- }
845
- }
846
-
847
- /* Special helper that checks for StopIteration and if so clears it, only
848
- indicating if it was set in the return value.
849
-
850
- Equivalent to if(PyErr_ExceptionMatches(PyExc_StopIteration) PyErr_Clear();
851
-
852
- If error is raised by built-in function next() and an iterator’s __next__()
853
- method to signal that there are no further items produced by the iterator then
854
- it resets the TSTATE to NULL and returns True else return False
855
-
856
- */
857
- NUITKA_MAY_BE_UNUSED static bool CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(PyThreadState *tstate) {
858
- return _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(tstate, PyExc_StopIteration);
859
- }
860
-
861
- /* Special helper that checks for KeyError and if so clears it, only
862
- indicating if it was set in the return value.
1273
+ #if PYTHON_VERSION >= 0x3c0
863
1274
 
864
- Equivalent to if(PyErr_ExceptionMatches(PyExc_KeyError) PyErr_Clear();
1275
+ // Python3.12: TODO: Must get rid of those by generating code with exception_state
1276
+ NUITKA_MAY_BE_UNUSED static void FETCH_ERROR_OCCURRED(PyThreadState *tstate, PyObject **exception_type,
1277
+ PyObject **exception_value,
1278
+ PyTracebackObject **exception_traceback) {
865
1279
 
866
- */
867
- NUITKA_MAY_BE_UNUSED static bool CHECK_AND_CLEAR_KEY_ERROR_OCCURRED(PyThreadState *tstate) {
868
- return _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(tstate, PyExc_KeyError);
1280
+ struct Nuitka_ExceptionPreservationItem exception_state;
1281
+ FETCH_ERROR_OCCURRED_STATE(tstate, &exception_state);
1282
+ ASSIGN_ARGS_FROM_EXCEPTION_PRESERVATION_STATE(&exception_state, exception_type, exception_value,
1283
+ exception_traceback);
1284
+ RELEASE_ERROR_OCCURRED_STATE_X(&exception_state);
869
1285
  }
870
1286
 
871
- NUITKA_MAY_BE_UNUSED static bool CHECK_AND_CLEAR_ATTRIBUTE_ERROR_OCCURRED(PyThreadState *tstate) {
872
- return _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(tstate, PyExc_AttributeError);
1287
+ NUITKA_MAY_BE_UNUSED static void RESTORE_ERROR_OCCURRED(PyThreadState *tstate, PyObject *exception_type,
1288
+ PyObject *exception_value, PyTracebackObject *exception_tb) {
1289
+ struct Nuitka_ExceptionPreservationItem exception_state;
1290
+ SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, &exception_state, exception_type, exception_value, exception_tb);
1291
+ Py_XDECREF(exception_type);
1292
+ Py_XDECREF(exception_value);
1293
+ Py_XDECREF(exception_tb);
1294
+
1295
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &exception_state);
873
1296
  }
874
1297
 
875
- // Format a NameError exception for a variable name.
876
- extern void FORMAT_NAME_ERROR(PyObject **exception_type, PyObject **exception_value, PyObject *variable_name);
877
-
878
- #if PYTHON_VERSION < 0x340
879
- // Same as FORMAT_NAME_ERROR with different wording, sometimes used for older Python version.
880
- extern void FORMAT_GLOBAL_NAME_ERROR(PyObject **exception_type, PyObject **exception_value, PyObject *variable_name);
881
1298
  #endif
882
1299
 
883
- // Format a UnboundLocalError exception for a variable name.
884
- extern void FORMAT_UNBOUND_LOCAL_ERROR(PyObject **exception_type, PyObject **exception_value, PyObject *variable_name);
885
-
886
- extern void FORMAT_UNBOUND_CLOSURE_ERROR(PyObject **exception_type, PyObject **exception_value,
887
- PyObject *variable_name);
888
-
889
1300
  #endif
890
1301
 
891
- #if PYTHON_VERSION >= 0x3c0
892
- static PyObject *_MAKE_EXCEPTION_FROM_TYPE_ARG0(PyTypeObject *type, PyObject *arg) {
893
- PyBaseExceptionObject *self;
894
-
895
- self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
896
-
897
- self->dict = NULL;
898
- self->notes = NULL;
899
- self->traceback = self->cause = self->context = NULL;
900
- self->suppress_context = 0;
901
-
902
- assert(arg != NULL);
903
-
904
- if (!PyTuple_Check(arg)) {
905
- self->args = MAKE_TUPLE1(arg);
906
- } else {
907
- self->args = Py_NewRef(arg);
908
- }
909
-
910
- return (PyObject *)self;
911
- }
912
- #endif
1302
+ // Part of "Nuitka", an optimizing Python compiler that is compatible and
1303
+ // integrates with CPython, but also works on its own.
1304
+ //
1305
+ // Licensed under the Apache License, Version 2.0 (the "License");
1306
+ // you may not use this file except in compliance with the License.
1307
+ // You may obtain a copy of the License at
1308
+ //
1309
+ // http://www.apache.org/licenses/LICENSE-2.0
1310
+ //
1311
+ // Unless required by applicable law or agreed to in writing, software
1312
+ // distributed under the License is distributed on an "AS IS" BASIS,
1313
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1314
+ // See the License for the specific language governing permissions and
1315
+ // limitations under the License.