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

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

Potentially problematic release.


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

Files changed (704) hide show
  1. Nuitka_winsvc-1.8.data/scripts/nuitka-run.bat → Nuitka_winsvc-2.4.8.data/scripts/nuitka-run.cmd +9 -9
  2. Nuitka_winsvc-1.8.data/scripts/nuitka.bat → Nuitka_winsvc-2.4.8.data/scripts/nuitka.cmd +15 -15
  3. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/METADATA +4 -3
  4. Nuitka_winsvc-2.4.8.dist-info/RECORD +954 -0
  5. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/WHEEL +1 -1
  6. nuitka/Builtins.py +18 -17
  7. nuitka/BytecodeCaching.py +24 -20
  8. nuitka/Bytecodes.py +23 -19
  9. nuitka/CacheCleanup.py +28 -23
  10. nuitka/Constants.py +19 -17
  11. nuitka/Errors.py +23 -17
  12. nuitka/HardImportRegistry.py +400 -0
  13. nuitka/MainControl.py +200 -112
  14. nuitka/ModuleRegistry.py +83 -20
  15. nuitka/OptionParsing.py +368 -175
  16. nuitka/Options.py +632 -213
  17. nuitka/OutputDirectories.py +40 -21
  18. nuitka/PostProcessing.py +73 -50
  19. nuitka/Progress.py +58 -24
  20. nuitka/PythonFlavors.py +141 -32
  21. nuitka/PythonOperators.py +18 -17
  22. nuitka/PythonVersions.py +106 -19
  23. nuitka/Serialization.py +68 -55
  24. nuitka/SourceCodeReferences.py +19 -17
  25. nuitka/Tracing.py +108 -70
  26. nuitka/TreeXML.py +31 -26
  27. nuitka/Variables.py +39 -41
  28. nuitka/Version.py +21 -7
  29. nuitka/__init__.py +5 -4
  30. nuitka/__main__.py +95 -29
  31. nuitka/__past__.py +44 -34
  32. nuitka/build/Backend.scons +202 -140
  33. nuitka/build/CCompilerVersion.scons +39 -31
  34. nuitka/build/DataComposerInterface.py +20 -17
  35. nuitka/build/Onefile.scons +50 -54
  36. nuitka/build/SconsCaching.py +93 -90
  37. nuitka/build/SconsCompilerSettings.py +157 -69
  38. nuitka/build/SconsHacks.py +25 -19
  39. nuitka/build/SconsInterface.py +154 -54
  40. nuitka/build/SconsProgress.py +19 -18
  41. nuitka/build/SconsSpawn.py +62 -33
  42. nuitka/build/SconsUtils.py +147 -55
  43. nuitka/build/__init__.py +5 -4
  44. nuitka/build/include/nuitka/allocator.h +105 -22
  45. nuitka/build/include/nuitka/builtins.h +17 -17
  46. nuitka/build/include/nuitka/calling.h +18 -18
  47. nuitka/build/include/nuitka/checkers.h +17 -18
  48. nuitka/build/include/nuitka/checksum_tools.h +14 -19
  49. nuitka/build/include/nuitka/compiled_asyncgen.h +18 -18
  50. nuitka/build/include/nuitka/compiled_cell.h +33 -18
  51. nuitka/build/include/nuitka/compiled_coroutine.h +18 -18
  52. nuitka/build/include/nuitka/compiled_frame.h +91 -53
  53. nuitka/build/include/nuitka/compiled_function.h +42 -20
  54. nuitka/build/include/nuitka/compiled_generator.h +24 -18
  55. nuitka/build/include/nuitka/compiled_method.h +17 -18
  56. nuitka/build/include/nuitka/constants.h +29 -18
  57. nuitka/build/include/nuitka/constants_blob.h +17 -17
  58. nuitka/build/include/nuitka/environment_variables.h +30 -0
  59. nuitka/build/include/nuitka/environment_variables_system.h +45 -0
  60. nuitka/build/include/nuitka/exception_groups.h +23 -26
  61. nuitka/build/include/nuitka/exceptions.h +593 -190
  62. nuitka/build/include/nuitka/filesystem_paths.h +26 -20
  63. nuitka/build/include/nuitka/freelists.h +38 -18
  64. nuitka/build/include/nuitka/helper/attributes.h +24 -18
  65. nuitka/build/include/nuitka/helper/boolean.h +17 -17
  66. nuitka/build/include/nuitka/helper/bytearrays.h +17 -17
  67. nuitka/build/include/nuitka/helper/bytes.h +14 -15
  68. nuitka/build/include/nuitka/helper/calling_generated.h +17 -17
  69. nuitka/build/include/nuitka/helper/comparisons_eq.h +17 -17
  70. nuitka/build/include/nuitka/helper/comparisons_ge.h +17 -17
  71. nuitka/build/include/nuitka/helper/comparisons_gt.h +17 -17
  72. nuitka/build/include/nuitka/helper/comparisons_le.h +17 -17
  73. nuitka/build/include/nuitka/helper/comparisons_lt.h +17 -17
  74. nuitka/build/include/nuitka/helper/comparisons_ne.h +17 -17
  75. nuitka/build/include/nuitka/helper/complex.h +17 -17
  76. nuitka/build/include/nuitka/helper/dictionaries.h +24 -22
  77. nuitka/build/include/nuitka/helper/floats.h +17 -18
  78. nuitka/build/include/nuitka/helper/import_hard.h +25 -17
  79. nuitka/build/include/nuitka/helper/indexes.h +17 -18
  80. nuitka/build/include/nuitka/helper/ints.h +32 -20
  81. nuitka/build/include/nuitka/helper/iterators.h +17 -17
  82. nuitka/build/include/nuitka/helper/lists.h +26 -24
  83. nuitka/build/include/nuitka/helper/lists_generated.h +22 -22
  84. nuitka/build/include/nuitka/helper/mappings.h +17 -18
  85. nuitka/build/include/nuitka/helper/operations.h +17 -17
  86. nuitka/build/include/nuitka/helper/operations_binary_add.h +17 -17
  87. nuitka/build/include/nuitka/helper/operations_binary_bitand.h +17 -17
  88. nuitka/build/include/nuitka/helper/operations_binary_bitor.h +17 -17
  89. nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +17 -17
  90. nuitka/build/include/nuitka/helper/operations_binary_divmod.h +17 -17
  91. nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +17 -17
  92. nuitka/build/include/nuitka/helper/operations_binary_lshift.h +17 -17
  93. nuitka/build/include/nuitka/helper/operations_binary_matmult.h +17 -17
  94. nuitka/build/include/nuitka/helper/operations_binary_mod.h +17 -17
  95. nuitka/build/include/nuitka/helper/operations_binary_mult.h +17 -17
  96. nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +17 -17
  97. nuitka/build/include/nuitka/helper/operations_binary_pow.h +17 -17
  98. nuitka/build/include/nuitka/helper/operations_binary_rshift.h +17 -17
  99. nuitka/build/include/nuitka/helper/operations_binary_sub.h +17 -17
  100. nuitka/build/include/nuitka/helper/operations_binary_truediv.h +17 -17
  101. nuitka/build/include/nuitka/helper/operations_builtin_types.h +17 -17
  102. nuitka/build/include/nuitka/helper/operations_inplace_add.h +17 -17
  103. nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +17 -17
  104. nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +17 -17
  105. nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +17 -17
  106. nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +17 -17
  107. nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +17 -17
  108. nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +17 -17
  109. nuitka/build/include/nuitka/helper/operations_inplace_mod.h +17 -17
  110. nuitka/build/include/nuitka/helper/operations_inplace_mult.h +17 -17
  111. nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +17 -17
  112. nuitka/build/include/nuitka/helper/operations_inplace_pow.h +17 -17
  113. nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +17 -17
  114. nuitka/build/include/nuitka/helper/operations_inplace_sub.h +17 -17
  115. nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +17 -17
  116. nuitka/build/include/nuitka/helper/raising.h +29 -17
  117. nuitka/build/include/nuitka/helper/rangeobjects.h +17 -17
  118. nuitka/build/include/nuitka/helper/richcomparisons.h +14 -14
  119. nuitka/build/include/nuitka/helper/sequences.h +19 -13
  120. nuitka/build/include/nuitka/helper/sets.h +11 -12
  121. nuitka/build/include/nuitka/helper/slices.h +31 -25
  122. nuitka/build/include/nuitka/helper/strings.h +16 -17
  123. nuitka/build/include/nuitka/helper/subscripts.h +18 -201
  124. nuitka/build/include/nuitka/helper/tuples.h +64 -52
  125. nuitka/build/include/nuitka/helpers.h +38 -20
  126. nuitka/build/include/nuitka/importing.h +28 -21
  127. nuitka/build/include/nuitka/jit_sources.h +25 -0
  128. nuitka/build/include/nuitka/prelude.h +128 -46
  129. nuitka/build/include/nuitka/printing.h +22 -17
  130. nuitka/build/include/nuitka/python_pgo.h +19 -18
  131. nuitka/build/include/nuitka/safe_string_ops.h +20 -18
  132. nuitka/build/include/nuitka/threading.h +32 -33
  133. nuitka/build/include/nuitka/tracing.h +28 -18
  134. nuitka/build/include/nuitka/type_aliases.h +27 -0
  135. nuitka/build/include/nuitka/unfreezing.h +29 -23
  136. nuitka/build/inline_copy/bin/scons.py +14 -0
  137. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +6 -6
  138. nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +0 -3
  139. nuitka/build/inline_copy/python_hacl/LICENSE.txt +201 -0
  140. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.c +1430 -0
  141. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.h +66 -0
  142. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.c +463 -0
  143. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.h +66 -0
  144. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.c +1273 -0
  145. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.h +204 -0
  146. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.c +734 -0
  147. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.h +131 -0
  148. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Streaming_Types.h +83 -0
  149. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt128_Verified.h +346 -0
  150. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt_8_16_32_64.h +107 -0
  151. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/fstar_uint128_struct_endianness.h +68 -0
  152. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/internal/target.h +293 -0
  153. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/lowstar_endianness.h +231 -0
  154. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/types.h +14 -0
  155. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_MD5.h +56 -0
  156. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA1.h +56 -0
  157. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA2.h +164 -0
  158. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA3.h +65 -0
  159. nuitka/build/inline_copy/python_hacl/hacl_312/python_hacl_namespaces.h +89 -0
  160. nuitka/build/inline_copy/tqdm/tqdm/__init__.py +2 -2
  161. nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +4 -1
  162. nuitka/build/inline_copy/tqdm/tqdm/utils.py +14 -8
  163. nuitka/build/inline_copy/tqdm/tqdm/version.py +1 -8
  164. nuitka/build/inline_copy/zlib/LICENSE +22 -0
  165. nuitka/build/inline_copy/zlib/crc32.c +1049 -0
  166. nuitka/build/inline_copy/zlib/crc32.h +9446 -0
  167. nuitka/build/inline_copy/zlib/zconf.h +551 -0
  168. nuitka/build/inline_copy/zlib/zlib.h +1938 -0
  169. nuitka/build/inline_copy/zlib/zutil.h +275 -0
  170. nuitka/build/static_src/CompiledAsyncgenType.c +176 -182
  171. nuitka/build/static_src/CompiledCellType.c +63 -40
  172. nuitka/build/static_src/CompiledCodeHelpers.c +181 -128
  173. nuitka/build/static_src/CompiledCoroutineType.c +196 -203
  174. nuitka/build/static_src/CompiledFrameType.c +287 -133
  175. nuitka/build/static_src/CompiledFunctionType.c +389 -95
  176. nuitka/build/static_src/CompiledGeneratorType.c +376 -252
  177. nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +185 -198
  178. nuitka/build/static_src/CompiledMethodType.c +83 -71
  179. nuitka/build/static_src/HelpersAllocator.c +88 -19
  180. nuitka/build/static_src/HelpersAttributes.c +33 -54
  181. nuitka/build/static_src/HelpersBuiltin.c +43 -33
  182. nuitka/build/static_src/HelpersBuiltinTypeMethods.c +17 -17
  183. nuitka/build/static_src/HelpersBytes.c +19 -20
  184. nuitka/build/static_src/HelpersCalling.c +33 -30
  185. nuitka/build/static_src/HelpersCallingGenerated.c +1000 -181
  186. nuitka/build/static_src/HelpersChecksumTools.c +35 -21
  187. nuitka/build/static_src/HelpersClasses.c +17 -17
  188. nuitka/build/static_src/HelpersComparisonEq.c +518 -492
  189. nuitka/build/static_src/HelpersComparisonEqUtils.c +21 -19
  190. nuitka/build/static_src/HelpersComparisonGe.c +513 -497
  191. nuitka/build/static_src/HelpersComparisonGt.c +512 -496
  192. nuitka/build/static_src/HelpersComparisonLe.c +513 -497
  193. nuitka/build/static_src/HelpersComparisonLt.c +512 -496
  194. nuitka/build/static_src/HelpersComparisonNe.c +520 -492
  195. nuitka/build/static_src/HelpersConsole.c +96 -0
  196. nuitka/build/static_src/HelpersConstantsBlob.c +542 -519
  197. nuitka/build/static_src/HelpersDeepcopy.c +33 -33
  198. nuitka/build/static_src/HelpersDictionaries.c +51 -29
  199. nuitka/build/static_src/HelpersDictionariesGenerated.c +177 -68
  200. nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
  201. nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
  202. nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +93 -0
  203. nuitka/build/static_src/HelpersExceptions.c +161 -50
  204. nuitka/build/static_src/HelpersFiles.c +37 -17
  205. nuitka/build/static_src/HelpersFilesystemPaths.c +292 -181
  206. nuitka/build/static_src/HelpersFloats.c +37 -31
  207. nuitka/build/static_src/HelpersHeapStorage.c +21 -17
  208. nuitka/build/static_src/HelpersImport.c +48 -20
  209. nuitka/build/static_src/HelpersImportHard.c +53 -17
  210. nuitka/build/static_src/HelpersJitSources.c +46 -0
  211. nuitka/build/static_src/HelpersLists.c +140 -50
  212. nuitka/build/static_src/HelpersListsGenerated.c +41 -41
  213. nuitka/build/static_src/HelpersMappings.c +17 -17
  214. nuitka/build/static_src/HelpersMatching.c +137 -51
  215. nuitka/build/static_src/HelpersOperationBinaryAdd.c +173 -146
  216. nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +99 -52
  217. nuitka/build/static_src/HelpersOperationBinaryBitand.c +50 -50
  218. nuitka/build/static_src/HelpersOperationBinaryBitor.c +50 -50
  219. nuitka/build/static_src/HelpersOperationBinaryBitxor.c +50 -50
  220. nuitka/build/static_src/HelpersOperationBinaryDivmod.c +41 -41
  221. nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +17 -17
  222. nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +41 -41
  223. nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +20 -21
  224. nuitka/build/static_src/HelpersOperationBinaryLshift.c +47 -47
  225. nuitka/build/static_src/HelpersOperationBinaryMatmult.c +24 -24
  226. nuitka/build/static_src/HelpersOperationBinaryMod.c +107 -107
  227. nuitka/build/static_src/HelpersOperationBinaryMult.c +81 -75
  228. nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +33 -30
  229. nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +41 -41
  230. nuitka/build/static_src/HelpersOperationBinaryPow.c +44 -44
  231. nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +12 -12
  232. nuitka/build/static_src/HelpersOperationBinaryRshift.c +47 -47
  233. nuitka/build/static_src/HelpersOperationBinarySub.c +80 -80
  234. nuitka/build/static_src/HelpersOperationBinaryTruediv.c +41 -41
  235. nuitka/build/static_src/HelpersOperationInplaceAdd.c +171 -153
  236. nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +24 -22
  237. nuitka/build/static_src/HelpersOperationInplaceBitand.c +53 -53
  238. nuitka/build/static_src/HelpersOperationInplaceBitor.c +53 -53
  239. nuitka/build/static_src/HelpersOperationInplaceBitxor.c +53 -53
  240. nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +62 -62
  241. nuitka/build/static_src/HelpersOperationInplaceLshift.c +44 -44
  242. nuitka/build/static_src/HelpersOperationInplaceMatmult.c +37 -37
  243. nuitka/build/static_src/HelpersOperationInplaceMod.c +134 -134
  244. nuitka/build/static_src/HelpersOperationInplaceMult.c +78 -78
  245. nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +62 -62
  246. nuitka/build/static_src/HelpersOperationInplacePow.c +62 -62
  247. nuitka/build/static_src/HelpersOperationInplaceRshift.c +44 -44
  248. nuitka/build/static_src/HelpersOperationInplaceSub.c +112 -112
  249. nuitka/build/static_src/HelpersOperationInplaceTruediv.c +62 -62
  250. nuitka/build/static_src/HelpersProfiling.c +24 -23
  251. nuitka/build/static_src/HelpersPythonPgo.c +22 -22
  252. nuitka/build/static_src/HelpersRaising.c +88 -20
  253. nuitka/build/static_src/HelpersSafeStrings.c +34 -22
  254. nuitka/build/static_src/HelpersSequences.c +18 -19
  255. nuitka/build/static_src/HelpersSlices.c +29 -23
  256. nuitka/build/static_src/HelpersStrings.c +234 -37
  257. nuitka/build/static_src/HelpersTuples.c +46 -34
  258. nuitka/build/static_src/HelpersTypes.c +68 -23
  259. nuitka/build/static_src/InspectPatcher.c +108 -27
  260. nuitka/build/static_src/MainProgram.c +359 -263
  261. nuitka/build/static_src/MetaPathBasedLoader.c +367 -242
  262. nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +39 -26
  263. nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +17 -18
  264. nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +97 -22
  265. nuitka/build/static_src/OnefileBootstrap.c +276 -164
  266. nuitka/build/static_src/OnefileSplashScreen.cpp +51 -27
  267. nuitka/code_generation/AsyncgenCodes.py +19 -17
  268. nuitka/code_generation/AttributeCodes.py +31 -27
  269. nuitka/code_generation/BinaryOperationHelperDefinitions.py +24 -20
  270. nuitka/code_generation/BranchCodes.py +19 -17
  271. nuitka/code_generation/BuiltinCodes.py +20 -17
  272. nuitka/code_generation/CallCodes.py +19 -17
  273. nuitka/code_generation/ClassCodes.py +19 -17
  274. nuitka/code_generation/CodeGeneration.py +48 -27
  275. nuitka/code_generation/CodeHelperSelection.py +19 -17
  276. nuitka/code_generation/CodeHelpers.py +24 -20
  277. nuitka/code_generation/CodeObjectCodes.py +34 -24
  278. nuitka/code_generation/ComparisonCodes.py +38 -20
  279. nuitka/code_generation/ComparisonHelperDefinitions.py +19 -17
  280. nuitka/code_generation/ConditionalCodes.py +19 -17
  281. nuitka/code_generation/ConstantCodes.py +82 -28
  282. nuitka/code_generation/Contexts.py +152 -26
  283. nuitka/code_generation/CoroutineCodes.py +19 -17
  284. nuitka/code_generation/CtypesCodes.py +19 -17
  285. nuitka/code_generation/DictCodes.py +25 -23
  286. nuitka/code_generation/Emission.py +21 -18
  287. nuitka/code_generation/ErrorCodes.py +27 -33
  288. nuitka/code_generation/EvalCodes.py +24 -20
  289. nuitka/code_generation/ExceptionCodes.py +27 -18
  290. nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +20 -17
  291. nuitka/code_generation/ExpressionCodes.py +19 -17
  292. nuitka/code_generation/FrameCodes.py +24 -20
  293. nuitka/code_generation/FunctionCodes.py +24 -21
  294. nuitka/code_generation/GeneratorCodes.py +23 -20
  295. nuitka/code_generation/GlobalConstants.py +43 -23
  296. nuitka/code_generation/GlobalsLocalsCodes.py +21 -19
  297. nuitka/code_generation/IdCodes.py +19 -17
  298. nuitka/code_generation/ImportCodes.py +90 -50
  299. nuitka/code_generation/Indentation.py +23 -22
  300. nuitka/code_generation/IndexCodes.py +19 -17
  301. nuitka/code_generation/InjectCCodes.py +14 -12
  302. nuitka/code_generation/IntegerCodes.py +19 -17
  303. nuitka/code_generation/IteratorCodes.py +19 -17
  304. nuitka/code_generation/JitCodes.py +44 -0
  305. nuitka/code_generation/LabelCodes.py +19 -17
  306. nuitka/code_generation/LineNumberCodes.py +19 -17
  307. nuitka/code_generation/ListCodes.py +32 -36
  308. nuitka/code_generation/LoaderCodes.py +22 -17
  309. nuitka/code_generation/LocalsDictCodes.py +56 -32
  310. nuitka/code_generation/LoopCodes.py +19 -17
  311. nuitka/code_generation/MatchCodes.py +42 -22
  312. nuitka/code_generation/ModuleCodes.py +43 -25
  313. nuitka/code_generation/Namify.py +27 -23
  314. nuitka/code_generation/NetworkxCodes.py +51 -0
  315. nuitka/code_generation/OperationCodes.py +29 -31
  316. nuitka/code_generation/PackageResourceCodes.py +59 -23
  317. nuitka/code_generation/PrintCodes.py +19 -17
  318. nuitka/code_generation/PythonAPICodes.py +19 -17
  319. nuitka/code_generation/RaisingCodes.py +19 -17
  320. nuitka/code_generation/Reports.py +19 -17
  321. nuitka/code_generation/ReturnCodes.py +19 -17
  322. nuitka/code_generation/SetCodes.py +19 -17
  323. nuitka/code_generation/SliceCodes.py +22 -20
  324. nuitka/code_generation/StringCodes.py +19 -17
  325. nuitka/code_generation/SubscriptCodes.py +24 -30
  326. nuitka/code_generation/TensorflowCodes.py +54 -0
  327. nuitka/code_generation/TryCodes.py +19 -17
  328. nuitka/code_generation/TupleCodes.py +20 -18
  329. nuitka/code_generation/TypeAliasCodes.py +71 -0
  330. nuitka/code_generation/VariableCodes.py +26 -22
  331. nuitka/code_generation/VariableDeclarations.py +20 -17
  332. nuitka/code_generation/YieldCodes.py +22 -20
  333. nuitka/code_generation/__init__.py +5 -4
  334. nuitka/code_generation/c_types/CTypeBases.py +19 -17
  335. nuitka/code_generation/c_types/CTypeBooleans.py +19 -17
  336. nuitka/code_generation/c_types/CTypeCFloats.py +19 -17
  337. nuitka/code_generation/c_types/CTypeCLongs.py +19 -18
  338. nuitka/code_generation/c_types/CTypeModuleDictVariables.py +19 -17
  339. nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +19 -17
  340. nuitka/code_generation/c_types/CTypeNuitkaInts.py +19 -18
  341. nuitka/code_generation/c_types/CTypeNuitkaVoids.py +19 -17
  342. nuitka/code_generation/c_types/CTypePyObjectPointers.py +27 -25
  343. nuitka/code_generation/c_types/CTypeVoids.py +20 -17
  344. nuitka/code_generation/c_types/__init__.py +5 -4
  345. nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +18 -17
  346. nuitka/code_generation/templates/CodeTemplatesConstants.py +132 -36
  347. nuitka/code_generation/templates/CodeTemplatesCoroutines.py +18 -17
  348. nuitka/code_generation/templates/CodeTemplatesExceptions.py +19 -18
  349. nuitka/code_generation/templates/CodeTemplatesFrames.py +18 -17
  350. nuitka/code_generation/templates/CodeTemplatesFunction.py +18 -17
  351. nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +19 -17
  352. nuitka/code_generation/templates/CodeTemplatesIterators.py +18 -18
  353. nuitka/code_generation/templates/CodeTemplatesLoader.py +25 -19
  354. nuitka/code_generation/templates/CodeTemplatesModules.py +244 -165
  355. nuitka/code_generation/templates/CodeTemplatesVariables.py +42 -27
  356. nuitka/code_generation/templates/TemplateDebugWrapper.py +19 -18
  357. nuitka/code_generation/templates/__init__.py +5 -4
  358. nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +19 -19
  359. nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +18 -18
  360. nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +76 -25
  361. nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +22 -22
  362. nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +19 -19
  363. nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +19 -19
  364. nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +17 -17
  365. nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +121 -48
  366. nuitka/code_generation/templates_c/HelperImportHard.c.j2 +18 -18
  367. nuitka/code_generation/templates_c/HelperLongTools.c.j2 +18 -18
  368. nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +6 -6
  369. nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +23 -23
  370. nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +35 -35
  371. nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +28 -28
  372. nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +17 -17
  373. nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +18 -18
  374. nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +44 -32
  375. nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +20 -20
  376. nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +28 -28
  377. nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +24 -24
  378. nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +33 -29
  379. nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +20 -20
  380. nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +27 -27
  381. nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +17 -17
  382. nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +17 -17
  383. nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +17 -17
  384. nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +17 -17
  385. nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +21 -18
  386. nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +26 -24
  387. nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +17 -17
  388. nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +17 -17
  389. nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +21 -18
  390. nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +17 -17
  391. nuitka/containers/Namedtuples.py +19 -18
  392. nuitka/containers/OrderedSetsFallback.py +19 -17
  393. nuitka/containers/__init__.py +5 -4
  394. nuitka/distutils/Build.py +19 -18
  395. nuitka/distutils/DistutilCommands.py +34 -23
  396. nuitka/distutils/__init__.py +5 -4
  397. nuitka/finalizations/Finalization.py +20 -17
  398. nuitka/finalizations/FinalizeMarkups.py +21 -41
  399. nuitka/finalizations/__init__.py +5 -4
  400. nuitka/freezer/DependsExe.py +48 -28
  401. nuitka/freezer/DllDependenciesCommon.py +47 -20
  402. nuitka/freezer/DllDependenciesMacOS.py +147 -57
  403. nuitka/freezer/DllDependenciesPosix.py +29 -19
  404. nuitka/freezer/DllDependenciesWin32.py +29 -21
  405. nuitka/freezer/ImportDetection.py +20 -17
  406. nuitka/freezer/IncludedDataFiles.py +118 -47
  407. nuitka/freezer/IncludedEntryPoints.py +102 -38
  408. nuitka/freezer/Onefile.py +32 -22
  409. nuitka/freezer/Standalone.py +105 -50
  410. nuitka/freezer/__init__.py +5 -4
  411. nuitka/importing/IgnoreListing.py +19 -17
  412. nuitka/importing/ImportCache.py +24 -21
  413. nuitka/importing/ImportResolving.py +103 -95
  414. nuitka/importing/Importing.py +286 -92
  415. nuitka/importing/PreloadedPackages.py +21 -18
  416. nuitka/importing/Recursion.py +131 -47
  417. nuitka/importing/StandardLibrary.py +46 -28
  418. nuitka/importing/__init__.py +5 -4
  419. nuitka/nodes/AsyncgenNodes.py +19 -17
  420. nuitka/nodes/AttributeLookupNodes.py +19 -17
  421. nuitka/nodes/AttributeNodes.py +19 -17
  422. nuitka/nodes/AttributeNodesGenerated.py +49 -24
  423. nuitka/nodes/BuiltinAllNodes.py +19 -17
  424. nuitka/nodes/BuiltinAnyNodes.py +19 -17
  425. nuitka/nodes/BuiltinComplexNodes.py +20 -17
  426. nuitka/nodes/BuiltinDecodingNodes.py +19 -17
  427. nuitka/nodes/BuiltinDecoratorNodes.py +19 -17
  428. nuitka/nodes/BuiltinDictNodes.py +19 -17
  429. nuitka/nodes/BuiltinFormatNodes.py +20 -17
  430. nuitka/nodes/BuiltinHashNodes.py +19 -17
  431. nuitka/nodes/BuiltinInputNodes.py +19 -17
  432. nuitka/nodes/BuiltinIntegerNodes.py +19 -17
  433. nuitka/nodes/BuiltinIteratorNodes.py +24 -20
  434. nuitka/nodes/BuiltinLenNodes.py +19 -17
  435. nuitka/nodes/BuiltinNextNodes.py +19 -17
  436. nuitka/nodes/BuiltinOpenNodes.py +52 -18
  437. nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +40 -23
  438. nuitka/nodes/BuiltinRangeNodes.py +21 -19
  439. nuitka/nodes/BuiltinRefNodes.py +68 -19
  440. nuitka/nodes/BuiltinSumNodes.py +20 -18
  441. nuitka/nodes/BuiltinTypeNodes.py +19 -17
  442. nuitka/nodes/BuiltinVarsNodes.py +19 -18
  443. nuitka/nodes/BytesNodes.py +19 -17
  444. nuitka/nodes/CallNodes.py +19 -17
  445. nuitka/nodes/Checkers.py +19 -17
  446. nuitka/nodes/ChildrenHavingMixins.py +1250 -302
  447. nuitka/nodes/ClassNodes.py +49 -29
  448. nuitka/nodes/CodeObjectSpecs.py +29 -18
  449. nuitka/nodes/ComparisonNodes.py +19 -17
  450. nuitka/nodes/ConditionalNodes.py +21 -23
  451. nuitka/nodes/ConstantRefNodes.py +57 -17
  452. nuitka/nodes/ContainerMakingNodes.py +19 -17
  453. nuitka/nodes/ContainerOperationNodes.py +19 -17
  454. nuitka/nodes/CoroutineNodes.py +19 -17
  455. nuitka/nodes/CtypesNodes.py +19 -18
  456. nuitka/nodes/DictionaryNodes.py +19 -18
  457. nuitka/nodes/ExceptionNodes.py +29 -17
  458. nuitka/nodes/ExecEvalNodes.py +19 -17
  459. nuitka/nodes/ExpressionBases.py +34 -26
  460. nuitka/nodes/ExpressionBasesGenerated.py +54 -32
  461. nuitka/nodes/ExpressionShapeMixins.py +19 -17
  462. nuitka/nodes/FrameNodes.py +19 -17
  463. nuitka/nodes/FunctionAttributeNodes.py +19 -17
  464. nuitka/nodes/FunctionNodes.py +81 -35
  465. nuitka/nodes/FutureSpecs.py +35 -20
  466. nuitka/nodes/GeneratorNodes.py +21 -19
  467. nuitka/nodes/GlobalsLocalsNodes.py +22 -17
  468. nuitka/nodes/HardImportNodesGenerated.py +545 -129
  469. nuitka/nodes/ImportHardNodes.py +46 -38
  470. nuitka/nodes/ImportNodes.py +436 -446
  471. nuitka/nodes/IndicatorMixins.py +19 -17
  472. nuitka/nodes/InjectCNodes.py +19 -18
  473. nuitka/nodes/IterationHandles.py +55 -34
  474. nuitka/nodes/KeyValuePairNodes.py +19 -17
  475. nuitka/nodes/ListOperationNodes.py +33 -21
  476. nuitka/nodes/LocalsDictNodes.py +19 -17
  477. nuitka/nodes/LocalsScopes.py +41 -41
  478. nuitka/nodes/LoopNodes.py +28 -17
  479. nuitka/nodes/MatchNodes.py +37 -24
  480. nuitka/nodes/ModuleAttributeNodes.py +18 -35
  481. nuitka/nodes/ModuleNodes.py +90 -31
  482. nuitka/nodes/NetworkxNodes.py +45 -0
  483. nuitka/nodes/NodeBases.py +45 -43
  484. nuitka/nodes/NodeMakingHelpers.py +21 -19
  485. nuitka/nodes/NodeMetaClasses.py +45 -28
  486. nuitka/nodes/OperatorNodes.py +28 -26
  487. nuitka/nodes/OperatorNodesUnary.py +20 -17
  488. nuitka/nodes/OsSysNodes.py +66 -18
  489. nuitka/nodes/OutlineNodes.py +22 -20
  490. nuitka/nodes/PackageMetadataNodes.py +37 -27
  491. nuitka/nodes/PackageResourceNodes.py +29 -23
  492. nuitka/nodes/PrintNodes.py +19 -17
  493. nuitka/nodes/ReturnNodes.py +20 -18
  494. nuitka/nodes/SideEffectNodes.py +19 -17
  495. nuitka/nodes/SliceNodes.py +20 -18
  496. nuitka/nodes/StatementBasesGenerated.py +125 -77
  497. nuitka/nodes/StatementNodes.py +19 -17
  498. nuitka/nodes/StrNodes.py +19 -17
  499. nuitka/nodes/StringConcatenationNodes.py +20 -17
  500. nuitka/nodes/SubscriptNodes.py +26 -24
  501. nuitka/nodes/TensorflowNodes.py +38 -0
  502. nuitka/nodes/TryNodes.py +19 -17
  503. nuitka/nodes/TypeMatchNodes.py +19 -17
  504. nuitka/nodes/TypeNodes.py +40 -17
  505. nuitka/nodes/VariableAssignNodes.py +122 -64
  506. nuitka/nodes/VariableDelNodes.py +19 -17
  507. nuitka/nodes/VariableNameNodes.py +19 -17
  508. nuitka/nodes/VariableRefNodes.py +63 -26
  509. nuitka/nodes/VariableReleaseNodes.py +19 -17
  510. nuitka/nodes/YieldNodes.py +21 -19
  511. nuitka/nodes/__init__.py +5 -4
  512. nuitka/nodes/shapes/BuiltinTypeShapes.py +145 -39
  513. nuitka/nodes/shapes/ControlFlowDescriptions.py +19 -17
  514. nuitka/nodes/shapes/ShapeMixins.py +40 -17
  515. nuitka/nodes/shapes/StandardShapes.py +27 -20
  516. nuitka/nodes/shapes/__init__.py +5 -4
  517. nuitka/optimizations/BytecodeDemotion.py +19 -17
  518. nuitka/optimizations/FunctionInlining.py +22 -23
  519. nuitka/optimizations/Graphs.py +19 -17
  520. nuitka/optimizations/Optimization.py +39 -35
  521. nuitka/optimizations/OptimizeBuiltinCalls.py +31 -27
  522. nuitka/optimizations/Tags.py +19 -18
  523. nuitka/optimizations/TraceCollections.py +67 -24
  524. nuitka/optimizations/ValueTraces.py +92 -25
  525. nuitka/optimizations/__init__.py +5 -4
  526. nuitka/pgo/PGO.py +33 -23
  527. nuitka/pgo/__init__.py +5 -4
  528. nuitka/plugins/PluginBase.py +610 -109
  529. nuitka/plugins/Plugins.py +241 -58
  530. nuitka/plugins/YamlPluginBase.py +121 -0
  531. nuitka/plugins/__init__.py +5 -4
  532. nuitka/plugins/standard/AntiBloatPlugin.py +357 -129
  533. nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +20 -19
  534. nuitka/plugins/standard/DataFilesPlugin.py +65 -29
  535. nuitka/plugins/standard/DelvewheelPlugin.py +32 -24
  536. nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
  537. nuitka/plugins/standard/DillPlugin/dill-postLoad.py +256 -0
  538. nuitka/plugins/standard/DillPlugin.py +42 -134
  539. nuitka/plugins/standard/DllFilesPlugin.py +125 -42
  540. nuitka/plugins/standard/EnumPlugin.py +19 -17
  541. nuitka/plugins/standard/EventletPlugin.py +19 -17
  542. nuitka/plugins/standard/GeventPlugin.py +19 -17
  543. nuitka/plugins/standard/GiPlugin.py +44 -28
  544. nuitka/plugins/standard/GlfwPlugin.py +20 -17
  545. nuitka/plugins/standard/ImplicitImports.py +407 -46
  546. nuitka/plugins/standard/KivyPlugin.py +30 -17
  547. nuitka/plugins/standard/MatplotlibPlugin.py +88 -42
  548. nuitka/plugins/standard/MultiprocessingPlugin.py +25 -20
  549. nuitka/plugins/standard/NumpyPlugin.py +19 -17
  550. nuitka/plugins/standard/OptionsNannyPlugin.py +48 -76
  551. nuitka/plugins/standard/PbrPlugin.py +21 -19
  552. nuitka/plugins/standard/PkgResourcesPlugin.py +34 -23
  553. nuitka/plugins/standard/PmwPlugin.py +30 -27
  554. nuitka/plugins/standard/PySidePyQtPlugin.py +74 -80
  555. nuitka/plugins/standard/PywebViewPlugin.py +19 -17
  556. nuitka/plugins/standard/SpacyPlugin.py +136 -0
  557. nuitka/plugins/standard/TensorflowPlugin.py +20 -17
  558. nuitka/plugins/standard/TkinterPlugin.py +103 -53
  559. nuitka/plugins/standard/TorchPlugin.py +20 -17
  560. nuitka/plugins/standard/TransformersPlugin.py +94 -30
  561. nuitka/plugins/standard/TrioPlugin.py +18 -15
  562. nuitka/plugins/standard/UpxPlugin.py +21 -19
  563. nuitka/plugins/standard/__init__.py +5 -4
  564. nuitka/plugins/standard/standard.nuitka-package.config.yml +3449 -1299
  565. nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +14 -14
  566. nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +121 -66
  567. nuitka/reports/CompilationReportReader.py +67 -0
  568. nuitka/reports/LicenseReport.rst.j2 +21 -21
  569. nuitka/reports/Reports.py +352 -76
  570. nuitka/reports/__init__.py +5 -4
  571. nuitka/specs/BuiltinBytesOperationSpecs.py +18 -17
  572. nuitka/specs/BuiltinDictOperationSpecs.py +18 -17
  573. nuitka/specs/BuiltinListOperationSpecs.py +18 -17
  574. nuitka/specs/BuiltinParameterSpecs.py +30 -20
  575. nuitka/specs/BuiltinStrOperationSpecs.py +19 -18
  576. nuitka/specs/BuiltinTypeOperationSpecs.py +18 -18
  577. nuitka/specs/BuiltinUnicodeOperationSpecs.py +18 -17
  578. nuitka/specs/HardImportSpecs.py +67 -22
  579. nuitka/specs/ParameterSpecs.py +56 -41
  580. nuitka/specs/__init__.py +5 -4
  581. nuitka/tools/Basics.py +20 -18
  582. nuitka/tools/__init__.py +5 -4
  583. nuitka/tools/commercial/__init__.py +7 -6
  584. nuitka/tools/data_composer/DataComposer.py +78 -62
  585. nuitka/tools/data_composer/__init__.py +5 -4
  586. nuitka/tools/data_composer/__main__.py +18 -17
  587. nuitka/tools/environments/CreateEnvironment.py +20 -17
  588. nuitka/tools/environments/Virtualenv.py +60 -32
  589. nuitka/tools/environments/__init__.py +5 -4
  590. nuitka/tools/general/__init__.py +5 -4
  591. nuitka/tools/general/dll_report/__init__.py +5 -4
  592. nuitka/tools/general/dll_report/__main__.py +19 -21
  593. nuitka/tools/general/find_module/FindModuleCode.py +35 -22
  594. nuitka/tools/general/find_module/__init__.py +5 -4
  595. nuitka/tools/onefile_compressor/OnefileCompressor.py +213 -131
  596. nuitka/tools/onefile_compressor/__init__.py +5 -4
  597. nuitka/tools/onefile_compressor/__main__.py +18 -17
  598. nuitka/tools/podman/Podman.py +19 -17
  599. nuitka/tools/podman/__init__.py +5 -4
  600. nuitka/tools/podman/__main__.py +35 -19
  601. nuitka/tools/profiler/__init__.py +5 -4
  602. nuitka/tools/profiler/__main__.py +18 -17
  603. nuitka/tools/scanning/DisplayPackageDLLs.py +47 -22
  604. nuitka/tools/scanning/DisplayPackageData.py +31 -19
  605. nuitka/tools/scanning/__init__.py +5 -4
  606. nuitka/tools/specialize/CTypeDescriptions.py +93 -71
  607. nuitka/tools/specialize/Common.py +18 -17
  608. nuitka/tools/specialize/SpecializeC.py +31 -27
  609. nuitka/tools/specialize/SpecializePython.py +108 -45
  610. nuitka/tools/specialize/__init__.py +5 -4
  611. nuitka/tools/testing/Common.py +106 -52
  612. nuitka/tools/testing/Constructs.py +19 -17
  613. nuitka/tools/testing/OutputComparison.py +54 -18
  614. nuitka/tools/testing/Pythons.py +19 -18
  615. nuitka/tools/testing/RuntimeTracing.py +20 -19
  616. nuitka/tools/testing/SearchModes.py +26 -20
  617. nuitka/tools/testing/Valgrind.py +19 -17
  618. nuitka/tools/testing/__init__.py +5 -4
  619. nuitka/tools/testing/check_reference_counts/__init__.py +5 -4
  620. nuitka/tools/testing/check_reference_counts/__main__.py +18 -18
  621. nuitka/tools/testing/compare_with_cpython/__init__.py +5 -4
  622. nuitka/tools/testing/compare_with_cpython/__main__.py +36 -29
  623. nuitka/tools/testing/find_sxs_modules/__init__.py +5 -4
  624. nuitka/tools/testing/find_sxs_modules/__main__.py +17 -17
  625. nuitka/tools/testing/measure_construct_performance/__init__.py +5 -4
  626. nuitka/tools/testing/measure_construct_performance/__main__.py +22 -25
  627. nuitka/tools/testing/run_nuitka_tests/__init__.py +5 -4
  628. nuitka/tools/testing/run_nuitka_tests/__main__.py +57 -40
  629. nuitka/tools/watch/AutoStage.py +144 -0
  630. nuitka/tools/watch/GitHub.py +113 -0
  631. nuitka/tools/watch/__init__.py +5 -4
  632. nuitka/tools/watch/__main__.py +322 -91
  633. nuitka/tree/Building.py +176 -147
  634. nuitka/tree/ComplexCallHelperFunctions.py +80 -58
  635. nuitka/tree/Extractions.py +19 -17
  636. nuitka/tree/InternalModule.py +29 -20
  637. nuitka/tree/Operations.py +19 -17
  638. nuitka/tree/ReformulationAssertStatements.py +20 -17
  639. nuitka/tree/ReformulationAssignmentStatements.py +92 -91
  640. nuitka/tree/ReformulationBooleanExpressions.py +19 -17
  641. nuitka/tree/ReformulationCallExpressions.py +20 -18
  642. nuitka/tree/ReformulationClasses.py +45 -39
  643. nuitka/tree/ReformulationClasses3.py +146 -98
  644. nuitka/tree/ReformulationComparisonExpressions.py +29 -35
  645. nuitka/tree/ReformulationContractionExpressions.py +58 -55
  646. nuitka/tree/ReformulationDictionaryCreation.py +40 -35
  647. nuitka/tree/ReformulationExecStatements.py +42 -39
  648. nuitka/tree/ReformulationForLoopStatements.py +30 -34
  649. nuitka/tree/ReformulationFunctionStatements.py +58 -54
  650. nuitka/tree/ReformulationImportStatements.py +34 -29
  651. nuitka/tree/ReformulationLambdaExpressions.py +23 -24
  652. nuitka/tree/ReformulationMatchStatements.py +244 -92
  653. nuitka/tree/ReformulationMultidist.py +22 -18
  654. nuitka/tree/ReformulationNamespacePackages.py +55 -46
  655. nuitka/tree/ReformulationPrintStatements.py +23 -24
  656. nuitka/tree/ReformulationSequenceCreation.py +50 -49
  657. nuitka/tree/ReformulationSubscriptExpressions.py +19 -17
  658. nuitka/tree/ReformulationTryExceptStatements.py +19 -17
  659. nuitka/tree/ReformulationTryFinallyStatements.py +34 -17
  660. nuitka/tree/ReformulationWhileLoopStatements.py +19 -17
  661. nuitka/tree/ReformulationWithStatements.py +39 -41
  662. nuitka/tree/ReformulationYieldExpressions.py +21 -19
  663. nuitka/tree/SourceHandling.py +76 -31
  664. nuitka/tree/SyntaxErrors.py +19 -17
  665. nuitka/tree/TreeHelpers.py +33 -20
  666. nuitka/tree/VariableClosure.py +35 -39
  667. nuitka/tree/__init__.py +5 -4
  668. nuitka/utils/AppDirs.py +41 -20
  669. nuitka/utils/CStrings.py +66 -21
  670. nuitka/utils/CommandLineOptions.py +84 -19
  671. nuitka/utils/Distributions.py +445 -54
  672. nuitka/utils/Download.py +89 -57
  673. nuitka/utils/Execution.py +73 -34
  674. nuitka/utils/FileOperations.py +318 -74
  675. nuitka/utils/Hashing.py +55 -33
  676. nuitka/utils/Images.py +26 -19
  677. nuitka/utils/Importing.py +118 -24
  678. nuitka/utils/InstalledPythons.py +80 -75
  679. nuitka/utils/InstanceCounters.py +20 -17
  680. nuitka/utils/Jinja2.py +30 -22
  681. nuitka/utils/Json.py +19 -17
  682. nuitka/utils/MacOSApp.py +26 -18
  683. nuitka/utils/MemoryUsage.py +20 -18
  684. nuitka/utils/ModuleNames.py +42 -26
  685. nuitka/utils/ReExecute.py +50 -28
  686. nuitka/utils/Rest.py +20 -17
  687. nuitka/utils/SharedLibraries.py +161 -75
  688. nuitka/utils/Shebang.py +20 -17
  689. nuitka/utils/Signing.py +63 -18
  690. nuitka/utils/SlotMetaClasses.py +57 -0
  691. nuitka/utils/StaticLibraries.py +83 -56
  692. nuitka/utils/ThreadedExecutor.py +18 -17
  693. nuitka/utils/Timing.py +22 -20
  694. nuitka/utils/Utils.py +115 -25
  695. nuitka/utils/WindowsFileUsage.py +22 -20
  696. nuitka/utils/WindowsResources.py +25 -18
  697. nuitka/utils/Yaml.py +62 -24
  698. nuitka/utils/__init__.py +5 -4
  699. Nuitka_winsvc-1.8.dist-info/RECORD +0 -905
  700. nuitka/build/inline_copy/tqdm/tqdm/_tqdm_gui.py +0 -9
  701. nuitka/build/inline_copy/tqdm/tqdm/gui.py +0 -191
  702. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/LICENSE.txt +0 -0
  703. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/entry_points.txt +0 -0
  704. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/top_level.txt +0 -0
