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
  /** Compiled Coroutines.
19
4
  *
20
5
  * Unlike in CPython, we have one type for just coroutines, this doesn't do generators
@@ -29,7 +14,7 @@
29
14
  #ifdef __IDE_ONLY__
30
15
  #include "nuitka/freelists.h"
31
16
  #include "nuitka/prelude.h"
32
- #include "structmember.h"
17
+ #include <structmember.h>
33
18
  #endif
34
19
 
35
20
  // For reporting about reference counts per type.
@@ -72,20 +57,21 @@ static void Nuitka_MarkCoroutineAsNotRunning(struct Nuitka_CoroutineObject *coro
72
57
  }
73
58
 
74
59
  static PyObject *_Nuitka_Coroutine_send(PyThreadState *tstate, struct Nuitka_CoroutineObject *coroutine,
75
- PyObject *value, bool closing, PyObject *exception_type,
76
- PyObject *exception_value, PyTracebackObject *exception_tb);
60
+ PyObject *value, bool closing,
61
+ struct Nuitka_ExceptionPreservationItem *exception_state);
77
62
 
78
63
  static long Nuitka_Coroutine_tp_hash(struct Nuitka_CoroutineObject *coroutine) { return coroutine->m_counter; }
79
64
 
80
- static PyObject *Nuitka_Coroutine_get_name(struct Nuitka_CoroutineObject *coroutine) {
81
- CHECK_OBJECT(coroutine);
65
+ static PyObject *Nuitka_Coroutine_get_name(PyObject *self, void *data) {
66
+ CHECK_OBJECT(self);
82
67
 
68
+ struct Nuitka_CoroutineObject *coroutine = (struct Nuitka_CoroutineObject *)self;
83
69
  Py_INCREF(coroutine->m_name);
84
70
  return coroutine->m_name;
85
71
  }
86
72
 
87
- static int Nuitka_Coroutine_set_name(struct Nuitka_CoroutineObject *coroutine, PyObject *value) {
88
- CHECK_OBJECT(coroutine);
73
+ static int Nuitka_Coroutine_set_name(PyObject *self, PyObject *value, void *data) {
74
+ CHECK_OBJECT(self);
89
75
  CHECK_OBJECT_X(value);
90
76
 
91
77
  // Cannot be deleted, not be non-unicode value.
@@ -96,6 +82,7 @@ static int Nuitka_Coroutine_set_name(struct Nuitka_CoroutineObject *coroutine, P
96
82
  return -1;
97
83
  }
98
84
 
85
+ struct Nuitka_CoroutineObject *coroutine = (struct Nuitka_CoroutineObject *)self;
99
86
  PyObject *tmp = coroutine->m_name;
100
87
  Py_INCREF(value);
101
88
  coroutine->m_name = value;
@@ -104,15 +91,16 @@ static int Nuitka_Coroutine_set_name(struct Nuitka_CoroutineObject *coroutine, P
104
91
  return 0;
105
92
  }
106
93
 
107
- static PyObject *Nuitka_Coroutine_get_qualname(struct Nuitka_CoroutineObject *coroutine) {
108
- CHECK_OBJECT(coroutine);
94
+ static PyObject *Nuitka_Coroutine_get_qualname(PyObject *self, void *data) {
95
+ CHECK_OBJECT(self);
109
96
 
97
+ struct Nuitka_CoroutineObject *coroutine = (struct Nuitka_CoroutineObject *)self;
110
98
  Py_INCREF(coroutine->m_qualname);
111
99
  return coroutine->m_qualname;
112
100
  }
113
101
 
114
- static int Nuitka_Coroutine_set_qualname(struct Nuitka_CoroutineObject *coroutine, PyObject *value) {
115
- CHECK_OBJECT(coroutine);
102
+ static int Nuitka_Coroutine_set_qualname(PyObject *self, PyObject *value, void *data) {
103
+ CHECK_OBJECT(self);
116
104
  CHECK_OBJECT_X(value);
117
105
 
118
106
  // Cannot be deleted, not be non-unicode value.
@@ -123,6 +111,7 @@ static int Nuitka_Coroutine_set_qualname(struct Nuitka_CoroutineObject *coroutin
123
111
  return -1;
124
112
  }
125
113
 
114
+ struct Nuitka_CoroutineObject *coroutine = (struct Nuitka_CoroutineObject *)self;
126
115
  PyObject *tmp = coroutine->m_qualname;
127
116
  Py_INCREF(value);
128
117
  coroutine->m_qualname = value;
@@ -131,20 +120,22 @@ static int Nuitka_Coroutine_set_qualname(struct Nuitka_CoroutineObject *coroutin
131
120
  return 0;
132
121
  }
133
122
 
134
- static PyObject *Nuitka_Coroutine_get_cr_await(struct Nuitka_CoroutineObject *coroutine) {
123
+ static PyObject *Nuitka_Coroutine_get_cr_await(PyObject *self, void *data) {
124
+ struct Nuitka_CoroutineObject *coroutine = (struct Nuitka_CoroutineObject *)self;
135
125
  CHECK_OBJECT(coroutine);
136
- CHECK_OBJECT_X(coroutine->m_yieldfrom);
126
+ CHECK_OBJECT_X(coroutine->m_yield_from);
137
127
 
138
- if (coroutine->m_yieldfrom) {
139
- Py_INCREF(coroutine->m_yieldfrom);
140
- return coroutine->m_yieldfrom;
128
+ if (coroutine->m_yield_from) {
129
+ Py_INCREF(coroutine->m_yield_from);
130
+ return coroutine->m_yield_from;
141
131
  } else {
142
- Py_INCREF(Py_None);
132
+ Py_INCREF_IMMORTAL(Py_None);
143
133
  return Py_None;
144
134
  }
145
135
  }
146
136
 
147
- static PyObject *Nuitka_Coroutine_get_code(struct Nuitka_CoroutineObject *coroutine) {
137
+ static PyObject *Nuitka_Coroutine_get_code(PyObject *self, void *data) {
138
+ struct Nuitka_CoroutineObject *coroutine = (struct Nuitka_CoroutineObject *)self;
148
139
  CHECK_OBJECT(coroutine);
149
140
  CHECK_OBJECT(coroutine->m_code_object);
150
141
 
@@ -152,8 +143,8 @@ static PyObject *Nuitka_Coroutine_get_code(struct Nuitka_CoroutineObject *corout
152
143
  return (PyObject *)coroutine->m_code_object;
153
144
  }
154
145
 
155
- static int Nuitka_Coroutine_set_code(struct Nuitka_CoroutineObject *coroutine, PyObject *value) {
156
- CHECK_OBJECT(coroutine);
146
+ static int Nuitka_Coroutine_set_code(PyObject *self, PyObject *value, void *data) {
147
+ CHECK_OBJECT(self);
157
148
 
158
149
  PyThreadState *tstate = PyThreadState_GET();
159
150
 
@@ -161,7 +152,8 @@ static int Nuitka_Coroutine_set_code(struct Nuitka_CoroutineObject *coroutine, P
161
152
  return -1;
162
153
  }
163
154
 
164
- static PyObject *Nuitka_Coroutine_get_frame(struct Nuitka_CoroutineObject *coroutine) {
155
+ static PyObject *Nuitka_Coroutine_get_frame(PyObject *self, void *data) {
156
+ struct Nuitka_CoroutineObject *coroutine = (struct Nuitka_CoroutineObject *)self;
165
157
  CHECK_OBJECT(coroutine);
166
158
  CHECK_OBJECT_X(coroutine->m_frame);
167
159
 
@@ -169,13 +161,13 @@ static PyObject *Nuitka_Coroutine_get_frame(struct Nuitka_CoroutineObject *corou
169
161
  Py_INCREF(coroutine->m_frame);
170
162
  return (PyObject *)coroutine->m_frame;
171
163
  } else {
172
- Py_INCREF(Py_None);
164
+ Py_INCREF_IMMORTAL(Py_None);
173
165
  return Py_None;
174
166
  }
175
167
  }
176
168
 
177
- static int Nuitka_Coroutine_set_frame(struct Nuitka_CoroutineObject *coroutine, PyObject *value) {
178
- CHECK_OBJECT(coroutine);
169
+ static int Nuitka_Coroutine_set_frame(PyObject *self, PyObject *value, void *data) {
170
+ CHECK_OBJECT(self);
179
171
  CHECK_OBJECT_X(value);
180
172
 
181
173
  PyThreadState *tstate = PyThreadState_GET();
@@ -196,30 +188,29 @@ static void Nuitka_Coroutine_release_closure(struct Nuitka_CoroutineObject *coro
196
188
  }
197
189
 
198
190
  // Note: Shared with asyncgen.
199
- static PyObject *_Nuitka_YieldFromCore(PyThreadState *tstate, PyObject *yieldfrom, PyObject *send_value,
191
+ static PyObject *_Nuitka_YieldFromCore(PyThreadState *tstate, PyObject *yield_from, PyObject *send_value,
200
192
  PyObject **returned_value, bool mode) {
201
193
  // Send iteration value to the sub-generator, which may be a CPython
202
194
  // generator object, something with an iterator next, or a send method,
203
195
  // where the later is only required if values other than "None" need to
204
196
  // be passed in.
205
- CHECK_OBJECT(yieldfrom);
197
+ CHECK_OBJECT(yield_from);
206
198
  CHECK_OBJECT_X(send_value);
207
199
 
208
200
  assert(send_value != NULL || HAS_ERROR_OCCURRED(tstate));
209
201
 
210
202
  PyObject *retval;
211
203
 
212
- PyObject *exception_type, *exception_value;
213
- PyTracebackObject *exception_tb;
204
+ struct Nuitka_ExceptionPreservationItem exception_state;
214
205
 
215
- FETCH_ERROR_OCCURRED(tstate, &exception_type, &exception_value, &exception_tb);
206
+ FETCH_ERROR_OCCURRED_STATE(tstate, &exception_state);
216
207
 
217
- if (exception_type != NULL) {
208
+ if (HAS_EXCEPTION_STATE(&exception_state)) {
218
209
  // Exception, was thrown into us, need to send that to sub-generator.
219
210
  // We acquired ownership of the published exception and need to release it potentially.
220
211
 
221
212
  // Transfer exception owner this.
222
- retval = _Nuitka_YieldFromPassExceptionTo(tstate, yieldfrom, exception_type, exception_value, exception_tb);
213
+ retval = _Nuitka_YieldFromPassExceptionTo(tstate, yield_from, &exception_state);
223
214
 
224
215
  // TODO: This wants to look at retval most definitely, send_value is going to be NULL.
225
216
  if (unlikely(send_value == NULL)) {
@@ -232,24 +223,28 @@ static PyObject *_Nuitka_YieldFromCore(PyThreadState *tstate, PyObject *yieldfro
232
223
  return NULL;
233
224
  }
234
225
  }
235
- } else if (PyGen_CheckExact(yieldfrom) || PyCoro_CheckExact(yieldfrom)) {
236
- retval = Nuitka_PyGen_Send(tstate, (PyGenObject *)yieldfrom, Py_None);
237
- } else if (send_value == Py_None && Nuitka_CoroutineWrapper_Check(yieldfrom)) {
226
+ } else if (PyGen_CheckExact(yield_from) || PyCoro_CheckExact(yield_from)) {
227
+ retval = Nuitka_PyGen_Send(tstate, (PyGenObject *)yield_from, Py_None);
228
+ } else if (send_value == Py_None && Nuitka_CoroutineWrapper_Check(yield_from)) {
238
229
  struct Nuitka_CoroutineObject *yieldfrom_coroutine =
239
- ((struct Nuitka_CoroutineWrapperObject *)yieldfrom)->m_coroutine;
230
+ ((struct Nuitka_CoroutineWrapperObject *)yield_from)->m_coroutine;
231
+
232
+ Py_INCREF_IMMORTAL(Py_None);
233
+
234
+ struct Nuitka_ExceptionPreservationItem no_exception_state;
235
+ INIT_ERROR_OCCURRED_STATE(&no_exception_state);
240
236
 
241
- Py_INCREF(Py_None);
242
- retval = _Nuitka_Coroutine_send(tstate, yieldfrom_coroutine, Py_None, mode ? false : true, NULL, NULL, NULL);
243
- } else if (send_value == Py_None && Py_TYPE(yieldfrom)->tp_iternext != NULL) {
244
- retval = Py_TYPE(yieldfrom)->tp_iternext(yieldfrom);
237
+ retval = _Nuitka_Coroutine_send(tstate, yieldfrom_coroutine, Py_None, mode ? false : true, &no_exception_state);
238
+ } else if (send_value == Py_None && Py_TYPE(yield_from)->tp_iternext != NULL) {
239
+ retval = Py_TYPE(yield_from)->tp_iternext(yield_from);
245
240
  } else {
246
241
  #if 0
247
242
  // TODO: Add slow mode traces.
248
- PRINT_ITEM(yieldfrom);
243
+ PRINT_ITEM(yield_from);
249
244
  PRINT_NEW_LINE();
250
245
  #endif
251
246
 
252
- retval = PyObject_CallMethodObjArgs(yieldfrom, const_str_plain_send, send_value, NULL);
247
+ retval = PyObject_CallMethodObjArgs(yield_from, const_str_plain_send, send_value, NULL);
253
248
  }
254
249
 
255
250
  // Check the sub-generator result
@@ -257,7 +252,7 @@ static PyObject *_Nuitka_YieldFromCore(PyThreadState *tstate, PyObject *yieldfro
257
252
  PyObject *error = GET_ERROR_OCCURRED(tstate);
258
253
 
259
254
  if (error == NULL) {
260
- Py_INCREF(Py_None);
255
+ Py_INCREF_IMMORTAL(Py_None);
261
256
  *returned_value = Py_None;
262
257
  } else if (likely(EXCEPTION_MATCH_BOOL_SINGLE(tstate, error, PyExc_StopIteration))) {
263
258
  // The sub-generator has given an exception. In case of
@@ -284,23 +279,23 @@ static PyObject *_Nuitka_YieldFromCoroutineCore(PyThreadState *tstate, struct Nu
284
279
  CHECK_OBJECT(coroutine);
285
280
  CHECK_OBJECT_X(send_value);
286
281
 
287
- PyObject *yieldfrom = coroutine->m_yieldfrom;
288
- CHECK_OBJECT(yieldfrom);
282
+ PyObject *yield_from = coroutine->m_yield_from;
283
+ CHECK_OBJECT(yield_from);
289
284
 
290
285
  // Need to make it unaccessible while using it.
291
- coroutine->m_yieldfrom = NULL;
286
+ coroutine->m_yield_from = NULL;
292
287
 
293
288
  PyObject *returned_value;
294
- PyObject *yielded = _Nuitka_YieldFromCore(tstate, yieldfrom, send_value, &returned_value, mode);
289
+ PyObject *yielded = _Nuitka_YieldFromCore(tstate, yield_from, send_value, &returned_value, mode);
295
290
 
296
291
  if (yielded == NULL) {
297
- assert(coroutine->m_yieldfrom == NULL);
298
- Py_DECREF(yieldfrom);
292
+ assert(coroutine->m_yield_from == NULL);
293
+ Py_DECREF(yield_from);
299
294
 
300
295
  yielded = ((coroutine_code)coroutine->m_code)(tstate, coroutine, returned_value);
301
296
  } else {
302
- assert(coroutine->m_yieldfrom == NULL);
303
- coroutine->m_yieldfrom = yieldfrom;
297
+ assert(coroutine->m_yield_from == NULL);
298
+ coroutine->m_yield_from = yield_from;
304
299
  }
305
300
 
306
301
  return yielded;
@@ -384,30 +379,26 @@ static void Nuitka_SetStopIterationValue(PyThreadState *tstate, PyObject *value)
384
379
  // be normalized.
385
380
 
386
381
  static PySendResult _Nuitka_Coroutine_sendR(PyThreadState *tstate, struct Nuitka_CoroutineObject *coroutine,
387
- PyObject *value, bool closing, PyObject *exception_type,
388
- PyObject *exception_value, PyTracebackObject *exception_tb,
382
+ PyObject *value, bool closing,
383
+ struct Nuitka_ExceptionPreservationItem *exception_state,
389
384
  PyObject **result) {
390
385
  CHECK_OBJECT(coroutine);
391
386
  assert(Nuitka_Coroutine_Check((PyObject *)coroutine));
392
- CHECK_OBJECT_X(exception_type);
393
- CHECK_OBJECT_X(exception_value);
394
- CHECK_OBJECT_X(exception_tb);
387
+ CHECK_EXCEPTION_STATE_X(exception_state);
395
388
  CHECK_OBJECT_X(value);
396
389
 
397
390
  #if _DEBUG_COROUTINE
398
391
  PRINT_COROUTINE_STATUS("Enter", coroutine);
399
392
  PRINT_COROUTINE_STRING("closing", closing ? "(closing) " : "(not closing) ");
400
393
  PRINT_COROUTINE_VALUE("value", value);
401
- PRINT_EXCEPTION(exception_type, exception_value, exception_tb);
394
+ PRINT_EXCEPTION_STATE(exception_state);
402
395
  PRINT_CURRENT_EXCEPTION();
403
396
  PRINT_NEW_LINE();
404
397
  #endif
405
398
 
406
399
  // Not both a value and an exception please.
407
400
  if (value != NULL) {
408
- assert(exception_type == NULL);
409
- assert(exception_value == NULL);
410
- assert(exception_tb == NULL);
401
+ ASSERT_EMPTY_EXCEPTION_STATE(exception_state);
411
402
  }
412
403
 
413
404
  if (coroutine->m_status == status_Unused && value != NULL && value != Py_None) {
@@ -449,11 +440,11 @@ static PySendResult _Nuitka_Coroutine_sendR(PyThreadState *tstate, struct Nuitka
449
440
  Nuitka_MarkCoroutineAsRunning(coroutine);
450
441
 
451
442
  // Check for thrown exception, publish it to the coroutine code.
452
- if (unlikely(exception_type)) {
443
+ if (unlikely(HAS_EXCEPTION_STATE(exception_state))) {
453
444
  assert(value == NULL);
454
445
 
455
446
  // Transfer exception ownership to published.
456
- RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
447
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
457
448
  }
458
449
 
459
450
  #if _DEBUG_COROUTINE
@@ -466,7 +457,7 @@ static PySendResult _Nuitka_Coroutine_sendR(PyThreadState *tstate, struct Nuitka
466
457
 
467
458
  PyObject *yielded;
468
459
 
469
- if (coroutine->m_yieldfrom == NULL) {
460
+ if (coroutine->m_yield_from == NULL) {
470
461
  yielded = ((coroutine_code)coroutine->m_code)(tstate, coroutine, value);
471
462
  } else {
472
463
  // This does not release the value if any, so we need to do it afterwards.
@@ -474,16 +465,14 @@ static PySendResult _Nuitka_Coroutine_sendR(PyThreadState *tstate, struct Nuitka
474
465
  Py_XDECREF(value);
475
466
  }
476
467
 
477
- // If the coroutine returns with m_yieldfrom set, it wants us to yield
468
+ // If the coroutine returns with m_yield_from set, it wants us to yield
478
469
  // from that value from now on.
479
- while (yielded == NULL && coroutine->m_yieldfrom != NULL) {
470
+ while (yielded == NULL && coroutine->m_yield_from != NULL) {
480
471
  yielded = Nuitka_YieldFromCoroutineNext(tstate, coroutine);
481
472
  }
482
473
 
483
474
  Nuitka_MarkCoroutineAsNotRunning(coroutine);
484
475
 
485
- tstate = PyThreadState_GET();
486
-
487
476
  // Remove the back frame from coroutine if it's there.
488
477
  if (coroutine->m_frame) {
489
478
  // assert(tstate->frame == &coroutine->m_frame->m_frame);
@@ -550,30 +539,7 @@ static PySendResult _Nuitka_Coroutine_sendR(PyThreadState *tstate, struct Nuitka
550
539
 
551
540
  return PYGEN_RETURN;
552
541
  } else if (error == PyExc_StopIteration) {
553
- PyObject *saved_exception_type, *saved_exception_value;
554
- PyTracebackObject *saved_exception_tb;
555
-
556
- // TODO: For Python3.12, this kind of code ought to use tstate methods entirely.
557
- FETCH_ERROR_OCCURRED(tstate, &saved_exception_type, &saved_exception_value, &saved_exception_tb);
558
- NORMALIZE_EXCEPTION(tstate, &saved_exception_type, &saved_exception_value, &saved_exception_tb);
559
-
560
- PyErr_Format(PyExc_RuntimeError, "coroutine raised StopIteration");
561
-
562
- FETCH_ERROR_OCCURRED(tstate, &exception_type, &exception_value, &exception_tb);
563
-
564
- RAISE_EXCEPTION_WITH_CAUSE(tstate, &exception_type, &exception_value, &exception_tb,
565
- saved_exception_value);
566
-
567
- CHECK_OBJECT(exception_value);
568
- CHECK_OBJECT(saved_exception_value);
569
-
570
- Py_INCREF(saved_exception_value);
571
- PyException_SetContext(exception_value, saved_exception_value);
572
-
573
- Py_DECREF(saved_exception_type);
574
- Py_XDECREF(saved_exception_tb);
575
-
576
- RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
542
+ RAISE_RUNTIME_ERROR_RAISED_STOP_ITERATION(tstate, "coroutine raised StopIteration");
577
543
 
578
544
  #if _DEBUG_COROUTINE
579
545
  PRINT_COROUTINE_STATUS("Leave with exception set", coroutine);
@@ -592,9 +558,7 @@ static PySendResult _Nuitka_Coroutine_sendR(PyThreadState *tstate, struct Nuitka
592
558
  Py_XDECREF(value);
593
559
 
594
560
  // Release exception if any, we are finished with it and will raise another.
595
- Py_XDECREF(exception_type);
596
- Py_XDECREF(exception_value);
597
- Py_XDECREF(exception_tb);
561
+ RELEASE_ERROR_OCCURRED_STATE_X(exception_state);
598
562
 
599
563
  /* This is for status_Finished */
