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 Generators.
19
4
  *
20
5
  * Unlike in CPython, we have one type for just generators, this doesn't do coroutines
@@ -28,6 +13,13 @@
28
13
  /* This file is included from another C file, help IDEs to still parse it on its own. */
29
14
  #ifdef __IDE_ONLY__
30
15
  #include "nuitka/prelude.h"
16
+ #include <structmember.h>
17
+ #endif
18
+
19
+ #if _DEBUG_REFCOUNTS
20
+ int count_active_Nuitka_Generator_Type;
21
+ int count_allocated_Nuitka_Generator_Type;
22
+ int count_released_Nuitka_Generator_Type;
31
23
  #endif
32
24
 
33
25
  // In a separate file, code to interact with uncompiled generators, that does
@@ -118,13 +110,15 @@ static void Nuitka_MarkGeneratorAsNotRunning(struct Nuitka_GeneratorObject *gene
118
110
  }
119
111
 
120
112
  static PyObject *Nuitka_Generator_tp_repr(struct Nuitka_GeneratorObject *generator) {
121
- return Nuitka_String_FromFormat("<compiled_generator object %s at %p>",
122
- #if PYTHON_VERSION < 0x350
123
- Nuitka_String_AsString(generator->m_name),
113
+ #if PYTHON_VERSION < 0x300
114
+ return Nuitka_String_FromFormat("<compiled_generator object %s at %p>", Nuitka_String_AsString(generator->m_name),
115
+ generator);
116
+ #elif PYTHON_VERSION < 0x350
117
+ return Nuitka_String_FromFormat("<compiled_generator object %U at %p>", generator->m_name, generator);
118
+
124
119
  #else
125
- Nuitka_String_AsString(generator->m_qualname),
120
+ return Nuitka_String_FromFormat("<compiled_generator object %U at %p>", generator->m_qualname, generator);
126
121
  #endif
127
- generator);
128
122
  }
129
123
 
130
124
  static long Nuitka_Generator_tp_traverse(struct Nuitka_GeneratorObject *generator, visitproc visit, void *arg) {
@@ -132,7 +126,7 @@ static long Nuitka_Generator_tp_traverse(struct Nuitka_GeneratorObject *generato
132
126
 
133
127
  // TODO: Identify the impact of not visiting owned objects like module.
134
128
  #if PYTHON_VERSION >= 0x300
135
- Py_VISIT(generator->m_yieldfrom);
129
+ Py_VISIT(generator->m_yield_from);
136
130
  #endif
137
131
 
138
132
  for (Py_ssize_t i = 0; i < generator->m_closure_given; i++) {
@@ -159,16 +153,20 @@ static void Nuitka_Generator_release_closure(struct Nuitka_GeneratorObject *gene
159
153
  static PyObject *ERROR_GET_STOP_ITERATION_VALUE(PyThreadState *tstate) {
160
154
  assert(PyErr_ExceptionMatches(PyExc_StopIteration));
161
155
 
162
- PyObject *exception_type, *exception_value;
163
- PyTracebackObject *exception_tb;
164
- FETCH_ERROR_OCCURRED(tstate, &exception_type, &exception_value, &exception_tb);
156
+ struct Nuitka_ExceptionPreservationItem saved_exception_state;
157
+ FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
165
158
 
166
- Py_DECREF(exception_type);
167
- Py_XDECREF(exception_tb);
159
+ #if PYTHON_VERSION < 0x3c0
160
+ Py_DECREF(saved_exception_state.exception_type);
161
+ Py_XDECREF(saved_exception_state.exception_tb);
162
+ #endif
163
+
164
+ // We own a reference, and we mean to return it.
165
+ PyObject *exception_value = saved_exception_state.exception_value;
168
166
 
169
167
  PyObject *value = NULL;
170
168
 
171
- if (exception_value) {
169
+ if (exception_value != NULL) {
172
170
  if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_value, PyExc_StopIteration)) {
173
171
  value = ((PyStopIterationObject *)exception_value)->value;
174
172
  Py_XINCREF(value);
@@ -179,27 +177,45 @@ static PyObject *ERROR_GET_STOP_ITERATION_VALUE(PyThreadState *tstate) {
179
177
  }
180
178
 
181
179
  if (value == NULL) {
182
- Py_INCREF(Py_None);
180
+ Py_INCREF_IMMORTAL(Py_None);
183
181
  value = Py_None;
184
182
  }
185
183
 
186
184
  return value;
187
185
  }
188
186
 
187
+ static PyObject *Nuitka_CallGeneratorThrowMethod(PyObject *throw_method,
188
+ struct Nuitka_ExceptionPreservationItem *exception_state) {
189
+
190
+ // TODO: Faster call code should be used.
191
+
192
+ #if PYTHON_VERSION < 0x3c0
193
+ PyObject *result =
194
+ PyObject_CallFunctionObjArgs(throw_method, exception_state->exception_type, exception_state->exception_value,
195
+ exception_state->exception_tb, NULL);
196
+
197
+ return result;
198
+ #else
199
+ // For Python 3.12 or higher, we don't create the type and tb args, code was
200
+ // always supposed to handle single argument forms and is now.
201
+ PyObject *result = PyObject_CallFunctionObjArgs(throw_method, exception_state->exception_value, NULL);
202
+
203
+ return result;
204
+ #endif
205
+ }
206
+
189
207
  static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator,
190
- PyObject *exception_type, PyObject *exception_value,
191
- PyTracebackObject *exception_tb);
208
+ struct Nuitka_ExceptionPreservationItem *exception_state);
192
209
  #if PYTHON_VERSION >= 0x350
193
210
  static PyObject *_Nuitka_Coroutine_throw2(PyThreadState *tstate, struct Nuitka_CoroutineObject *coroutine, bool closing,
194
- PyObject *exception_type, PyObject *exception_value,
195
- PyTracebackObject *exception_tb);
211
+ struct Nuitka_ExceptionPreservationItem *exception_state);
196
212
  #endif
197
213
 
198
- static PyObject *_Nuitka_YieldFromPassExceptionTo(PyThreadState *tstate, PyObject *value, PyObject *exception_type,
199
- PyObject *exception_value, PyTracebackObject *exception_tb) {
214
+ static PyObject *_Nuitka_YieldFromPassExceptionTo(PyThreadState *tstate, PyObject *value,
215
+ struct Nuitka_ExceptionPreservationItem *exception_state) {
200
216
  // The yielding generator is being closed, but we also are tasked to
201
217
  // immediately close the currently running sub-generator.
202
- if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_type, PyExc_GeneratorExit)) {
218
+ if (EXCEPTION_STATE_MATCH_BOOL_SINGLE(tstate, exception_state, PyExc_GeneratorExit)) {
203
219
  PyObject *close_method = PyObject_GetAttr(value, const_str_plain_close);
204
220
 
205
221
  if (close_method) {
@@ -208,9 +224,7 @@ static PyObject *_Nuitka_YieldFromPassExceptionTo(PyThreadState *tstate, PyObjec
208
224
 
209
225
  if (unlikely(close_value == NULL)) {
210
226
  // Release exception, we are done with it, raising the one from close instead.
211
- Py_DECREF(exception_type);
212
- Py_XDECREF(exception_value);
213
- Py_XDECREF(exception_tb);
227
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
214
228
 
215
229
  return NULL;
216
230
  }
@@ -225,7 +239,7 @@ static PyObject *_Nuitka_YieldFromPassExceptionTo(PyThreadState *tstate, PyObjec
225
239
  }
226
240
 
227
241
  // Transfer exception ownership to published.
228
- RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
242
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
229
243
 
230
244
  return NULL;
231
245
  }
@@ -239,8 +253,7 @@ static PyObject *_Nuitka_YieldFromPassExceptionTo(PyThreadState *tstate, PyObjec
239
253
  PyGenObject *gen = (PyGenObject *)value;
240
254
 
241
255
  // Handing exception ownership over.
242
- PyObject *result =
243
- Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_type, exception_value, exception_tb);
256
+ PyObject *result = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
244
257
 
245
258
  return result;
246
259
  }
@@ -249,60 +262,55 @@ static PyObject *_Nuitka_YieldFromPassExceptionTo(PyThreadState *tstate, PyObjec
249
262
  if (Nuitka_Generator_Check(value)) {
250
263
  struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)value);
251
264
 
252
- return _Nuitka_Generator_throw2(tstate, gen, exception_type, exception_value, exception_tb);
265
+ return _Nuitka_Generator_throw2(tstate, gen, exception_state);
253
266
  }
254
267
 
255
268
  #if PYTHON_VERSION >= 0x350
256
269
  if (Nuitka_Coroutine_Check(value)) {
257
270
  struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)value);
258
271
  // Handing exception ownership over.
259
- return _Nuitka_Coroutine_throw2(tstate, coro, true, exception_type, exception_value, exception_tb);
272
+ return _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
260
273
  }
261
274
 
262
275
  if (Nuitka_CoroutineWrapper_Check(value)) {
263
276
  struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineWrapperObject *)value)->m_coroutine;
264
277
  // Handing exception ownership over.
265
- return _Nuitka_Coroutine_throw2(tstate, coro, true, exception_type, exception_value, exception_tb);
278
+ return _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
266
279
  }
267
280
  #endif
268
281
 
269
282
  PyObject *throw_method = PyObject_GetAttr(value, const_str_plain_throw);
270
283
 