@@ -1,20 +1,5 @@
1
- // Copyright 2023, Kay Hayen, mailto:kay.hayen@gmail.com
2
- //
3
- // Part of "Nuitka", an optimizing Python compiler that is compatible and
4
- // integrates with CPython, but also works on its own.
5
- //
6
- // Licensed under the Apache License, Version 2.0 (the "License");
7
- // you may not use this file except in compliance with the License.
8
- // You may obtain a copy of the License at
9
- //
10
- // http://www.apache.org/licenses/LICENSE-2.0
11
- //
12
- // Unless required by applicable law or agreed to in writing, software
13
- // distributed under the License is distributed on an "AS IS" BASIS,
14
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- // See the License for the specific language governing permissions and
16
- // limitations under the License.
17
- //
1
+ // Copyright 2024, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
2
+
18
3
  /** 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,12 +153,16 @@ 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
 
@@ -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
284
  if (throw_method) {
272
- PyObject *result =
273
- PyObject_CallFunctionObjArgs(throw_method, exception_type, exception_value, exception_tb, 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
292
  } else if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, GET_ERROR_OCCURRED(tstate), PyExc_AttributeError)) {
283
293
  // Restoring the exception we own, to be released when handling it.
284
- RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
294
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
285
295
 
286
296
  return NULL;
287
297
  } else {
288
298
  assert(HAS_ERROR_OCCURRED(tstate));
289
299
 
290
300
  // Releasing exception we own.
291
- Py_DECREF(exception_type);
292
- Py_XDECREF(exception_value);
293
- Py_XDECREF(exception_tb);
301
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
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,60 @@ 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(tstate, &saved_exception_state.exception_type, &saved_exception_state.exception_value,
475
+ &saved_exception_state.exception_tb);
476
+ #endif
477
+
478
+ struct Nuitka_ExceptionPreservationItem new_exception_state;
479
+ SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_STR(tstate, &new_exception_state, PyExc_RuntimeError, message);
480
+
481
+ #if PYTHON_VERSION < 0x3c0
482
+ NORMALIZE_EXCEPTION(tstate, &new_exception_state.exception_type, &new_exception_state.exception_value,
483
+ &new_exception_state.exception_tb);
484
+ #endif
485
+
486
+ Py_INCREF(saved_exception_state.exception_value);
487
+ RAISE_EXCEPTION_WITH_CAUSE_STATE(tstate, &new_exception_state, saved_exception_state.exception_value);
488
+
489
+ Py_INCREF(saved_exception_state.exception_value);
490
+ PyException_SetContext(new_exception_state.exception_value, saved_exception_state.exception_value);
491
+
492
+ RELEASE_ERROR_OCCURRED_STATE_X(&saved_exception_state);
493
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &new_exception_state);
494
+ }
495
+ #endif
496
+
460
497
  static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator,
461
- PyObject *value, PyObject *exception_type, PyObject *exception_value,
462
- PyTracebackObject *exception_tb) {
498
+ PyObject *value, struct Nuitka_ExceptionPreservationItem *exception_state) {
463
499
  CHECK_OBJECT(generator);
464
500
  assert(Nuitka_Generator_Check((PyObject *)generator));
465
- CHECK_OBJECT_X(exception_type);
466
- CHECK_OBJECT_X(exception_value);
467
- CHECK_OBJECT_X(exception_tb);
501
+ CHECK_EXCEPTION_STATE_X(exception_state);
468
502
  CHECK_OBJECT_X(value);
469
503
  assert(PyThreadState_GET() == tstate);
470
504
 
471
505
  #if _DEBUG_GENERATOR
472
506
  PRINT_GENERATOR_STATUS("Enter", generator);
473
507
  PRINT_COROUTINE_VALUE("value", value);
474
- PRINT_EXCEPTION(exception_type, exception_value, exception_tb);
508
+ PRINT_EXCEPTION_STATE(exception_state);
475
509
  PRINT_CURRENT_EXCEPTION();
476
510
  PRINT_NEW_LINE();
477
511
  #endif
478
512
 
479
513
  if (value != NULL) {
480
- assert(exception_type == NULL);
481
- assert(exception_value == NULL);
482
- assert(exception_tb == NULL);
514
+ ASSERT_EMPTY_EXCEPTION_STATE(exception_state);
483
515
  }
484
516
 
485
517
  if (generator->m_status != status_Finished) {
@@ -521,15 +553,15 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
521
553
  Nuitka_MarkGeneratorAsRunning(generator);
522
554
 
523
555
  // Check for thrown exception, publish it to the generator code.
524
- if (unlikely(exception_type)) {
556
+ if (unlikely(HAS_EXCEPTION_STATE(exception_state))) {
525
557
  assert(value == NULL);
526
558
 
527
559
  // Transfer exception ownership to published.
528
- RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
560
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
529
561
  }
530
562
 
531
563
  #if _DEBUG_GENERATOR
532
- PRINT_GENERATOR_STATUS("Switching to coroutine", generator);
564
+ PRINT_GENERATOR_STATUS("Switching to generator", generator);
533
565
  PRINT_COROUTINE_VALUE("value", value);
534
566
  PRINT_CURRENT_EXCEPTION();
535
567
  PRINT_NEW_LINE();
@@ -539,7 +571,7 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
539
571
  PyObject *yielded;
540
572
 
541
573
  #if PYTHON_VERSION >= 0x300
542
- if (generator->m_yieldfrom == NULL) {
574
+ if (generator->m_yield_from == NULL) {
543
575
  yielded = ((generator_code)generator->m_code)(tstate, generator, value);
544
576
  } else {
545
577
  // This does not release the value if any, so we need to do it afterwards.
@@ -552,9 +584,9 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
552
584
  assert(PyThreadState_GET() == tstate);
553
585
 
554
586
  #if PYTHON_VERSION >= 0x300
555
- // If the generator returns with m_yieldfrom set, it wants us to yield
587
+ // If the generator returns with m_yield_from set, it wants us to yield
556
588
  // from that value from now on.
557
- while (yielded == NULL && generator->m_yieldfrom != NULL) {
589
+ while (yielded == NULL && generator->m_yield_from != NULL) {
558
590
  yielded = Nuitka_YieldFromGeneratorNext(tstate, generator);
559
591
  }
560
592
  #endif
@@ -567,7 +599,9 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
567
599
  // assert(tstate->frame == &generator->m_frame->m_frame);
568
600
  assertFrameObject(generator->m_frame);
569
601
 
570
- Py_CLEAR(generator->m_frame->m_frame.f_back);
602
+ if (generator->m_frame->m_frame.f_back) {
603
+ Py_CLEAR(generator->m_frame->m_frame.f_back);
604
+ }
571
605
  }
572
606
 
573
607
  // Return back to the frame that called us.
@@ -589,7 +623,7 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
589
623
  Nuitka_MarkGeneratorAsFinished(generator);
590
624
 
591
625
  if (generator->m_frame != NULL) {
592
- #if PYTHON_VERSION >= 0x340
626
+ #if PYTHON_VERSION >= 0x300
593
627
  Nuitka_SetFrameGenerator(generator->m_frame, NULL);
594
628
  #endif
595
629
  Py_DECREF(generator->m_frame);
@@ -612,30 +646,7 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
612
646
  generator->m_code_object->co_flags & CO_FUTURE_GENERATOR_STOP &&
613
647
  #endif
614
648
  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);
649
+ RAISE_RUNTIME_ERROR_RAISED_STOP_ITERATION(tstate, "generator raised StopIteration");
639
650
 
640
651
  return NULL;
641
652
  }
@@ -697,9 +708,9 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
697
708
  tstate->exc_value = Py_None;
698
709
  tstate->exc_traceback = (PyObject *)Py_None;
699
710
 
700
- Py_INCREF(Py_None);
701
- Py_INCREF(Py_None);
702
- Py_INCREF(Py_None);
711
+ Py_INCREF_IMMORTAL(Py_None);
712
+ Py_INCREF_IMMORTAL(Py_None);
713
+ Py_INCREF_IMMORTAL(Py_None);
703
714
 
704
715
  Py_XDECREF(old_type);
705
716
  Py_XDECREF(old_value);
@@ -725,9 +736,11 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
725
736
  }
726
737
 
727
738
  static PyObject *Nuitka_Generator_send(struct Nuitka_GeneratorObject *generator, PyObject *value) {
739
+ CHECK_OBJECT(value);
740
+
728
741
  PyThreadState *tstate = PyThreadState_GET();
729
742
 
730
- if (generator->m_status == status_Unused && value != NULL && value != Py_None) {
743
+ if (generator->m_status == status_Unused && value != Py_None) {
731
744
  // Buggy CPython 3.10 refuses to allow later usage.
732
745
  #if PYTHON_VERSION >= 0x3a0 && PYTHON_VERSION < 0x3a2
733
746
  Nuitka_MarkGeneratorAsFinished(generator);
@@ -740,7 +753,11 @@ static PyObject *Nuitka_Generator_send(struct Nuitka_GeneratorObject *generator,
740
753
 
741
754
  // We need to transfer ownership of the sent value.
742
755
  Py_INCREF(value);
743
- PyObject *result = _Nuitka_Generator_send(tstate, generator, value, NULL, NULL, NULL);
756
+
757
+ struct Nuitka_ExceptionPreservationItem exception_state;
758
+ INIT_ERROR_OCCURRED_STATE(&exception_state);
759
+
760
+ PyObject *result = _Nuitka_Generator_send(tstate, generator, value, &exception_state);
744
761
 
745
762
  if (result == NULL) {
746
763
  if (HAS_ERROR_OCCURRED(tstate) == false) {
@@ -754,15 +771,23 @@ static PyObject *Nuitka_Generator_send(struct Nuitka_GeneratorObject *generator,
754
771
  static PyObject *Nuitka_Generator_tp_iternext(struct Nuitka_GeneratorObject *generator) {
755
772
  PyThreadState *tstate = PyThreadState_GET();
756
773
 
757
- Py_INCREF(Py_None);
758
- return _Nuitka_Generator_send(tstate, generator, Py_None, NULL, NULL, NULL);
774
+ Py_INCREF_IMMORTAL(Py_None);
775
+
776
+ struct Nuitka_ExceptionPreservationItem exception_state;
777
+ INIT_ERROR_OCCURRED_STATE(&exception_state);
778
+
779
+ return _Nuitka_Generator_send(tstate, generator, Py_None, &exception_state);
759
780
  }
760
781
 
761
782
  /* Our own qiter interface, which is for quicker simple loop style iteration,
762
783
  that does not send anything in. */