600
564
  assert(coroutine->m_status == status_Finished);
@@ -626,18 +590,15 @@ static PySendResult _Nuitka_Coroutine_sendR(PyThreadState *tstate, struct Nuitka
626
590
  }
627
591
 
628
592
  static PyObject *_Nuitka_Coroutine_send(PyThreadState *tstate, struct Nuitka_CoroutineObject *coroutine,
629
- PyObject *value, bool closing, PyObject *exception_type,
630
- PyObject *exception_value, PyTracebackObject *exception_tb) {
593
+ PyObject *value, bool closing,
594
+ struct Nuitka_ExceptionPreservationItem *exception_state) {
631
595
 
632
596
  PyObject *result;
633
- PySendResult res = _Nuitka_Coroutine_sendR(tstate, coroutine, value, closing, exception_type, exception_value,
634
- exception_tb, &result);
597
+ PySendResult res = _Nuitka_Coroutine_sendR(tstate, coroutine, value, closing, exception_state, &result);
635
598
 
636
599
  switch (res) {
637
600
  case PYGEN_RETURN:
638
- if (result == NULL) {
639
- SET_CURRENT_EXCEPTION_TYPE0(tstate, PyExc_StopIteration);
640
- } else {
601
+ if (result != NULL) {
641
602
  if (result != Py_None) {
642
603
  Nuitka_SetStopIterationValue(tstate, result);
643
604
  }
@@ -663,11 +624,15 @@ static PyObject *Nuitka_Coroutine_send(struct Nuitka_CoroutineObject *coroutine,
663
624
  Py_INCREF(value);
664
625
 
665
626
  PyThreadState *tstate = PyThreadState_GET();
666
- PyObject *result = _Nuitka_Coroutine_send(tstate, coroutine, value, false, NULL, NULL, NULL);
627
+
628
+ struct Nuitka_ExceptionPreservationItem exception_state;
629
+ INIT_ERROR_OCCURRED_STATE(&exception_state);
630
+
631
+ PyObject *result = _Nuitka_Coroutine_send(tstate, coroutine, value, false, &exception_state);
667
632
 
668
633
  if (result == NULL) {
669
634
  if (HAS_ERROR_OCCURRED(tstate) == false) {
670
- SET_CURRENT_EXCEPTION_TYPE0(tstate, PyExc_StopIteration);
635
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
671
636
  }
672
637
  }
673
638
 
@@ -682,9 +647,10 @@ static bool _Nuitka_Coroutine_close(PyThreadState *tstate, struct Nuitka_Corouti
682
647
  CHECK_OBJECT(coroutine);
683
648
 
684
649
  if (coroutine->m_status == status_Running) {
685
- Py_INCREF(PyExc_GeneratorExit);
650
+ struct Nuitka_ExceptionPreservationItem exception_state;
651
+ SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, &exception_state, PyExc_GeneratorExit, NULL, NULL);
686
652
 
687
- PyObject *result = _Nuitka_Coroutine_send(tstate, coroutine, NULL, true, PyExc_GeneratorExit, NULL, NULL);
653
+ PyObject *result = _Nuitka_Coroutine_send(tstate, coroutine, NULL, true, &exception_state);
688
654
 
689
655
  if (unlikely(result)) {
690
656
  Py_DECREF(result);
@@ -707,7 +673,7 @@ static PyObject *Nuitka_Coroutine_close(struct Nuitka_CoroutineObject *coroutine
707
673
  if (unlikely(r == false)) {
708
674
  return NULL;
709
675
  } else {
710
- Py_INCREF(Py_None);
676
+ Py_INCREF_IMMORTAL(Py_None);
711
677
  return Py_None;
712
678
  }
713
679
  }
@@ -716,12 +682,11 @@ static PyObject *Nuitka_Coroutine_close(struct Nuitka_CoroutineObject *coroutine
716
682
  static bool Nuitka_AsyncgenAsend_Check(PyObject *object);
717
683
  struct Nuitka_AsyncgenAsendObject;
718
684
  static PyObject *_Nuitka_AsyncgenAsend_throw2(PyThreadState *tstate, struct Nuitka_AsyncgenAsendObject *asyncgen_asend,
719
- PyObject *exception_type, PyObject *exception_value,
720
- PyTracebackObject *exception_tb);
685
+ struct Nuitka_ExceptionPreservationItem *exception_state);
721
686
  #endif
722
687
 
723
- static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exception_type, PyObject **exception_value,
724
- PyTracebackObject **exception_tb);
688
+ static bool _Nuitka_Generator_check_throw(PyThreadState *tstate,
689
+ struct Nuitka_ExceptionPreservationItem *exception_state);
725
690
 
726
691
  // This function is called when yielding to a coroutine through "_Nuitka_YieldFromPassExceptionTo"
727
692
  // and potentially wrapper objects used by generators, or by the throw method itself.
@@ -730,98 +695,90 @@ static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exc
730
695
  // value of exception_type will not be NULL, but the actual exception will not necessarily
731
696
  // be normalized.
732
697
  static PyObject *_Nuitka_Coroutine_throw2(PyThreadState *tstate, struct Nuitka_CoroutineObject *coroutine, bool closing,
733
- PyObject *exception_type, PyObject *exception_value,
734
- PyTracebackObject *exception_tb) {
698
+ struct Nuitka_ExceptionPreservationItem *exception_state) {
735
699
  CHECK_OBJECT(coroutine);
736
700
  assert(Nuitka_Coroutine_Check((PyObject *)coroutine));
737
- CHECK_OBJECT(exception_type);
738
- CHECK_OBJECT_X(exception_value);
739
- CHECK_OBJECT_X(exception_tb);
701
+ CHECK_EXCEPTION_STATE(exception_state);
740
702
 
741
703
  #if _DEBUG_COROUTINE
742
704
  PRINT_COROUTINE_STATUS("Enter", coroutine);
743
705
  PRINT_COROUTINE_STRING("closing", closing ? "(closing) " : "(not closing) ");
744
- PRINT_COROUTINE_VALUE("yieldfrom", coroutine->m_yieldfrom);
745
- PRINT_EXCEPTION(exception_type, exception_value, exception_tb);
706
+ PRINT_COROUTINE_VALUE("yield_from", coroutine->m_yield_from);
707
+ PRINT_EXCEPTION_STATE(exception_state);
746
708
  PRINT_NEW_LINE();
747
709
  #endif
748
710
 
749
- if (coroutine->m_yieldfrom != NULL) {
750
- if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_type, PyExc_GeneratorExit)) {
711
+ if (coroutine->m_yield_from != NULL) {
712
+ if (EXCEPTION_STATE_MATCH_BOOL_SINGLE(tstate, exception_state, PyExc_GeneratorExit)) {
751
713
  // Coroutines need to close the yield_from.
752
714
  Nuitka_MarkCoroutineAsRunning(coroutine);
753
- bool res = Nuitka_gen_close_iter(tstate, coroutine->m_yieldfrom);
715
+ bool res = Nuitka_gen_close_iter(tstate, coroutine->m_yield_from);
754
716
  Nuitka_MarkCoroutineAsNotRunning(coroutine);
755
717
 
756
718
  if (res == false) {
757
719
  // Release exception, we are done with it now and pick up the new one.
758
- Py_DECREF(exception_type);
759
- Py_XDECREF(exception_value);
760
- Py_XDECREF(exception_tb);
720
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
761
721
 
762
- FETCH_ERROR_OCCURRED(tstate, &exception_type, &exception_value, &exception_tb);
722
+ FETCH_ERROR_OCCURRED_STATE(tstate, exception_state);
763
723
  }
764
724
 
765
725
  // Transferred exception ownership to "_Nuitka_Coroutine_send".
766
- return _Nuitka_Coroutine_send(tstate, coroutine, NULL, false, exception_type, exception_value,
767
- exception_tb);
726
+ return _Nuitka_Coroutine_send(tstate, coroutine, NULL, false, exception_state);
768
727
  }
769
728
 
770
729
  PyObject *ret;
771
730
 
772
731
  #if _DEBUG_COROUTINE
773
732
  PRINT_COROUTINE_STATUS("Passing to yielded from", coroutine);
774
- PRINT_COROUTINE_VALUE("m_yieldfrom", coroutine->m_yieldfrom);
733
+ PRINT_COROUTINE_VALUE("m_yield_from", coroutine->m_yield_from);
775
734
  PRINT_NEW_LINE();
776
735
  #endif
777
736
 
778
- if (Nuitka_Generator_Check(coroutine->m_yieldfrom)) {
779
- struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)coroutine->m_yieldfrom);
737
+ if (Nuitka_Generator_Check(coroutine->m_yield_from)) {
738
+ struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)coroutine->m_yield_from);
780
739
  // Transferred exception ownership to "_Nuitka_Generator_throw2".
781
740
  Nuitka_MarkCoroutineAsRunning(coroutine);
782
- ret = _Nuitka_Generator_throw2(tstate, gen, exception_type, exception_value, exception_tb);
741
+ ret = _Nuitka_Generator_throw2(tstate, gen, exception_state);
783
742
  Nuitka_MarkCoroutineAsNotRunning(coroutine);
784
- } else if (Nuitka_Coroutine_Check(coroutine->m_yieldfrom)) {
785
- struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)coroutine->m_yieldfrom);
743
+ } else if (Nuitka_Coroutine_Check(coroutine->m_yield_from)) {
744
+ struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)coroutine->m_yield_from);
786
745
  // Transferred exception ownership to "_Nuitka_Coroutine_throw2".
787
746
  Nuitka_MarkCoroutineAsRunning(coroutine);
788
- ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_type, exception_value, exception_tb);
747
+ ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
789
748
  Nuitka_MarkCoroutineAsNotRunning(coroutine);
790
749
  #if NUITKA_UNCOMPILED_THROW_INTEGRATION
791
- } else if (PyGen_CheckExact(coroutine->m_yieldfrom) || PyCoro_CheckExact(coroutine->m_yieldfrom)) {
792
- PyGenObject *gen = (PyGenObject *)coroutine->m_yieldfrom;
750
+ } else if (PyGen_CheckExact(coroutine->m_yield_from) || PyCoro_CheckExact(coroutine->m_yield_from)) {
751
+ PyGenObject *gen = (PyGenObject *)coroutine->m_yield_from;
793
752
 
794
753
  // Transferred exception ownership to "Nuitka_UncompiledGenerator_throw".
795
754
  Nuitka_MarkCoroutineAsRunning(coroutine);
796
- ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_type, exception_value, exception_tb);
755
+ ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
797
756
  Nuitka_MarkCoroutineAsNotRunning(coroutine);