271
- if (throw_method) {
272
- PyObject *result =
273
- PyObject_CallFunctionObjArgs(throw_method, exception_type, exception_value, exception_tb, NULL);
284
+ if (throw_method != NULL) {
285
+ PyObject *result = Nuitka_CallGeneratorThrowMethod(throw_method, exception_state);
274
286
  Py_DECREF(throw_method);
275
287
 
276
288
  // Releasing exception we own.
277
- Py_DECREF(exception_type);
278
- Py_XDECREF(exception_value);
279
- Py_XDECREF(exception_tb);
289
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
280
290
 
281
291
  return result;
282
- } else if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, GET_ERROR_OCCURRED(tstate), PyExc_AttributeError)) {
283
- // Restoring the exception we own, to be released when handling it.
284
- RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
285
-
286
- return NULL;
287
292
  } else {
288
293
  assert(HAS_ERROR_OCCURRED(tstate));
289
294
 
290
- // Releasing exception we own.
291
- Py_DECREF(exception_type);
292
- Py_XDECREF(exception_value);
293
- Py_XDECREF(exception_tb);
295
+ if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, GET_ERROR_OCCURRED(tstate), PyExc_AttributeError)) {
296
+ // Restoring the exception we own, to be released when handling it.
297
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
298
+ } else {
299
+ // Releasing exception we own.
300
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
301
+ }
294
302
 
295
303
  return NULL;
296
304
  }
297
305
  }
298
306
 