763
784
  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);
785
+ Py_INCREF_IMMORTAL(Py_None);
786
+
787
+ struct Nuitka_ExceptionPreservationItem exception_state;
788
+ INIT_ERROR_OCCURRED_STATE(&exception_state);
789
+
790
+ PyObject *result = _Nuitka_Generator_send(tstate, generator, Py_None, &exception_state);
766
791
 
767
792
  if (result == NULL) {
768
793
  if (unlikely(!CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(tstate))) {
@@ -798,9 +823,10 @@ static bool _Nuitka_Generator_close(PyThreadState *tstate, struct Nuitka_Generat
798
823
  CHECK_OBJECT(generator);
799
824
 
800
825
  if (generator->m_status == status_Running) {
801
- Py_INCREF(PyExc_GeneratorExit);
826
+ struct Nuitka_ExceptionPreservationItem exception_state;
827
+ SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, &exception_state, PyExc_GeneratorExit, NULL, NULL);
802
828
 
803
- PyObject *result = _Nuitka_Generator_send(tstate, generator, NULL, PyExc_GeneratorExit, NULL, NULL);
829
+ PyObject *result = _Nuitka_Generator_send(tstate, generator, NULL, &exception_state);
804
830
 
805
831
  if (unlikely(result)) {
806
832
  Py_DECREF(result);
@@ -831,20 +857,15 @@ static PyObject *Nuitka_Generator_close(struct Nuitka_GeneratorObject *generator
831
857
  if (unlikely(r == false)) {
832
858
  return NULL;
833
859
  } else {
834
- Py_INCREF(Py_None);
860
+ Py_INCREF_IMMORTAL(Py_None);
835
861
  return Py_None;
836
862
  }
837
863
  }
838
864
 
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
-
865
+ #if PYTHON_VERSION >= 0x3c0
866
+ static bool _Nuitka_Generator_check_throw_args(PyThreadState *tstate, PyObject **exception_type,
867
+ PyObject **exception_value, PyTracebackObject **exception_tb) {
846
868
  if (*exception_tb == (PyTracebackObject *)Py_None) {
847
- Py_DECREF(*exception_tb);
848
869
  *exception_tb = NULL;
849
870
  } else if (*exception_tb != NULL && !PyTraceBack_Check(*exception_tb)) {
850
871
  SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "throw() third argument must be a traceback object");
@@ -852,7 +873,6 @@ static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exc
852
873
  }
853
874
 
854
875
  if (PyExceptionClass_Check(*exception_type)) {
855
- // TODO: Must not / need not normalize here?
856
876
  NORMALIZE_EXCEPTION(tstate, exception_type, exception_value, exception_tb);
857
877
  } else if (PyExceptionInstance_Check(*exception_type)) {
858
878
  if (*exception_value != NULL && *exception_value != Py_None) {
@@ -862,10 +882,8 @@ static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exc
862
882
  }
863
883
 
864
884
  // Release old None value and replace it with the object, then set the exception type
865
- // from the class.
866
- Py_XDECREF(*exception_value);
885
+ // from the class. The "None" is known immortal here and needs no refcount correction.
867
886
  *exception_value = *exception_type;
868
-
869
887
  *exception_type = PyExceptionInstance_Class(*exception_type);
870
888
  Py_INCREF(*exception_type);
871
889
  } else {
@@ -883,10 +901,95 @@ static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exc
883
901
  return true;
884
902
 
885
903
  failed_throw:
904
+
905
+ return false;
906
+ }
907
+ #endif
908
+
909
+ static bool _Nuitka_Generator_make_throw_exception_state(PyThreadState *tstate,
910
+ struct Nuitka_ExceptionPreservationItem *exception_state,
911
+ PyObject *exception_type, PyObject *exception_value,
912
+ PyTracebackObject *exception_tb) {
913
+
914
+ #if PYTHON_VERSION >= 0x3c0
915
+ Py_INCREF(exception_type);
916
+ Py_XINCREF(exception_value);
917
+ Py_XINCREF(exception_tb);
918
+
919
+ if (_Nuitka_Generator_check_throw_args(tstate, &exception_type, &exception_value, &exception_tb) == false) {
920
+ Py_DECREF(exception_type);
921
+ Py_XDECREF(exception_value);
922
+ Py_XDECREF(exception_tb);
923
+
924
+ return false;
925
+ }
926
+ #endif
927
+
928
+ SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, exception_state, exception_type, exception_value, exception_tb);
929
+
930
+ #if PYTHON_VERSION >= 0x3c0
931
+ Py_DECREF(exception_type);
932
+ Py_XDECREF(exception_value);
933
+ Py_XDECREF(exception_tb);
934
+ #endif
935
+
936
+ return true;
937
+ }
938
+
939
+ // Shared code for checking a thrown exception, coroutines, asyncgen, uncompiled
940
+ // ones do this too. For pre-3.12, the checking needs to be done late, for 3.12
941
+ // early, so it's a separate function.
942
+ static bool _Nuitka_Generator_check_throw(PyThreadState *tstate,
943
+ struct Nuitka_ExceptionPreservationItem *exception_state) {
944
+ CHECK_EXCEPTION_STATE(exception_state);
945
+
946
+ #if PYTHON_VERSION < 0x3c0
947
+ if (exception_state->exception_tb == (PyTracebackObject *)Py_None) {
948
+ Py_DECREF(exception_state->exception_tb);
949
+ exception_state->exception_tb = NULL;
950
+ } else if (exception_state->exception_tb != NULL && !PyTraceBack_Check(exception_state->exception_tb)) {
951
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "throw() third argument must be a traceback object");
952
+ goto failed_throw;
953
+ }
954
+
955
+ if (PyExceptionClass_Check(exception_state->exception_type)) {
956
+ // TODO: Must not / need not normalize here?
957
+ NORMALIZE_EXCEPTION(tstate, &exception_state->exception_type, &exception_state->exception_value,
958
+ &exception_state->exception_tb);
959
+ } else if (PyExceptionInstance_Check(exception_state->exception_type)) {
960
+ if (exception_state->exception_value != NULL && exception_state->exception_value != Py_None) {
961
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
962
+ "instance exception may not have a separate value");
963
+ goto failed_throw;
964
+ }
965
+
966
+ // Release old None value and replace it with the object, then set the exception type
967
+ // from the class.
968
+ Py_XDECREF(exception_state->exception_value);
969
+ exception_state->exception_value = exception_state->exception_type;
970
+
971
+ exception_state->exception_type = PyExceptionInstance_Class(exception_state->exception_type);
972
+ Py_INCREF(exception_state->exception_type);
973
+ } else {
974
+ #if PYTHON_VERSION < 0x300
975
+ PyErr_Format(PyExc_TypeError, "exceptions must be classes, or instances, not %s",
976
+ Py_TYPE(exception_state->exception_type)->tp_name);
977
+ #else
978
+ PyErr_Format(PyExc_TypeError, "exceptions must be classes or instances deriving from BaseException, not %s",
979
+ Py_TYPE(exception_state->exception_type)->tp_name);
980
+ #endif
981
+
982
+ goto failed_throw;
983
+ }
984
+
985
+ #endif
986
+ return true;
987
+
988
+ #if PYTHON_VERSION < 0x3c0
989
+ failed_throw:
990
+ #endif
886
991
  // Release exception, we are done with it now.
887
- Py_DECREF(*exception_type);
888
- Py_XDECREF(*exception_value);
889
- Py_XDECREF(*exception_tb);
992
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
890
993
 
891
994
  return false;
892
995
  }
@@ -902,49 +1005,49 @@ static bool _Nuitka_Asyncgen_close(PyThreadState *tstate, struct Nuitka_Asyncgen
902
1005
  #endif
903
1006
 
904
1007
  // Note: This is also used for coroutines and asyncgen
905
- static bool Nuitka_gen_close_iter(PyThreadState *tstate, PyObject *yieldfrom) {
1008
+ static bool Nuitka_gen_close_iter(PyThreadState *tstate, PyObject *yield_from) {
906
1009
  #if _DEBUG_GENERATOR
907
1010
  PRINT_STRING("Nuitka_gen_close_iter: Enter\n");
908
1011
  #endif
909
1012
 
910
- CHECK_OBJECT(yieldfrom);
1013
+ CHECK_OBJECT(yield_from);
911
1014
 
912
- // TODO: Could specialize depending in yieldfrom type for performance. Many
1015
+ // TODO: Could specialize depending in yield_from type for performance. Many
913
1016
  // times these will be our own ones, or known ones like uncompiled
914
1017
  // generators.
915
- if (Nuitka_Generator_Check(yieldfrom)) {
1018
+ if (Nuitka_Generator_Check(yield_from)) {
916
1019
  #if _DEBUG_GENERATOR
917
1020
  PRINT_STRING("Nuitka_gen_close_iter: Defer to _Nuitka_Generator_close\n");
918
1021
  #endif
919
- return _Nuitka_Generator_close(tstate, (struct Nuitka_GeneratorObject *)yieldfrom);
1022
+ return _Nuitka_Generator_close(tstate, (struct Nuitka_GeneratorObject *)yield_from);
920
1023
  }
921
1024
 
922
1025
  #if PYTHON_VERSION >= 0x350
923
- if (Nuitka_Coroutine_Check(yieldfrom)) {
1026
+ if (Nuitka_Coroutine_Check(yield_from)) {
924
1027
  #if _DEBUG_GENERATOR
925
1028
  PRINT_STRING("Nuitka_gen_close_iter: Defer to _Nuitka_Coroutine_close\n");
926
1029
  #endif
927
- return _Nuitka_Coroutine_close(tstate, (struct Nuitka_CoroutineObject *)yieldfrom);
1030
+ return _Nuitka_Coroutine_close(tstate, (struct Nuitka_CoroutineObject *)yield_from);
928
1031
  }
929
1032
  #endif
930
1033
 
931
1034
  #if PYTHON_VERSION >= 0x360
932
- if (Nuitka_Asyncgen_Check(yieldfrom)) {
1035
+ if (Nuitka_Asyncgen_Check(yield_from)) {
933
1036
  #if _DEBUG_GENERATOR
934
1037
  PRINT_STRING("Nuitka_gen_close_iter: Defer to _Nuitka_Asyncgen_close\n");
935
1038
  #endif
936
- return _Nuitka_Asyncgen_close(tstate, (struct Nuitka_AsyncgenObject *)yieldfrom);
1039
+ return _Nuitka_Asyncgen_close(tstate, (struct Nuitka_AsyncgenObject *)yield_from);
937
1040
  }
938
1041
  #endif
939
1042
 
940
- PyObject *meth = PyObject_GetAttr(yieldfrom, const_str_plain_close);
1043
+ PyObject *meth = PyObject_GetAttr(yield_from, const_str_plain_close);
941
1044
 
942
1045
  if (unlikely(meth == NULL)) {
943
1046
  if (unlikely(!PyErr_ExceptionMatches(PyExc_AttributeError))) {
944
1047
  #if _DEBUG_GENERATOR
945
1048
  PRINT_STRING("Nuitka_gen_close_iter: Strange error while looking up close method.\n");
946
1049
  #endif
947
- PyErr_WriteUnraisable(yieldfrom);
1050
+ PyErr_WriteUnraisable(yield_from);
948
1051
  }
949
1052
 
950
1053
  CLEAR_ERROR_OCCURRED(tstate);
@@ -980,113 +1083,105 @@ static bool Nuitka_gen_close_iter(PyThreadState *tstate, PyObject *yieldfrom) {
980
1083
  static bool Nuitka_AsyncgenAsend_Check(PyObject *object);
981
1084
  struct Nuitka_AsyncgenAsendObject;
982
1085
  static PyObject *_Nuitka_AsyncgenAsend_throw2(PyThreadState *tstate, struct Nuitka_AsyncgenAsendObject *asyncgen_asend,
983
- PyObject *exception_type, PyObject *exception_value,
984
- PyTracebackObject *exception_tb);
1086
+ struct Nuitka_ExceptionPreservationItem *exception_state);
985
1087
  #endif
986
1088
 
987
1089
  static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator,
988
- PyObject *exception_type, PyObject *exception_value,
989
- PyTracebackObject *exception_tb) {
1090
+ struct Nuitka_ExceptionPreservationItem *exception_state) {
990
1091
  #if _DEBUG_GENERATOR
991
1092
  PRINT_GENERATOR_STATUS("Enter", generator);
992
- PRINT_COROUTINE_VALUE("yieldfrom", generator->m_yieldfrom);
993
- PRINT_EXCEPTION(exception_type, exception_value, exception_tb);
1093
+ PRINT_COROUTINE_VALUE("yield_from", generator->m_yield_from);
1094
+ PRINT_EXCEPTION_STATE(exception_state);
994
1095
  PRINT_NEW_LINE();
995
1096
  #endif
996
1097
 
997
1098
  CHECK_OBJECT(generator);
998
1099
  assert(Nuitka_Generator_Check((PyObject *)generator));
999
- CHECK_OBJECT(exception_type);
1000
- CHECK_OBJECT_X(exception_value);
1001
- CHECK_OBJECT_X(exception_tb);
1100
+ CHECK_EXCEPTION_STATE(exception_state);
1002
1101
 
1003
1102
  #if PYTHON_VERSION >= 0x300
1004
- if (generator->m_yieldfrom != NULL) {
1005
- if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_type, PyExc_GeneratorExit)) {
1103
+ if (generator->m_yield_from != NULL) {
1104
+ if (EXCEPTION_STATE_MATCH_BOOL_SINGLE(tstate, exception_state, PyExc_GeneratorExit)) {
1006
1105
  // Generators need to close the yield_from.
1007
1106
  Nuitka_MarkGeneratorAsRunning(generator);
1008
- bool res = Nuitka_gen_close_iter(tstate, generator->m_yieldfrom);
1107
+ bool res = Nuitka_gen_close_iter(tstate, generator->m_yield_from);
1009
1108
  Nuitka_MarkGeneratorAsNotRunning(generator);
1010
1109
 
1011
1110
  if (res == false) {
1012
1111
  // 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);
1112
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
1016
1113
 
1017
- FETCH_ERROR_OCCURRED(tstate, &exception_type, &exception_value, &exception_tb);
1114
+ FETCH_ERROR_OCCURRED_STATE(tstate, exception_state);
1018
1115
  }
1019
1116
 
1020
1117
  // Transferred exception ownership to "_Nuitka_Generator_send".
1021
- return _Nuitka_Generator_send(tstate, generator, NULL, exception_type, exception_value, exception_tb);
1118
+ return _Nuitka_Generator_send(tstate, generator, NULL, exception_state);
1022
1119
  }
1023
1120
 
1024
1121
  PyObject *ret;
1025
1122
 
1026
1123
  #if _DEBUG_GENERATOR
1027
1124
  PRINT_GENERATOR_STATUS("Passing to yielded from", generator);
1028
- PRINT_COROUTINE_VALUE("m_yieldfrom", generator->m_yieldfrom);
1125
+ PRINT_COROUTINE_VALUE("m_yield_from", generator->m_yield_from);
1029
1126
  PRINT_NEW_LINE();
1030
1127
  #endif
1031
1128
 
1032
- if (Nuitka_Generator_Check(generator->m_yieldfrom)) {
1033
- struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)generator->m_yieldfrom);
1129
+ if (Nuitka_Generator_Check(generator->m_yield_from)) {
1130
+ struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)generator->m_yield_from);
1034
1131
  // Transferred exception ownership to "_Nuitka_Generator_throw2".
1035
1132
  Nuitka_MarkGeneratorAsRunning(generator);
1036
- ret = _Nuitka_Generator_throw2(tstate, gen, exception_type, exception_value, exception_tb);
1133
+ ret = _Nuitka_Generator_throw2(tstate, gen, exception_state);
1037
1134
  Nuitka_MarkGeneratorAsNotRunning(generator);
1038
1135
  #if NUITKA_UNCOMPILED_THROW_INTEGRATION
1039
- } else if (PyGen_CheckExact(generator->m_yieldfrom)) {
1040
- PyGenObject *gen = (PyGenObject *)generator->m_yieldfrom;
1136
+ } else if (PyGen_CheckExact(generator->m_yield_from)) {
1137
+ PyGenObject *gen = (PyGenObject *)generator->m_yield_from;
1041
1138
 
1042
1139
  // Transferred exception ownership to "Nuitka_UncompiledGenerator_throw".
1043
1140
  Nuitka_MarkGeneratorAsRunning(generator);
1044
- ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_type, exception_value, exception_tb);
1141
+ ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
1045
1142
  Nuitka_MarkGeneratorAsNotRunning(generator);
1046
1143
  #endif
1047
1144
  #if PYTHON_VERSION >= 0x350
1048
- } else if (Nuitka_Coroutine_Check(generator->m_yieldfrom)) {
1049
- struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)generator->m_yieldfrom);
1145
+ } else if (Nuitka_Coroutine_Check(generator->m_yield_from)) {
1146
+ struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)generator->m_yield_from);
1050
1147
  // Transferred exception ownership to "_Nuitka_Coroutine_throw2".
1051
1148
  Nuitka_MarkGeneratorAsRunning(generator);
1052
- ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_type, exception_value, exception_tb);
1149
+ ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
1053
1150
  Nuitka_MarkGeneratorAsNotRunning(generator);
1054
- } else if (Nuitka_CoroutineWrapper_Check(generator->m_yieldfrom)) {
1151
+ } else if (Nuitka_CoroutineWrapper_Check(generator->m_yield_from)) {
1055
1152
  struct Nuitka_CoroutineObject *coro =
1056
- ((struct Nuitka_CoroutineWrapperObject *)generator->m_yieldfrom)->m_coroutine;
1153
+ ((struct Nuitka_CoroutineWrapperObject *)generator->m_yield_from)->m_coroutine;
1057
1154
 
1058
1155
  // Transferred exception ownership to "_Nuitka_Coroutine_throw2".
1059
1156
  Nuitka_MarkGeneratorAsRunning(generator);
1060
- ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_type, exception_value, exception_tb);
1157
+ ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
1061
1158
  Nuitka_MarkGeneratorAsNotRunning(generator);