798
757
  #endif
799
- } else if (Nuitka_CoroutineWrapper_Check(coroutine->m_yieldfrom)) {
758
+ } else if (Nuitka_CoroutineWrapper_Check(coroutine->m_yield_from)) {
800
759
  struct Nuitka_CoroutineObject *coro =
801
- ((struct Nuitka_CoroutineWrapperObject *)coroutine->m_yieldfrom)->m_coroutine;
760
+ ((struct Nuitka_CoroutineWrapperObject *)coroutine->m_yield_from)->m_coroutine;
802
761
 
803
762
  // Transferred exception ownership to "_Nuitka_Coroutine_throw2".
804
763
  Nuitka_MarkCoroutineAsRunning(coroutine);
805
- ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_type, exception_value, exception_tb);
764
+ ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
806
765
  Nuitka_MarkCoroutineAsNotRunning(coroutine);
807
766
  #if PYTHON_VERSION >= 0x360
808
- } else if (Nuitka_AsyncgenAsend_Check(coroutine->m_yieldfrom)) {
767
+ } else if (Nuitka_AsyncgenAsend_Check(coroutine->m_yield_from)) {
809
768
  struct Nuitka_AsyncgenAsendObject *asyncgen_asend =
810
- ((struct Nuitka_AsyncgenAsendObject *)coroutine->m_yieldfrom);
769
+ ((struct Nuitka_AsyncgenAsendObject *)coroutine->m_yield_from);
811
770
 
812
771
  // Transferred exception ownership to "_Nuitka_AsyncgenAsend_throw2".
813
772
  Nuitka_MarkCoroutineAsRunning(coroutine);
814
- ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend, exception_type, exception_value, exception_tb);
773
+ ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend, exception_state);
815
774
  Nuitka_MarkCoroutineAsNotRunning(coroutine);
