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