1062
1159
  #if NUITKA_UNCOMPILED_THROW_INTEGRATION
1063
- } else if (PyCoro_CheckExact(generator->m_yieldfrom)) {
1064
- PyGenObject *gen = (PyGenObject *)generator->m_yieldfrom;
1160
+ } else if (PyCoro_CheckExact(generator->m_yield_from)) {
1161
+ PyGenObject *gen = (PyGenObject *)generator->m_yield_from;
1065
1162
 
1066
1163
  // Transferred exception ownership to "Nuitka_UncompiledGenerator_throw".
1067
1164
  Nuitka_MarkGeneratorAsRunning(generator);
1068
- ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_type, exception_value, exception_tb);
1165
+ ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
1069
1166
  Nuitka_MarkGeneratorAsNotRunning(generator);
1070
1167
  #endif
1071
1168
  #if PYTHON_VERSION >= 0x360
1072
- } else if (Nuitka_AsyncgenAsend_Check(generator->m_yieldfrom)) {
1169
+ } else if (Nuitka_AsyncgenAsend_Check(generator->m_yield_from)) {
1073
1170
  struct Nuitka_AsyncgenAsendObject *asyncgen_asend =
1074
- ((struct Nuitka_AsyncgenAsendObject *)generator->m_yieldfrom);
1171
+ ((struct Nuitka_AsyncgenAsendObject *)generator->m_yield_from);
1075
1172
 
1076
1173
  // Transferred exception ownership to "_Nuitka_AsyncgenAsend_throw2".
1077
1174
  Nuitka_MarkGeneratorAsRunning(generator);
1078
- ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend, exception_type, exception_value, exception_tb);
1175
+ ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend, exception_state);
1079
1176
  Nuitka_MarkGeneratorAsNotRunning(generator);