816
775
  #endif
817
776
  } else {
818
- PyObject *meth = PyObject_GetAttr(coroutine->m_yieldfrom, const_str_plain_throw);
777
+ PyObject *meth = PyObject_GetAttr(coroutine->m_yield_from, const_str_plain_throw);
819
778
  if (unlikely(meth == NULL)) {
820
779
  if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
821
780
  // Release exception, we are done with it now.
822
- Py_DECREF(exception_type);
823
- Py_XDECREF(exception_value);
824
- Py_XDECREF(exception_tb);
781
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
825
782
 
826
783
  return NULL;
827
784
  }
@@ -832,39 +789,37 @@ static PyObject *_Nuitka_Coroutine_throw2(PyThreadState *tstate, struct Nuitka_C
832
789
  goto throw_here;
833
790
  }
834
791
 
835
- CHECK_OBJECT(exception_type);
792
+ CHECK_EXCEPTION_STATE(exception_state);
836
793
 
837
794
  #if 0
838
795
  // TODO: Add slow mode traces.
839
- PRINT_ITEM(coroutine->m_yieldfrom);
796
+ PRINT_ITEM(coroutine->m_yield_from);
840
797
  PRINT_NEW_LINE();
841
798
  #endif
842
799
  Nuitka_MarkCoroutineAsRunning(coroutine);
843
- ret = PyObject_CallFunctionObjArgs(meth, exception_type, exception_value, exception_tb, NULL);
800
+ ret = Nuitka_CallGeneratorThrowMethod(meth, exception_state);
844
801
  Nuitka_MarkCoroutineAsNotRunning(coroutine);
845
802
 
846
803
  Py_DECREF(meth);
847
804
 
848
805
  // Release exception, we are done with it now.
849
- Py_DECREF(exception_type);
850
- Py_XDECREF(exception_value);
851
- Py_XDECREF(exception_tb);
806
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
852
807
  }