299
307
  static PyObject *_Nuitka_YieldFromGeneratorCore(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator,
300
- PyObject *yieldfrom, PyObject *send_value) {
308
+ PyObject *yield_from, PyObject *send_value) {
301
309
  // Send iteration value to the sub-generator, which may be a CPython
302
310
  // generator object, something with an iterator next, or a send method,
303
311
  // where the later is only required if values other than "None" need to
304
312
  // be passed in.
305
- CHECK_OBJECT(yieldfrom);
313
+ CHECK_OBJECT(yield_from);
306
314
  assert(send_value != NULL || HAS_ERROR_OCCURRED(tstate));
307
315
 
308
316
  PyObject *retval;
@@ -315,14 +323,13 @@ static PyObject *_Nuitka_YieldFromGeneratorCore(PyThreadState *tstate, struct Nu
315
323
  PRINT_NEW_LINE();
316
324
  #endif
317
325
 
318
- PyObject *exception_type, *exception_value;
319
- PyTracebackObject *exception_tb;
320
- FETCH_ERROR_OCCURRED(tstate, &exception_type, &exception_value, &exception_tb);
326
+ struct Nuitka_ExceptionPreservationItem exception_state;
327
+ FETCH_ERROR_OCCURRED_STATE(tstate, &exception_state);
321
328
 
322
329
  // Exception, was thrown into us, need to send that to sub-generator.
323
- if (exception_type != NULL) {
330
+ if (HAS_EXCEPTION_STATE(&exception_state)) {
324
331
  // Passing ownership of exception fetch to it.
325
- retval = _Nuitka_YieldFromPassExceptionTo(tstate, yieldfrom, exception_type, exception_value, exception_tb);
332
+ retval = _Nuitka_YieldFromPassExceptionTo(tstate, yield_from, &exception_state);
326
333
 
327
334
  // TODO: This wants to look at retval most definitely, send_value is going to be NULL.
328
335
  if (unlikely(send_value == NULL)) {
@@ -335,23 +342,23 @@ static PyObject *_Nuitka_YieldFromGeneratorCore(PyThreadState *tstate, struct Nu
335
342
  return NULL;
336
343
  }
337
344
  }
338
- } else if (PyGen_CheckExact(yieldfrom)) {
339
- retval = Nuitka_PyGen_Send(tstate, (PyGenObject *)yieldfrom, Py_None);
345
+ } else if (PyGen_CheckExact(yield_from)) {
346
+ retval = Nuitka_PyGen_Send(tstate, (PyGenObject *)yield_from, Py_None);
340
347
  }
341
348
  #if PYTHON_VERSION >= 0x350
342
- else if (PyCoro_CheckExact(yieldfrom)) {
343
- retval = Nuitka_PyGen_Send(tstate, (PyGenObject *)yieldfrom, Py_None);
349
+ else if (PyCoro_CheckExact(yield_from)) {
350
+ retval = Nuitka_PyGen_Send(tstate, (PyGenObject *)yield_from, Py_None);
344
351
  }
345
352
  #endif
346
- else if (send_value == Py_None && Py_TYPE(yieldfrom)->tp_iternext != NULL) {
347
- retval = Py_TYPE(yieldfrom)->tp_iternext(yieldfrom);
353
+ else if (send_value == Py_None && Py_TYPE(yield_from)->tp_iternext != NULL) {
354
+ retval = Py_TYPE(yield_from)->tp_iternext(yield_from);
348
355
  } else {
349
- // Bug compatibility here, before 3.3 tuples were unrolled in calls, which is what
356
+ // Bug compatibility here, before Python3 tuples were unrolled in calls, which is what
350
357
  // PyObject_CallMethod does.
351
- #if PYTHON_VERSION >= 0x340
352
- retval = PyObject_CallMethodObjArgs(yieldfrom, const_str_plain_send, send_value, NULL);
358
+ #if PYTHON_VERSION >= 0x300
359
+ retval = PyObject_CallMethodObjArgs(yield_from, const_str_plain_send, send_value, NULL);
353
360
  #else
354
- retval = PyObject_CallMethod(yieldfrom, (char *)"send", (char *)"O", send_value);
361
+ retval = PyObject_CallMethod(yield_from, (char *)"send", (char *)"O", send_value);
355
362
  #endif
356
363
  }
357
364
 
@@ -360,7 +367,7 @@ static PyObject *_Nuitka_YieldFromGeneratorCore(PyThreadState *tstate, struct Nu
360
367
  PyObject *error = GET_ERROR_OCCURRED(tstate);
361
368
 
362
369
  if (error == NULL) {
363
- Py_INCREF(Py_None);
370
+ Py_INCREF_IMMORTAL(Py_None);
364
371
  generator->m_returned = Py_None;
365
372
  } else if (likely(EXCEPTION_MATCH_BOOL_SINGLE(tstate, error, PyExc_StopIteration))) {
366
373
  // The sub-generator has given an exception. In case of
@@ -382,15 +389,15 @@ static PyObject *Nuitka_YieldFromGeneratorCore(PyThreadState *tstate, struct Nui
382
389
  CHECK_OBJECT(generator);
383
390
  CHECK_OBJECT_X(send_value);
384
391
 
385
- PyObject *yieldfrom = generator->m_yieldfrom;
386
- CHECK_OBJECT(yieldfrom);
392
+ PyObject *yield_from = generator->m_yield_from;
393
+ CHECK_OBJECT(yield_from);
387
394
 
388
395
  // Need to make it unaccessible while using it.
389
- generator->m_yieldfrom = NULL;
390
- PyObject *yielded = _Nuitka_YieldFromGeneratorCore(tstate, generator, yieldfrom, send_value);
396
+ generator->m_yield_from = NULL;
397
+ PyObject *yielded = _Nuitka_YieldFromGeneratorCore(tstate, generator, yield_from, send_value);
391
398
 
392
399
  if (yielded == NULL) {
393
- Py_DECREF(yieldfrom);
400
+ Py_DECREF(yield_from);
394
401
 
395
402
  if (generator->m_returned != NULL) {
396
403
  PyObject *yield_from_result = generator->m_returned;
@@ -403,7 +410,7 @@ static PyObject *Nuitka_YieldFromGeneratorCore(PyThreadState *tstate, struct Nui
403
410
  }
404
411
 
405
412
  } else {
406
- generator->m_yieldfrom = yieldfrom;
413
+ generator->m_yield_from = yield_from;
407
414
  }
408
415
 
409
416
  return yielded;
@@ -414,7 +421,7 @@ static PyObject *Nuitka_YieldFromGeneratorNext(PyThreadState *tstate, struct Nui
414
421
 
415
422
  // Coroutines are already perfect for yielding from.
416
423
  #if PYTHON_VERSION >= 0x350
417
- if (PyCoro_CheckExact(generator->m_yieldfrom) || Nuitka_Coroutine_Check(generator->m_yieldfrom)) {
424
+ if (PyCoro_CheckExact(generator->m_yield_from) || Nuitka_Coroutine_Check(generator->m_yield_from)) {
418
425
  if (unlikely((generator->m_code_object->co_flags & CO_ITERABLE_COROUTINE) == 0)) {
419
426
  SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
420
427
  "cannot 'yield from' a coroutine object in a non-coroutine generator");
@@ -422,10 +429,10 @@ static PyObject *Nuitka_YieldFromGeneratorNext(PyThreadState *tstate, struct Nui
422
429
  } else
423
430
  #endif
424
431
  {
425
- PyObject *new_iterator = MAKE_ITERATOR(tstate, generator->m_yieldfrom);
432
+ PyObject *new_iterator = MAKE_ITERATOR(tstate, generator->m_yield_from);
426
433
  if (new_iterator != NULL) {
427
- Py_DECREF(generator->m_yieldfrom);
428
- generator->m_yieldfrom = new_iterator;
434
+ Py_DECREF(generator->m_yield_from);
435
+ generator->m_yield_from = new_iterator;
429
436
  }
430
437
  }
431
438
 
@@ -451,35 +458,56 @@ static void _Nuitka_GeneratorPopFrame(PyThreadState *tstate, Nuitka_ThreadStateF
451
458
  #if PYTHON_VERSION < 0x3b0
452
459
  tstate->frame = return_frame;
453
460
  #else
454
- tstate->cframe->current_frame = return_frame;
461
+ CURRENT_TSTATE_INTERPRETER_FRAME(tstate) = return_frame;
455
462
  #endif
456
463
 
457
464
  PRINT_TOP_FRAME("Generator pop exit gives top frame:");
458
465
  }
459
466
 
467
+ #if PYTHON_VERSION >= 0x350
468
+ static void RAISE_RUNTIME_ERROR_RAISED_STOP_ITERATION(PyThreadState *tstate, char const *message) {
469
+
470
+ struct Nuitka_ExceptionPreservationItem saved_exception_state;
471
+ FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
472
+
473
+ #if PYTHON_VERSION < 0x3c0
474
+ NORMALIZE_EXCEPTION_STATE(tstate, &saved_exception_state);
475
+ #endif
476
+
477
+ struct Nuitka_ExceptionPreservationItem new_exception_state;
478
+ SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_STR(tstate, &new_exception_state, PyExc_RuntimeError, message);
479
+
480
+ #if PYTHON_VERSION < 0x3c0
481
+ NORMALIZE_EXCEPTION_STATE(tstate, &new_exception_state);
482
+ #endif
483
+
484
+ Py_INCREF(saved_exception_state.exception_value);
485
+ RAISE_EXCEPTION_WITH_CAUSE(tstate, &new_exception_state, saved_exception_state.exception_value);
486
+
487
+ Nuitka_Exception_SetContext(new_exception_state.exception_value, saved_exception_state.exception_value);
488
+
489
+ RELEASE_ERROR_OCCURRED_STATE_X(&saved_exception_state);
490
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &new_exception_state);
491
+ }
492
+ #endif
493
+
460
494
  static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator,
461
- PyObject *value, PyObject *exception_type, PyObject *exception_value,
462
- PyTracebackObject *exception_tb) {
495
+ PyObject *value, struct Nuitka_ExceptionPreservationItem *exception_state) {
463
496
  CHECK_OBJECT(generator);
464
497
  assert(Nuitka_Generator_Check((PyObject *)generator));
465
- CHECK_OBJECT_X(exception_type);
466
- CHECK_OBJECT_X(exception_value);
467
- CHECK_OBJECT_X(exception_tb);
498
+ CHECK_EXCEPTION_STATE_X(exception_state);
468
499
  CHECK_OBJECT_X(value);
469
- assert(PyThreadState_GET() == tstate);
470
500
 
471
501
  #if _DEBUG_GENERATOR
472
502
  PRINT_GENERATOR_STATUS("Enter", generator);
473
503
  PRINT_COROUTINE_VALUE("value", value);
474
- PRINT_EXCEPTION(exception_type, exception_value, exception_tb);
504
+ PRINT_EXCEPTION_STATE(exception_state);
475
505
  PRINT_CURRENT_EXCEPTION();
476
506
  PRINT_NEW_LINE();
477
507
  #endif
478
508
 
479
509
  if (value != NULL) {
480
- assert(exception_type == NULL);
481
- assert(exception_value == NULL);
482
- assert(exception_tb == NULL);
510
+ ASSERT_EMPTY_EXCEPTION_STATE(exception_state);
483
511
  }
484
512
 
485
513
  if (generator->m_status != status_Finished) {
@@ -521,15 +549,15 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
521
549
  Nuitka_MarkGeneratorAsRunning(generator);
522
550
 
523
551
  // Check for thrown exception, publish it to the generator code.
524
- if (unlikely(exception_type)) {
552
+ if (unlikely(HAS_EXCEPTION_STATE(exception_state))) {
525
553
  assert(value == NULL);
526
554
 
527
555
  // Transfer exception ownership to published.
528
- RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
556
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
529
557
  }
530
558
 
531
559
  #if _DEBUG_GENERATOR
532
- PRINT_GENERATOR_STATUS("Switching to coroutine", generator);
560
+ PRINT_GENERATOR_STATUS("Switching to generator", generator);
533
561
  PRINT_COROUTINE_VALUE("value", value);
534
562
  PRINT_CURRENT_EXCEPTION();
535
563
  PRINT_NEW_LINE();
@@ -539,7 +567,7 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
539
567
  PyObject *yielded;
540
568
 
541
569
  #if PYTHON_VERSION >= 0x300
542
- if (generator->m_yieldfrom == NULL) {
570
+ if (generator->m_yield_from == NULL) {
543
571
  yielded = ((generator_code)generator->m_code)(tstate, generator, value);
544
572
  } else {
545
573
  // This does not release the value if any, so we need to do it afterwards.
@@ -549,17 +577,14 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
549
577
  #else
550
578
  yielded = ((generator_code)generator->m_code)(tstate, generator, value);
551
579
  #endif
552
- assert(PyThreadState_GET() == tstate);
553
580
 
554
581
  #if PYTHON_VERSION >= 0x300
555
- // If the generator returns with m_yieldfrom set, it wants us to yield
582
+ // If the generator returns with m_yield_from set, it wants us to yield
556
583
  // from that value from now on.
557
- while (yielded == NULL && generator->m_yieldfrom != NULL) {
584
+ while (yielded == NULL && generator->m_yield_from != NULL) {
558
585
  yielded = Nuitka_YieldFromGeneratorNext(tstate, generator);
559
586
  }
560
587
  #endif
561
- assert(PyThreadState_GET() == tstate);
562
-
563
588
  Nuitka_MarkGeneratorAsNotRunning(generator);
564
589
 
565
590
  // Remove the generator from the frame stack.
@@ -567,7 +592,9 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
567
592
  // assert(tstate->frame == &generator->m_frame->m_frame);
568
593
  assertFrameObject(generator->m_frame);
569
594
 
570
- Py_CLEAR(generator->m_frame->m_frame.f_back);
595
+ if (generator->m_frame->m_frame.f_back) {
596
+ Py_CLEAR(generator->m_frame->m_frame.f_back);
597
+ }
571
598
  }
572
599
 
573
600
  // Return back to the frame that called us.
@@ -589,7 +616,7 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
589
616
  Nuitka_MarkGeneratorAsFinished(generator);
590
617
 
591
618
  if (generator->m_frame != NULL) {
592
- #if PYTHON_VERSION >= 0x340
619
+ #if PYTHON_VERSION >= 0x300
593
620
  Nuitka_SetFrameGenerator(generator->m_frame, NULL);
594
621
  #endif
595
622
  Py_DECREF(generator->m_frame);
@@ -612,30 +639,7 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
612
639
  generator->m_code_object->co_flags & CO_FUTURE_GENERATOR_STOP &&
613
640
  #endif
614
641
  GET_ERROR_OCCURRED(tstate) == PyExc_StopIteration) {
615
- PyObject *saved_exception_type, *saved_exception_value;
616
- PyTracebackObject *saved_exception_tb;
617
-
618
- // TODO: For Python3.12, this kind of code ought to use tstate methods entirely.
619
- FETCH_ERROR_OCCURRED(tstate, &saved_exception_type, &saved_exception_value, &saved_exception_tb);
620
- NORMALIZE_EXCEPTION(tstate, &saved_exception_type, &saved_exception_value, &saved_exception_tb);
621
-
622
- SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "generator raised StopIteration");
623
-
624
- FETCH_ERROR_OCCURRED(tstate, &exception_type, &exception_value, &exception_tb);
625
-
626
- RAISE_EXCEPTION_WITH_CAUSE(tstate, &exception_type, &exception_value, &exception_tb,
627
- saved_exception_value);
628
-
629
- CHECK_OBJECT(exception_value);
630
- CHECK_OBJECT(saved_exception_value);
631
-
632
- Py_INCREF(saved_exception_value);
633
- PyException_SetContext(exception_value, saved_exception_value);
634
-
635
- Py_DECREF(saved_exception_type);
636
- Py_XDECREF(saved_exception_tb);
637
-
638
- RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
642
+ RAISE_RUNTIME_ERROR_RAISED_STOP_ITERATION(tstate, "generator raised StopIteration");
639
643
 
640
644
  return NULL;
641
645
  }
@@ -668,7 +672,7 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
668
672
  PyObject *old_value = tstate->exc_value;
669
673
  PyTracebackObject *old_tb = (PyTracebackObject *)tstate->exc_traceback;
670
674
 
671
- // Set sys attributes in the fastest possible way.
675
+ // Set sys attributes in the fastest possible way, spell-checker: ignore sysdict
672
676
  PyObject *sys_dict = tstate->interp->sysdict;
673
677
  CHECK_OBJECT(sys_dict);
674
678
 
@@ -697,9 +701,9 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
697
701
  tstate->exc_value = Py_None;
698
702
  tstate->exc_traceback = (PyObject *)Py_None;
699
703
 
700
- Py_INCREF(Py_None);
701
- Py_INCREF(Py_None);
702
- Py_INCREF(Py_None);
704
+ Py_INCREF_IMMORTAL(Py_None);
705
+ Py_INCREF_IMMORTAL(Py_None);
706
+ Py_INCREF_IMMORTAL(Py_None);
703
707
 
704
708
  Py_XDECREF(old_type);
705
709
  Py_XDECREF(old_value);
@@ -725,9 +729,11 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
725
729
  }
726
730
 
727
731
  static PyObject *Nuitka_Generator_send(struct Nuitka_GeneratorObject *generator, PyObject *value) {
732
+ CHECK_OBJECT(value);
733
+
728
734
  PyThreadState *tstate = PyThreadState_GET();
729
735
 
730
- if (generator->m_status == status_Unused && value != NULL && value != Py_None) {
736
+ if (generator->m_status == status_Unused && value != Py_None) {
731
737
  // Buggy CPython 3.10 refuses to allow later usage.
732
738
  #if PYTHON_VERSION >= 0x3a0 && PYTHON_VERSION < 0x3a2
733
739
  Nuitka_MarkGeneratorAsFinished(generator);
@@ -740,11 +746,15 @@ static PyObject *Nuitka_Generator_send(struct Nuitka_GeneratorObject *generator,
740
746
 
741
747
  // We need to transfer ownership of the sent value.
742
748
  Py_INCREF(value);
743
- PyObject *result = _Nuitka_Generator_send(tstate, generator, value, NULL, NULL, NULL);
749
+
750
+ struct Nuitka_ExceptionPreservationItem exception_state;
751
+ INIT_ERROR_OCCURRED_STATE(&exception_state);
752
+
753
+ PyObject *result = _Nuitka_Generator_send(tstate, generator, value, &exception_state);
744
754
 
745
755
  if (result == NULL) {
746
756
  if (HAS_ERROR_OCCURRED(tstate) == false) {
747
- SET_CURRENT_EXCEPTION_TYPE0(tstate, PyExc_StopIteration);
757
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
748
758
  }
749
759
  }
750
760
 
@@ -754,15 +764,23 @@ static PyObject *Nuitka_Generator_send(struct Nuitka_GeneratorObject *generator,
754
764
  static PyObject *Nuitka_Generator_tp_iternext(struct Nuitka_GeneratorObject *generator) {
755
765
  PyThreadState *tstate = PyThreadState_GET();
756
766
 
757
- Py_INCREF(Py_None);
758
- return _Nuitka_Generator_send(tstate, generator, Py_None, NULL, NULL, NULL);
767
+ Py_INCREF_IMMORTAL(Py_None);
768
+
769
+ struct Nuitka_ExceptionPreservationItem exception_state;
770
+ INIT_ERROR_OCCURRED_STATE(&exception_state);
771
+
772
+ return _Nuitka_Generator_send(tstate, generator, Py_None, &exception_state);
759
773
  }
760
774
 
761
775
  /* Our own qiter interface, which is for quicker simple loop style iteration,
762
776
  that does not send anything in. */
763
777
  PyObject *Nuitka_Generator_qiter(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator, bool *finished) {
764
- Py_INCREF(Py_None);
765
- PyObject *result = _Nuitka_Generator_send(tstate, generator, Py_None, NULL, NULL, NULL);
778
+ Py_INCREF_IMMORTAL(Py_None);
779
+
780
+ struct Nuitka_ExceptionPreservationItem exception_state;
781
+ INIT_ERROR_OCCURRED_STATE(&exception_state);
782
+
783
+ PyObject *result = _Nuitka_Generator_send(tstate, generator, Py_None, &exception_state);
766
784
 
767
785
  if (result == NULL) {
768
786
  if (unlikely(!CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(tstate))) {
@@ -798,9 +816,10 @@ static bool _Nuitka_Generator_close(PyThreadState *tstate, struct Nuitka_Generat
798
816
  CHECK_OBJECT(generator);
799
817
 
800
818
  if (generator->m_status == status_Running) {
801
- Py_INCREF(PyExc_GeneratorExit);
819
+ struct Nuitka_ExceptionPreservationItem exception_state;
820
+ SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, &exception_state, PyExc_GeneratorExit, NULL, NULL);
802
821
 
803
- PyObject *result = _Nuitka_Generator_send(tstate, generator, NULL, PyExc_GeneratorExit, NULL, NULL);
822
+ PyObject *result = _Nuitka_Generator_send(tstate, generator, NULL, &exception_state);
804
823
 
805
824
  if (unlikely(result)) {
806
825
  Py_DECREF(result);
@@ -823,7 +842,7 @@ static bool _Nuitka_Generator_close(PyThreadState *tstate, struct Nuitka_Generat
823
842
  return true;
824
843
  }
825
844
 
826
- static PyObject *Nuitka_Generator_close(struct Nuitka_GeneratorObject *generator) {
845
+ static PyObject *Nuitka_Generator_close(struct Nuitka_GeneratorObject *generator, PyObject *unused) {
827
846
  PyThreadState *tstate = PyThreadState_GET();
828
847
 
829
848
  bool r = _Nuitka_Generator_close(tstate, generator);
@@ -831,20 +850,15 @@ static PyObject *Nuitka_Generator_close(struct Nuitka_GeneratorObject *generator
831
850
  if (unlikely(r == false)) {
832
851
  return NULL;
833
852
  } else {
834
- Py_INCREF(Py_None);
853
+ Py_INCREF_IMMORTAL(Py_None);
835
854
  return Py_None;
836
855
  }
837
856
  }
838
857
 
839
- // Shared code for checking a thrown exception, coroutines, asyncgen, uncompiled ones do this too.
840
- static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exception_type, PyObject **exception_value,
841
- PyTracebackObject **exception_tb) {
842
- CHECK_OBJECT(*exception_type);
843
- CHECK_OBJECT_X(*exception_value);
844
- CHECK_OBJECT_X(*exception_tb);
845
-
858
+ #if PYTHON_VERSION >= 0x3c0
859
+ static bool _Nuitka_Generator_check_throw_args(PyThreadState *tstate, PyObject **exception_type,
860
+ PyObject **exception_value, PyTracebackObject **exception_tb) {
846
861
  if (*exception_tb == (PyTracebackObject *)Py_None) {
847
- Py_DECREF(*exception_tb);
848
862
  *exception_tb = NULL;
849
863
  } else if (*exception_tb != NULL && !PyTraceBack_Check(*exception_tb)) {
850
864
  SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "throw() third argument must be a traceback object");
@@ -852,7 +866,6 @@ static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exc
852
866
  }
853
867
 
854
868
  if (PyExceptionClass_Check(*exception_type)) {
855
- // TODO: Must not / need not normalize here?
856
869
  NORMALIZE_EXCEPTION(tstate, exception_type, exception_value, exception_tb);
857
870
  } else if (PyExceptionInstance_Check(*exception_type)) {
858
871
  if (*exception_value != NULL && *exception_value != Py_None) {
@@ -862,10 +875,8 @@ static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exc
862
875
  }
863
876
 
864
877
  // Release old None value and replace it with the object, then set the exception type
865
- // from the class.
866
- Py_XDECREF(*exception_value);
878
+ // from the class. The "None" is known immortal here and needs no refcount correction.
867
879
  *exception_value = *exception_type;
868
-
869
880
  *exception_type = PyExceptionInstance_Class(*exception_type);
870
881
  Py_INCREF(*exception_type);
871
882
  } else {
@@ -883,10 +894,94 @@ static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exc
883
894
  return true;
884
895
 
885
896
  failed_throw:
897
+
898
+ return false;
899
+ }
900
+ #endif
901
+
902
+ static bool _Nuitka_Generator_make_throw_exception_state(PyThreadState *tstate,
903
+ struct Nuitka_ExceptionPreservationItem *exception_state,
904
+ PyObject *exception_type, PyObject *exception_value,
905
+ PyTracebackObject *exception_tb) {
906
+
907
+ #if PYTHON_VERSION >= 0x3c0
908
+ Py_INCREF(exception_type);
909
+ Py_XINCREF(exception_value);
910
+ Py_XINCREF(exception_tb);
911
+
912
+ if (_Nuitka_Generator_check_throw_args(tstate, &exception_type, &exception_value, &exception_tb) == false) {
913
+ Py_DECREF(exception_type);
914
+ Py_XDECREF(exception_value);
915
+ Py_XDECREF(exception_tb);
916
+
917
+ return false;
918
+ }
919
+ #endif
920
+
921
+ SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, exception_state, exception_type, exception_value, exception_tb);
922
+
923
+ #if PYTHON_VERSION >= 0x3c0
924
+ Py_DECREF(exception_type);
925
+ Py_XDECREF(exception_value);
926
+ Py_XDECREF(exception_tb);
927
+ #endif
928
+
929
+ return true;
930
+ }
931
+
932
+ // Shared code for checking a thrown exception, coroutines, asyncgen, uncompiled
933
+ // ones do this too. For pre-3.12, the checking needs to be done late, for 3.12
934
+ // early, so it's a separate function.
935
+ static bool _Nuitka_Generator_check_throw(PyThreadState *tstate,
936
+ struct Nuitka_ExceptionPreservationItem *exception_state) {
937
+ CHECK_EXCEPTION_STATE(exception_state);
938
+
939
+ #if PYTHON_VERSION < 0x3c0
940
+ if (exception_state->exception_tb == (PyTracebackObject *)Py_None) {
941
+ Py_DECREF(exception_state->exception_tb);
942
+ exception_state->exception_tb = NULL;
943
+ } else if (exception_state->exception_tb != NULL && !PyTraceBack_Check(exception_state->exception_tb)) {
944
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "throw() third argument must be a traceback object");
945
+ goto failed_throw;
946
+ }
947
+
948
+ if (PyExceptionClass_Check(exception_state->exception_type)) {
949
+ // TODO: Must not / need not normalize here?
950
+ NORMALIZE_EXCEPTION_STATE(tstate, exception_state);
951
+ } else if (PyExceptionInstance_Check(exception_state->exception_type)) {
952
+ if (exception_state->exception_value != NULL && exception_state->exception_value != Py_None) {
953
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
954
+ "instance exception may not have a separate value");
955
+ goto failed_throw;
956
+ }
957
+
958
+ // Release old None value and replace it with the object, then set the exception type
959
+ // from the class.
960
+ Py_XDECREF(exception_state->exception_value);
961
+ exception_state->exception_value = exception_state->exception_type;
962
+
963
+ exception_state->exception_type = PyExceptionInstance_Class(exception_state->exception_type);
964
+ Py_INCREF(exception_state->exception_type);
965
+ } else {
966
+ #if PYTHON_VERSION < 0x300
967
+ PyErr_Format(PyExc_TypeError, "exceptions must be classes, or instances, not %s",
968
+ Py_TYPE(exception_state->exception_type)->tp_name);
969
+ #else
970
+ PyErr_Format(PyExc_TypeError, "exceptions must be classes or instances deriving from BaseException, not %s",
971
+ Py_TYPE(exception_state->exception_type)->tp_name);
972
+ #endif
973
+
974
+ goto failed_throw;
975
+ }
976
+
977
+ #endif
978
+ return true;
979
+
980
+ #if PYTHON_VERSION < 0x3c0
981
+ failed_throw:
982
+ #endif
886
983
  // Release exception, we are done with it now.
887
- Py_DECREF(*exception_type);
888
- Py_XDECREF(*exception_value);
889
- Py_XDECREF(*exception_tb);
984
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
890
985
 
891
986
  return false;
892
987
  }
@@ -902,49 +997,49 @@ static bool _Nuitka_Asyncgen_close(PyThreadState *tstate, struct Nuitka_Asyncgen
902
997
  #endif
903
998
 
904
999
  // Note: This is also used for coroutines and asyncgen
905
- static bool Nuitka_gen_close_iter(PyThreadState *tstate, PyObject *yieldfrom) {
1000
+ static bool Nuitka_gen_close_iter(PyThreadState *tstate, PyObject *yield_from) {
906
1001
  #if _DEBUG_GENERATOR
907
1002
  PRINT_STRING("Nuitka_gen_close_iter: Enter\n");
908
1003
  #endif
909
1004
 
910
- CHECK_OBJECT(yieldfrom);
1005
+ CHECK_OBJECT(yield_from);
911
1006
 
912
- // TODO: Could specialize depending in yieldfrom type for performance. Many
1007
+ // TODO: Could specialize depending in yield_from type for performance. Many
913
1008
  // times these will be our own ones, or known ones like uncompiled
914
1009
  // generators.
915
- if (Nuitka_Generator_Check(yieldfrom)) {
1010
+ if (Nuitka_Generator_Check(yield_from)) {
916
1011
  #if _DEBUG_GENERATOR
917
1012
  PRINT_STRING("Nuitka_gen_close_iter: Defer to _Nuitka_Generator_close\n");
918
1013
  #endif
919
- return _Nuitka_Generator_close(tstate, (struct Nuitka_GeneratorObject *)yieldfrom);
1014
+ return _Nuitka_Generator_close(tstate, (struct Nuitka_GeneratorObject *)yield_from);
920
1015
  }
921
1016
 
922
1017
  #if PYTHON_VERSION >= 0x350
923
- if (Nuitka_Coroutine_Check(yieldfrom)) {
1018
+ if (Nuitka_Coroutine_Check(yield_from)) {
924
1019
  #if _DEBUG_GENERATOR
925
1020
  PRINT_STRING("Nuitka_gen_close_iter: Defer to _Nuitka_Coroutine_close\n");
926
1021
  #endif
927
- return _Nuitka_Coroutine_close(tstate, (struct Nuitka_CoroutineObject *)yieldfrom);
1022
+ return _Nuitka_Coroutine_close(tstate, (struct Nuitka_CoroutineObject *)yield_from);
928
1023
  }
929
1024
  #endif
930
1025
 
931
1026
  #if PYTHON_VERSION >= 0x360
932
- if (Nuitka_Asyncgen_Check(yieldfrom)) {
1027
+ if (Nuitka_Asyncgen_Check(yield_from)) {
933
1028
  #if _DEBUG_GENERATOR
934
1029
  PRINT_STRING("Nuitka_gen_close_iter: Defer to _Nuitka_Asyncgen_close\n");
935
1030
  #endif
936
- return _Nuitka_Asyncgen_close(tstate, (struct Nuitka_AsyncgenObject *)yieldfrom);
1031
+ return _Nuitka_Asyncgen_close(tstate, (struct Nuitka_AsyncgenObject *)yield_from);
937
1032
  }
938
1033
  #endif
939
1034
 
940
- PyObject *meth = PyObject_GetAttr(yieldfrom, const_str_plain_close);
1035
+ PyObject *meth = PyObject_GetAttr(yield_from, const_str_plain_close);
941
1036
 
942
1037
  if (unlikely(meth == NULL)) {
943
1038
  if (unlikely(!PyErr_ExceptionMatches(PyExc_AttributeError))) {
944
1039
  #if _DEBUG_GENERATOR
945
1040
  PRINT_STRING("Nuitka_gen_close_iter: Strange error while looking up close method.\n");
946
1041
  #endif
947
- PyErr_WriteUnraisable(yieldfrom);
1042
+ PyErr_WriteUnraisable(yield_from);
948
1043
  }
949
1044
 
950
1045
  CLEAR_ERROR_OCCURRED(tstate);
@@ -980,113 +1075,105 @@ static bool Nuitka_gen_close_iter(PyThreadState *tstate, PyObject *yieldfrom) {
980
1075
  static bool Nuitka_AsyncgenAsend_Check(PyObject *object);
981
1076
  struct Nuitka_AsyncgenAsendObject;
982
1077
  static PyObject *_Nuitka_AsyncgenAsend_throw2(PyThreadState *tstate, struct Nuitka_AsyncgenAsendObject *asyncgen_asend,
983
- PyObject *exception_type, PyObject *exception_value,
984
- PyTracebackObject *exception_tb);
1078
+ struct Nuitka_ExceptionPreservationItem *exception_state);
985
1079
  #endif
986
1080
 
987
1081
  static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator,
988
- PyObject *exception_type, PyObject *exception_value,
989
- PyTracebackObject *exception_tb) {
1082
+ struct Nuitka_ExceptionPreservationItem *exception_state) {
990
1083
  #if _DEBUG_GENERATOR
991
1084
  PRINT_GENERATOR_STATUS("Enter", generator);
992
- PRINT_COROUTINE_VALUE("yieldfrom", generator->m_yieldfrom);
993
- PRINT_EXCEPTION(exception_type, exception_value, exception_tb);
1085
+ PRINT_COROUTINE_VALUE("yield_from", generator->m_yield_from);
1086
+ PRINT_EXCEPTION_STATE(exception_state);
994
1087
  PRINT_NEW_LINE();
995
1088
  #endif
996
1089
 
997
1090
  CHECK_OBJECT(generator);
998
1091
  assert(Nuitka_Generator_Check((PyObject *)generator));
999
- CHECK_OBJECT(exception_type);
1000
- CHECK_OBJECT_X(exception_value);
1001
- CHECK_OBJECT_X(exception_tb);
1092
+ CHECK_EXCEPTION_STATE(exception_state);
1002
1093
 
1003
1094
  #if PYTHON_VERSION >= 0x300
1004
- if (generator->m_yieldfrom != NULL) {
1005
- if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_type, PyExc_GeneratorExit)) {
1095
+ if (generator->m_yield_from != NULL) {
1096
+ if (EXCEPTION_STATE_MATCH_BOOL_SINGLE(tstate, exception_state, PyExc_GeneratorExit)) {
1006
1097
  // Generators need to close the yield_from.
1007
1098
  Nuitka_MarkGeneratorAsRunning(generator);
1008
- bool res = Nuitka_gen_close_iter(tstate, generator->m_yieldfrom);
1099
+ bool res = Nuitka_gen_close_iter(tstate, generator->m_yield_from);
1009
1100
  Nuitka_MarkGeneratorAsNotRunning(generator);
1010
1101
 
1011
1102
  if (res == false) {
1012
1103
  // Release exception, we are done with it now and pick up the new one.
1013
- Py_DECREF(exception_type);
1014
- Py_XDECREF(exception_value);
1015
- Py_XDECREF(exception_tb);
1104
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
1016
1105
 
1017
- FETCH_ERROR_OCCURRED(tstate, &exception_type, &exception_value, &exception_tb);
1106
+ FETCH_ERROR_OCCURRED_STATE(tstate, exception_state);
1018
1107
  }
1019
1108
 
1020
1109
  // Transferred exception ownership to "_Nuitka_Generator_send".
1021
- return _Nuitka_Generator_send(tstate, generator, NULL, exception_type, exception_value, exception_tb);
1110
+ return _Nuitka_Generator_send(tstate, generator, NULL, exception_state);
1022
1111
  }
1023
1112
 
1024
1113
  PyObject *ret;
1025
1114
 
1026
1115
  #if _DEBUG_GENERATOR
1027
1116
  PRINT_GENERATOR_STATUS("Passing to yielded from", generator);
1028
- PRINT_COROUTINE_VALUE("m_yieldfrom", generator->m_yieldfrom);
1117
+ PRINT_COROUTINE_VALUE("m_yield_from", generator->m_yield_from);
1029
1118
  PRINT_NEW_LINE();
1030
1119
  #endif
1031
1120
 
1032
- if (Nuitka_Generator_Check(generator->m_yieldfrom)) {
1033
- struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)generator->m_yieldfrom);
1121
+ if (Nuitka_Generator_Check(generator->m_yield_from)) {
1122
+ struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)generator->m_yield_from);
1034
1123
  // Transferred exception ownership to "_Nuitka_Generator_throw2".
1035
1124
  Nuitka_MarkGeneratorAsRunning(generator);
1036
- ret = _Nuitka_Generator_throw2(tstate, gen, exception_type, exception_value, exception_tb);
1125
+ ret = _Nuitka_Generator_throw2(tstate, gen, exception_state);
1037
1126
  Nuitka_MarkGeneratorAsNotRunning(generator);
1038
1127
  #if NUITKA_UNCOMPILED_THROW_INTEGRATION
1039
- } else if (PyGen_CheckExact(generator->m_yieldfrom)) {
1040
- PyGenObject *gen = (PyGenObject *)generator->m_yieldfrom;
1128
+ } else if (PyGen_CheckExact(generator->m_yield_from)) {
1129
+ PyGenObject *gen = (PyGenObject *)generator->m_yield_from;
1041
1130
 
1042
1131
  // Transferred exception ownership to "Nuitka_UncompiledGenerator_throw".
1043
1132
  Nuitka_MarkGeneratorAsRunning(generator);
1044
- ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_type, exception_value, exception_tb);
1133
+ ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
1045
1134
  Nuitka_MarkGeneratorAsNotRunning(generator);
1046
1135
  #endif
1047
1136
  #if PYTHON_VERSION >= 0x350
1048
- } else if (Nuitka_Coroutine_Check(generator->m_yieldfrom)) {
1049
- struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)generator->m_yieldfrom);
1137
+ } else if (Nuitka_Coroutine_Check(generator->m_yield_from)) {
1138
+ struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)generator->m_yield_from);
1050
1139
  // Transferred exception ownership to "_Nuitka_Coroutine_throw2".
1051
1140
  Nuitka_MarkGeneratorAsRunning(generator);
1052
- ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_type, exception_value, exception_tb);
1141
+ ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
1053
1142
  Nuitka_MarkGeneratorAsNotRunning(generator);
1054
- } else if (Nuitka_CoroutineWrapper_Check(generator->m_yieldfrom)) {
1143
+ } else if (Nuitka_CoroutineWrapper_Check(generator->m_yield_from)) {
1055
1144
  struct Nuitka_CoroutineObject *coro =
1056
- ((struct Nuitka_CoroutineWrapperObject *)generator->m_yieldfrom)->m_coroutine;
1145
+ ((struct Nuitka_CoroutineWrapperObject *)generator->m_yield_from)->m_coroutine;
1057
1146
 
1058
1147
  // Transferred exception ownership to "_Nuitka_Coroutine_throw2".
1059
1148
  Nuitka_MarkGeneratorAsRunning(generator);
1060
- ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_type, exception_value, exception_tb);
1149
+ ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
1061
1150
  Nuitka_MarkGeneratorAsNotRunning(generator);
1062
1151
  #if NUITKA_UNCOMPILED_THROW_INTEGRATION
1063
- } else if (PyCoro_CheckExact(generator->m_yieldfrom)) {
1064
- PyGenObject *gen = (PyGenObject *)generator->m_yieldfrom;
1152
+ } else if (PyCoro_CheckExact(generator->m_yield_from)) {
1153
+ PyGenObject *gen = (PyGenObject *)generator->m_yield_from;
1065
1154
 
1066
1155
  // Transferred exception ownership to "Nuitka_UncompiledGenerator_throw".
1067
1156
  Nuitka_MarkGeneratorAsRunning(generator);
1068
- ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_type, exception_value, exception_tb);
1157
+ ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
1069
1158
  Nuitka_MarkGeneratorAsNotRunning(generator);
1070
1159
  #endif
1071
1160
  #if PYTHON_VERSION >= 0x360
1072
- } else if (Nuitka_AsyncgenAsend_Check(generator->m_yieldfrom)) {
1161
+ } else if (Nuitka_AsyncgenAsend_Check(generator->m_yield_from)) {
1073
1162
  struct Nuitka_AsyncgenAsendObject *asyncgen_asend =
1074
- ((struct Nuitka_AsyncgenAsendObject *)generator->m_yieldfrom);
1163
+ ((struct Nuitka_AsyncgenAsendObject *)generator->m_yield_from);
1075
1164
 
1076
1165
  // Transferred exception ownership to "_Nuitka_AsyncgenAsend_throw2".
1077
1166
  Nuitka_MarkGeneratorAsRunning(generator);
1078
- ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend, exception_type, exception_value, exception_tb);
1167
+ ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend, exception_state);
1079
1168
  Nuitka_MarkGeneratorAsNotRunning(generator);
1080
1169
  #endif
1081
1170
  #endif
1082
1171
  } else {
1083
- PyObject *meth = PyObject_GetAttr(generator->m_yieldfrom, const_str_plain_throw);
1172
+ PyObject *meth = PyObject_GetAttr(generator->m_yield_from, const_str_plain_throw);
1084
1173
  if (unlikely(meth == NULL)) {
1085
1174
  if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
1086
1175
  // Release exception, we are done with it now.
1087
- Py_DECREF(exception_type);
1088
- Py_XDECREF(exception_value);
1089
- Py_XDECREF(exception_tb);
1176
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
1090
1177
 
1091
1178
  return NULL;
1092
1179
  }
@@ -1097,39 +1184,37 @@ static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate, struct Nuitka_G
1097
1184
  goto throw_here;
1098
1185
  }
1099
1186
 
1100
- CHECK_OBJECT(exception_type);
1187
+ CHECK_EXCEPTION_STATE(exception_state);
1101
1188
 
1102
1189
  #if 0
1103
1190
  // TODO: Add slow mode traces.
1104
- PRINT_ITEM(coroutine->m_yieldfrom);
1191
+ PRINT_ITEM(coroutine->m_yield_from);
1105
1192
  PRINT_NEW_LINE();
1106
1193
  #endif
1107
1194
  Nuitka_MarkGeneratorAsRunning(generator);
1108
- ret = PyObject_CallFunctionObjArgs(meth, exception_type, exception_value, exception_tb, NULL);
1195
+ ret = Nuitka_CallGeneratorThrowMethod(meth, exception_state);
1109
1196
  Nuitka_MarkGeneratorAsNotRunning(generator);
1110
1197
 
1111
1198
  Py_DECREF(meth);
1112
1199
 
1113
1200
  // Release exception, we are done with it now.
1114
- Py_DECREF(exception_type);
1115
- Py_XDECREF(exception_value);
1116
- Py_XDECREF(exception_tb);
1201
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
1117
1202
  }
1118
1203
 
1119
1204
  if (unlikely(ret == NULL)) {
1120
1205
  // Return value or exception, not to continue with yielding from.
1121
- if (generator->m_yieldfrom != NULL) {
1122
- CHECK_OBJECT(generator->m_yieldfrom);
1206
+ if (generator->m_yield_from != NULL) {
1207
+ CHECK_OBJECT(generator->m_yield_from);
1123
1208
  #if _DEBUG_GENERATOR
1124
1209
  PRINT_GENERATOR_STATUS("Null return, yield from removal:", generator);
1125
- PRINT_COROUTINE_VALUE("yieldfrom", generator->m_yieldfrom);
1210
+ PRINT_COROUTINE_VALUE("yield_from", generator->m_yield_from);
1126
1211
  #endif
1127
- Py_DECREF(generator->m_yieldfrom);
1128
- generator->m_yieldfrom = NULL;
1212
+ Py_DECREF(generator->m_yield_from);
1213
+ generator->m_yield_from = NULL;
1129
1214
  }
1130
1215
 
1131
1216
  PyObject *val;
1132
- if (_PyGen_FetchStopIterationValue(&val) == 0) {
1217
+ if (Nuitka_PyGen_FetchStopIterationValue(tstate, &val)) {
1133
1218
  CHECK_OBJECT(val);
1134
1219
 
1135
1220
  #if _DEBUG_GENERATOR
@@ -1138,14 +1223,21 @@ static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate, struct Nuitka_G
1138
1223
  PRINT_NEW_LINE();
1139
1224
  #endif
1140
1225
 
1141
- ret = _Nuitka_Generator_send(tstate, generator, val, NULL, NULL, NULL);
1226
+ struct Nuitka_ExceptionPreservationItem no_exception_state;
1227
+ INIT_ERROR_OCCURRED_STATE(&no_exception_state);
1228
+
1229
+ ret = _Nuitka_Generator_send(tstate, generator, val, &no_exception_state);
1142
1230
  } else {
1143
1231
  #if _DEBUG_GENERATOR
1144
1232
  PRINT_GENERATOR_STATUS("Sending exception value into ourselves", generator);
1145
1233
  PRINT_CURRENT_EXCEPTION();
1146
1234
  PRINT_NEW_LINE();
1147
1235
  #endif
1148
- ret = _Nuitka_Generator_send(tstate, generator, NULL, NULL, NULL, NULL);
1236
+
1237
+ struct Nuitka_ExceptionPreservationItem no_exception_state;
1238
+ INIT_ERROR_OCCURRED_STATE(&no_exception_state);
1239
+
1240
+ ret = _Nuitka_Generator_send(tstate, generator, NULL, &no_exception_state);
1149
1241
  }
1150
1242
 
1151
1243
  #if _DEBUG_GENERATOR
@@ -1171,39 +1263,41 @@ throw_here:
1171
1263
 
1172
1264
  // We continue to have exception ownership here.
1173
1265
 
1174
- if (unlikely(_Nuitka_Generator_check_throw2(tstate, &exception_type, &exception_value, &exception_tb) == false)) {
1175
- // Exception was released by _Nuitka_Generator_check_throw2 already.
1266
+ if (unlikely(_Nuitka_Generator_check_throw(tstate, exception_state) == false)) {
1267
+ // Exception was released by _Nuitka_Generator_check_throw already.
1176
1268
  return NULL;
1177
1269
  }
1178
1270
 
1179
1271
  if (generator->m_status == status_Running) {
1180
1272
  // Passing exception ownership to _Nuitka_Generator_send
1181
- PyObject *result =
1182
- _Nuitka_Generator_send(tstate, generator, NULL, exception_type, exception_value, exception_tb);
1273
+ PyObject *result = _Nuitka_Generator_send(tstate, generator, NULL, exception_state);
1183
1274
 
1184
1275
  if (result == NULL) {
1185
- if (GET_ERROR_OCCURRED(tstate) == NULL) {
1186
- SET_CURRENT_EXCEPTION_TYPE0(tstate, PyExc_StopIteration);
1276
+ if (HAS_ERROR_OCCURRED(tstate) == false) {
1277
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
1187
1278
  }
1188
1279
  }
1189
1280
 
1190
1281
  return result;
1191
1282
  } else if (generator->m_status == status_Finished) {
1192
- RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
1283
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
1193
1284
 
1194
1285
  return NULL;
1195
1286
  } else {
1287
+ PyTracebackObject *exception_tb = GET_EXCEPTION_STATE_TRACEBACK(exception_state);
1288
+
1196
1289
  if (exception_tb == NULL) {
1197
1290
  // TODO: Our compiled objects really need a way to store common
1198
1291
  // stuff in a "shared" part across all instances, and outside of
1199
1292
  // run time, so we could reuse this.
1200
1293
  struct Nuitka_FrameObject *frame =
1201
1294
  MAKE_FUNCTION_FRAME(tstate, generator->m_code_object, generator->m_module, 0);
1202
- exception_tb = MAKE_TRACEBACK(frame, generator->m_code_object->co_firstlineno);
1295
+ SET_EXCEPTION_STATE_TRACEBACK(exception_state,
1296
+ MAKE_TRACEBACK(frame, generator->m_code_object->co_firstlineno));
1203
1297
  Py_DECREF(frame);
1204
1298
  }
1205
1299
 
1206
- RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
1300
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
1207
1301
 
1208
1302
  Nuitka_MarkGeneratorAsFinished(generator);
1209
1303
 
@@ -1223,18 +1317,20 @@ static PyObject *Nuitka_Generator_throw(struct Nuitka_GeneratorObject *generator
1223
1317
  return NULL;
1224
1318
  }
1225
1319
 
1226
- // Handing ownership of exception over, we need not release it ourselves
1227
- Py_INCREF(exception_type);
1228
- Py_XINCREF(exception_value);
1229
- Py_XINCREF(exception_tb);
1230
-
1231
1320
  PyThreadState *tstate = PyThreadState_GET();
1232
1321
 
1233
- PyObject *result = _Nuitka_Generator_throw2(tstate, generator, exception_type, exception_value, exception_tb);
1322
+ // Handing ownership of exception over, we need not release it ourselves
1323
+ struct Nuitka_ExceptionPreservationItem exception_state;
1324
+ if (_Nuitka_Generator_make_throw_exception_state(tstate, &exception_state, exception_type, exception_value,
1325
+ exception_tb) == false) {
1326
+ return NULL;
1327
+ }
1328
+
1329
+ PyObject *result = _Nuitka_Generator_throw2(tstate, generator, &exception_state);
1234
1330
 
1235
1331
  if (result == NULL) {
1236
1332
  if (HAS_ERROR_OCCURRED(tstate) == false) {
1237
- SET_CURRENT_EXCEPTION_TYPE0(tstate, PyExc_StopIteration);
1333
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
1238
1334
  }
1239
1335
  }
1240
1336
 
@@ -1248,7 +1344,7 @@ static PyObject *Nuitka_Generator_throw(struct Nuitka_GeneratorObject *generator
1248
1344
  return result;
1249
1345
  }
1250
1346
 
1251
- #if PYTHON_VERSION >= 0x340
1347
+ #if PYTHON_VERSION >= 0x300
1252
1348
  static void Nuitka_Generator_tp_finalizer(struct Nuitka_GeneratorObject *generator) {
1253
1349
  if (generator->m_status != status_Running) {
1254
1350
  return;
@@ -1256,9 +1352,8 @@ static void Nuitka_Generator_tp_finalizer(struct Nuitka_GeneratorObject *generat
1256
1352
 
1257
1353
  PyThreadState *tstate = PyThreadState_GET();
1258
1354
 
1259
- PyObject *save_exception_type, *save_exception_value;
1260
- PyTracebackObject *save_exception_tb;
1261
- FETCH_ERROR_OCCURRED(tstate, &save_exception_type, &save_exception_value, &save_exception_tb);
1355
+ struct Nuitka_ExceptionPreservationItem saved_exception_state;
1356
+ FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1262
1357
 
1263
1358
  bool close_result = _Nuitka_Generator_close(tstate, generator);
1264
1359
 
@@ -1266,8 +1361,8 @@ static void Nuitka_Generator_tp_finalizer(struct Nuitka_GeneratorObject *generat
1266
1361
  PyErr_WriteUnraisable((PyObject *)generator);
1267
1362
  }
1268
1363
 
1269
- /* Restore the saved exception if any. */
1270
- RESTORE_ERROR_OCCURRED(tstate, save_exception_type, save_exception_value, save_exception_tb);
1364
+ // Restore the saved exception if any.
1365
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1271
1366
  }
1272
1367
  #endif
1273
1368
 
@@ -1276,6 +1371,11 @@ static struct Nuitka_GeneratorObject *free_list_generators = NULL;
1276
1371
  static int free_list_generators_count = 0;
1277
1372
 
1278
1373
  static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator) {
1374
+ #if _DEBUG_REFCOUNTS
1375
+ count_active_Nuitka_Generator_Type -= 1;
1376
+ count_released_Nuitka_Generator_Type += 1;
1377
+ #endif
1378
+
1279
1379
  // Revive temporarily.
1280
1380
  assert(Py_REFCNT(generator) == 0);
1281
1381
  Py_SET_REFCNT(generator, 1);
@@ -1283,9 +1383,8 @@ static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator
1283
1383
  PyThreadState *tstate = PyThreadState_GET();
1284
1384
 
1285
1385
  // Save the current exception, if any, we must preserve it.
1286
- PyObject *save_exception_type, *save_exception_value;
1287
- PyTracebackObject *save_exception_tb;
1288
- FETCH_ERROR_OCCURRED(tstate, &save_exception_type, &save_exception_value, &save_exception_tb);
1386
+ struct Nuitka_ExceptionPreservationItem saved_exception_state;
1387
+ FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1289
1388
 
1290
1389
  if (generator->m_status == status_Running) {
1291
1390
  bool close_result = _Nuitka_Generator_close(tstate, generator);
@@ -1305,7 +1404,7 @@ static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator
1305
1404
  }
1306
1405
 
1307
1406
  if (generator->m_frame != NULL) {
1308
- #if PYTHON_VERSION >= 0x340
1407
+ #if PYTHON_VERSION >= 0x300
1309
1408
  Nuitka_SetFrameGenerator(generator->m_frame, NULL);
1310
1409
  #endif
1311
1410
  Py_DECREF(generator->m_frame);
@@ -1329,19 +1428,20 @@ static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator
1329
1428
  /* Put the object into free list or release to GC */
1330
1429
  releaseToFreeList(free_list_generators, generator, MAX_GENERATOR_FREE_LIST_COUNT);
1331
1430
 
1332
- RESTORE_ERROR_OCCURRED(tstate, save_exception_type, save_exception_value, save_exception_tb);
1431
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1333
1432
  }
1334
1433
 
1335
1434
  static long Nuitka_Generator_tp_hash(struct Nuitka_GeneratorObject *generator) { return generator->m_counter; }
1336
1435
 
1337
- static PyObject *Nuitka_Generator_get_name(struct Nuitka_GeneratorObject *generator) {
1436
+ static PyObject *Nuitka_Generator_get_name(PyObject *self, void *data) {
1437
+ struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
1338
1438
  PyObject *result = generator->m_name;
1339
1439
  Py_INCREF(result);
1340
1440
  return result;
1341
1441
  }
1342
1442
 
1343
1443
  #if PYTHON_VERSION >= 0x350
1344
- static int Nuitka_Generator_set_name(struct Nuitka_GeneratorObject *generator, PyObject *value) {
1444
+ static int Nuitka_Generator_set_name(PyObject *self, PyObject *value, void *data) {
1345
1445
  // Cannot be deleted, not be non-unicode value.
1346
1446
  if (unlikely((value == NULL) || !PyUnicode_Check(value))) {
1347
1447
  PyThreadState *tstate = PyThreadState_GET();
@@ -1350,6 +1450,7 @@ static int Nuitka_Generator_set_name(struct Nuitka_GeneratorObject *generator, P
1350
1450
  return -1;
1351
1451
  }
1352
1452
 
1453
+ struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
1353
1454
  PyObject *tmp = generator->m_name;
1354
1455
  Py_INCREF(value);
1355
1456
  generator->m_name = value;
@@ -1358,13 +1459,14 @@ static int Nuitka_Generator_set_name(struct Nuitka_GeneratorObject *generator, P
1358
1459
  return 0;
1359
1460
  }
1360
1461
 
1361
- static PyObject *Nuitka_Generator_get_qualname(struct Nuitka_GeneratorObject *generator) {
1462
+ static PyObject *Nuitka_Generator_get_qualname(PyObject *self, void *data) {
1463
+ struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
1362
1464
  PyObject *result = generator->m_qualname;
1363
1465
  Py_INCREF(result);
1364
1466
  return result;
1365
1467
  }
1366
1468
 
1367
- static int Nuitka_Generator_set_qualname(struct Nuitka_GeneratorObject *generator, PyObject *value) {
1469
+ static int Nuitka_Generator_set_qualname(PyObject *self, PyObject *value, void *data) {
1368
1470
  // Cannot be deleted, not be non-unicode value.
1369
1471
  if (unlikely((value == NULL) || !PyUnicode_Check(value))) {
1370
1472
  PyThreadState *tstate = PyThreadState_GET();
@@ -1373,6 +1475,7 @@ static int Nuitka_Generator_set_qualname(struct Nuitka_GeneratorObject *generato
1373
1475
  return -1;
1374
1476
  }
1375
1477
 
1478
+ struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
1376
1479
  PyObject *tmp = generator->m_qualname;
1377
1480
  Py_INCREF(value);
1378
1481
  generator->m_qualname = value;
@@ -1381,34 +1484,37 @@ static int Nuitka_Generator_set_qualname(struct Nuitka_GeneratorObject *generato
1381
1484
  return 0;
1382
1485
  }
1383
1486
 
1384
- static PyObject *Nuitka_Generator_get_yieldfrom(struct Nuitka_GeneratorObject *generator) {
1385
- if (generator->m_yieldfrom) {
1386
- Py_INCREF(generator->m_yieldfrom);
1387
- return generator->m_yieldfrom;
1487
+ static PyObject *Nuitka_Generator_get_yield_from(PyObject *self, void *data) {
1488
+ struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
1489
+ if (generator->m_yield_from) {
1490
+ Py_INCREF(generator->m_yield_from);
1491
+ return generator->m_yield_from;
1388
1492
  } else {
1389
- Py_INCREF(Py_None);
1493
+ Py_INCREF_IMMORTAL(Py_None);
1390
1494
  return Py_None;
1391
1495
  }
1392
1496
  }
1393
1497
 
1394
1498
  #endif
1395
1499
 
1396
- static PyObject *Nuitka_Generator_get_code(struct Nuitka_GeneratorObject *generator) {
1500
+ static PyObject *Nuitka_Generator_get_code(PyObject *self, void *data) {
1501
+ struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
1397
1502
  PyObject *result = (PyObject *)generator->m_code_object;
1398
1503
  Py_INCREF(result);
1399
1504
  return result;
1400
1505
  }
1401
1506
 
1402
- static int Nuitka_Generator_set_code(struct Nuitka_GeneratorObject *generator, PyObject *value) {
1507
+ static int Nuitka_Generator_set_code(PyObject *self, PyObject *value, void *data) {
1403
1508
  PyThreadState *tstate = PyThreadState_GET();
1404
1509
 
1405
1510
  SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "gi_code is not writable in Nuitka");
1406
1511
  return -1;
1407
1512
  }
1408
1513
 
1409
- static PyObject *Nuitka_Generator_get_frame(struct Nuitka_GeneratorObject *generator) {
1514
+ static PyObject *Nuitka_Generator_get_frame(PyObject *self, void *data) {
1410
1515
  PyObject *result;
1411
1516
 
1517
+ struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
1412
1518
  if (generator->m_frame) {
1413
1519
  result = (PyObject *)generator->m_frame;
1414
1520
  } else {
@@ -1419,27 +1525,28 @@ static PyObject *Nuitka_Generator_get_frame(struct Nuitka_GeneratorObject *gener
1419
1525
  return result;
1420
1526
  }
1421
1527
 
1422
- static int Nuitka_Generator_set_frame(struct Nuitka_GeneratorObject *generator, PyObject *value) {
1528
+ static int Nuitka_Generator_set_frame(PyObject *self, PyObject *value, void *data) {
1423
1529
  PyThreadState *tstate = PyThreadState_GET();
1424
1530
 
1425
1531
  SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "gi_frame is not writable in Nuitka");
1426
1532
  return -1;
1427
1533
  }
1428
1534
 
1429
- static PyObject *Nuitka_Generator_get_running(struct Nuitka_GeneratorObject *generator) {
1535
+ static PyObject *Nuitka_Generator_get_running(PyObject *self, void *data) {
1430
1536
  PyObject *result;
1431
1537
 
1538
+ struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
1432
1539
  /* The type of "gi_running" changed in Python3. */
1433
1540
  #if PYTHON_VERSION < 0x300
1434
- result = PyInt_FromLong(generator->m_running);
1541
+ result = Nuitka_PyInt_FromLong(generator->m_running);
1435
1542
  #else
1436
1543
  result = BOOL_FROM(generator->m_running != 0);
1437
- Py_INCREF(result);
1544
+ Py_INCREF_IMMORTAL(result);
1438
1545
  #endif
1439
1546
  return result;
1440
1547
  }
1441
1548
 
1442
- static int Nuitka_Generator_set_running(struct Nuitka_GeneratorObject *generator, PyObject *value) {
1549
+ static int Nuitka_Generator_set_running(PyObject *self, PyObject *value, void *data) {
1443
1550
  #if PYTHON_VERSION < 0x300
1444
1551
  PyObject *exception_type = PyExc_TypeError;
1445
1552
  #else
@@ -1457,17 +1564,19 @@ static int Nuitka_Generator_set_running(struct Nuitka_GeneratorObject *generator
1457
1564
  return -1;
1458
1565
  }
1459
1566
 
1460
- static PyGetSetDef Nuitka_Generator_getsetlist[] = {
1567
+ // spell-checker: ignore gi_yieldfrom
1568
+
1569
+ static PyGetSetDef Nuitka_Generator_tp_getset[] = {
1461
1570
  #if PYTHON_VERSION < 0x350
1462
- {(char *)"__name__", (getter)Nuitka_Generator_get_name, NULL, NULL},
1571
+ {(char *)"__name__", Nuitka_Generator_get_name, NULL, NULL},
1463
1572
  #else
1464
- {(char *)"__name__", (getter)Nuitka_Generator_get_name, (setter)Nuitka_Generator_set_name, NULL},
1465
- {(char *)"__qualname__", (getter)Nuitka_Generator_get_qualname, (setter)Nuitka_Generator_set_qualname, NULL},
1466
- {(char *)"gi_yieldfrom", (getter)Nuitka_Generator_get_yieldfrom, NULL, NULL},
1573
+ {(char *)"__name__", Nuitka_Generator_get_name, Nuitka_Generator_set_name, NULL},
1574
+ {(char *)"__qualname__", Nuitka_Generator_get_qualname, Nuitka_Generator_set_qualname, NULL},
1575
+ {(char *)"gi_yieldfrom", Nuitka_Generator_get_yield_from, NULL, NULL},
1467
1576
  #endif
1468
- {(char *)"gi_code", (getter)Nuitka_Generator_get_code, (setter)Nuitka_Generator_set_code, NULL},
1469
- {(char *)"gi_frame", (getter)Nuitka_Generator_get_frame, (setter)Nuitka_Generator_set_frame, NULL},
1470
- {(char *)"gi_running", (getter)Nuitka_Generator_get_running, (setter)Nuitka_Generator_set_running, NULL},
1577
+ {(char *)"gi_code", Nuitka_Generator_get_code, Nuitka_Generator_set_code, NULL},
1578
+ {(char *)"gi_frame", Nuitka_Generator_get_frame, Nuitka_Generator_set_frame, NULL},
1579
+ {(char *)"gi_running", Nuitka_Generator_get_running, Nuitka_Generator_set_running, NULL},
1471
1580
 
1472
1581
  {NULL}};
1473
1582
 
@@ -1487,8 +1596,6 @@ static PyAsyncMethods Nuitka_Generator_as_async = {
1487
1596
  };
1488
1597
  #endif
1489
1598
 
1490
- #include <structmember.h>
1491
-
1492
1599
  PyTypeObject Nuitka_Generator_Type = {
1493
1600
  PyVarObject_HEAD_INIT(NULL, 0) "compiled_generator", // tp_name
1494
1601
  sizeof(struct Nuitka_GeneratorObject), // tp_basicsize
@@ -1512,7 +1619,7 @@ PyTypeObject Nuitka_Generator_Type = {
1512
1619
  0, // tp_getattro (PyObject_GenericGetAttr)
1513
1620
  0, // tp_setattro
1514
1621
  0, // tp_as_buffer
1515
- #if PYTHON_VERSION < 0x340
1622
+ #if PYTHON_VERSION < 0x300
1516
1623
  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
1517
1624
  #else
1518
1625
  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE,
@@ -1527,7 +1634,7 @@ PyTypeObject Nuitka_Generator_Type = {
1527
1634
  (iternextfunc)Nuitka_Generator_tp_iternext, // tp_iternext
1528
1635
  Nuitka_Generator_methods, // tp_methods
1529
1636
  NULL, // tp_members
1530
- Nuitka_Generator_getsetlist, // tp_getset
1637
+ Nuitka_Generator_tp_getset, // tp_getset
1531
1638
  0, // tp_base
1532
1639
  0, // tp_dict
1533
1640
  0, // tp_descr_get
@@ -1545,7 +1652,7 @@ PyTypeObject Nuitka_Generator_Type = {
1545
1652
  0, // tp_weaklist
1546
1653
  0, // tp_del
1547
1654
  0 // tp_version_tag
1548
- #if PYTHON_VERSION >= 0x340
1655
+ #if PYTHON_VERSION >= 0x300
1549
1656
  ,
1550
1657
  (destructor)Nuitka_Generator_tp_finalizer // tp_finalize
1551
1658
  #endif
@@ -1591,7 +1698,7 @@ void _initCompiledGeneratorType(void) {
1591
1698
  assert(Nuitka_Generator_Type.tp_subclasses != PyGen_Type.tp_subclasses || PyGen_Type.tp_cache == NULL);
1592
1699
  assert(Nuitka_Generator_Type.tp_weaklist != PyGen_Type.tp_weaklist);
1593
1700
  assert(Nuitka_Generator_Type.tp_del != PyGen_Type.tp_del || PyGen_Type.tp_del == NULL);
1594
- #if PYTHON_VERSION >= 0x340
1701
+ #if PYTHON_VERSION >= 0x300
1595
1702
  assert(Nuitka_Generator_Type.tp_finalize != PyGen_Type.tp_finalize || PyGen_Type.tp_finalize == NULL);
1596
1703
  #endif
1597
1704
 
@@ -1612,6 +1719,11 @@ PyObject *Nuitka_Generator_New(generator_code code, PyObject *module, PyObject *
1612
1719
  #endif
1613
1720
  PyCodeObject *code_object, struct Nuitka_CellObject **closure, Py_ssize_t closure_given,
1614
1721
  Py_ssize_t heap_storage_size) {
1722
+ #if _DEBUG_REFCOUNTS
1723
+ count_active_Nuitka_Generator_Type += 1;
1724
+ count_allocated_Nuitka_Generator_Type += 1;
1725
+ #endif
1726
+
1615
1727
  struct Nuitka_GeneratorObject *result;
1616
1728
 
1617
1729
  // TODO: Change the var part of the type to 1 maybe
@@ -1649,7 +1761,7 @@ PyObject *Nuitka_Generator_New(generator_code code, PyObject *module, PyObject *
1649
1761
  #endif
1650
1762
 
1651
1763
  #if PYTHON_VERSION >= 0x300
1652
- result->m_yieldfrom = NULL;
1764
+ result->m_yield_from = NULL;
1653
1765
  #endif
1654
1766
 
1655
1767
  memcpy(&result->m_closure[0], closure, closure_given * sizeof(struct Nuitka_CellObject *));
@@ -1707,4 +1819,18 @@ PyObject *Nuitka_Generator_NewEmpty(PyObject *module, PyObject *name,
1707
1819
 
1708
1820
  // Chain frames to generator and asyncgen code, as they need to close them with access
1709
1821
  // to best functions.
1710
- #include "CompiledFrameType.c"
1822
+ #include "CompiledFrameType.c"
1823
+ // Part of "Nuitka", an optimizing Python compiler that is compatible and
1824
+ // integrates with CPython, but also works on its own.
1825
+ //
1826
+ // Licensed under the Apache License, Version 2.0 (the "License");
1827
+ // you may not use this file except in compliance with the License.
1828
+ // You may obtain a copy of the License at
1829
+ //
1830
+ // http://www.apache.org/licenses/LICENSE-2.0
1831
+ //
1832
+ // Unless required by applicable law or agreed to in writing, software
1833
+ // distributed under the License is distributed on an "AS IS" BASIS,
1834
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1835
+ // See the License for the specific language governing permissions and
1836
+ // limitations under the License.