1080
1177
  #endif
1081
1178
  #endif
1082
1179
  } else {
1083
- PyObject *meth = PyObject_GetAttr(generator->m_yieldfrom, const_str_plain_throw);
1180
+ PyObject *meth = PyObject_GetAttr(generator->m_yield_from, const_str_plain_throw);
1084
1181
  if (unlikely(meth == NULL)) {
1085
1182
  if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
1086
1183
  // Release exception, we are done with it now.
1087
- Py_DECREF(exception_type);
1088
- Py_XDECREF(exception_value);
1089
- Py_XDECREF(exception_tb);
1184
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
1090
1185
 
1091
1186
  return NULL;
1092
1187
  }
@@ -1097,35 +1192,33 @@ static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate, struct Nuitka_G
1097
1192
  goto throw_here;
1098
1193
  }
1099
1194
 
1100
- CHECK_OBJECT(exception_type);
1195
+ CHECK_EXCEPTION_STATE(exception_state);
1101
1196
 
1102
1197
  #if 0
1103
1198
  // TODO: Add slow mode traces.
1104
- PRINT_ITEM(coroutine->m_yieldfrom);
1199
+ PRINT_ITEM(coroutine->m_yield_from);
1105
1200
  PRINT_NEW_LINE();
1106
1201
  #endif