853
808
 
854
809
  if (unlikely(ret == NULL)) {
855
810
  // Return value or exception, not to continue with yielding from.
856
- if (coroutine->m_yieldfrom != NULL) {
857
- CHECK_OBJECT(coroutine->m_yieldfrom);
811
+ if (coroutine->m_yield_from != NULL) {
812
+ CHECK_OBJECT(coroutine->m_yield_from);
858
813
  #if _DEBUG_COROUTINE
859
814
  PRINT_COROUTINE_STATUS("Null return, yield from removal:", coroutine);
860
- PRINT_COROUTINE_VALUE("yieldfrom", coroutine->m_yieldfrom);
815
+ PRINT_COROUTINE_VALUE("yield_from", coroutine->m_yield_from);
861
816
  #endif
862
- Py_DECREF(coroutine->m_yieldfrom);
863
- coroutine->m_yieldfrom = NULL;
817
+ Py_DECREF(coroutine->m_yield_from);
818
+ coroutine->m_yield_from = NULL;
864
819
  }
865
820
 
866
821
  PyObject *val;
867
- if (_PyGen_FetchStopIterationValue(&val) == 0) {
822
+ if (Nuitka_PyGen_FetchStopIterationValue(tstate, &val)) {
868
823
  CHECK_OBJECT(val);
869
824
 
870
825
  #if _DEBUG_COROUTINE
@@ -873,15 +828,22 @@ static PyObject *_Nuitka_Coroutine_throw2(PyThreadState *tstate, struct Nuitka_C
873
828
  PRINT_NEW_LINE();
874
829
  #endif
875
830
 
831
+ struct Nuitka_ExceptionPreservationItem no_exception_state;
832
+ INIT_ERROR_OCCURRED_STATE(&no_exception_state);
833
+
876
834
  // The ownership of val is transferred.
877
- ret = _Nuitka_Coroutine_send(tstate, coroutine, val, false, NULL, NULL, NULL);
835
+ ret = _Nuitka_Coroutine_send(tstate, coroutine, val, false, &no_exception_state);
878
836
  } else {
879
837
  #if _DEBUG_COROUTINE
880
838
  PRINT_COROUTINE_STATUS("Sending exception value into ourselves", coroutine);
881
839
  PRINT_CURRENT_EXCEPTION();
882
840
  PRINT_NEW_LINE();
883
841
  #endif
884
- ret = _Nuitka_Coroutine_send(tstate, coroutine, NULL, false, NULL, NULL, NULL);
842
+
843
+ struct Nuitka_ExceptionPreservationItem no_exception_state;
844
+ INIT_ERROR_OCCURRED_STATE(&no_exception_state);
845
+
846
+ ret = _Nuitka_Coroutine_send(tstate, coroutine, NULL, false, &no_exception_state);
885
847
  }
886
848
 
887
849
  #if _DEBUG_COROUTINE
@@ -907,15 +869,14 @@ static PyObject *_Nuitka_Coroutine_throw2(PyThreadState *tstate, struct Nuitka_C
907
869
  throw_here:
908
870
  // We continue to have exception ownership here.
909
871
 
910
- if (unlikely(_Nuitka_Generator_check_throw2(tstate, &exception_type, &exception_value, &exception_tb) == false)) {
911
- // Exception was released by _Nuitka_Generator_check_throw2 already.
872
+ if (unlikely(_Nuitka_Generator_check_throw(tstate, exception_state) == false)) {
873
+ // Exception was released by _Nuitka_Generator_check_throw already.
912
874
  return NULL;
913
875
  }
914
876
 
915
877
  if (coroutine->m_status == status_Running) {
916
878
  // Transferred exception ownership to "_Nuitka_Coroutine_send".
917
- PyObject *result =
918
- _Nuitka_Coroutine_send(tstate, coroutine, NULL, false, exception_type, exception_value, exception_tb);
879
+ PyObject *result = _Nuitka_Coroutine_send(tstate, coroutine, NULL, false, exception_state);
919
880
  return result;
920
881
  } else if (coroutine->m_status == status_Finished) {
921
882
 
@@ -937,30 +898,31 @@ throw_here:
937
898
  #endif
938
899
  );
939
900
 
940
- Py_DECREF(exception_type);
941
- Py_XDECREF(exception_value);
942
- Py_XDECREF(exception_tb);
901
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
943
902
 
944
903
  return NULL;
945
904
  }
946
905
  #endif
947
906
  // Passing exception to publication.
948
- RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
907
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
949
908
 
950
909
  return NULL;
951
910
  } else {
911
+ PyTracebackObject *exception_tb = GET_EXCEPTION_STATE_TRACEBACK(exception_state);
912
+
952
913
  if (exception_tb == NULL) {
953
914
  // TODO: Our compiled objects really need a way to store common
954
915
  // stuff in a "shared" part across all instances, and outside of
955
916
  // run time, so we could reuse this.
956
917
  struct Nuitka_FrameObject *frame =
957
918
  MAKE_FUNCTION_FRAME(tstate, coroutine->m_code_object, coroutine->m_module, 0);
958
- exception_tb = MAKE_TRACEBACK(frame, coroutine->m_code_object->co_firstlineno);
919
+ SET_EXCEPTION_STATE_TRACEBACK(exception_state,
920
+ MAKE_TRACEBACK(frame, coroutine->m_code_object->co_firstlineno));
959
921
  Py_DECREF(frame);
960
922
  }
961
923
 
962
924
  // Passing exception to publication.
963
- RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
925
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
964
926
 
965
927
  #if _DEBUG_COROUTINE
966
928
  PRINT_COROUTINE_STATUS("Finishing from exception", coroutine);
@@ -994,18 +956,20 @@ static PyObject *Nuitka_Coroutine_throw(struct Nuitka_CoroutineObject *coroutine
994
956
  PRINT_NEW_LINE();
995
957
  #endif
996
958
 
959
+ PyThreadState *tstate = PyThreadState_GET();
960
+
997
961
  // Handing ownership of exception over, we need not release it ourselves
998
- Py_INCREF(exception_type);
999
- Py_XINCREF(exception_value);
1000
- Py_XINCREF(exception_tb);
962
+ struct Nuitka_ExceptionPreservationItem exception_state;
963
+ if (_Nuitka_Generator_make_throw_exception_state(tstate, &exception_state, exception_type, exception_value,
964
+ exception_tb) == false) {
965
+ return NULL;
966
+ }
1001
967
 
1002
- PyThreadState *tstate = PyThreadState_GET();
1003
- PyObject *result =
1004
- _Nuitka_Coroutine_throw2(tstate, coroutine, false, exception_type, exception_value, exception_tb);
968
+ PyObject *result = _Nuitka_Coroutine_throw2(tstate, coroutine, false, &exception_state);
1005
969
 
1006
970
  if (result == NULL) {
1007
971
  if (HAS_ERROR_OCCURRED(tstate) == false) {
1008
- SET_CURRENT_EXCEPTION_TYPE0(tstate, PyExc_StopIteration);
972
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
1009
973
  }
1010
974
  }
1011
975
 
@@ -1031,7 +995,7 @@ static long Nuitka_Coroutine_tp_traverse(struct Nuitka_CoroutineObject *coroutin
1031
995
  CHECK_OBJECT(coroutine);
1032
996
 
1033
997
  // TODO: Identify the impact of not visiting owned objects like module
1034
- Py_VISIT(coroutine->m_yieldfrom);
998
+ Py_VISIT(coroutine->m_yield_from);
1035
999
 
1036
1000
  for (Py_ssize_t i = 0; i < coroutine->m_closure_given; i++) {
1037
1001
  Py_VISIT(coroutine->m_closure[i]);
@@ -1085,7 +1049,11 @@ static PySendResult _Nuitka_Coroutine_am_send(struct Nuitka_CoroutineObject *cor
1085
1049
 
1086
1050
  // We need to transfer ownership of the sent value.
1087
1051
  Py_INCREF(arg);
1088
- PySendResult res = _Nuitka_Coroutine_sendR(tstate, coroutine, arg, false, NULL, NULL, NULL, result);
1052
+
1053
+ struct Nuitka_ExceptionPreservationItem exception_state;
1054
+ INIT_ERROR_OCCURRED_STATE(&exception_state);
1055
+
1056
+ PySendResult res = _Nuitka_Coroutine_sendR(tstate, coroutine, arg, false, &exception_state, result);
1089
1057
 
1090
1058
  #if _DEBUG_COROUTINE
1091
1059
  PRINT_COROUTINE_STATUS("Leave", coroutine);
@@ -1103,9 +1071,8 @@ static void Nuitka_Coroutine_tp_finalize(struct Nuitka_CoroutineObject *coroutin
1103
1071
 
1104
1072
  PyThreadState *tstate = PyThreadState_GET();
1105
1073
 
1106
- PyObject *save_exception_type, *save_exception_value;
1107
- PyTracebackObject *save_exception_tb;
1108
- FETCH_ERROR_OCCURRED(tstate, &save_exception_type, &save_exception_value, &save_exception_tb);
1074
+ struct Nuitka_ExceptionPreservationItem saved_exception_state;
1075
+ FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1109
1076
 
1110
1077
  bool close_result = _Nuitka_Coroutine_close(tstate, coroutine);
1111
1078
 
@@ -1114,7 +1081,7 @@ static void Nuitka_Coroutine_tp_finalize(struct Nuitka_CoroutineObject *coroutin
1114
1081
  }
1115
1082
 
1116
1083
  /* Restore the saved exception if any. */
1117
- RESTORE_ERROR_OCCURRED(tstate, save_exception_type, save_exception_value, save_exception_tb);
1084
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1118
1085
  }
1119
1086
 
1120
1087
  #define MAX_COROUTINE_FREE_LIST_COUNT 100
@@ -1134,9 +1101,8 @@ static void Nuitka_Coroutine_tp_dealloc(struct Nuitka_CoroutineObject *coroutine
1134
1101
  PyThreadState *tstate = PyThreadState_GET();
1135
1102
 
1136
1103
  // Save the current exception, if any, we must preserve it.
1137
- PyObject *save_exception_type, *save_exception_value;
1138
- PyTracebackObject *save_exception_tb;
1139
- FETCH_ERROR_OCCURRED(tstate, &save_exception_type, &save_exception_value, &save_exception_tb);
1104
+ struct Nuitka_ExceptionPreservationItem saved_exception_state;
1105
+ FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1140
1106
 
1141
1107
  #if _DEBUG_COROUTINE
1142
1108
  PRINT_COROUTINE_STATUS("Enter", coroutine);
@@ -1154,7 +1120,7 @@ static void Nuitka_Coroutine_tp_dealloc(struct Nuitka_CoroutineObject *coroutine
1154
1120
  // Allow for above code to resurrect the coroutine.
1155
1121
  Py_SET_REFCNT(coroutine, Py_REFCNT(coroutine) - 1);
1156
1122
  if (Py_REFCNT(coroutine) >= 1) {
1157
- RESTORE_ERROR_OCCURRED(tstate, save_exception_type, save_exception_value, save_exception_tb);
1123
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1158
1124
  return;
1159
1125
  }
1160
1126
 
@@ -1182,7 +1148,7 @@ static void Nuitka_Coroutine_tp_dealloc(struct Nuitka_CoroutineObject *coroutine
1182
1148
  /* Put the object into free list or release to GC */
1183
1149
  releaseToFreeList(free_list_coros, coroutine, MAX_COROUTINE_FREE_LIST_COUNT);
1184
1150
 
1185
- RESTORE_ERROR_OCCURRED(tstate, save_exception_type, save_exception_value, save_exception_tb);
1151
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1186
1152
  }
1187
1153
 
1188
1154
  // TODO: Set "__doc__" automatically for method clones of compiled types from
@@ -1194,12 +1160,12 @@ static PyMethodDef Nuitka_Coroutine_methods[] = {{"send", (PyCFunction)Nuitka_Co
1194
1160
 
1195
1161
  // TODO: Set "__doc__" automatically for method clones of compiled types from
1196
1162
  // the documentation of built-in original type.
1197
- static PyGetSetDef Nuitka_Coroutine_getsetlist[] = {
1198
- {(char *)"__name__", (getter)Nuitka_Coroutine_get_name, (setter)Nuitka_Coroutine_set_name, NULL},
1199
- {(char *)"__qualname__", (getter)Nuitka_Coroutine_get_qualname, (setter)Nuitka_Coroutine_set_qualname, NULL},
1200
- {(char *)"cr_await", (getter)Nuitka_Coroutine_get_cr_await, (setter)NULL, NULL},
1201
- {(char *)"cr_code", (getter)Nuitka_Coroutine_get_code, (setter)Nuitka_Coroutine_set_code, NULL},
1202
- {(char *)"cr_frame", (getter)Nuitka_Coroutine_get_frame, (setter)Nuitka_Coroutine_set_frame, NULL},
1163
+ static PyGetSetDef Nuitka_Coroutine_tp_getset[] = {
1164
+ {(char *)"__name__", Nuitka_Coroutine_get_name, Nuitka_Coroutine_set_name, NULL},
1165
+ {(char *)"__qualname__", Nuitka_Coroutine_get_qualname, Nuitka_Coroutine_set_qualname, NULL},
1166
+ {(char *)"cr_await", Nuitka_Coroutine_get_cr_await, NULL, NULL},
1167
+ {(char *)"cr_code", Nuitka_Coroutine_get_code, Nuitka_Coroutine_set_code, NULL},
1168
+ {(char *)"cr_frame", Nuitka_Coroutine_get_frame, Nuitka_Coroutine_set_frame, NULL},
1203
1169
 
1204
1170
  {NULL}};
1205
1171
 
@@ -1251,7 +1217,7 @@ PyTypeObject Nuitka_Coroutine_Type = {
1251
1217
  0, // tp_iternext
1252
1218
  Nuitka_Coroutine_methods, // tp_methods
1253
1219
  Nuitka_Coroutine_members, // tp_members
1254
- Nuitka_Coroutine_getsetlist, // tp_getset
1220
+ Nuitka_Coroutine_tp_getset, // tp_getset
1255
1221
  0, // tp_base
1256
1222
  0, // tp_dict
1257
1223
  0, // tp_descr_get
@@ -1390,12 +1356,15 @@ static int Nuitka_PyInterpreterFrame_GetLine(_PyInterpreterFrame *frame) {
1390
1356
  // we have the line number stored.
1391
1357
 
1392
1358
  int addr = _PyInterpreterFrame_LASTI(frame) * sizeof(_Py_CODEUNIT);
1359
+ #if PYTHON_VERSION < 0x3d0
1393
1360
  return PyCode_Addr2Line(frame->f_code, addr);
1361
+ #else
1362
+ return PyCode_Addr2Line((PyCodeObject *)frame->f_executable, addr);
1363
+ #endif
1394
1364
  }
1395
1365
 
1396
- static PyObject *computeCoroutineOrigin(int origin_depth) {
1397
- PyThreadState *tstate = _PyThreadState_GET();
1398
- _PyInterpreterFrame *current_frame = tstate->cframe->current_frame;
1366
+ static PyObject *computeCoroutineOrigin(PyThreadState *tstate, int origin_depth) {
1367
+ _PyInterpreterFrame *current_frame = CURRENT_TSTATE_INTERPRETER_FRAME(tstate);
1399
1368
 
1400
1369
  // Create result tuple with correct size.
1401
1370
  int frame_count = 0;
@@ -1404,11 +1373,11 @@ static PyObject *computeCoroutineOrigin(int origin_depth) {
1404
1373
  frame = frame->previous;
1405
1374
  frame_count += 1;
1406
1375
  }
1407
- PyObject *cr_origin = MAKE_TUPLE_EMPTY_VAR(frame_count);
1376
+ PyObject *cr_origin = MAKE_TUPLE_EMPTY_VAR(tstate, frame_count);
1408
1377
 
1409
1378
  frame = current_frame;
1410
1379
  for (int i = 0; i < frame_count; i++) {
1411
- PyCodeObject *code = frame->f_code;
1380
+ PyCodeObject *code = Nuitka_InterpreterFrame_GetCodeObject(frame);
1412
1381
 
1413
1382
  int line = Nuitka_PyInterpreterFrame_GetLine(frame);
1414
1383
 
@@ -1423,7 +1392,7 @@ static PyObject *computeCoroutineOrigin(int origin_depth) {
1423
1392
  }
1424
1393
 
1425
1394
  #elif PYTHON_VERSION >= 0x370
1426
- static PyObject *computeCoroutineOrigin(int origin_depth) {
1395
+ static PyObject *computeCoroutineOrigin(PyThreadState *tstate, int origin_depth) {
1427
1396
  PyFrameObject *frame = PyEval_GetFrame();
1428
1397
 
1429
1398
  int frame_count = 0;
@@ -1433,13 +1402,13 @@ static PyObject *computeCoroutineOrigin(int origin_depth) {
1433
1402
  frame_count += 1;
1434
1403
  }
1435
1404
 
1436
- PyObject *cr_origin = MAKE_TUPLE_EMPTY(frame_count);
1405
+ PyObject *cr_origin = MAKE_TUPLE_EMPTY(tstate, frame_count);
1437
1406
 
1438
1407
  frame = PyEval_GetFrame();
1439
1408
 
1440
1409
  for (int i = 0; i < frame_count; i++) {
1441
- PyObject *frame_info =
1442
- Py_BuildValue("OiO", frame->f_code->co_filename, PyFrame_GetLineNumber(frame), frame->f_code->co_name);
1410
+ PyObject *frame_info = Py_BuildValue("OiO", Nuitka_Frame_GetCodeObject(frame)->co_filename,
1411
+ PyFrame_GetLineNumber(frame), frame->f_code->co_name);
1443
1412
 
1444
1413
  assert(frame_info);
1445
1414
 
@@ -1489,7 +1458,7 @@ PyObject *Nuitka_Coroutine_New(PyThreadState *tstate, coroutine_code code, PyObj
1489
1458
  result->m_qualname = qualname;
1490
1459
  Py_INCREF(qualname);
1491
1460
 
1492
- result->m_yieldfrom = NULL;
1461
+ result->m_yield_from = NULL;
1493
1462
 
1494
1463
  memcpy(&result->m_closure[0], closure, closure_given * sizeof(struct Nuitka_CellObject *));
1495
1464
  result->m_closure_given = closure_given;
@@ -1515,7 +1484,7 @@ PyObject *Nuitka_Coroutine_New(PyThreadState *tstate, coroutine_code code, PyObj
1515
1484
  if (origin_depth == 0) {
1516
1485
  result->m_origin = NULL;
1517
1486
  } else {
1518
- result->m_origin = computeCoroutineOrigin(origin_depth);
1487
+ result->m_origin = computeCoroutineOrigin(tstate, origin_depth);
1519
1488
  }
1520
1489
  #endif
1521
1490
 
@@ -1530,9 +1499,21 @@ PyObject *Nuitka_Coroutine_New(PyThreadState *tstate, coroutine_code code, PyObj
1530
1499
  return (PyObject *)result;
1531
1500
  }
1532
1501
 
1502
+ static inline PyCodeObject *_Nuitka_PyGen_GetCode(PyGenObject *gen) {
1503
+ #if PYTHON_VERSION < 0x3c0
1504
+ return (PyCodeObject *)gen->gi_code;
1505
+ #elif PYTHON_VERSION < 0x3d0
1506
+ _PyInterpreterFrame *frame = (_PyInterpreterFrame *)(gen->gi_iframe);
1507
+ return frame->f_code;
1508
+ #else
1509
+ _PyInterpreterFrame *frame = (_PyInterpreterFrame *)(gen->gi_iframe);
1510
+ return (PyCodeObject *)frame->f_executable;
1511
+ #endif
1512
+ }
1513
+
1533
1514
  static int gen_is_coroutine(PyObject *object) {
1534
1515
  if (PyGen_CheckExact(object)) {
1535
- PyCodeObject *code = (PyCodeObject *)((PyGenObject *)object)->gi_code;
1516
+ PyCodeObject *code = _Nuitka_PyGen_GetCode((PyGenObject *)object);
1536
1517
 
1537
1518
  if (code->co_flags & CO_ITERABLE_COROUTINE) {
1538
1519
  return 1;
@@ -1677,17 +1658,24 @@ static PyObject *Nuitka_AIterWrapper_iternext(struct Nuitka_AIterWrapper *aw) {
1677
1658
 
1678
1659
  #if PYTHON_VERSION < 0x360
1679
1660
  SET_CURRENT_EXCEPTION_TYPE0_VALUE0(tstate, PyExc_StopIteration, aw->aw_aiter);
1680
- #else
1661
+ #elif PYTHON_VERSION < 0x3c0
1681
1662
  if (!PyTuple_Check(aw->aw_aiter) && !PyExceptionInstance_Check(aw->aw_aiter)) {
1682
1663
  SET_CURRENT_EXCEPTION_TYPE0_VALUE0(tstate, PyExc_StopIteration, aw->aw_aiter);
1683
1664
  } else {
1684
- PyObject *result = PyObject_CallFunctionObjArgs(PyExc_StopIteration, aw->aw_aiter, NULL);
1665
+ PyObject *result = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, PyExc_StopIteration, aw->aw_aiter);
1666
+
1685
1667
  if (unlikely(result == NULL)) {
1686
1668
  return NULL;
1687
1669
  }
1688
1670
 
1689
- SET_CURRENT_EXCEPTION_TYPE0_VALUE1(tstate, PyExc_StopIteration, result);
1671
+ struct Nuitka_ExceptionPreservationItem exception_state = {_Py_NewRef(PyExc_StopIteration), result, NULL};
1672
+
1673
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &exception_state);
1690
1674
  }
1675
+ #else
1676
+ struct Nuitka_ExceptionPreservationItem exception_state = {Nuitka_CreateStopIteration(tstate, aw->aw_aiter)};
1677
+
1678
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &exception_state);
1691
1679
  #endif
1692
1680
 
1693
1681
  return NULL;
@@ -1953,3 +1941,18 @@ static void _initCompiledCoroutineTypes(void) {
1953
1941
  #if PYTHON_VERSION >= 0x360
1954
1942
  #include "CompiledAsyncgenType.c"
1955
1943
  #endif
1944
+
1945
+ // Part of "Nuitka", an optimizing Python compiler that is compatible and
1946
+ // integrates with CPython, but also works on its own.
1947
+ //
1948
+ // Licensed under the Apache License, Version 2.0 (the "License");
1949
+ // you may not use this file except in compliance with the License.
1950
+ // You may obtain a copy of the License at
1951
+ //
1952
+ // http://www.apache.org/licenses/LICENSE-2.0
1953
+ //
1954
+ // Unless required by applicable law or agreed to in writing, software
1955
+ // distributed under the License is distributed on an "AS IS" BASIS,
1956
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1957
+ // See the License for the specific language governing permissions and
1958
+ // limitations under the License.