1107
1202
  Nuitka_MarkGeneratorAsRunning(generator);
1108
- ret = PyObject_CallFunctionObjArgs(meth, exception_type, exception_value, exception_tb, NULL);
1203
+ ret = Nuitka_CallGeneratorThrowMethod(meth, exception_state);
1109
1204
  Nuitka_MarkGeneratorAsNotRunning(generator);
1110
1205
 
1111
1206
  Py_DECREF(meth);
1112
1207
 
1113
1208
  // Release exception, we are done with it now.
1114
- Py_DECREF(exception_type);
1115
- Py_XDECREF(exception_value);
1116
- Py_XDECREF(exception_tb);
1209
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
1117
1210
  }
1118
1211
 
1119
1212
  if (unlikely(ret == NULL)) {
1120
1213
  // Return value or exception, not to continue with yielding from.
1121
- if (generator->m_yieldfrom != NULL) {
1122
- CHECK_OBJECT(generator->m_yieldfrom);
1214
+ if (generator->m_yield_from != NULL) {
1215
+ CHECK_OBJECT(generator->m_yield_from);
1123
1216
  #if _DEBUG_GENERATOR
1124
1217
  PRINT_GENERATOR_STATUS("Null return, yield from removal:", generator);
1125
- PRINT_COROUTINE_VALUE("yieldfrom", generator->m_yieldfrom);
1218
+ PRINT_COROUTINE_VALUE("yield_from", generator->m_yield_from);
1126
1219
  #endif
1127
- Py_DECREF(generator->m_yieldfrom);
1128
- generator->m_yieldfrom = NULL;
1220
+ Py_DECREF(generator->m_yield_from);
1221
+ generator->m_yield_from = NULL;
1129
1222
  }
1130
1223
 
1131
1224
  PyObject *val;
@@ -1138,14 +1231,21 @@ static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate, struct Nuitka_G
1138
1231
  PRINT_NEW_LINE();
1139
1232
  #endif
1140
1233
 
1141
- ret = _Nuitka_Generator_send(tstate, generator, val, NULL, NULL, NULL);
1234
+ struct Nuitka_ExceptionPreservationItem no_exception_state;
1235
+ INIT_ERROR_OCCURRED_STATE(&no_exception_state);
1236
+
1237
+ ret = _Nuitka_Generator_send(tstate, generator, val, &no_exception_state);
1142
1238
  } else {
1143
1239
  #if _DEBUG_GENERATOR
1144
1240
  PRINT_GENERATOR_STATUS("Sending exception value into ourselves", generator);
1145
1241
  PRINT_CURRENT_EXCEPTION();
1146
1242
  PRINT_NEW_LINE();
1147
1243
  #endif
1148
- ret = _Nuitka_Generator_send(tstate, generator, NULL, NULL, NULL, NULL);
1244
+
1245
+ struct Nuitka_ExceptionPreservationItem no_exception_state;
1246
+ INIT_ERROR_OCCURRED_STATE(&no_exception_state);
1247
+
1248
+ ret = _Nuitka_Generator_send(tstate, generator, NULL, &no_exception_state);
1149
1249
  }
1150
1250
 
1151
1251
  #if _DEBUG_GENERATOR
@@ -1171,15 +1271,14 @@ throw_here:
1171
1271
 
1172
1272
  // We continue to have exception ownership here.
1173
1273
 
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.
1274
+ if (unlikely(_Nuitka_Generator_check_throw(tstate, exception_state) == false)) {
1275
+ // Exception was released by _Nuitka_Generator_check_throw already.
1176
1276
  return NULL;
1177
1277
  }
1178
1278
 
1179
1279
  if (generator->m_status == status_Running) {
1180
1280
  // Passing exception ownership to _Nuitka_Generator_send
1181
- PyObject *result =
1182
- _Nuitka_Generator_send(tstate, generator, NULL, exception_type, exception_value, exception_tb);
1281
+ PyObject *result = _Nuitka_Generator_send(tstate, generator, NULL, exception_state);
1183
1282
 
1184
1283
  if (result == NULL) {
1185
1284
  if (GET_ERROR_OCCURRED(tstate) == NULL) {
@@ -1189,21 +1288,24 @@ throw_here:
1189
1288
 
1190
1289
  return result;
1191
1290
  } else if (generator->m_status == status_Finished) {
1192
- RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
1291
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
1193
1292
 
1194
1293
  return NULL;
1195
1294
  } else {
1295
+ PyTracebackObject *exception_tb = GET_EXCEPTION_STATE_TRACEBACK(exception_state);
1296
+
1196
1297
  if (exception_tb == NULL) {
1197
1298
  // TODO: Our compiled objects really need a way to store common
1198
1299
  // stuff in a "shared" part across all instances, and outside of
1199
1300
  // run time, so we could reuse this.
1200
1301
  struct Nuitka_FrameObject *frame =
1201
1302
  MAKE_FUNCTION_FRAME(tstate, generator->m_code_object, generator->m_module, 0);
1202
- exception_tb = MAKE_TRACEBACK(frame, generator->m_code_object->co_firstlineno);
1303
+ SET_EXCEPTION_STATE_TRACEBACK(exception_state,
1304
+ MAKE_TRACEBACK(frame, generator->m_code_object->co_firstlineno));
1203
1305
  Py_DECREF(frame);
1204
1306
  }
1205
1307
 
1206
- RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
1308
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
1207
1309
 
1208
1310
  Nuitka_MarkGeneratorAsFinished(generator);
1209
1311
 
@@ -1223,14 +1325,16 @@ static PyObject *Nuitka_Generator_throw(struct Nuitka_GeneratorObject *generator
1223
1325
  return NULL;
1224
1326
  }
1225
1327
 
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
1328
  PyThreadState *tstate = PyThreadState_GET();
1232
1329
 
1233
- PyObject *result = _Nuitka_Generator_throw2(tstate, generator, exception_type, exception_value, exception_tb);
1330
+ // Handing ownership of exception over, we need not release it ourselves
1331
+ struct Nuitka_ExceptionPreservationItem exception_state;
1332
+ if (_Nuitka_Generator_make_throw_exception_state(tstate, &exception_state, exception_type, exception_value,
1333
+ exception_tb) == false) {
1334
+ return NULL;
1335
+ }
1336
+
1337
+ PyObject *result = _Nuitka_Generator_throw2(tstate, generator, &exception_state);
1234
1338
 
1235
1339
  if (result == NULL) {
1236
1340
  if (HAS_ERROR_OCCURRED(tstate) == false) {
@@ -1248,7 +1352,7 @@ static PyObject *Nuitka_Generator_throw(struct Nuitka_GeneratorObject *generator
1248
1352
  return result;
1249
1353
  }
1250
1354
 
1251
- #if PYTHON_VERSION >= 0x340
1355
+ #if PYTHON_VERSION >= 0x300
1252
1356
  static void Nuitka_Generator_tp_finalizer(struct Nuitka_GeneratorObject *generator) {
1253
1357
  if (generator->m_status != status_Running) {
1254
1358
  return;
@@ -1256,9 +1360,8 @@ static void Nuitka_Generator_tp_finalizer(struct Nuitka_GeneratorObject *generat
1256
1360
 
1257
1361
  PyThreadState *tstate = PyThreadState_GET();
1258
1362
 
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);
1363
+ struct Nuitka_ExceptionPreservationItem saved_exception_state;
1364
+ FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1262
1365
 
1263
1366
  bool close_result = _Nuitka_Generator_close(tstate, generator);
1264
1367
 
@@ -1266,8 +1369,8 @@ static void Nuitka_Generator_tp_finalizer(struct Nuitka_GeneratorObject *generat
1266
1369
  PyErr_WriteUnraisable((PyObject *)generator);
1267
1370
  }
1268
1371
 
1269
- /* Restore the saved exception if any. */
1270
- RESTORE_ERROR_OCCURRED(tstate, save_exception_type, save_exception_value, save_exception_tb);
1372
+ // Restore the saved exception if any.
1373
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1271
1374
  }
1272
1375
  #endif
1273
1376
 
@@ -1276,6 +1379,11 @@ static struct Nuitka_GeneratorObject *free_list_generators = NULL;
1276
1379
  static int free_list_generators_count = 0;
1277
1380
 
1278
1381
  static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator) {
1382
+ #if _DEBUG_REFCOUNTS
1383
+ count_active_Nuitka_Generator_Type -= 1;
1384
+ count_released_Nuitka_Generator_Type += 1;
1385
+ #endif
1386
+
1279
1387
  // Revive temporarily.
1280
1388
  assert(Py_REFCNT(generator) == 0);
1281
1389
  Py_SET_REFCNT(generator, 1);
@@ -1283,9 +1391,8 @@ static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator
1283
1391
  PyThreadState *tstate = PyThreadState_GET();
1284
1392
 
1285
1393
  // 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);
1394
+ struct Nuitka_ExceptionPreservationItem saved_exception_state;
1395
+ FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1289
1396
 
1290
1397
  if (generator->m_status == status_Running) {
1291
1398
  bool close_result = _Nuitka_Generator_close(tstate, generator);
@@ -1305,7 +1412,7 @@ static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator
1305
1412
  }
1306
1413
 
1307
1414
  if (generator->m_frame != NULL) {
1308
- #if PYTHON_VERSION >= 0x340
1415
+ #if PYTHON_VERSION >= 0x300
1309
1416
  Nuitka_SetFrameGenerator(generator->m_frame, NULL);
1310
1417
  #endif
1311
1418
  Py_DECREF(generator->m_frame);
@@ -1329,7 +1436,7 @@ static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator
1329
1436
  /* Put the object into free list or release to GC */
1330
1437
  releaseToFreeList(free_list_generators, generator, MAX_GENERATOR_FREE_LIST_COUNT);
1331
1438
 
1332
- RESTORE_ERROR_OCCURRED(tstate, save_exception_type, save_exception_value, save_exception_tb);
1439
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1333
1440
  }
1334
1441
 
1335
1442
  static long Nuitka_Generator_tp_hash(struct Nuitka_GeneratorObject *generator) { return generator->m_counter; }
@@ -1382,11 +1489,11 @@ static int Nuitka_Generator_set_qualname(struct Nuitka_GeneratorObject *generato
1382
1489
  }
1383
1490
 
1384
1491
  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;
1492
+ if (generator->m_yield_from) {
1493
+ Py_INCREF(generator->m_yield_from);
1494
+ return generator->m_yield_from;
1388
1495
  } else {
1389
- Py_INCREF(Py_None);
1496
+ Py_INCREF_IMMORTAL(Py_None);
1390
1497
  return Py_None;
1391
1498
  }
1392
1499
  }
@@ -1434,7 +1541,7 @@ static PyObject *Nuitka_Generator_get_running(struct Nuitka_GeneratorObject *gen
1434
1541
  result = 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
  }
@@ -1457,7 +1564,7 @@ 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
+ static PyGetSetDef Nuitka_Generator_tp_getset[] = {
1461
1568
  #if PYTHON_VERSION < 0x350
1462
1569
  {(char *)"__name__", (getter)Nuitka_Generator_get_name, NULL, NULL},
1463
1570
  #else
@@ -1487,8 +1594,6 @@ static PyAsyncMethods Nuitka_Generator_as_async = {
1487
1594
  };
1488
1595
  #endif
1489
1596
 
1490
- #include <structmember.h>
1491
-
1492
1597
  PyTypeObject Nuitka_Generator_Type = {
1493
1598
  PyVarObject_HEAD_INIT(NULL, 0) "compiled_generator", // tp_name
1494
1599
  sizeof(struct Nuitka_GeneratorObject), // tp_basicsize
@@ -1527,7 +1632,7 @@ PyTypeObject Nuitka_Generator_Type = {
1527
1632
  (iternextfunc)Nuitka_Generator_tp_iternext, // tp_iternext
1528
1633
  Nuitka_Generator_methods, // tp_methods
1529
1634
  NULL, // tp_members
1530
- Nuitka_Generator_getsetlist, // tp_getset
1635
+ Nuitka_Generator_tp_getset, // tp_getset
1531
1636
  0, // tp_base
1532
1637
  0, // tp_dict
1533
1638
  0, // tp_descr_get
@@ -1545,7 +1650,7 @@ PyTypeObject Nuitka_Generator_Type = {
1545
1650
  0, // tp_weaklist
1546
1651
  0, // tp_del
1547
1652
  0 // tp_version_tag
1548
- #if PYTHON_VERSION >= 0x340
1653
+ #if PYTHON_VERSION >= 0x300
1549
1654
  ,
1550
1655
  (destructor)Nuitka_Generator_tp_finalizer // tp_finalize
1551
1656
  #endif
@@ -1591,7 +1696,7 @@ void _initCompiledGeneratorType(void) {
1591
1696
  assert(Nuitka_Generator_Type.tp_subclasses != PyGen_Type.tp_subclasses || PyGen_Type.tp_cache == NULL);
1592
1697
  assert(Nuitka_Generator_Type.tp_weaklist != PyGen_Type.tp_weaklist);
1593
1698
  assert(Nuitka_Generator_Type.tp_del != PyGen_Type.tp_del || PyGen_Type.tp_del == NULL);
1594
- #if PYTHON_VERSION >= 0x340
1699
+ #if PYTHON_VERSION >= 0x300
1595
1700
  assert(Nuitka_Generator_Type.tp_finalize != PyGen_Type.tp_finalize || PyGen_Type.tp_finalize == NULL);
1596
1701
  #endif
1597
1702
 
@@ -1612,6 +1717,11 @@ PyObject *Nuitka_Generator_New(generator_code code, PyObject *module, PyObject *
1612
1717
  #endif
1613
1718
  PyCodeObject *code_object, struct Nuitka_CellObject **closure, Py_ssize_t closure_given,
1614
1719
  Py_ssize_t heap_storage_size) {
1720
+ #if _DEBUG_REFCOUNTS
1721
+ count_active_Nuitka_Generator_Type += 1;
1722
+ count_allocated_Nuitka_Generator_Type += 1;
1723
+ #endif
1724
+
1615
1725
  struct Nuitka_GeneratorObject *result;
1616
1726
 
1617
1727
  // TODO: Change the var part of the type to 1 maybe
@@ -1649,7 +1759,7 @@ PyObject *Nuitka_Generator_New(generator_code code, PyObject *module, PyObject *
1649
1759
  #endif
1650
1760
 
1651
1761
  #if PYTHON_VERSION >= 0x300
1652
- result->m_yieldfrom = NULL;
1762
+ result->m_yield_from = NULL;
1653
1763
  #endif
1654
1764
 
1655
1765
  memcpy(&result->m_closure[0], closure, closure_given * sizeof(struct Nuitka_CellObject *));
@@ -1707,4 +1817,18 @@ PyObject *Nuitka_Generator_NewEmpty(PyObject *module, PyObject *name,
1707
1817
 
1708
1818
  // Chain frames to generator and asyncgen code, as they need to close them with access
1709
1819
  // to best functions.
1710
- #include "CompiledFrameType.c"
1820
+ #include "CompiledFrameType.c"
1821
+ // Part of "Nuitka", an optimizing Python compiler that is compatible and
1822
+ // integrates with CPython, but also works on its own.
1823
+ //
1824
+ // Licensed under the Apache License, Version 2.0 (the "License");
1825
+ // you may not use this file except in compliance with the License.
1826
+ // You may obtain a copy of the License at
1827
+ //
1828
+ // http://www.apache.org/licenses/LICENSE-2.0
1829
+ //
1830
+ // Unless required by applicable law or agreed to in writing, software
1831
+ // distributed under the License is distributed on an "AS IS" BASIS,
1832
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1833
+ // See the License for the specific language governing permissions and
1834
+ // limitations under the License.