Nuitka-winsvc 2.7.7__cp313-cp313-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 (995) hide show
  1. nuitka/Builtins.py +259 -0
  2. nuitka/BytecodeCaching.py +184 -0
  3. nuitka/Bytecodes.py +109 -0
  4. nuitka/CacheCleanup.py +54 -0
  5. nuitka/Constants.py +425 -0
  6. nuitka/Errors.py +93 -0
  7. nuitka/HardImportRegistry.py +408 -0
  8. nuitka/MainControl.py +1201 -0
  9. nuitka/ModuleRegistry.py +364 -0
  10. nuitka/OptionParsing.py +2473 -0
  11. nuitka/Options.py +2948 -0
  12. nuitka/OutputDirectories.py +201 -0
  13. nuitka/PostProcessing.py +551 -0
  14. nuitka/Progress.py +252 -0
  15. nuitka/PythonFlavors.py +426 -0
  16. nuitka/PythonOperators.py +146 -0
  17. nuitka/PythonVersions.py +513 -0
  18. nuitka/Serialization.py +291 -0
  19. nuitka/SourceCodeReferences.py +176 -0
  20. nuitka/Tracing.py +579 -0
  21. nuitka/TreeXML.py +141 -0
  22. nuitka/Variables.py +515 -0
  23. nuitka/Version.py +88 -0
  24. nuitka/__init__.py +19 -0
  25. nuitka/__main__.py +224 -0
  26. nuitka/__past__.py +217 -0
  27. nuitka/build/Backend.scons +1111 -0
  28. nuitka/build/CCompilerVersion.scons +281 -0
  29. nuitka/build/DataComposerInterface.py +116 -0
  30. nuitka/build/Offsets.scons +626 -0
  31. nuitka/build/Onefile.scons +564 -0
  32. nuitka/build/SconsCaching.py +451 -0
  33. nuitka/build/SconsCompilerSettings.py +1133 -0
  34. nuitka/build/SconsHacks.py +215 -0
  35. nuitka/build/SconsInterface.py +664 -0
  36. nuitka/build/SconsProgress.py +100 -0
  37. nuitka/build/SconsSpawn.py +436 -0
  38. nuitka/build/SconsUtils.py +939 -0
  39. nuitka/build/__init__.py +19 -0
  40. nuitka/build/include/nuitka/allocator.h +450 -0
  41. nuitka/build/include/nuitka/builtins.h +97 -0
  42. nuitka/build/include/nuitka/calling.h +123 -0
  43. nuitka/build/include/nuitka/checkers.h +39 -0
  44. nuitka/build/include/nuitka/checksum_tools.h +28 -0
  45. nuitka/build/include/nuitka/compiled_asyncgen.h +281 -0
  46. nuitka/build/include/nuitka/compiled_cell.h +64 -0
  47. nuitka/build/include/nuitka/compiled_coroutine.h +271 -0
  48. nuitka/build/include/nuitka/compiled_frame.h +502 -0
  49. nuitka/build/include/nuitka/compiled_function.h +170 -0
  50. nuitka/build/include/nuitka/compiled_generator.h +287 -0
  51. nuitka/build/include/nuitka/compiled_method.h +54 -0
  52. nuitka/build/include/nuitka/constants.h +251 -0
  53. nuitka/build/include/nuitka/constants_blob.h +34 -0
  54. nuitka/build/include/nuitka/debug_settings.h +60 -0
  55. nuitka/build/include/nuitka/environment_variables.h +30 -0
  56. nuitka/build/include/nuitka/environment_variables_system.h +51 -0
  57. nuitka/build/include/nuitka/exception_groups.h +167 -0
  58. nuitka/build/include/nuitka/exceptions.h +1458 -0
  59. nuitka/build/include/nuitka/filesystem_paths.h +117 -0
  60. nuitka/build/include/nuitka/freelists.h +92 -0
  61. nuitka/build/include/nuitka/hedley.h +1774 -0
  62. nuitka/build/include/nuitka/helper/attributes.h +90 -0
  63. nuitka/build/include/nuitka/helper/boolean.h +86 -0
  64. nuitka/build/include/nuitka/helper/bytearrays.h +34 -0
  65. nuitka/build/include/nuitka/helper/bytes.h +28 -0
  66. nuitka/build/include/nuitka/helper/calling_generated.h +132 -0
  67. nuitka/build/include/nuitka/helper/comparisons_dual_eq.h +47 -0
  68. nuitka/build/include/nuitka/helper/comparisons_dual_ge.h +39 -0
  69. nuitka/build/include/nuitka/helper/comparisons_dual_gt.h +39 -0
  70. nuitka/build/include/nuitka/helper/comparisons_dual_le.h +47 -0
  71. nuitka/build/include/nuitka/helper/comparisons_dual_lt.h +47 -0
  72. nuitka/build/include/nuitka/helper/comparisons_dual_ne.h +39 -0
  73. nuitka/build/include/nuitka/helper/comparisons_eq.h +247 -0
  74. nuitka/build/include/nuitka/helper/comparisons_ge.h +197 -0
  75. nuitka/build/include/nuitka/helper/comparisons_gt.h +197 -0
  76. nuitka/build/include/nuitka/helper/comparisons_le.h +247 -0
  77. nuitka/build/include/nuitka/helper/comparisons_lt.h +247 -0
  78. nuitka/build/include/nuitka/helper/comparisons_ne.h +197 -0
  79. nuitka/build/include/nuitka/helper/complex.h +46 -0
  80. nuitka/build/include/nuitka/helper/dictionaries.h +481 -0
  81. nuitka/build/include/nuitka/helper/floats.h +32 -0
  82. nuitka/build/include/nuitka/helper/import_hard.h +121 -0
  83. nuitka/build/include/nuitka/helper/indexes.h +47 -0
  84. nuitka/build/include/nuitka/helper/ints.h +165 -0
  85. nuitka/build/include/nuitka/helper/iterators.h +376 -0
  86. nuitka/build/include/nuitka/helper/lists.h +94 -0
  87. nuitka/build/include/nuitka/helper/lists_generated.h +36 -0
  88. nuitka/build/include/nuitka/helper/mappings.h +39 -0
  89. nuitka/build/include/nuitka/helper/operations.h +114 -0
  90. nuitka/build/include/nuitka/helper/operations_binary_add.h +240 -0
  91. nuitka/build/include/nuitka/helper/operations_binary_bitand.h +108 -0
  92. nuitka/build/include/nuitka/helper/operations_binary_bitor.h +108 -0
  93. nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +108 -0
  94. nuitka/build/include/nuitka/helper/operations_binary_divmod.h +103 -0
  95. nuitka/build/include/nuitka/helper/operations_binary_dual_add.h +34 -0
  96. nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +103 -0
  97. nuitka/build/include/nuitka/helper/operations_binary_lshift.h +99 -0
  98. nuitka/build/include/nuitka/helper/operations_binary_matmult.h +60 -0
  99. nuitka/build/include/nuitka/helper/operations_binary_mod.h +304 -0
  100. nuitka/build/include/nuitka/helper/operations_binary_mult.h +247 -0
  101. nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +125 -0
  102. nuitka/build/include/nuitka/helper/operations_binary_pow.h +90 -0
  103. nuitka/build/include/nuitka/helper/operations_binary_rshift.h +99 -0
  104. nuitka/build/include/nuitka/helper/operations_binary_sub.h +117 -0
  105. nuitka/build/include/nuitka/helper/operations_binary_truediv.h +103 -0
  106. nuitka/build/include/nuitka/helper/operations_builtin_types.h +247 -0
  107. nuitka/build/include/nuitka/helper/operations_inplace_add.h +173 -0
  108. nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +76 -0
  109. nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +76 -0
  110. nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +76 -0
  111. nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +95 -0
  112. nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +62 -0
  113. nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +60 -0
  114. nuitka/build/include/nuitka/helper/operations_inplace_mod.h +218 -0
  115. nuitka/build/include/nuitka/helper/operations_inplace_mult.h +184 -0
  116. nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +115 -0
  117. nuitka/build/include/nuitka/helper/operations_inplace_pow.h +87 -0
  118. nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +62 -0
  119. nuitka/build/include/nuitka/helper/operations_inplace_sub.h +102 -0
  120. nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +95 -0
  121. nuitka/build/include/nuitka/helper/raising.h +114 -0
  122. nuitka/build/include/nuitka/helper/rangeobjects.h +66 -0
  123. nuitka/build/include/nuitka/helper/richcomparisons.h +35 -0
  124. nuitka/build/include/nuitka/helper/sequences.h +33 -0
  125. nuitka/build/include/nuitka/helper/sets.h +25 -0
  126. nuitka/build/include/nuitka/helper/slices.h +314 -0
  127. nuitka/build/include/nuitka/helper/strings.h +30 -0
  128. nuitka/build/include/nuitka/helper/subscripts.h +390 -0
  129. nuitka/build/include/nuitka/helper/tuples.h +187 -0
  130. nuitka/build/include/nuitka/helpers.h +417 -0
  131. nuitka/build/include/nuitka/importing.h +149 -0
  132. nuitka/build/include/nuitka/incbin.h +402 -0
  133. nuitka/build/include/nuitka/jit_sources.h +25 -0
  134. nuitka/build/include/nuitka/prelude.h +626 -0
  135. nuitka/build/include/nuitka/printing.h +84 -0
  136. nuitka/build/include/nuitka/python_pgo.h +57 -0
  137. nuitka/build/include/nuitka/safe_string_ops.h +57 -0
  138. nuitka/build/include/nuitka/threading.h +142 -0
  139. nuitka/build/include/nuitka/tracing.h +82 -0
  140. nuitka/build/include/nuitka/type_aliases.h +30 -0
  141. nuitka/build/include/nuitka/unfreezing.h +91 -0
  142. nuitka/build/inline_copy/appdirs/LICENSE.txt +23 -0
  143. nuitka/build/inline_copy/appdirs/appdirs.py +611 -0
  144. nuitka/build/inline_copy/atomicwrites/LICENSE +19 -0
  145. nuitka/build/inline_copy/atomicwrites/atomicwrites.py +226 -0
  146. nuitka/build/inline_copy/bin/scons.py +58 -0
  147. nuitka/build/inline_copy/clcache/clcache/LICENSE +30 -0
  148. nuitka/build/inline_copy/clcache/clcache/__init__.py +4 -0
  149. nuitka/build/inline_copy/clcache/clcache/caching.py +2008 -0
  150. nuitka/build/inline_copy/colorama/LICENSE.txt +27 -0
  151. nuitka/build/inline_copy/colorama/colorama/__init__.py +6 -0
  152. nuitka/build/inline_copy/colorama/colorama/ansi.py +102 -0
  153. nuitka/build/inline_copy/colorama/colorama/ansitowin32.py +258 -0
  154. nuitka/build/inline_copy/colorama/colorama/initialise.py +80 -0
  155. nuitka/build/inline_copy/colorama/colorama/win32.py +152 -0
  156. nuitka/build/inline_copy/colorama/colorama/winterm.py +169 -0
  157. nuitka/build/inline_copy/glob2/LICENSE +27 -0
  158. nuitka/build/inline_copy/glob2/glob2/__init__.py +5 -0
  159. nuitka/build/inline_copy/glob2/glob2/compat.py +167 -0
  160. nuitka/build/inline_copy/glob2/glob2/fnmatch.py +141 -0
  161. nuitka/build/inline_copy/glob2/glob2/impl.py +216 -0
  162. nuitka/build/inline_copy/jinja2/LICENSE.rst +28 -0
  163. nuitka/build/inline_copy/jinja2/README.rst +2 -0
  164. nuitka/build/inline_copy/jinja2/jinja2/__init__.py +72 -0
  165. nuitka/build/inline_copy/jinja2/jinja2/_compat.py +105 -0
  166. nuitka/build/inline_copy/jinja2/jinja2/_identifier.py +2 -0
  167. nuitka/build/inline_copy/jinja2/jinja2/bccache.py +361 -0
  168. nuitka/build/inline_copy/jinja2/jinja2/compiler.py +1721 -0
  169. nuitka/build/inline_copy/jinja2/jinja2/constants.py +32 -0
  170. nuitka/build/inline_copy/jinja2/jinja2/debug.py +378 -0
  171. nuitka/build/inline_copy/jinja2/jinja2/defaults.py +56 -0
  172. nuitka/build/inline_copy/jinja2/jinja2/environment.py +1276 -0
  173. nuitka/build/inline_copy/jinja2/jinja2/exceptions.py +146 -0
  174. nuitka/build/inline_copy/jinja2/jinja2/ext.py +627 -0
  175. nuitka/build/inline_copy/jinja2/jinja2/filters.py +1190 -0
  176. nuitka/build/inline_copy/jinja2/jinja2/idtracking.py +286 -0
  177. nuitka/build/inline_copy/jinja2/jinja2/lexer.py +739 -0
  178. nuitka/build/inline_copy/jinja2/jinja2/loaders.py +483 -0
  179. nuitka/build/inline_copy/jinja2/jinja2/meta.py +106 -0
  180. nuitka/build/inline_copy/jinja2/jinja2/nativetypes.py +220 -0
  181. nuitka/build/inline_copy/jinja2/jinja2/nodes.py +999 -0
  182. nuitka/build/inline_copy/jinja2/jinja2/optimizer.py +49 -0
  183. nuitka/build/inline_copy/jinja2/jinja2/parser.py +903 -0
  184. nuitka/build/inline_copy/jinja2/jinja2/runtime.py +808 -0
  185. nuitka/build/inline_copy/jinja2/jinja2/sandbox.py +488 -0
  186. nuitka/build/inline_copy/jinja2/jinja2/tests.py +174 -0
  187. nuitka/build/inline_copy/jinja2/jinja2/utils.py +642 -0
  188. nuitka/build/inline_copy/jinja2/jinja2/visitor.py +87 -0
  189. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Action.py +1475 -0
  190. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Builder.py +905 -0
  191. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/CacheDir.py +314 -0
  192. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Conftest.py +805 -0
  193. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Debug.py +251 -0
  194. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Defaults.py +646 -0
  195. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Environment.py +2561 -0
  196. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/EnvironmentValues.py +119 -0
  197. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Errors.py +222 -0
  198. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Executor.py +660 -0
  199. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Job.py +439 -0
  200. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Memoize.py +242 -0
  201. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/Alias.py +176 -0
  202. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/FS.py +3861 -0
  203. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/Python.py +195 -0
  204. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/__init__.py +1784 -0
  205. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/PathList.py +224 -0
  206. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/__init__.py +341 -0
  207. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/aix.py +81 -0
  208. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/cygwin.py +61 -0
  209. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/darwin.py +70 -0
  210. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/hpux.py +45 -0
  211. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/irix.py +41 -0
  212. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/mingw.py +33 -0
  213. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/os2.py +55 -0
  214. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/posix.py +124 -0
  215. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/sunos.py +47 -0
  216. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/virtualenv.py +115 -0
  217. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/win32.py +429 -0
  218. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/SConf.py +1119 -0
  219. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/SConsign.py +453 -0
  220. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/C.py +226 -0
  221. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/Dir.py +131 -0
  222. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/Prog.py +114 -0
  223. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/RC.py +57 -0
  224. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/__init__.py +436 -0
  225. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/Interactive.py +372 -0
  226. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/Main.py +1469 -0
  227. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/SConsOptions.py +1071 -0
  228. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/SConscript.py +686 -0
  229. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/__init__.py +425 -0
  230. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Subst.py +979 -0
  231. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Taskmaster.py +1062 -0
  232. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/386asm.py +61 -0
  233. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/GettextCommon.py +429 -0
  234. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/__init__.py +52 -0
  235. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/arch.py +66 -0
  236. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/common.py +371 -0
  237. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/netframework.py +83 -0
  238. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/sdk.py +411 -0
  239. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/vc.py +994 -0
  240. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/vs.py +608 -0
  241. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/PharLapCommon.py +116 -0
  242. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/__init__.py +882 -0
  243. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixc++.py +43 -0
  244. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixcc.py +74 -0
  245. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixcxx.py +77 -0
  246. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixlink.py +78 -0
  247. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/applelink.py +209 -0
  248. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ar.py +63 -0
  249. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/as.py +49 -0
  250. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/asm.py +78 -0
  251. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/bcc32.py +81 -0
  252. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/c++.py +44 -0
  253. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cc.py +105 -0
  254. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clang.py +91 -0
  255. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clangCommon/__init__.py +18 -0
  256. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clangxx.py +99 -0
  257. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cxx.py +95 -0
  258. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cyglink.py +212 -0
  259. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/default.py +50 -0
  260. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/filesystem.py +98 -0
  261. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/g++.py +45 -0
  262. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gas.py +56 -0
  263. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gcc.py +110 -0
  264. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gettext_tool.py +69 -0
  265. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gnulink.py +70 -0
  266. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gxx.py +78 -0
  267. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpc++.py +45 -0
  268. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpcc.py +53 -0
  269. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpcxx.py +88 -0
  270. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hplink.py +72 -0
  271. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/icc.py +59 -0
  272. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/icl.py +52 -0
  273. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ilink.py +55 -0
  274. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ilink32.py +60 -0
  275. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/install.py +510 -0
  276. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/intelc.py +617 -0
  277. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/link.py +72 -0
  278. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/LoadableModule.py +131 -0
  279. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/SharedLibrary.py +218 -0
  280. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/__init__.py +171 -0
  281. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkloc.py +112 -0
  282. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/m4.py +63 -0
  283. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/masm.py +77 -0
  284. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mingw.py +232 -0
  285. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msgfmt.py +132 -0
  286. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msginit.py +137 -0
  287. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msgmerge.py +125 -0
  288. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mslib.py +73 -0
  289. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mslink.py +339 -0
  290. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mssdk.py +50 -0
  291. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msvc.py +325 -0
  292. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msvs.py +2116 -0
  293. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mwcc.py +207 -0
  294. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mwld.py +108 -0
  295. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/nasm.py +72 -0
  296. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/rmic.py +139 -0
  297. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/rpcgen.py +70 -0
  298. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgiar.py +68 -0
  299. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgic++.py +43 -0
  300. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgicc.py +53 -0
  301. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgicxx.py +61 -0
  302. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgilink.py +59 -0
  303. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunar.py +64 -0
  304. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunc++.py +45 -0
  305. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/suncc.py +58 -0
  306. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/suncxx.py +153 -0
  307. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunlink.py +79 -0
  308. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/tar.py +73 -0
  309. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/textfile.py +198 -0
  310. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/tlib.py +53 -0
  311. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/wix.py +104 -0
  312. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/xgettext.py +337 -0
  313. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/zip.py +120 -0
  314. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Util.py +2134 -0
  315. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/ConfigureCache.py +171 -0
  316. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/__init__.py +0 -0
  317. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/sconsign.py +494 -0
  318. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/BoolVariable.py +96 -0
  319. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/EnumVariable.py +110 -0
  320. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +152 -0
  321. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/PackageVariable.py +107 -0
  322. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/PathVariable.py +158 -0
  323. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/__init__.py +334 -0
  324. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Warnings.py +238 -0
  325. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/__init__.py +9 -0
  326. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/__init__.py +104 -0
  327. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/_scons_dbm.py +42 -0
  328. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/win32.py +101 -0
  329. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/cpp.py +640 -0
  330. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/dblite.py +295 -0
  331. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/exitfuncs.py +59 -0
  332. nuitka/build/inline_copy/markupsafe/LICENSE.rst +28 -0
  333. nuitka/build/inline_copy/markupsafe/markupsafe/__init__.py +327 -0
  334. nuitka/build/inline_copy/markupsafe/markupsafe/_compat.py +33 -0
  335. nuitka/build/inline_copy/markupsafe/markupsafe/_constants.py +264 -0
  336. nuitka/build/inline_copy/markupsafe/markupsafe/_native.py +69 -0
  337. nuitka/build/inline_copy/pefile/LICENSE.txt +21 -0
  338. nuitka/build/inline_copy/pefile/ordlookup/__init__.py +41 -0
  339. nuitka/build/inline_copy/pefile/ordlookup/oleaut32.py +400 -0
  340. nuitka/build/inline_copy/pefile/ordlookup/ws2_32.py +120 -0
  341. nuitka/build/inline_copy/pefile/pefile.py +8034 -0
  342. nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +3272 -0
  343. nuitka/build/inline_copy/pkg_resources/pkg_resources/py31compat.py +21 -0
  344. nuitka/build/inline_copy/python_hacl/LICENSE.txt +201 -0
  345. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.c +1430 -0
  346. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.h +66 -0
  347. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.c +463 -0
  348. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.h +66 -0
  349. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.c +1273 -0
  350. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.h +204 -0
  351. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.c +734 -0
  352. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.h +131 -0
  353. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Streaming_Types.h +83 -0
  354. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt128_Verified.h +346 -0
  355. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt_8_16_32_64.h +107 -0
  356. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/fstar_uint128_struct_endianness.h +68 -0
  357. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/internal/target.h +293 -0
  358. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/lowstar_endianness.h +231 -0
  359. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/types.h +14 -0
  360. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_MD5.h +56 -0
  361. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA1.h +56 -0
  362. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA2.h +164 -0
  363. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA3.h +65 -0
  364. nuitka/build/inline_copy/python_hacl/hacl_312/python_hacl_namespaces.h +89 -0
  365. nuitka/build/inline_copy/stubgen/astunparse.py +938 -0
  366. nuitka/build/inline_copy/stubgen/six.py +998 -0
  367. nuitka/build/inline_copy/stubgen/stubgen.py +484 -0
  368. nuitka/build/inline_copy/tqdm/tqdm/__init__.py +40 -0
  369. nuitka/build/inline_copy/tqdm/tqdm/_main.py +9 -0
  370. nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +97 -0
  371. nuitka/build/inline_copy/tqdm/tqdm/_tqdm.py +9 -0
  372. nuitka/build/inline_copy/tqdm/tqdm/_tqdm_notebook.py +9 -0
  373. nuitka/build/inline_copy/tqdm/tqdm/_tqdm_pandas.py +24 -0
  374. nuitka/build/inline_copy/tqdm/tqdm/_utils.py +12 -0
  375. nuitka/build/inline_copy/tqdm/tqdm/auto.py +44 -0
  376. nuitka/build/inline_copy/tqdm/tqdm/autonotebook.py +28 -0
  377. nuitka/build/inline_copy/tqdm/tqdm/dask.py +46 -0
  378. nuitka/build/inline_copy/tqdm/tqdm/notebook.py +316 -0
  379. nuitka/build/inline_copy/tqdm/tqdm/std.py +1524 -0
  380. nuitka/build/inline_copy/tqdm/tqdm/tk.py +207 -0
  381. nuitka/build/inline_copy/tqdm/tqdm/utils.py +351 -0
  382. nuitka/build/inline_copy/tqdm/tqdm/version.py +2 -0
  383. nuitka/build/inline_copy/yaml/LICENSE +20 -0
  384. nuitka/build/inline_copy/yaml/yaml/__init__.py +427 -0
  385. nuitka/build/inline_copy/yaml/yaml/composer.py +139 -0
  386. nuitka/build/inline_copy/yaml/yaml/constructor.py +748 -0
  387. nuitka/build/inline_copy/yaml/yaml/cyaml.py +101 -0
  388. nuitka/build/inline_copy/yaml/yaml/dumper.py +62 -0
  389. nuitka/build/inline_copy/yaml/yaml/emitter.py +1137 -0
  390. nuitka/build/inline_copy/yaml/yaml/error.py +75 -0
  391. nuitka/build/inline_copy/yaml/yaml/events.py +86 -0
  392. nuitka/build/inline_copy/yaml/yaml/loader.py +63 -0
  393. nuitka/build/inline_copy/yaml/yaml/nodes.py +49 -0
  394. nuitka/build/inline_copy/yaml/yaml/parser.py +589 -0
  395. nuitka/build/inline_copy/yaml/yaml/reader.py +185 -0
  396. nuitka/build/inline_copy/yaml/yaml/representer.py +389 -0
  397. nuitka/build/inline_copy/yaml/yaml/resolver.py +227 -0
  398. nuitka/build/inline_copy/yaml/yaml/scanner.py +1435 -0
  399. nuitka/build/inline_copy/yaml/yaml/serializer.py +111 -0
  400. nuitka/build/inline_copy/yaml/yaml/tokens.py +104 -0
  401. nuitka/build/inline_copy/zlib/LICENSE +22 -0
  402. nuitka/build/inline_copy/zlib/crc32.c +1049 -0
  403. nuitka/build/inline_copy/zlib/crc32.h +9446 -0
  404. nuitka/build/inline_copy/zlib/zconf.h +551 -0
  405. nuitka/build/inline_copy/zlib/zlib.h +1938 -0
  406. nuitka/build/inline_copy/zlib/zutil.h +275 -0
  407. nuitka/build/inline_copy/zstd/LICENSE.txt +30 -0
  408. nuitka/build/inline_copy/zstd/common/bitstream.h +463 -0
  409. nuitka/build/inline_copy/zstd/common/compiler.h +288 -0
  410. nuitka/build/inline_copy/zstd/common/cpu.h +213 -0
  411. nuitka/build/inline_copy/zstd/common/debug.h +107 -0
  412. nuitka/build/inline_copy/zstd/common/entropy_common.c +360 -0
  413. nuitka/build/inline_copy/zstd/common/error_private.c +56 -0
  414. nuitka/build/inline_copy/zstd/common/error_private.h +80 -0
  415. nuitka/build/inline_copy/zstd/common/fse.h +715 -0
  416. nuitka/build/inline_copy/zstd/common/fse_decompress.c +393 -0
  417. nuitka/build/inline_copy/zstd/common/huf.h +361 -0
  418. nuitka/build/inline_copy/zstd/common/mem.h +426 -0
  419. nuitka/build/inline_copy/zstd/common/xxhash.c +826 -0
  420. nuitka/build/inline_copy/zstd/common/xxhash.h +285 -0
  421. nuitka/build/inline_copy/zstd/common/zstd_common.c +83 -0
  422. nuitka/build/inline_copy/zstd/common/zstd_deps.h +111 -0
  423. nuitka/build/inline_copy/zstd/common/zstd_errors.h +95 -0
  424. nuitka/build/inline_copy/zstd/common/zstd_internal.h +478 -0
  425. nuitka/build/inline_copy/zstd/decompress/huf_decompress.c +1350 -0
  426. nuitka/build/inline_copy/zstd/decompress/zstd_ddict.c +244 -0
  427. nuitka/build/inline_copy/zstd/decompress/zstd_ddict.h +44 -0
  428. nuitka/build/inline_copy/zstd/decompress/zstd_decompress.c +1930 -0
  429. nuitka/build/inline_copy/zstd/decompress/zstd_decompress_block.c +1540 -0
  430. nuitka/build/inline_copy/zstd/decompress/zstd_decompress_block.h +62 -0
  431. nuitka/build/inline_copy/zstd/decompress/zstd_decompress_internal.h +190 -0
  432. nuitka/build/inline_copy/zstd/zstd.h +2391 -0
  433. nuitka/build/static_src/CompiledAsyncgenType.c +2211 -0
  434. nuitka/build/static_src/CompiledCellType.c +300 -0
  435. nuitka/build/static_src/CompiledCodeHelpers.c +2160 -0
  436. nuitka/build/static_src/CompiledCoroutineType.c +1946 -0
  437. nuitka/build/static_src/CompiledFrameType.c +1337 -0
  438. nuitka/build/static_src/CompiledFunctionType.c +3320 -0
  439. nuitka/build/static_src/CompiledGeneratorType.c +1997 -0
  440. nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +2117 -0
  441. nuitka/build/static_src/CompiledMethodType.c +614 -0
  442. nuitka/build/static_src/GenerateHeadersMain.c +30 -0
  443. nuitka/build/static_src/HelpersAllocator.c +939 -0
  444. nuitka/build/static_src/HelpersAttributes.c +1241 -0
  445. nuitka/build/static_src/HelpersBuiltin.c +901 -0
  446. nuitka/build/static_src/HelpersBuiltinTypeMethods.c +3594 -0
  447. nuitka/build/static_src/HelpersBytes.c +107 -0
  448. nuitka/build/static_src/HelpersCalling.c +397 -0
  449. nuitka/build/static_src/HelpersCallingGenerated.c +14361 -0
  450. nuitka/build/static_src/HelpersChecksumTools.c +59 -0
  451. nuitka/build/static_src/HelpersClasses.c +91 -0
  452. nuitka/build/static_src/HelpersComparisonDualEq.c +183 -0
  453. nuitka/build/static_src/HelpersComparisonDualGe.c +121 -0
  454. nuitka/build/static_src/HelpersComparisonDualGt.c +121 -0
  455. nuitka/build/static_src/HelpersComparisonDualLe.c +183 -0
  456. nuitka/build/static_src/HelpersComparisonDualLt.c +183 -0
  457. nuitka/build/static_src/HelpersComparisonDualNe.c +121 -0
  458. nuitka/build/static_src/HelpersComparisonEq.c +12070 -0
  459. nuitka/build/static_src/HelpersComparisonEqUtils.c +169 -0
  460. nuitka/build/static_src/HelpersComparisonGe.c +11871 -0
  461. nuitka/build/static_src/HelpersComparisonGt.c +11855 -0
  462. nuitka/build/static_src/HelpersComparisonLe.c +11957 -0
  463. nuitka/build/static_src/HelpersComparisonLt.c +11941 -0
  464. nuitka/build/static_src/HelpersComparisonNe.c +11979 -0
  465. nuitka/build/static_src/HelpersConsole.c +124 -0
  466. nuitka/build/static_src/HelpersConstantsBlob.c +1487 -0
  467. nuitka/build/static_src/HelpersDeepcopy.c +636 -0
  468. nuitka/build/static_src/HelpersDictionaries.c +1739 -0
  469. nuitka/build/static_src/HelpersDictionariesGenerated.c +738 -0
  470. nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
  471. nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
  472. nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +97 -0
  473. nuitka/build/static_src/HelpersExceptions.c +298 -0
  474. nuitka/build/static_src/HelpersFiles.c +353 -0
  475. nuitka/build/static_src/HelpersFilesystemPaths.c +1322 -0
  476. nuitka/build/static_src/HelpersFloats.c +92 -0
  477. nuitka/build/static_src/HelpersHeapStorage.c +68 -0
  478. nuitka/build/static_src/HelpersImport.c +506 -0
  479. nuitka/build/static_src/HelpersImportHard.c +526 -0
  480. nuitka/build/static_src/HelpersJitSources.c +48 -0
  481. nuitka/build/static_src/HelpersLists.c +899 -0
  482. nuitka/build/static_src/HelpersListsGenerated.c +564 -0
  483. nuitka/build/static_src/HelpersMappings.c +46 -0
  484. nuitka/build/static_src/HelpersMatching.c +192 -0
  485. nuitka/build/static_src/HelpersOperationBinaryAdd.c +6477 -0
  486. nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +703 -0
  487. nuitka/build/static_src/HelpersOperationBinaryBitand.c +2738 -0
  488. nuitka/build/static_src/HelpersOperationBinaryBitor.c +2738 -0
  489. nuitka/build/static_src/HelpersOperationBinaryBitxor.c +2738 -0
  490. nuitka/build/static_src/HelpersOperationBinaryDivmod.c +2406 -0
  491. nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +33 -0
  492. nuitka/build/static_src/HelpersOperationBinaryDualAdd.c +172 -0
  493. nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +2422 -0
  494. nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +220 -0
  495. nuitka/build/static_src/HelpersOperationBinaryLshift.c +2846 -0
  496. nuitka/build/static_src/HelpersOperationBinaryMatmult.c +453 -0
  497. nuitka/build/static_src/HelpersOperationBinaryMod.c +6549 -0
  498. nuitka/build/static_src/HelpersOperationBinaryMult.c +6438 -0
  499. nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +125 -0
  500. nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +2355 -0
  501. nuitka/build/static_src/HelpersOperationBinaryPow.c +2743 -0
  502. nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +26 -0
  503. nuitka/build/static_src/HelpersOperationBinaryRshift.c +2706 -0
  504. nuitka/build/static_src/HelpersOperationBinarySub.c +2649 -0
  505. nuitka/build/static_src/HelpersOperationBinaryTruediv.c +2415 -0
  506. nuitka/build/static_src/HelpersOperationInplaceAdd.c +5211 -0
  507. nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +144 -0
  508. nuitka/build/static_src/HelpersOperationInplaceBitand.c +1826 -0
  509. nuitka/build/static_src/HelpersOperationInplaceBitor.c +1826 -0
  510. nuitka/build/static_src/HelpersOperationInplaceBitxor.c +1826 -0
  511. nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +2605 -0
  512. nuitka/build/static_src/HelpersOperationInplaceLshift.c +1594 -0
  513. nuitka/build/static_src/HelpersOperationInplaceMatmult.c +603 -0
  514. nuitka/build/static_src/HelpersOperationInplaceMod.c +4762 -0
  515. nuitka/build/static_src/HelpersOperationInplaceMult.c +4689 -0
  516. nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +2553 -0
  517. nuitka/build/static_src/HelpersOperationInplacePow.c +2807 -0
  518. nuitka/build/static_src/HelpersOperationInplaceRshift.c +1534 -0
  519. nuitka/build/static_src/HelpersOperationInplaceSub.c +2894 -0
  520. nuitka/build/static_src/HelpersOperationInplaceTruediv.c +2612 -0
  521. nuitka/build/static_src/HelpersProfiling.c +104 -0
  522. nuitka/build/static_src/HelpersPythonPgo.c +113 -0
  523. nuitka/build/static_src/HelpersRaising.c +447 -0
  524. nuitka/build/static_src/HelpersSafeStrings.c +185 -0
  525. nuitka/build/static_src/HelpersSequences.c +134 -0
  526. nuitka/build/static_src/HelpersSlices.c +73 -0
  527. nuitka/build/static_src/HelpersStrings.c +998 -0
  528. nuitka/build/static_src/HelpersTuples.c +148 -0
  529. nuitka/build/static_src/HelpersTypes.c +329 -0
  530. nuitka/build/static_src/InspectPatcher.c +439 -0
  531. nuitka/build/static_src/MainProgram.c +2060 -0
  532. nuitka/build/static_src/MetaPathBasedLoader.c +2290 -0
  533. nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +125 -0
  534. nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +158 -0
  535. nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +785 -0
  536. nuitka/build/static_src/OnefileBootstrap.c +1580 -0
  537. nuitka/build/static_src/OnefileSplashScreen.cpp +275 -0
  538. nuitka/code_generation/AsyncgenCodes.py +186 -0
  539. nuitka/code_generation/AttributeCodes.py +357 -0
  540. nuitka/code_generation/BinaryOperationHelperDefinitions.py +720 -0
  541. nuitka/code_generation/BranchCodes.py +67 -0
  542. nuitka/code_generation/BuiltinCodes.py +529 -0
  543. nuitka/code_generation/CallCodes.py +1186 -0
  544. nuitka/code_generation/ClassCodes.py +156 -0
  545. nuitka/code_generation/CodeGeneration.py +1078 -0
  546. nuitka/code_generation/CodeHelperSelection.py +81 -0
  547. nuitka/code_generation/CodeHelpers.py +455 -0
  548. nuitka/code_generation/CodeObjectCodes.py +165 -0
  549. nuitka/code_generation/ComparisonCodes.py +569 -0
  550. nuitka/code_generation/ComparisonHelperDefinitions.py +146 -0
  551. nuitka/code_generation/ConditionalCodes.py +236 -0
  552. nuitka/code_generation/ConstantCodes.py +243 -0
  553. nuitka/code_generation/Contexts.py +1248 -0
  554. nuitka/code_generation/CoroutineCodes.py +253 -0
  555. nuitka/code_generation/CtypesCodes.py +46 -0
  556. nuitka/code_generation/DictCodes.py +918 -0
  557. nuitka/code_generation/Emission.py +75 -0
  558. nuitka/code_generation/ErrorCodes.py +281 -0
  559. nuitka/code_generation/EvalCodes.py +444 -0
  560. nuitka/code_generation/ExceptionCodes.py +337 -0
  561. nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +227 -0
  562. nuitka/code_generation/ExpressionCodes.py +61 -0
  563. nuitka/code_generation/FrameCodes.py +518 -0
  564. nuitka/code_generation/FunctionCodes.py +858 -0
  565. nuitka/code_generation/GeneratorCodes.py +218 -0
  566. nuitka/code_generation/GlobalConstants.py +249 -0
  567. nuitka/code_generation/GlobalsLocalsCodes.py +211 -0
  568. nuitka/code_generation/IdCodes.py +53 -0
  569. nuitka/code_generation/ImportCodes.py +468 -0
  570. nuitka/code_generation/Indentation.py +45 -0
  571. nuitka/code_generation/IndexCodes.py +50 -0
  572. nuitka/code_generation/InjectCCodes.py +28 -0
  573. nuitka/code_generation/IntegerCodes.py +110 -0
  574. nuitka/code_generation/IteratorCodes.py +378 -0
  575. nuitka/code_generation/JitCodes.py +44 -0
  576. nuitka/code_generation/LabelCodes.py +68 -0
  577. nuitka/code_generation/LineNumberCodes.py +91 -0
  578. nuitka/code_generation/ListCodes.py +502 -0
  579. nuitka/code_generation/LoaderCodes.py +193 -0
  580. nuitka/code_generation/LocalsDictCodes.py +359 -0
  581. nuitka/code_generation/LoopCodes.py +88 -0
  582. nuitka/code_generation/MatchCodes.py +67 -0
  583. nuitka/code_generation/ModuleCodes.py +247 -0
  584. nuitka/code_generation/Namify.py +260 -0
  585. nuitka/code_generation/NetworkxCodes.py +51 -0
  586. nuitka/code_generation/OperationCodes.py +398 -0
  587. nuitka/code_generation/PackageResourceCodes.py +986 -0
  588. nuitka/code_generation/PrintCodes.py +93 -0
  589. nuitka/code_generation/PythonAPICodes.py +215 -0
  590. nuitka/code_generation/RaisingCodes.py +481 -0
  591. nuitka/code_generation/Reports.py +115 -0
  592. nuitka/code_generation/ReturnCodes.py +143 -0
  593. nuitka/code_generation/SetCodes.py +196 -0
  594. nuitka/code_generation/SliceCodes.py +465 -0
  595. nuitka/code_generation/StringCodes.py +303 -0
  596. nuitka/code_generation/SubscriptCodes.py +263 -0
  597. nuitka/code_generation/TensorflowCodes.py +54 -0
  598. nuitka/code_generation/TryCodes.py +326 -0
  599. nuitka/code_generation/TupleCodes.py +115 -0
  600. nuitka/code_generation/TypeAliasCodes.py +120 -0
  601. nuitka/code_generation/VariableCodes.py +519 -0
  602. nuitka/code_generation/VariableDeclarations.py +279 -0
  603. nuitka/code_generation/YieldCodes.py +253 -0
  604. nuitka/code_generation/__init__.py +19 -0
  605. nuitka/code_generation/c_types/CTypeBases.py +177 -0
  606. nuitka/code_generation/c_types/CTypeBooleans.py +104 -0
  607. nuitka/code_generation/c_types/CTypeCFloats.py +57 -0
  608. nuitka/code_generation/c_types/CTypeCLongs.py +45 -0
  609. nuitka/code_generation/c_types/CTypeModuleDictVariables.py +109 -0
  610. nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +150 -0
  611. nuitka/code_generation/c_types/CTypeNuitkaInts.py +200 -0
  612. nuitka/code_generation/c_types/CTypeNuitkaVoids.py +107 -0
  613. nuitka/code_generation/c_types/CTypePyObjectPointers.py +572 -0
  614. nuitka/code_generation/c_types/CTypeVoids.py +92 -0
  615. nuitka/code_generation/c_types/__init__.py +19 -0
  616. nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +106 -0
  617. nuitka/code_generation/templates/CodeTemplatesConstants.py +296 -0
  618. nuitka/code_generation/templates/CodeTemplatesCoroutines.py +109 -0
  619. nuitka/code_generation/templates/CodeTemplatesExceptions.py +84 -0
  620. nuitka/code_generation/templates/CodeTemplatesFrames.py +235 -0
  621. nuitka/code_generation/templates/CodeTemplatesFunction.py +117 -0
  622. nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +130 -0
  623. nuitka/code_generation/templates/CodeTemplatesIterators.py +40 -0
  624. nuitka/code_generation/templates/CodeTemplatesLoader.py +180 -0
  625. nuitka/code_generation/templates/CodeTemplatesModules.py +710 -0
  626. nuitka/code_generation/templates/CodeTemplatesVariables.py +388 -0
  627. nuitka/code_generation/templates/TemplateDebugWrapper.py +80 -0
  628. nuitka/code_generation/templates/__init__.py +19 -0
  629. nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +321 -0
  630. nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +143 -0
  631. nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +677 -0
  632. nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +165 -0
  633. nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +38 -0
  634. nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +41 -0
  635. nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +53 -0
  636. nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +364 -0
  637. nuitka/code_generation/templates_c/HelperImportHard.c.j2 +37 -0
  638. nuitka/code_generation/templates_c/HelperLongTools.c.j2 +53 -0
  639. nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +20 -0
  640. nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +148 -0
  641. nuitka/code_generation/templates_c/HelperOperationBinaryDual.c.j2 +115 -0
  642. nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +352 -0
  643. nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +115 -0
  644. nuitka/code_generation/templates_c/HelperOperationComparisonDual.c.j2 +86 -0
  645. nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +31 -0
  646. nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +32 -0
  647. nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +112 -0
  648. nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +157 -0
  649. nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +115 -0
  650. nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +99 -0
  651. nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +115 -0
  652. nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +281 -0
  653. nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +420 -0
  654. nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +51 -0
  655. nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +71 -0
  656. nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +327 -0
  657. nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +411 -0
  658. nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +59 -0
  659. nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +229 -0
  660. nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +47 -0
  661. nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +55 -0
  662. nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +58 -0
  663. nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +62 -0
  664. nuitka/containers/Namedtuples.py +51 -0
  665. nuitka/containers/OrderedDicts.py +191 -0
  666. nuitka/containers/OrderedSets.py +123 -0
  667. nuitka/containers/OrderedSetsFallback.py +139 -0
  668. nuitka/containers/__init__.py +19 -0
  669. nuitka/distutils/Build.py +76 -0
  670. nuitka/distutils/DistutilCommands.py +438 -0
  671. nuitka/distutils/__init__.py +19 -0
  672. nuitka/finalizations/Finalization.py +35 -0
  673. nuitka/finalizations/FinalizeMarkups.py +136 -0
  674. nuitka/finalizations/__init__.py +19 -0
  675. nuitka/freezer/DependsExe.py +257 -0
  676. nuitka/freezer/DllDependenciesCommon.py +97 -0
  677. nuitka/freezer/DllDependenciesMacOS.py +444 -0
  678. nuitka/freezer/DllDependenciesPosix.py +242 -0
  679. nuitka/freezer/DllDependenciesWin32.py +315 -0
  680. nuitka/freezer/ImportDetection.py +359 -0
  681. nuitka/freezer/IncludedDataFiles.py +689 -0
  682. nuitka/freezer/IncludedEntryPoints.py +376 -0
  683. nuitka/freezer/Onefile.py +296 -0
  684. nuitka/freezer/Standalone.py +520 -0
  685. nuitka/freezer/__init__.py +19 -0
  686. nuitka/importing/IgnoreListing.py +449 -0
  687. nuitka/importing/ImportCache.py +95 -0
  688. nuitka/importing/ImportResolving.py +186 -0
  689. nuitka/importing/Importing.py +1200 -0
  690. nuitka/importing/PreloadedPackages.py +164 -0
  691. nuitka/importing/Recursion.py +611 -0
  692. nuitka/importing/StandardLibrary.py +429 -0
  693. nuitka/importing/__init__.py +19 -0
  694. nuitka/nodes/AsyncgenNodes.py +107 -0
  695. nuitka/nodes/AttributeLookupNodes.py +124 -0
  696. nuitka/nodes/AttributeNodes.py +386 -0
  697. nuitka/nodes/AttributeNodesGenerated.py +10734 -0
  698. nuitka/nodes/BuiltinAllNodes.py +115 -0
  699. nuitka/nodes/BuiltinAnyNodes.py +124 -0
  700. nuitka/nodes/BuiltinComplexNodes.py +83 -0
  701. nuitka/nodes/BuiltinDecodingNodes.py +52 -0
  702. nuitka/nodes/BuiltinDecoratorNodes.py +85 -0
  703. nuitka/nodes/BuiltinDictNodes.py +140 -0
  704. nuitka/nodes/BuiltinFormatNodes.py +159 -0
  705. nuitka/nodes/BuiltinHashNodes.py +63 -0
  706. nuitka/nodes/BuiltinInputNodes.py +39 -0
  707. nuitka/nodes/BuiltinIntegerNodes.py +170 -0
  708. nuitka/nodes/BuiltinIteratorNodes.py +391 -0
  709. nuitka/nodes/BuiltinLenNodes.py +61 -0
  710. nuitka/nodes/BuiltinNextNodes.py +111 -0
  711. nuitka/nodes/BuiltinOpenNodes.py +148 -0
  712. nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +7367 -0
  713. nuitka/nodes/BuiltinRangeNodes.py +690 -0
  714. nuitka/nodes/BuiltinRefNodes.py +314 -0
  715. nuitka/nodes/BuiltinSumNodes.py +104 -0
  716. nuitka/nodes/BuiltinTypeNodes.py +454 -0
  717. nuitka/nodes/BuiltinVarsNodes.py +44 -0
  718. nuitka/nodes/BytesNodes.py +829 -0
  719. nuitka/nodes/CallNodes.py +217 -0
  720. nuitka/nodes/Checkers.py +55 -0
  721. nuitka/nodes/ChildrenHavingMixins.py +21576 -0
  722. nuitka/nodes/ClassNodes.py +286 -0
  723. nuitka/nodes/CodeObjectSpecs.py +230 -0
  724. nuitka/nodes/ComparisonNodes.py +687 -0
  725. nuitka/nodes/ConditionalNodes.py +884 -0
  726. nuitka/nodes/ConstantRefNodes.py +1717 -0
  727. nuitka/nodes/ContainerMakingNodes.py +408 -0
  728. nuitka/nodes/ContainerOperationNodes.py +87 -0
  729. nuitka/nodes/CoroutineNodes.py +144 -0
  730. nuitka/nodes/CtypesNodes.py +51 -0
  731. nuitka/nodes/DictionaryNodes.py +1513 -0
  732. nuitka/nodes/ExceptionNodes.py +393 -0
  733. nuitka/nodes/ExecEvalNodes.py +229 -0
  734. nuitka/nodes/ExpressionBases.py +1301 -0
  735. nuitka/nodes/ExpressionBasesGenerated.py +2103 -0
  736. nuitka/nodes/ExpressionShapeMixins.py +886 -0
  737. nuitka/nodes/FrameNodes.py +413 -0
  738. nuitka/nodes/FunctionAttributeNodes.py +102 -0
  739. nuitka/nodes/FunctionNodes.py +1303 -0
  740. nuitka/nodes/FutureSpecs.py +224 -0
  741. nuitka/nodes/GeneratorNodes.py +201 -0
  742. nuitka/nodes/GlobalsLocalsNodes.py +209 -0
  743. nuitka/nodes/HardImportNodesGenerated.py +3599 -0
  744. nuitka/nodes/ImportHardNodes.py +185 -0
  745. nuitka/nodes/ImportNodes.py +1366 -0
  746. nuitka/nodes/IndicatorMixins.py +79 -0
  747. nuitka/nodes/InjectCNodes.py +51 -0
  748. nuitka/nodes/IterationHandles.py +407 -0
  749. nuitka/nodes/KeyValuePairNodes.py +378 -0
  750. nuitka/nodes/ListOperationNodes.py +525 -0
  751. nuitka/nodes/LocalsDictNodes.py +717 -0
  752. nuitka/nodes/LocalsScopes.py +505 -0
  753. nuitka/nodes/LoopNodes.py +445 -0
  754. nuitka/nodes/MatchNodes.py +60 -0
  755. nuitka/nodes/ModuleAttributeNodes.py +180 -0
  756. nuitka/nodes/ModuleNodes.py +1137 -0
  757. nuitka/nodes/NetworkxNodes.py +45 -0
  758. nuitka/nodes/NodeBases.py +890 -0
  759. nuitka/nodes/NodeMakingHelpers.py +481 -0
  760. nuitka/nodes/NodeMetaClasses.py +172 -0
  761. nuitka/nodes/OperatorNodes.py +944 -0
  762. nuitka/nodes/OperatorNodesUnary.py +403 -0
  763. nuitka/nodes/OsSysNodes.py +215 -0
  764. nuitka/nodes/OutlineNodes.py +372 -0
  765. nuitka/nodes/PackageMetadataNodes.py +982 -0
  766. nuitka/nodes/PackageResourceNodes.py +424 -0
  767. nuitka/nodes/PrintNodes.py +105 -0
  768. nuitka/nodes/ReturnNodes.py +255 -0
  769. nuitka/nodes/SideEffectNodes.py +139 -0
  770. nuitka/nodes/SliceNodes.py +386 -0
  771. nuitka/nodes/StatementBasesGenerated.py +3419 -0
  772. nuitka/nodes/StatementNodes.py +316 -0
  773. nuitka/nodes/StrNodes.py +919 -0
  774. nuitka/nodes/StringConcatenationNodes.py +103 -0
  775. nuitka/nodes/SubscriptNodes.py +245 -0
  776. nuitka/nodes/TensorflowNodes.py +38 -0
  777. nuitka/nodes/TryNodes.py +519 -0
  778. nuitka/nodes/TypeMatchNodes.py +65 -0
  779. nuitka/nodes/TypeNodes.py +390 -0
  780. nuitka/nodes/VariableAssignNodes.py +1177 -0
  781. nuitka/nodes/VariableDelNodes.py +320 -0
  782. nuitka/nodes/VariableNameNodes.py +153 -0
  783. nuitka/nodes/VariableRefNodes.py +895 -0
  784. nuitka/nodes/VariableReleaseNodes.py +153 -0
  785. nuitka/nodes/YieldNodes.py +121 -0
  786. nuitka/nodes/__init__.py +19 -0
  787. nuitka/nodes/shapes/BuiltinTypeShapes.py +4290 -0
  788. nuitka/nodes/shapes/ControlFlowDescriptions.py +199 -0
  789. nuitka/nodes/shapes/IteratorShapes.py +71 -0
  790. nuitka/nodes/shapes/ShapeMixins.py +255 -0
  791. nuitka/nodes/shapes/StandardShapes.py +1384 -0
  792. nuitka/nodes/shapes/__init__.py +19 -0
  793. nuitka/optimizations/BytecodeDemotion.py +105 -0
  794. nuitka/optimizations/FunctionInlining.py +110 -0
  795. nuitka/optimizations/Graphs.py +70 -0
  796. nuitka/optimizations/Optimization.py +363 -0
  797. nuitka/optimizations/OptimizeBuiltinCalls.py +1582 -0
  798. nuitka/optimizations/Tags.py +76 -0
  799. nuitka/optimizations/TraceCollections.py +1257 -0
  800. nuitka/optimizations/ValueTraces.py +980 -0
  801. nuitka/optimizations/__init__.py +19 -0
  802. nuitka/pgo/PGO.py +160 -0
  803. nuitka/pgo/__init__.py +19 -0
  804. nuitka/plugins/PluginBase.py +1924 -0
  805. nuitka/plugins/Plugins.py +2007 -0
  806. nuitka/plugins/YamlPluginBase.py +121 -0
  807. nuitka/plugins/__init__.py +19 -0
  808. nuitka/plugins/standard/AntiBloatPlugin.py +1024 -0
  809. nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +95 -0
  810. nuitka/plugins/standard/DataFilesPlugin.py +311 -0
  811. nuitka/plugins/standard/DelvewheelPlugin.py +150 -0
  812. nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
  813. nuitka/plugins/standard/DillPlugin/cloudpickle-postLoad.py +67 -0
  814. nuitka/plugins/standard/DillPlugin/dill-postLoad.py +223 -0
  815. nuitka/plugins/standard/DillPlugin.py +137 -0
  816. nuitka/plugins/standard/DllFilesPlugin.py +527 -0
  817. nuitka/plugins/standard/EnumPlugin.py +64 -0
  818. nuitka/plugins/standard/EventletPlugin.py +57 -0
  819. nuitka/plugins/standard/GeventPlugin.py +64 -0
  820. nuitka/plugins/standard/GiPlugin.py +118 -0
  821. nuitka/plugins/standard/GlfwPlugin.py +138 -0
  822. nuitka/plugins/standard/ImplicitImports.py +845 -0
  823. nuitka/plugins/standard/KivyPlugin.py +141 -0
  824. nuitka/plugins/standard/MatplotlibPlugin.py +256 -0
  825. nuitka/plugins/standard/MultiprocessingPlugin.py +199 -0
  826. nuitka/plugins/standard/NumpyPlugin.py +35 -0
  827. nuitka/plugins/standard/OptionsNannyPlugin.py +158 -0
  828. nuitka/plugins/standard/PbrPlugin.py +62 -0
  829. nuitka/plugins/standard/PkgResourcesPlugin.py +162 -0
  830. nuitka/plugins/standard/PlaywrightPlugin.py +179 -0
  831. nuitka/plugins/standard/PmwPlugin.py +248 -0
  832. nuitka/plugins/standard/PySidePyQtPlugin.py +1666 -0
  833. nuitka/plugins/standard/PywebViewPlugin.py +81 -0
  834. nuitka/plugins/standard/SpacyPlugin.py +137 -0
  835. nuitka/plugins/standard/TensorflowPlugin.py +35 -0
  836. nuitka/plugins/standard/TkinterPlugin.py +416 -0
  837. nuitka/plugins/standard/TorchPlugin.py +35 -0
  838. nuitka/plugins/standard/TransformersPlugin.py +121 -0
  839. nuitka/plugins/standard/TrioPlugin.py +33 -0
  840. nuitka/plugins/standard/UpxPlugin.py +174 -0
  841. nuitka/plugins/standard/__init__.py +19 -0
  842. nuitka/plugins/standard/standard.nuitka-package.config.yml +9313 -0
  843. nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +78 -0
  844. nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +468 -0
  845. nuitka/reports/CompilationReportReader.py +83 -0
  846. nuitka/reports/LicenseReport.rst.j2 +41 -0
  847. nuitka/reports/Reports.py +961 -0
  848. nuitka/reports/__init__.py +19 -0
  849. nuitka/specs/BuiltinBytesOperationSpecs.py +180 -0
  850. nuitka/specs/BuiltinDictOperationSpecs.py +82 -0
  851. nuitka/specs/BuiltinListOperationSpecs.py +80 -0
  852. nuitka/specs/BuiltinParameterSpecs.py +831 -0
  853. nuitka/specs/BuiltinStrOperationSpecs.py +181 -0
  854. nuitka/specs/BuiltinTypeOperationSpecs.py +34 -0
  855. nuitka/specs/BuiltinUnicodeOperationSpecs.py +123 -0
  856. nuitka/specs/HardImportSpecs.py +236 -0
  857. nuitka/specs/ParameterSpecs.py +630 -0
  858. nuitka/specs/__init__.py +19 -0
  859. nuitka/tools/Basics.py +55 -0
  860. nuitka/tools/__init__.py +19 -0
  861. nuitka/tools/commercial/__init__.py +21 -0
  862. nuitka/tools/data_composer/DataComposer.py +593 -0
  863. nuitka/tools/data_composer/__init__.py +19 -0
  864. nuitka/tools/data_composer/__main__.py +41 -0
  865. nuitka/tools/environments/CreateEnvironment.py +69 -0
  866. nuitka/tools/environments/Virtualenv.py +158 -0
  867. nuitka/tools/environments/__init__.py +19 -0
  868. nuitka/tools/general/__init__.py +19 -0
  869. nuitka/tools/general/dll_report/__init__.py +19 -0
  870. nuitka/tools/general/dll_report/__main__.py +83 -0
  871. nuitka/tools/general/find_module/FindModuleCode.py +127 -0
  872. nuitka/tools/general/find_module/__init__.py +19 -0
  873. nuitka/tools/general/generate_header/GenerateHeader.py +73 -0
  874. nuitka/tools/general/generate_header/__init__.py +19 -0
  875. nuitka/tools/onefile_compressor/OnefileCompressor.py +390 -0
  876. nuitka/tools/onefile_compressor/__init__.py +19 -0
  877. nuitka/tools/onefile_compressor/__main__.py +41 -0
  878. nuitka/tools/podman/Podman.py +55 -0
  879. nuitka/tools/podman/__init__.py +19 -0
  880. nuitka/tools/podman/__main__.py +425 -0
  881. nuitka/tools/profiler/__init__.py +19 -0
  882. nuitka/tools/profiler/__main__.py +93 -0
  883. nuitka/tools/scanning/DisplayDistributions.py +39 -0
  884. nuitka/tools/scanning/DisplayPackageDLLs.py +151 -0
  885. nuitka/tools/scanning/DisplayPackageData.py +73 -0
  886. nuitka/tools/scanning/__init__.py +19 -0
  887. nuitka/tools/specialize/CTypeDescriptions.py +1928 -0
  888. nuitka/tools/specialize/Common.py +380 -0
  889. nuitka/tools/specialize/SpecializeC.py +1483 -0
  890. nuitka/tools/specialize/SpecializePython.py +1151 -0
  891. nuitka/tools/specialize/__init__.py +19 -0
  892. nuitka/tools/testing/Common.py +2007 -0
  893. nuitka/tools/testing/Constructs.py +53 -0
  894. nuitka/tools/testing/DocTests.py +156 -0
  895. nuitka/tools/testing/OutputComparison.py +313 -0
  896. nuitka/tools/testing/Pythons.py +34 -0
  897. nuitka/tools/testing/RuntimeTracing.py +260 -0
  898. nuitka/tools/testing/SearchModes.py +208 -0
  899. nuitka/tools/testing/Valgrind.py +103 -0
  900. nuitka/tools/testing/__init__.py +19 -0
  901. nuitka/tools/testing/check_reference_counts/__init__.py +19 -0
  902. nuitka/tools/testing/check_reference_counts/__main__.py +107 -0
  903. nuitka/tools/testing/compare_with_cpython/__init__.py +19 -0
  904. nuitka/tools/testing/compare_with_cpython/__main__.py +942 -0
  905. nuitka/tools/testing/find_sxs_modules/__init__.py +19 -0
  906. nuitka/tools/testing/find_sxs_modules/__main__.py +73 -0
  907. nuitka/tools/testing/measure_construct_performance/__init__.py +19 -0
  908. nuitka/tools/testing/measure_construct_performance/__main__.py +288 -0
  909. nuitka/tools/testing/run_nuitka_tests/__init__.py +19 -0
  910. nuitka/tools/testing/run_nuitka_tests/__main__.py +1091 -0
  911. nuitka/tools/watch/AutoStage.py +145 -0
  912. nuitka/tools/watch/Common.py +55 -0
  913. nuitka/tools/watch/Conda.py +125 -0
  914. nuitka/tools/watch/GitHub.py +113 -0
  915. nuitka/tools/watch/Pacman.py +73 -0
  916. nuitka/tools/watch/Pipenv.py +145 -0
  917. nuitka/tools/watch/__init__.py +19 -0
  918. nuitka/tools/watch/__main__.py +615 -0
  919. nuitka/tree/Building.py +1459 -0
  920. nuitka/tree/ComplexCallHelperFunctions.py +2150 -0
  921. nuitka/tree/Extractions.py +48 -0
  922. nuitka/tree/FutureSpecState.py +71 -0
  923. nuitka/tree/InternalModule.py +96 -0
  924. nuitka/tree/Operations.py +45 -0
  925. nuitka/tree/ReformulationAssertStatements.py +97 -0
  926. nuitka/tree/ReformulationAssignmentStatements.py +1260 -0
  927. nuitka/tree/ReformulationBooleanExpressions.py +97 -0
  928. nuitka/tree/ReformulationCallExpressions.py +314 -0
  929. nuitka/tree/ReformulationClasses.py +407 -0
  930. nuitka/tree/ReformulationClasses3.py +1149 -0
  931. nuitka/tree/ReformulationComparisonExpressions.py +174 -0
  932. nuitka/tree/ReformulationContractionExpressions.py +676 -0
  933. nuitka/tree/ReformulationDictionaryCreation.py +304 -0
  934. nuitka/tree/ReformulationExecStatements.py +386 -0
  935. nuitka/tree/ReformulationForLoopStatements.py +215 -0
  936. nuitka/tree/ReformulationFunctionStatements.py +931 -0
  937. nuitka/tree/ReformulationImportStatements.py +333 -0
  938. nuitka/tree/ReformulationLambdaExpressions.py +185 -0
  939. nuitka/tree/ReformulationMatchStatements.py +797 -0
  940. nuitka/tree/ReformulationMultidist.py +80 -0
  941. nuitka/tree/ReformulationNamespacePackages.py +239 -0
  942. nuitka/tree/ReformulationPrintStatements.py +127 -0
  943. nuitka/tree/ReformulationSequenceCreation.py +438 -0
  944. nuitka/tree/ReformulationSubscriptExpressions.py +123 -0
  945. nuitka/tree/ReformulationTryExceptStatements.py +418 -0
  946. nuitka/tree/ReformulationTryFinallyStatements.py +239 -0
  947. nuitka/tree/ReformulationWhileLoopStatements.py +160 -0
  948. nuitka/tree/ReformulationWithStatements.py +382 -0
  949. nuitka/tree/ReformulationYieldExpressions.py +133 -0
  950. nuitka/tree/SourceHandling.py +476 -0
  951. nuitka/tree/SyntaxErrors.py +143 -0
  952. nuitka/tree/TreeHelpers.py +720 -0
  953. nuitka/tree/VariableClosure.py +483 -0
  954. nuitka/tree/__init__.py +19 -0
  955. nuitka/utils/AppDirs.py +104 -0
  956. nuitka/utils/CStrings.py +208 -0
  957. nuitka/utils/CommandLineOptions.py +207 -0
  958. nuitka/utils/Distributions.py +728 -0
  959. nuitka/utils/Download.py +217 -0
  960. nuitka/utils/Execution.py +517 -0
  961. nuitka/utils/FileOperations.py +1587 -0
  962. nuitka/utils/Hashing.py +137 -0
  963. nuitka/utils/Images.py +79 -0
  964. nuitka/utils/Importing.py +335 -0
  965. nuitka/utils/InlineCopies.py +52 -0
  966. nuitka/utils/InstalledPythons.py +254 -0
  967. nuitka/utils/InstanceCounters.py +86 -0
  968. nuitka/utils/Jinja2.py +158 -0
  969. nuitka/utils/Json.py +40 -0
  970. nuitka/utils/MacOSApp.py +134 -0
  971. nuitka/utils/MemoryUsage.py +165 -0
  972. nuitka/utils/ModuleNames.py +317 -0
  973. nuitka/utils/PackageResources.py +44 -0
  974. nuitka/utils/ReExecute.py +152 -0
  975. nuitka/utils/Rest.py +60 -0
  976. nuitka/utils/SharedLibraries.py +1014 -0
  977. nuitka/utils/Shebang.py +113 -0
  978. nuitka/utils/Signing.py +144 -0
  979. nuitka/utils/SlotMetaClasses.py +57 -0
  980. nuitka/utils/StaticLibraries.py +260 -0
  981. nuitka/utils/ThreadedExecutor.py +87 -0
  982. nuitka/utils/Timing.py +102 -0
  983. nuitka/utils/Utils.py +483 -0
  984. nuitka/utils/WindowsFileUsage.py +337 -0
  985. nuitka/utils/WindowsResources.py +652 -0
  986. nuitka/utils/Yaml.py +247 -0
  987. nuitka/utils/__init__.py +19 -0
  988. nuitka_winsvc-2.7.7.data/scripts/nuitka-run.cmd +24 -0
  989. nuitka_winsvc-2.7.7.data/scripts/nuitka.cmd +30 -0
  990. nuitka_winsvc-2.7.7.dist-info/METADATA +115 -0
  991. nuitka_winsvc-2.7.7.dist-info/RECORD +995 -0
  992. nuitka_winsvc-2.7.7.dist-info/WHEEL +5 -0
  993. nuitka_winsvc-2.7.7.dist-info/entry_points.txt +7 -0
  994. nuitka_winsvc-2.7.7.dist-info/licenses/LICENSE.txt +202 -0
  995. nuitka_winsvc-2.7.7.dist-info/top_level.txt +1 -0
@@ -0,0 +1,2211 @@
1
+ // Copyright 2025, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
2
+
3
+ /** Compiled Asyncgen.
4
+ *
5
+ * Unlike in CPython, we have one type for just asyncgen, this doesn't do
6
+ * generators nor coroutines.
7
+ *
8
+ * It strives to be full replacement for normal asyncgen.
9
+ *
10
+ * spellchecker: ignore Asend,Athrow
11
+ *
12
+ */
13
+
14
+ // This file is included from another C file, help IDEs to still parse it on
15
+ // its own.
16
+ #ifdef __IDE_ONLY__
17
+ #include "nuitka/freelists.h"
18
+ #include "nuitka/prelude.h"
19
+ #include <structmember.h>
20
+ #endif
21
+
22
+ // For reporting about reference counts per type.
23
+ #if _DEBUG_REFCOUNTS
24
+ int count_active_Nuitka_Asyncgen_Type = 0;
25
+ int count_allocated_Nuitka_Asyncgen_Type = 0;
26
+ int count_released_Nuitka_Asyncgen_Type = 0;
27
+ int count_active_Nuitka_AsyncgenValueWrapper_Type = 0;
28
+ int count_allocated_Nuitka_AsyncgenValueWrapper_Type = 0;
29
+ int count_released_Nuitka_AsyncgenValueWrapper_Type = 0;
30
+ int count_active_Nuitka_AsyncgenAsend_Type = 0;
31
+ int count_allocated_Nuitka_AsyncgenAsend_Type = 0;
32
+ int count_released_Nuitka_AsyncgenAsend_Type = 0;
33
+ int count_active_Nuitka_AsyncgenAthrow_Type = 0;
34
+ int count_allocated_Nuitka_AsyncgenAthrow_Type = 0;
35
+ int count_released_Nuitka_AsyncgenAthrow_Type = 0;
36
+ #endif
37
+
38
+ static void Nuitka_MarkAsyncgenAsFinished(struct Nuitka_AsyncgenObject *asyncgen) {
39
+ asyncgen->m_status = status_Finished;
40
+
41
+ #if PYTHON_VERSION >= 0x3b0
42
+ if (asyncgen->m_frame) {
43
+ asyncgen->m_frame->m_frame_state = FRAME_COMPLETED;
44
+ }
45
+ #endif
46
+ }
47
+
48
+ static void Nuitka_MarkAsyncgenAsRunning(struct Nuitka_AsyncgenObject *asyncgen) {
49
+ asyncgen->m_running = 1;
50
+
51
+ if (asyncgen->m_frame) {
52
+ Nuitka_Frame_MarkAsExecuting(asyncgen->m_frame);
53
+ }
54
+ }
55
+
56
+ static void Nuitka_MarkAsyncgenAsNotRunning(struct Nuitka_AsyncgenObject *asyncgen) {
57
+ asyncgen->m_running = 0;
58
+
59
+ if (asyncgen->m_frame) {
60
+ Nuitka_Frame_MarkAsNotExecuting(asyncgen->m_frame);
61
+ }
62
+ }
63
+
64
+ static long Nuitka_Asyncgen_tp_hash(struct Nuitka_AsyncgenObject *asyncgen) { return asyncgen->m_counter; }
65
+
66
+ static PyObject *Nuitka_Asyncgen_get_name(PyObject *self, void *data) {
67
+ CHECK_OBJECT(self);
68
+
69
+ struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
70
+ Py_INCREF(asyncgen->m_name);
71
+ return asyncgen->m_name;
72
+ }
73
+
74
+ static int Nuitka_Asyncgen_set_name(PyObject *self, PyObject *value, void *data) {
75
+ CHECK_OBJECT(self);
76
+ CHECK_OBJECT_X(value);
77
+
78
+ // Cannot be deleted, not be non-unicode value.
79
+ if (unlikely((value == NULL) || !PyUnicode_Check(value))) {
80
+ PyThreadState *tstate = PyThreadState_GET();
81
+
82
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "__name__ must be set to a string object");
83
+ return -1;
84
+ }
85
+
86
+ struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
87
+ PyObject *tmp = asyncgen->m_name;
88
+ Py_INCREF(value);
89
+ asyncgen->m_name = value;
90
+ Py_DECREF(tmp);
91
+
92
+ return 0;
93
+ }
94
+
95
+ static PyObject *Nuitka_Asyncgen_get_qualname(PyObject *self, void *data) {
96
+ CHECK_OBJECT(self);
97
+
98
+ struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
99
+ Py_INCREF(asyncgen->m_qualname);
100
+ return asyncgen->m_qualname;
101
+ }
102
+
103
+ static int Nuitka_Asyncgen_set_qualname(PyObject *self, PyObject *value, void *data) {
104
+ CHECK_OBJECT(self);
105
+ CHECK_OBJECT_X(value);
106
+
107
+ // Cannot be deleted, not be non-unicode value.
108
+ if (unlikely((value == NULL) || !PyUnicode_Check(value))) {
109
+ PyThreadState *tstate = PyThreadState_GET();
110
+
111
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "__qualname__ must be set to a string object");
112
+ return -1;
113
+ }
114
+
115
+ struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
116
+ PyObject *tmp = asyncgen->m_qualname;
117
+ Py_INCREF(value);
118
+ asyncgen->m_qualname = value;
119
+ Py_DECREF(tmp);
120
+
121
+ return 0;
122
+ }
123
+
124
+ static PyObject *Nuitka_Asyncgen_get_ag_await(PyObject *self, void *data) {
125
+ CHECK_OBJECT(self);
126
+
127
+ struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
128
+ if (asyncgen->m_yield_from) {
129
+ Py_INCREF(asyncgen->m_yield_from);
130
+ return asyncgen->m_yield_from;
131
+ } else {
132
+ Py_INCREF_IMMORTAL(Py_None);
133
+ return Py_None;
134
+ }
135
+ }
136
+
137
+ static PyObject *Nuitka_Asyncgen_get_code(PyObject *self, void *data) {
138
+ struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
139
+ CHECK_OBJECT(asyncgen);
140
+ CHECK_OBJECT(asyncgen->m_code_object);
141
+
142
+ Py_INCREF(asyncgen->m_code_object);
143
+ return (PyObject *)asyncgen->m_code_object;
144
+ }
145
+
146
+ static int Nuitka_Asyncgen_set_code(PyObject *self, PyObject *value, void *data) {
147
+ CHECK_OBJECT(self);
148
+
149
+ PyThreadState *tstate = PyThreadState_GET();
150
+
151
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "ag_code is not writable in Nuitka");
152
+ return -1;
153
+ }
154
+
155
+ static PyObject *Nuitka_Asyncgen_get_frame(PyObject *self, void *data) {
156
+ struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
157
+ CHECK_OBJECT(asyncgen);
158
+ CHECK_OBJECT_X(asyncgen->m_frame);
159
+
160
+ if (asyncgen->m_frame) {
161
+ Py_INCREF(asyncgen->m_frame);
162
+ return (PyObject *)asyncgen->m_frame;
163
+ } else {
164
+ Py_INCREF_IMMORTAL(Py_None);
165
+ return Py_None;
166
+ }
167
+ }
168
+
169
+ static int Nuitka_Asyncgen_set_frame(PyObject *self, PyObject *value, void *data) {
170
+ CHECK_OBJECT(self);
171
+ CHECK_OBJECT_X(value);
172
+
173
+ PyThreadState *tstate = PyThreadState_GET();
174
+
175
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "ag_frame is not writable in Nuitka");
176
+ return -1;
177
+ }
178
+
179
+ static void Nuitka_Asyncgen_release_closure(struct Nuitka_AsyncgenObject *asyncgen) {
180
+ for (Py_ssize_t i = 0; i < asyncgen->m_closure_given; i++) {
181
+ CHECK_OBJECT(asyncgen->m_closure[i]);
182
+ Py_DECREF(asyncgen->m_closure[i]);
183
+ }
184
+
185
+ // This can be ran multiple times, set the count to zero,
186
+ // after first run, which deactivates the above loop.
187
+ asyncgen->m_closure_given = 0;
188
+ }
189
+
190
+ static PyObject *Nuitka_YieldFromAsyncgenCore(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen,
191
+ PyObject *send_value, bool mode) {
192
+ CHECK_OBJECT(asyncgen);
193
+ CHECK_OBJECT_X(send_value);
194
+
195
+ PyObject *yield_from = asyncgen->m_yield_from;
196
+ CHECK_OBJECT(yield_from);
197
+
198
+ // Need to make it unaccessible while using it.
199
+ asyncgen->m_yield_from = NULL;
200
+
201
+ PyObject *returned_value;
202
+ PyObject *yielded = _Nuitka_YieldFromCore(tstate, yield_from, send_value, &returned_value, mode);
203
+
204
+ if (yielded == NULL) {
205
+ assert(asyncgen->m_yield_from == NULL);
206
+ Py_DECREF(yield_from);
207
+
208
+ yielded = ((asyncgen_code)asyncgen->m_code)(tstate, asyncgen, returned_value);
209
+ } else {
210
+ assert(asyncgen->m_yield_from == NULL);
211
+ asyncgen->m_yield_from = yield_from;
212
+ }
213
+
214
+ return yielded;
215
+ }
216
+
217
+ #if _DEBUG_ASYNCGEN
218
+ NUITKA_MAY_BE_UNUSED static void _PRINT_ASYNCGEN_STATUS(char const *descriptor, char const *context,
219
+ struct Nuitka_AsyncgenObject *asyncgen) {
220
+ char const *status;
221
+
222
+ switch (asyncgen->m_status) {
223
+ case status_Finished:
224
+ status = "(finished)";
225
+ break;
226
+ case status_Running:
227
+ status = "(running)";
228
+ break;
229
+ case status_Unused:
230
+ status = "(unused)";
231
+ break;
232
+ default:
233
+ status = "(ILLEGAL)";
234
+ break;
235
+ }
236
+
237
+ PRINT_STRING(descriptor);
238
+ PRINT_STRING(" : ");
239
+ PRINT_STRING(context);
240
+ PRINT_STRING(" ");
241
+ PRINT_ITEM((PyObject *)asyncgen);
242
+ PRINT_STRING(" ");
243
+ PRINT_STRING(status);
244
+ PRINT_NEW_LINE();
245
+ }
246
+
247
+ #define PRINT_ASYNCGEN_STATUS(context, asyncgen) _PRINT_ASYNCGEN_STATUS(__FUNCTION__, context, asyncgen)
248
+
249
+ #endif
250
+
251
+ static PyObject *Nuitka_YieldFromAsyncgenNext(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen) {
252
+ CHECK_OBJECT(asyncgen);
253
+
254
+ #if _DEBUG_ASYNCGEN
255
+ PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
256
+ PRINT_NEW_LINE();
257
+ #endif
258
+ PyObject *result = Nuitka_YieldFromAsyncgenCore(tstate, asyncgen, Py_None, true);
259
+ #if _DEBUG_ASYNCGEN
260
+ PRINT_ASYNCGEN_STATUS("Leave", asyncgen);
261
+ PRINT_CURRENT_EXCEPTION();
262
+ PRINT_NEW_LINE();
263
+ #endif
264
+
265
+ return result;
266
+ }
267
+
268
+ static PyObject *Nuitka_YieldFromAsyncgenInitial(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen,
269
+ PyObject *send_value) {
270
+ CHECK_OBJECT(asyncgen);
271
+ CHECK_OBJECT_X(send_value);
272
+
273
+ #if _DEBUG_ASYNCGEN
274
+ PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
275
+ PRINT_NEW_LINE();
276
+ #endif
277
+ PyObject *result = Nuitka_YieldFromAsyncgenCore(tstate, asyncgen, send_value, false);
278
+ #if _DEBUG_ASYNCGEN
279
+ PRINT_ASYNCGEN_STATUS("Leave", asyncgen);
280
+ PRINT_CURRENT_EXCEPTION();
281
+ PRINT_NEW_LINE();
282
+ #endif
283
+
284
+ return result;
285
+ }
286
+
287
+ static PyObject *Nuitka_AsyncgenValueWrapper_New(PyObject *value);
288
+
289
+ static PySendResult _Nuitka_Asyncgen_sendR(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen,
290
+ PyObject *value, bool closing,
291
+ struct Nuitka_ExceptionPreservationItem *exception_state,
292
+ PyObject **result) {
293
+ CHECK_OBJECT(asyncgen);
294
+ assert(Nuitka_Asyncgen_Check((PyObject *)asyncgen));
295
+ CHECK_OBJECT_X(value);
296
+ CHECK_EXCEPTION_STATE_X(exception_state);
297
+
298
+ #if _DEBUG_ASYNCGEN
299
+ PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
300
+ PRINT_COROUTINE_VALUE("value", value);
301
+ PRINT_EXCEPTION_STATE(exception_state);
302
+ PRINT_CURRENT_EXCEPTION();
303
+ PRINT_NEW_LINE();
304
+ #endif
305
+
306
+ if (value != NULL) {
307
+ ASSERT_EMPTY_EXCEPTION_STATE(exception_state);
308
+ }
309
+
310
+ if (asyncgen->m_status == status_Unused && value != NULL && value != Py_None) {
311
+ // No exception if value is given.
312
+ Py_XDECREF(value);
313
+
314
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
315
+ "can't send non-None value to a just-started async generator");
316
+ return PYGEN_ERROR;
317
+ }
318
+
319
+ if (asyncgen->m_status != status_Finished) {
320
+ if (asyncgen->m_running) {
321
+ Py_XDECREF(value);
322
+
323
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ValueError, "async generator already executing");
324
+ return PYGEN_ERROR;
325
+ }
326
+ // Put the asyncgen back on the frame stack.
327
+ Nuitka_ThreadStateFrameType *return_frame = _Nuitka_GetThreadStateFrame(tstate);
328
+
329
+ // Consider it as running.
330
+ if (asyncgen->m_status == status_Unused) {
331
+ asyncgen->m_status = status_Running;
332
+ assert(asyncgen->m_resume_frame == NULL);
333
+
334
+ // Value will not be used, can only be Py_None or NULL.
335
+ Py_XDECREF(value);
336
+ value = NULL;
337
+ } else {
338
+ assert(asyncgen->m_resume_frame);
339
+ pushFrameStackGenerator(tstate, asyncgen->m_resume_frame);
340
+
341
+ asyncgen->m_resume_frame = NULL;
342
+ }
343
+
344
+ // Continue the yielder function while preventing recursion.
345
+ asyncgen->m_running = true;
346
+
347
+ // Check for thrown exception, and publish it.
348
+ if (unlikely(HAS_EXCEPTION_STATE(exception_state))) {
349
+ assert(value == NULL);
350
+
351
+ // Transfer exception ownership to published.
352
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
353
+ }
354
+
355
+ if (asyncgen->m_frame) {
356
+ Nuitka_Frame_MarkAsExecuting(asyncgen->m_frame);
357
+ }
358
+
359
+ #if _DEBUG_ASYNCGEN
360
+ PRINT_ASYNCGEN_STATUS("Switching to asyncgen", asyncgen);
361
+ PRINT_COROUTINE_VALUE("value", value);
362
+ PRINT_CURRENT_EXCEPTION();
363
+ PRINT_NEW_LINE();
364
+ // dumpFrameStack();
365
+ #endif
366
+
367
+ PyObject *yielded;
368
+
369
+ if (asyncgen->m_yield_from == NULL) {
370
+ // This consumes a reference to the value.
371
+ yielded = ((asyncgen_code)asyncgen->m_code)(tstate, asyncgen, value);
372
+ } else {
373
+ // This does not release the value if any, so we need to do it afterwards.
374
+ yielded = Nuitka_YieldFromAsyncgenInitial(tstate, asyncgen, value);
375
+ Py_XDECREF(value);
376
+ }
377
+
378
+ // If the asyncgen returns with m_yield_from set, it wants us to yield
379
+ // from that value from now on.
380
+ while (yielded == NULL && asyncgen->m_yield_from != NULL) {
381
+ yielded = Nuitka_YieldFromAsyncgenNext(tstate, asyncgen);
382
+ }
383
+
384
+ Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
385
+
386
+ // Remove the back frame from asyncgen if it's there.
387
+ if (asyncgen->m_frame) {
388
+ // assert(tstate->frame == &asyncgen->m_frame->m_frame);
389
+ assertFrameObject(asyncgen->m_frame);
390
+
391
+ Py_CLEAR(asyncgen->m_frame->m_frame.f_back);
392
+
393
+ // Remember where to resume from.
394
+ asyncgen->m_resume_frame = _Nuitka_GetThreadStateFrame(tstate);
395
+ }
396
+
397
+ // Return back to the frame that called us.
398
+ _Nuitka_GeneratorPopFrame(tstate, return_frame);
399
+
400
+ #if _DEBUG_ASYNCGEN
401
+ PRINT_ASYNCGEN_STATUS("Returned from asyncgen", asyncgen);
402
+ // dumpFrameStack();
403
+ #endif
404
+
405
+ #ifndef __NUITKA_NO_ASSERT__
406
+ if (return_frame) {
407
+ assertThreadFrameObject(return_frame);
408
+ }
409
+ #endif
410
+
411
+ if (yielded == NULL) {
412
+ #if _DEBUG_ASYNCGEN
413
+ PRINT_ASYNCGEN_STATUS("finishing from yield", asyncgen);
414
+ PRINT_CURRENT_EXCEPTION();
415
+ PRINT_STRING("-> finishing asyncgen with exception sets status_Finished\n");
416
+ PRINT_NEW_LINE();
417
+ #endif
418
+ Nuitka_MarkAsyncgenAsFinished(asyncgen);
419
+
420
+ if (asyncgen->m_frame != NULL) {
421
+ Nuitka_SetFrameGenerator(asyncgen->m_frame, NULL);
422
+ Py_DECREF(asyncgen->m_frame);
423
+ asyncgen->m_frame = NULL;
424
+ }
425
+
426
+ Nuitka_Asyncgen_release_closure(asyncgen);
427
+
428
+ PyObject *error_occurred = GET_ERROR_OCCURRED(tstate);
429
+
430
+ if (error_occurred == PyExc_StopIteration || error_occurred == PyExc_StopAsyncIteration) {
431
+ char const *message;
432
+ if (error_occurred == PyExc_StopIteration) {
433
+ message = "async generator raised StopIteration";
434
+ } else {
435
+ message = "async generator raised StopAsyncIteration";
436
+ }
437
+
438
+ RAISE_RUNTIME_ERROR_RAISED_STOP_ITERATION(tstate, message);
439
+ return PYGEN_ERROR;
440
+ }
441
+
442
+ return PYGEN_ERROR;
443
+ } else {
444
+ // For normal yield, wrap the result value before returning.
445
+ if (asyncgen->m_yield_from == NULL) {
446
+ // Transferred ownership to constructor of Nuitka_AsyncgenValueWrapper
447
+ PyObject *wrapped = Nuitka_AsyncgenValueWrapper_New(yielded);
448
+ yielded = wrapped;
449
+
450
+ assert(yielded != NULL);
451
+ }
452
+
453
+ *result = yielded;
454
+ return PYGEN_NEXT;
455
+ }
456
+ } else {
457
+ Py_XDECREF(value);
458
+
459
+ // Release exception if any, we are finished with it and will raise another.
460
+ RELEASE_ERROR_OCCURRED_STATE_X(exception_state);
461
+
462
+ return PYGEN_RETURN;
463
+ }
464
+ }
465
+
466
+ static PyObject *_Nuitka_Asyncgen_send(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen, PyObject *value,
467
+ bool closing, struct Nuitka_ExceptionPreservationItem *exception_state) {
468
+
469
+ PyObject *result;
470
+ PySendResult res = _Nuitka_Asyncgen_sendR(tstate, asyncgen, value, closing, exception_state, &result);
471
+
472
+ switch (res) {
473
+ case PYGEN_RETURN:
474
+ SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
475
+ return NULL;
476
+ case PYGEN_NEXT:
477
+ return result;
478
+ case PYGEN_ERROR:
479
+ return NULL;
480
+ default:
481
+ NUITKA_CANNOT_GET_HERE("invalid PYGEN_ result");
482
+ }
483
+ }
484
+
485
+ // Note: Used by compiled frames.
486
+ static bool _Nuitka_Asyncgen_close(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen) {
487
+ #if _DEBUG_ASYNCGEN
488
+ PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
489
+ #endif
490
+ CHECK_OBJECT(asyncgen);
491
+
492
+ if (asyncgen->m_status == status_Running) {
493
+ struct Nuitka_ExceptionPreservationItem exception_state;
494
+ SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, &exception_state, PyExc_GeneratorExit, NULL, NULL);
495
+
496
+ PyObject *result = _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, true, &exception_state);
497
+
498
+ if (unlikely(result)) {
499
+ Py_DECREF(result);
500
+
501
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "async generator ignored GeneratorExit");
502
+ return false;
503
+ } else {
504
+ return DROP_ERROR_OCCURRED_GENERATOR_EXIT_OR_STOP_ITERATION(tstate);
505
+ }
506
+ }
507
+
508
+ return true;
509
+ }
510
+
511
+ static bool _Nuitka_Generator_check_throw(PyThreadState *tstate,
512
+ struct Nuitka_ExceptionPreservationItem *exception_state);
513
+
514
+ // This function is called when yielding to a asyncgen through "_Nuitka_YieldFromPassExceptionTo"
515
+ // and potentially wrapper objects used by generators, or by the throw method itself.
516
+ // Note:
517
+ // Exception arguments are passed for ownership and must be released before returning. The
518
+ // value of exception_type will not be NULL, but the actual exception will not necessarily
519
+ // be normalized.
520
+ static PyObject *_Nuitka_Asyncgen_throw2(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen,
521
+ bool close_on_genexit,
522
+ struct Nuitka_ExceptionPreservationItem *exception_state) {
523
+ CHECK_OBJECT(asyncgen);
524
+ assert(Nuitka_Asyncgen_Check((PyObject *)asyncgen));
525
+ CHECK_EXCEPTION_STATE(exception_state);
526
+
527
+ #if _DEBUG_ASYNCGEN
528
+ PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
529
+ PRINT_COROUTINE_VALUE("yield_from", asyncgen->m_yield_from);
530
+ PRINT_EXCEPTION_STATE(exception_state);
531
+ PRINT_NEW_LINE();
532
+ #endif
533
+
534
+ if (asyncgen->m_yield_from != NULL) {
535
+ // TODO: This check is not done for coroutines, correct?
536
+ if (close_on_genexit) {
537
+ if (EXCEPTION_STATE_MATCH_BOOL_SINGLE(tstate, exception_state, PyExc_GeneratorExit)) {
538
+ // Asynchronous generators need to close the yield_from.
539
+ Nuitka_MarkAsyncgenAsRunning(asyncgen);
540
+ bool res = Nuitka_gen_close_iter(tstate, asyncgen->m_yield_from);
541
+ Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
542
+
543
+ if (res == false) {
544
+ // Release exception, we are done with it now and pick up the new one.
545
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
546
+ FETCH_ERROR_OCCURRED_STATE(tstate, exception_state);
547
+ }
548
+
549
+ return _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, false, exception_state);
550
+ }
551
+ }
552
+
553
+ PyObject *ret;
554
+
555
+ #if _DEBUG_ASYNCGEN
556
+ PRINT_ASYNCGEN_STATUS("Passing to yielded from", asyncgen);
557
+ PRINT_COROUTINE_VALUE("m_yield_from", asyncgen->m_yield_from);
558
+ PRINT_NEW_LINE();
559
+ #endif
560
+
561
+ #if NUITKA_UNCOMPILED_THROW_INTEGRATION
562
+ if (PyGen_CheckExact(asyncgen->m_yield_from) || PyCoro_CheckExact(asyncgen->m_yield_from)) {
563
+ PyGenObject *gen = (PyGenObject *)asyncgen->m_yield_from;
564
+
565
+ // Transferred exception ownership to "Nuitka_UncompiledGenerator_throw".
566
+ Nuitka_MarkAsyncgenAsRunning(asyncgen);
567
+ ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
568
+ Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
569
+ } else
570
+ #endif
571
+ if (Nuitka_Generator_Check(asyncgen->m_yield_from)) {
572
+ struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)asyncgen->m_yield_from);
573
+ // Transferred exception ownership to "_Nuitka_Generator_throw2".
574
+ Nuitka_MarkAsyncgenAsRunning(asyncgen);
575
+ ret = _Nuitka_Generator_throw2(tstate, gen, exception_state);
576
+ Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
577
+ } else if (Nuitka_Coroutine_Check(asyncgen->m_yield_from)) {
578
+ struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)asyncgen->m_yield_from);
579
+ // Transferred exception ownership to "_Nuitka_Coroutine_throw2".
580
+ Nuitka_MarkAsyncgenAsRunning(asyncgen);
581
+ ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
582
+ Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
583
+ } else if (Nuitka_CoroutineWrapper_Check(asyncgen->m_yield_from)) {
584
+ struct Nuitka_CoroutineObject *coro =
585
+ ((struct Nuitka_CoroutineWrapperObject *)asyncgen->m_yield_from)->m_coroutine;
586
+
587
+ // Transferred exception ownership to "_Nuitka_Coroutine_throw2".
588
+ Nuitka_MarkAsyncgenAsRunning(asyncgen);
589
+ ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
590
+ Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
591
+ } else if (Nuitka_AsyncgenAsend_Check(asyncgen->m_yield_from)) {
592
+ struct Nuitka_AsyncgenAsendObject *asyncgen_asend =
593
+ ((struct Nuitka_AsyncgenAsendObject *)asyncgen->m_yield_from);
594
+
595
+ // Transferred exception ownership to "_Nuitka_AsyncgenAsend_throw2".
596
+ Nuitka_MarkAsyncgenAsRunning(asyncgen);
597
+ ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend, exception_state);
598
+ Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
599
+ } else {
600
+ PyObject *meth = PyObject_GetAttr(asyncgen->m_yield_from, const_str_plain_throw);
601
+
602
+ if (unlikely(meth == NULL)) {
603
+ if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
604
+ // Release exception, we are done with it now.
605
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
606
+
607
+ return NULL;
608
+ }
609
+
610
+ CLEAR_ERROR_OCCURRED(tstate);
611
+
612
+ // Passing exception ownership to that code.
613
+ goto throw_here;
614
+ }
615
+
616
+ CHECK_EXCEPTION_STATE(exception_state);
617
+
618
+ #if 0
619
+ // TODO: Add slow mode traces.
620
+ PRINT_ITEM(coroutine->m_yield_from);
621
+ PRINT_NEW_LINE();
622
+ #endif
623
+
624
+ Nuitka_MarkAsyncgenAsRunning(asyncgen);
625
+ ret = Nuitka_CallGeneratorThrowMethod(meth, exception_state);
626
+ Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
627
+
628
+ Py_DECREF(meth);
629
+
630
+ // Release exception, we are done with it now.
631
+ RELEASE_ERROR_OCCURRED_STATE(exception_state);
632
+ }
633
+
634
+ if (unlikely(ret == NULL)) {
635
+ PyObject *val;
636
+
637
+ if (Nuitka_PyGen_FetchStopIterationValue(tstate, &val)) {
638
+ CHECK_OBJECT(val);
639
+
640
+ asyncgen->m_yield_from = NULL;
641
+
642
+ // Return value, not to continue with yielding from.
643
+ if (asyncgen->m_yield_from != NULL) {
644
+ CHECK_OBJECT(asyncgen->m_yield_from);
645
+ #if _DEBUG_ASYNCGEN
646
+ PRINT_ASYNCGEN_STATUS("Yield from removal:", asyncgen);
647
+ PRINT_COROUTINE_VALUE("yield_from", asyncgen->m_yield_from);
648
+ #endif
649
+ Py_DECREF(asyncgen->m_yield_from);
650
+ asyncgen->m_yield_from = NULL;
651
+ }
652
+
653
+ #if _DEBUG_ASYNCGEN
654
+ PRINT_ASYNCGEN_STATUS("Sending return value into ourselves", asyncgen);
655
+ PRINT_COROUTINE_VALUE("value", val);
656
+ PRINT_NEW_LINE();
657
+ #endif
658
+
659
+ struct Nuitka_ExceptionPreservationItem no_exception_state;
660
+ INIT_ERROR_OCCURRED_STATE(&no_exception_state);
661
+
662
+ ret = _Nuitka_Asyncgen_send(tstate, asyncgen, val, false, &no_exception_state);
663
+ } else {
664
+ #if _DEBUG_ASYNCGEN
665
+ PRINT_ASYNCGEN_STATUS("Sending exception value into ourselves", asyncgen);
666
+ PRINT_COROUTINE_VALUE("yield_from", asyncgen->m_yield_from);
667
+ PRINT_CURRENT_EXCEPTION();
668
+ PRINT_NEW_LINE();
669
+ #endif
670
+
671
+ struct Nuitka_ExceptionPreservationItem no_exception_state;
672
+ INIT_ERROR_OCCURRED_STATE(&no_exception_state);
673
+
674
+ ret = _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, false, &no_exception_state);
675
+ }
676
+
677
+ #if _DEBUG_ASYNCGEN
678
+ PRINT_ASYNCGEN_STATUS("Leave with value/exception from sending into ourselves:", asyncgen);
679
+ PRINT_COROUTINE_VALUE("return_value", ret);
680
+ PRINT_CURRENT_EXCEPTION();
681
+ PRINT_NEW_LINE();
682
+ #endif
683
+ } else {
684
+ #if _DEBUG_ASYNCGEN
685
+ PRINT_ASYNCGEN_STATUS("Leave with return value:", asyncgen);
686
+ PRINT_COROUTINE_VALUE("return_value", ret);
687
+ PRINT_CURRENT_EXCEPTION();
688
+ PRINT_NEW_LINE();
689
+ #endif
690
+ }
691
+
692
+ return ret;
693
+ }
694
+
695
+ throw_here:
696
+ // We continue to have exception ownership here.
697
+ #if _DEBUG_ASYNCGEN
698
+ PRINT_ASYNCGEN_STATUS("Need to throw into itself", asyncgen);
699
+ #endif
700
+
701
+ if (unlikely(_Nuitka_Generator_check_throw(tstate, exception_state) == false)) {
702
+ // Exception was released by _Nuitka_Generator_check_throw already.
703
+ return NULL;
704
+ }
705
+
706
+ PyObject *result;
707
+
708
+ if (asyncgen->m_status == status_Running) {
709
+ result = _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, false, exception_state);
710
+ } else if (asyncgen->m_status == status_Finished) {
711
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
712
+ result = NULL;
713
+ } else {
714
+ PyTracebackObject *exception_tb = GET_EXCEPTION_STATE_TRACEBACK(exception_state);
715
+
716
+ if (exception_tb == NULL) {
717
+ // TODO: Our compiled objects really need a way to store common
718
+ // stuff in a "shared" part across all instances, and outside of
719
+ // run time, so we could reuse this.
720
+ struct Nuitka_FrameObject *frame =
721
+ MAKE_FUNCTION_FRAME(tstate, asyncgen->m_code_object, asyncgen->m_module, 0);
722
+ SET_EXCEPTION_STATE_TRACEBACK(exception_state,
723
+ MAKE_TRACEBACK(frame, asyncgen->m_code_object->co_firstlineno));
724
+ Py_DECREF(frame);
725
+ }
726
+
727
+ RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
728
+
729
+ #if _DEBUG_ASYNCGEN
730
+ PRINT_ASYNCGEN_STATUS("Finishing from exception", asyncgen);
731
+ PRINT_NEW_LINE();
732
+ #endif
733
+
734
+ Nuitka_MarkAsyncgenAsFinished(asyncgen);
735
+
736
+ result = NULL;
737
+ }
738
+
739
+ #if _DEBUG_ASYNCGEN
740
+ PRINT_ASYNCGEN_STATUS("Leave", asyncgen);
741
+ PRINT_COROUTINE_VALUE("yield_from", asyncgen->m_yield_from);
742
+ PRINT_CURRENT_EXCEPTION();
743
+ PRINT_NEW_LINE();
744
+ #endif
745
+
746
+ return result;
747
+ }
748
+
749
+ static PyObject *Nuitka_Asyncgen_throw(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen, PyObject *args) {
750
+ CHECK_OBJECT(asyncgen);
751
+ CHECK_OBJECT_DEEP(args);
752
+
753
+ PyObject *exception_type;
754
+ PyObject *exception_value = NULL;
755
+ PyTracebackObject *exception_tb = NULL;
756
+
757
+ // This takes no references, that is for us to do.
758
+ int res = PyArg_UnpackTuple(args, "throw", 1, 3, &exception_type, &exception_value, &exception_tb);
759
+
760
+ if (unlikely(res == 0)) {
761
+ return NULL;
762
+ }
763
+
764
+ #if _DEBUG_ASYNCGEN
765
+ PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
766
+ PRINT_EXCEPTION(exception_type, exception_value, exception_tb);
767
+ PRINT_NEW_LINE();
768
+ #endif
769
+
770
+ // Handing ownership of exception over, we need not release it ourselves
771
+ struct Nuitka_ExceptionPreservationItem exception_state;
772
+ if (_Nuitka_Generator_make_throw_exception_state(tstate, &exception_state, exception_type, exception_value,
773
+ exception_tb) == false) {
774
+ return NULL;
775
+ }
776
+
777
+ PyObject *result = _Nuitka_Asyncgen_throw2(tstate, asyncgen, false, &exception_state);
778
+
779
+ if (result == NULL) {
780
+ if (HAS_ERROR_OCCURRED(tstate) == false) {
781
+ SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
782
+ }
783
+ }
784
+
785
+ #if _DEBUG_ASYNCGEN
786
+ PRINT_ASYNCGEN_STATUS("Leave", asyncgen);
787
+ PRINT_COROUTINE_VALUE("return value", result);
788
+ PRINT_CURRENT_EXCEPTION();
789
+ #endif
790
+
791
+ CHECK_EXCEPTION_STATE(&exception_state);
792
+
793
+ return result;
794
+ }
795
+
796
+ static bool _Nuitka_Asyncgen_init_hooks(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen) {
797
+ /* Just do this once per async generator object. */
798
+ if (asyncgen->m_hooks_init_done) {
799
+ return 0;
800
+ }
801
+ asyncgen->m_hooks_init_done = 1;
802
+
803
+ /* Attach the finalizer if any. */
804
+ PyObject *finalizer = tstate->async_gen_finalizer;
805
+ if (finalizer != NULL) {
806
+ Py_INCREF(finalizer);
807
+ asyncgen->m_finalizer = finalizer;
808
+ }
809
+
810
+ /* Call the "firstiter" hook for async generator. */
811
+ PyObject *firstiter = tstate->async_gen_firstiter;
812
+ if (firstiter != NULL) {
813
+ Py_INCREF(firstiter);
814
+
815
+ PyObject *res = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, firstiter, (PyObject *)asyncgen);
816
+
817
+ Py_DECREF(firstiter);
818
+
819
+ if (unlikely(res == NULL)) {
820
+ return true;
821
+ }
822
+
823
+ Py_DECREF(res);
824
+ }
825
+
826
+ return false;
827
+ }
828
+
829
+ static PyObject *Nuitka_AsyncgenAsend_New(struct Nuitka_AsyncgenObject *asyncgen, PyObject *sendval);
830
+ static PyObject *Nuitka_AsyncgenAthrow_New(struct Nuitka_AsyncgenObject *asyncgen, PyObject *args);
831
+
832
+ static PyObject *Nuitka_Asyncgen_anext(struct Nuitka_AsyncgenObject *asyncgen) {
833
+ CHECK_OBJECT(asyncgen);
834
+
835
+ #if _DEBUG_ASYNCGEN
836
+ PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
837
+ PRINT_NEW_LINE();
838
+ #endif
839
+
840
+ PyThreadState *tstate = PyThreadState_GET();
841
+
842
+ if (_Nuitka_Asyncgen_init_hooks(tstate, asyncgen)) {
843
+ return NULL;
844
+ }
845
+
846
+ PyObject *result = Nuitka_AsyncgenAsend_New(asyncgen, Py_None);
847
+
848
+ #if _DEBUG_ASYNCGEN
849
+ PRINT_ASYNCGEN_STATUS("Leave", asyncgen);
850
+ PRINT_COROUTINE_VALUE("result", result);
851
+ PRINT_NEW_LINE();
852
+ #endif
853
+
854
+ return result;
855
+ }
856
+
857
+ static PyObject *Nuitka_Asyncgen_asend(struct Nuitka_AsyncgenObject *asyncgen, PyObject *value) {
858
+ CHECK_OBJECT(asyncgen);
859
+
860
+ PyThreadState *tstate = PyThreadState_GET();
861
+
862
+ if (_Nuitka_Asyncgen_init_hooks(tstate, asyncgen)) {
863
+ return NULL;
864
+ }
865
+
866
+ return Nuitka_AsyncgenAsend_New(asyncgen, value);
867
+ }
868
+
869
+ static PyObject *Nuitka_Asyncgen_aclose(struct Nuitka_AsyncgenObject *asyncgen) {
870
+ CHECK_OBJECT(asyncgen);
871
+
872
+ PyThreadState *tstate = PyThreadState_GET();
873
+
874
+ if (_Nuitka_Asyncgen_init_hooks(tstate, asyncgen)) {
875
+ return NULL;
876
+ }
877
+
878
+ return Nuitka_AsyncgenAthrow_New(asyncgen, NULL);
879
+ }
880
+
881
+ static PyObject *Nuitka_Asyncgen_athrow(struct Nuitka_AsyncgenObject *asyncgen, PyObject *args) {
882
+ CHECK_OBJECT(asyncgen);
883
+
884
+ PyThreadState *tstate = PyThreadState_GET();
885
+
886
+ if (_Nuitka_Asyncgen_init_hooks(tstate, asyncgen)) {
887
+ return NULL;
888
+ }
889
+
890
+ return Nuitka_AsyncgenAthrow_New(asyncgen, args);
891
+ }
892
+
893
+ #if PYTHON_VERSION >= 0x3a0
894
+ static PySendResult _Nuitka_Asyncgen_am_send(struct Nuitka_AsyncgenObject *asyncgen, PyObject *arg, PyObject **result) {
895
+ #if _DEBUG_ASYNCGEN
896
+ PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
897
+ #endif
898
+
899
+ *result = NULL;
900
+
901
+ PyThreadState *tstate = PyThreadState_GET();
902
+
903
+ struct Nuitka_ExceptionPreservationItem exception_state;
904
+ INIT_ERROR_OCCURRED_STATE(&exception_state);
905
+
906
+ Py_INCREF(arg);
907
+ PySendResult res = _Nuitka_Asyncgen_sendR(tstate, asyncgen, arg, false, &exception_state, result);
908
+
909
+ #if _DEBUG_ASYNCGEN
910
+ PRINT_ASYNCGEN_STATUS("Leave", asyncgen);
911
+ PRINT_COROUTINE_VALUE("result", *result);
912
+ PRINT_NEW_LINE();
913
+ #endif
914
+ return res;
915
+ }
916
+ #endif
917
+
918
+ static void Nuitka_Asyncgen_tp_finalize(struct Nuitka_AsyncgenObject *asyncgen) {
919
+ if (asyncgen->m_status != status_Running) {
920
+ return;
921
+ }
922
+
923
+ PyThreadState *tstate = PyThreadState_GET();
924
+
925
+ struct Nuitka_ExceptionPreservationItem saved_exception_state;
926
+
927
+ // Need to call registered finalizer if provided, "asyncio" seems to do
928
+ // that.
929
+ PyObject *finalizer = asyncgen->m_finalizer;
930
+ if (finalizer != NULL && asyncgen->m_closed == false) {
931
+ // Save the current exception, if any.
932
+ FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
933
+
934
+ PyObject *res = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, finalizer, (PyObject *)asyncgen);
935
+
936
+ if (unlikely(res == NULL)) {
937
+ PyErr_WriteUnraisable((PyObject *)asyncgen);
938
+ } else {
939
+ Py_DECREF(res);
940
+ }
941
+
942
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
943
+ return;
944
+ }
945
+
946
+ FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
947
+
948
+ bool close_result = _Nuitka_Asyncgen_close(tstate, asyncgen);
949
+
950
+ if (unlikely(close_result == false)) {
951
+ PyErr_WriteUnraisable((PyObject *)asyncgen);
952
+ }
953
+
954
+ /* Restore the saved exception if any. */
955
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
956
+ }
957
+
958
+ #define MAX_ASYNCGEN_FREE_LIST_COUNT 100
959
+ static struct Nuitka_AsyncgenObject *free_list_asyncgens = NULL;
960
+ static int free_list_asyncgens_count = 0;
961
+
962
+ // TODO: This might have to be finalize actually.
963
+ static void Nuitka_Asyncgen_tp_dealloc(struct Nuitka_AsyncgenObject *asyncgen) {
964
+ #if _DEBUG_REFCOUNTS
965
+ count_active_Nuitka_Asyncgen_Type -= 1;
966
+ count_released_Nuitka_Asyncgen_Type += 1;
967
+ #endif
968
+ if (asyncgen->m_weakrefs != NULL) {
969
+ Nuitka_GC_UnTrack(asyncgen);
970
+
971
+ // TODO: Avoid API call and make this our own function to reuse the
972
+ // pattern of temporarily untracking the value or maybe even to avoid
973
+ // the need to do it. It may also be a lot of work to do that though
974
+ // and maybe having weakrefs is uncommon.
975
+ PyObject_ClearWeakRefs((PyObject *)asyncgen);
976
+
977
+ Nuitka_GC_Track(asyncgen);
978
+ }
979
+
980
+ if (Nuitka_CallFinalizerFromDealloc((PyObject *)asyncgen) == false) {
981
+ return;
982
+ }
983
+
984
+ Nuitka_GC_UnTrack(asyncgen);
985
+
986
+ Py_XDECREF(asyncgen->m_finalizer);
987
+ asyncgen->m_finalizer = NULL;
988
+
989
+ Nuitka_Asyncgen_release_closure(asyncgen);
990
+
991
+ if (asyncgen->m_frame) {
992
+ Nuitka_SetFrameGenerator(asyncgen->m_frame, NULL);
993
+ Py_DECREF(asyncgen->m_frame);
994
+ }
995
+
996
+ // Now it is safe to release references and memory for it.
997
+ Py_DECREF(asyncgen->m_name);
998
+ Py_DECREF(asyncgen->m_qualname);
999
+
1000
+ // TODO: Maybe push this into the freelist code and do
1001
+ // it on allocation.
1002
+ _PyGC_CLEAR_FINALIZED((PyObject *)asyncgen);
1003
+
1004
+ /* Put the object into free list or release to GC */
1005
+ releaseToFreeList(free_list_asyncgens, asyncgen, MAX_ASYNCGEN_FREE_LIST_COUNT);
1006
+ }
1007
+
1008
+ static PyObject *Nuitka_Asyncgen_tp_repr(struct Nuitka_AsyncgenObject *asyncgen) {
1009
+ CHECK_OBJECT(asyncgen);
1010
+
1011
+ return PyUnicode_FromFormat("<compiled_async_generator object %s at %p>",
1012
+ Nuitka_String_AsString(asyncgen->m_qualname), asyncgen);
1013
+ }
1014
+
1015
+ static int Nuitka_Asyncgen_tp_traverse(struct Nuitka_AsyncgenObject *asyncgen, visitproc visit, void *arg) {
1016
+ CHECK_OBJECT(asyncgen);
1017
+
1018
+ Py_VISIT(asyncgen->m_yield_from);
1019
+
1020
+ for (Py_ssize_t i = 0; i < asyncgen->m_closure_given; i++) {
1021
+ Py_VISIT(asyncgen->m_closure[i]);
1022
+ }
1023
+
1024
+ Py_VISIT(asyncgen->m_frame);
1025
+
1026
+ Py_VISIT(asyncgen->m_finalizer);
1027
+
1028
+ return 0;
1029
+ }
1030
+
1031
+ // TODO: Set "__doc__" automatically for method clones of compiled types from
1032
+ // the documentation of built-in original type.
1033
+ static PyMethodDef Nuitka_Asyncgen_methods[] = {{"asend", (PyCFunction)Nuitka_Asyncgen_asend, METH_O, NULL},
1034
+ {"athrow", (PyCFunction)Nuitka_Asyncgen_athrow, METH_VARARGS, NULL},
1035
+ {"aclose", (PyCFunction)Nuitka_Asyncgen_aclose, METH_NOARGS, NULL},
1036
+ {NULL}};
1037
+
1038
+ static PyAsyncMethods Nuitka_Asyncgen_as_async = {
1039
+ 0, // am_await
1040
+ 0, // am_aiter (PyObject_SelfIter)
1041
+ (unaryfunc)Nuitka_Asyncgen_anext // am_anext
1042
+ #if PYTHON_VERSION >= 0x3a0
1043
+ ,
1044
+ (sendfunc)_Nuitka_Asyncgen_am_send // am_send
1045
+ #endif
1046
+ };
1047
+
1048
+ // TODO: Set "__doc__" automatically for method clones of compiled types from
1049
+ // the documentation of built-in original type.
1050
+ static PyGetSetDef Nuitka_Asyncgen_tp_getset[] = {
1051
+ {(char *)"__name__", Nuitka_Asyncgen_get_name, Nuitka_Asyncgen_set_name, NULL},
1052
+ {(char *)"__qualname__", Nuitka_Asyncgen_get_qualname, Nuitka_Asyncgen_set_qualname, NULL},
1053
+ {(char *)"ag_await", Nuitka_Asyncgen_get_ag_await, NULL, NULL},
1054
+ {(char *)"ag_code", Nuitka_Asyncgen_get_code, Nuitka_Asyncgen_set_code, NULL},
1055
+ {(char *)"ag_frame", Nuitka_Asyncgen_get_frame, Nuitka_Asyncgen_set_frame, NULL},
1056
+
1057
+ {NULL}};
1058
+
1059
+ static PyMemberDef Nuitka_Asyncgen_members[] = {
1060
+ {(char *)"ag_running", T_BOOL, offsetof(struct Nuitka_AsyncgenObject, m_running), READONLY},
1061
+ #if PYTHON_VERSION >= 0x380
1062
+ {(char *)"ag_running", T_BOOL, offsetof(struct Nuitka_AsyncgenObject, m_running_async), READONLY},
1063
+ #endif
1064
+ {NULL}};
1065
+
1066
+ PyTypeObject Nuitka_Asyncgen_Type = {
1067
+ PyVarObject_HEAD_INIT(NULL, 0) "compiled_async_generator", // tp_name
1068
+ sizeof(struct Nuitka_AsyncgenObject), // tp_basicsize
1069
+ sizeof(struct Nuitka_CellObject *), // tp_itemsize
1070
+ (destructor)Nuitka_Asyncgen_tp_dealloc, // tp_dealloc
1071
+ 0, // tp_print
1072
+ 0, // tp_getattr
1073
+ 0, // tp_setattr
1074
+ &Nuitka_Asyncgen_as_async, // tp_as_async
1075
+ (reprfunc)Nuitka_Asyncgen_tp_repr, // tp_repr
1076
+ 0, // tp_as_number
1077
+ 0, // tp_as_sequence
1078
+ 0, // tp_as_mapping
1079
+ (hashfunc)Nuitka_Asyncgen_tp_hash, // tp_hash
1080
+ 0, // tp_call
1081
+ 0, // tp_str
1082
+ 0, // tp_getattro (PyObject_GenericGetAttr)
1083
+ 0, // tp_setattro
1084
+ 0, // tp_as_buffer
1085
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, // tp_flags
1086
+ 0, // tp_doc
1087
+ (traverseproc)Nuitka_Asyncgen_tp_traverse, // tp_traverse
1088
+ 0, // tp_clear
1089
+ 0, // tp_richcompare
1090
+ offsetof(struct Nuitka_AsyncgenObject, m_weakrefs), // tp_weaklistoffset
1091
+ 0, // tp_iter
1092
+ 0, // tp_iternext
1093
+ Nuitka_Asyncgen_methods, // tp_methods
1094
+ Nuitka_Asyncgen_members, // tp_members
1095
+ Nuitka_Asyncgen_tp_getset, // tp_getset
1096
+ 0, // tp_base
1097
+ 0, // tp_dict
1098
+ 0, // tp_descr_get
1099
+ 0, // tp_descr_set
1100
+ 0, // tp_dictoffset
1101
+ 0, // tp_init
1102
+ 0, // tp_alloc
1103
+ 0, // tp_new
1104
+ 0, // tp_free
1105
+ 0, // tp_is_gc
1106
+ 0, // tp_bases
1107
+ 0, // tp_mro
1108
+ 0, // tp_cache
1109
+ 0, // tp_subclasses
1110
+ 0, // tp_weaklist
1111
+ 0, // tp_del
1112
+ 0, // tp_version_tag
1113
+ (destructor)Nuitka_Asyncgen_tp_finalize, // tp_finalize
1114
+
1115
+ };
1116
+
1117
+ PyObject *Nuitka_Asyncgen_New(asyncgen_code code, PyObject *module, PyObject *name, PyObject *qualname,
1118
+ PyCodeObject *code_object, struct Nuitka_CellObject **closure, Py_ssize_t closure_given,
1119
+ Py_ssize_t heap_storage_size) {
1120
+ #if _DEBUG_REFCOUNTS
1121
+ count_active_Nuitka_Asyncgen_Type += 1;
1122
+ count_allocated_Nuitka_Asyncgen_Type += 1;
1123
+ #endif
1124
+
1125
+ struct Nuitka_AsyncgenObject *result;
1126
+
1127
+ // TODO: Change the var part of the type to 1 maybe
1128
+ Py_ssize_t full_size = closure_given + (heap_storage_size + sizeof(void *) - 1) / sizeof(void *);
1129
+
1130
+ // Macro to assign result memory from GC or free list.
1131
+ allocateFromFreeList(free_list_asyncgens, struct Nuitka_AsyncgenObject, Nuitka_Asyncgen_Type, full_size);
1132
+
1133
+ // For quicker access of generator heap.
1134
+ result->m_heap_storage = &result->m_closure[closure_given];
1135
+
1136
+ result->m_code = (void *)code;
1137
+
1138
+ CHECK_OBJECT(module);
1139
+ result->m_module = module;
1140
+
1141
+ CHECK_OBJECT(name);
1142
+ result->m_name = name;
1143
+ Py_INCREF(name);
1144
+
1145
+ // The "qualname" defaults to NULL for most compact C code.
1146
+ if (qualname == NULL) {
1147
+ qualname = name;
1148
+ }
1149
+ CHECK_OBJECT(qualname);
1150
+
1151
+ result->m_qualname = qualname;
1152
+ Py_INCREF(qualname);
1153
+
1154
+ result->m_yield_from = NULL;
1155
+
1156
+ memcpy(&result->m_closure[0], closure, closure_given * sizeof(struct Nuitka_CellObject *));
1157
+ result->m_closure_given = closure_given;
1158
+
1159
+ result->m_weakrefs = NULL;
1160
+
1161
+ result->m_status = status_Unused;
1162
+ result->m_running = false;
1163
+ result->m_awaiting = false;
1164
+ #if PYTHON_VERSION >= 0x380
1165
+ result->m_running_async = false;
1166
+ #endif
1167
+
1168
+ result->m_yield_return_index = 0;
1169
+
1170
+ result->m_frame = NULL;
1171
+ result->m_code_object = code_object;
1172
+
1173
+ result->m_resume_frame = NULL;
1174
+
1175
+ result->m_finalizer = NULL;
1176
+ result->m_hooks_init_done = false;
1177
+ result->m_closed = false;
1178
+
1179
+ #if PYTHON_VERSION >= 0x370
1180
+ result->m_exc_state = Nuitka_ExceptionStackItem_Empty;
1181
+ #endif
1182
+
1183
+ static long Nuitka_Asyncgen_counter = 0;
1184
+ result->m_counter = Nuitka_Asyncgen_counter++;
1185
+
1186
+ Nuitka_GC_Track(result);
1187
+ return (PyObject *)result;
1188
+ }
1189
+
1190
+ struct Nuitka_AsyncgenWrappedValueObject {
1191
+ /* Python object folklore: */
1192
+ PyObject_HEAD
1193
+
1194
+ PyObject *m_value;
1195
+ };
1196
+
1197
+ static struct Nuitka_AsyncgenWrappedValueObject *free_list_asyncgen_value_wrappers = NULL;
1198
+ static int free_list_asyncgen_value_wrappers_count = 0;
1199
+
1200
+ static void Nuitka_AsyncgenValueWrapper_tp_dealloc(struct Nuitka_AsyncgenWrappedValueObject *asyncgen_value_wrapper) {
1201
+ #if _DEBUG_REFCOUNTS
1202
+ count_active_Nuitka_AsyncgenValueWrapper_Type -= 1;
1203
+ count_released_Nuitka_AsyncgenValueWrapper_Type += 1;
1204
+ #endif
1205
+
1206
+ Nuitka_GC_UnTrack((PyObject *)asyncgen_value_wrapper);
1207
+
1208
+ CHECK_OBJECT(asyncgen_value_wrapper->m_value);
1209
+ Py_DECREF(asyncgen_value_wrapper->m_value);
1210
+
1211
+ /* Put the object into free list or release to GC */
1212
+ releaseToFreeList(free_list_asyncgen_value_wrappers, asyncgen_value_wrapper, MAX_ASYNCGEN_FREE_LIST_COUNT);
1213
+ }
1214
+
1215
+ static int Nuitka_AsyncgenValueWrapper_tp_traverse(struct Nuitka_AsyncgenWrappedValueObject *asyncgen_value_wrapper,
1216
+ visitproc visit, void *arg) {
1217
+ CHECK_OBJECT(asyncgen_value_wrapper);
1218
+
1219
+ Py_VISIT(asyncgen_value_wrapper->m_value);
1220
+
1221
+ return 0;
1222
+ }
1223
+
1224
+ static PyTypeObject Nuitka_AsyncgenValueWrapper_Type = {
1225
+ PyVarObject_HEAD_INIT(NULL, 0) "compiled_async_generator_wrapped_value", // tp_name
1226
+ sizeof(struct Nuitka_AsyncgenWrappedValueObject), // tp_basicsize
1227
+ 0, // tp_itemsize
1228
+ (destructor)Nuitka_AsyncgenValueWrapper_tp_dealloc, // tp_dealloc
1229
+ 0, // tp_print
1230
+ 0, // tp_getattr
1231
+ 0, // tp_setattr
1232
+ 0, // tp_as_async
1233
+ 0, // tp_repr
1234
+ 0, // tp_as_number
1235
+ 0, // tp_as_sequence
1236
+ 0, // tp_as_mapping
1237
+ 0, // tp_hash
1238
+ 0, // tp_call
1239
+ 0, // tp_str
1240
+ 0, // tp_getattro (PyObject_GenericGetAttr)
1241
+ 0, // tp_setattro
1242
+ 0, // tp_as_buffer
1243
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, // tp_flags
1244
+ 0, // tp_doc
1245
+ (traverseproc)Nuitka_AsyncgenValueWrapper_tp_traverse, // tp_traverse
1246
+ 0, // tp_clear
1247
+ 0, // tp_richcompare
1248
+ 0, // tp_weaklistoffset
1249
+ 0, // tp_iter
1250
+ 0, // tp_iternext
1251
+ 0, // tp_methods
1252
+ 0, // tp_members
1253
+ 0, // tp_getset
1254
+ 0, // tp_base
1255
+ 0, // tp_dict
1256
+ 0, // tp_descr_get
1257
+ 0, // tp_descr_set
1258
+ 0, // tp_dictoffset
1259
+ 0, // tp_init
1260
+ 0, // tp_alloc
1261
+ 0, // tp_new
1262
+ };
1263
+
1264
+ // Note: This expects a reference given in value, because that is the
1265
+ // only way we use it.
1266
+ static PyObject *Nuitka_AsyncgenValueWrapper_New(PyObject *value) {
1267
+ CHECK_OBJECT(value);
1268
+
1269
+ #if _DEBUG_REFCOUNTS
1270
+ count_active_Nuitka_AsyncgenValueWrapper_Type += 1;
1271
+ #endif
1272
+
1273
+ struct Nuitka_AsyncgenWrappedValueObject *result;
1274
+
1275
+ allocateFromFreeListFixed(free_list_asyncgen_value_wrappers, struct Nuitka_AsyncgenWrappedValueObject,
1276
+ Nuitka_AsyncgenValueWrapper_Type);
1277
+
1278
+ result->m_value = value;
1279
+
1280
+ Nuitka_GC_Track(result);
1281
+
1282
+ return (PyObject *)result;
1283
+ }
1284
+
1285
+ #define Nuitka_AsyncgenWrappedValue_CheckExact(o) (Py_TYPE(o) == &Nuitka_AsyncgenValueWrapper_Type)
1286
+
1287
+ typedef enum {
1288
+ AWAITABLE_STATE_INIT = 0, /* Has not yet been iterated. */
1289
+ AWAITABLE_STATE_ITER = 1, /* Being iterated currently. */
1290
+ AWAITABLE_STATE_CLOSED = 2, /* Closed, no more. */
1291
+ } AwaitableState;
1292
+
1293
+ struct Nuitka_AsyncgenAsendObject {
1294
+ /* Python object folklore: */
1295
+ PyObject_HEAD
1296
+
1297
+ struct Nuitka_AsyncgenObject *m_gen;
1298
+ PyObject *m_sendval;
1299
+
1300
+ AwaitableState m_state;
1301
+ };
1302
+
1303
+ #if _DEBUG_ASYNCGEN
1304
+
1305
+ NUITKA_MAY_BE_UNUSED static void _PRINT_ASYNCGEN_ASEND_STATUS(char const *descriptor, char const *context,
1306
+ struct Nuitka_AsyncgenAsendObject *asyncgen_asend) {
1307
+ char const *status;
1308
+
1309
+ switch (asyncgen_asend->m_state) {
1310
+ case AWAITABLE_STATE_INIT:
1311
+ status = "(init)";
1312
+ break;
1313
+ case AWAITABLE_STATE_ITER:
1314
+ status = "(iter)";
1315
+ break;
1316
+ case AWAITABLE_STATE_CLOSED:
1317
+ status = "(closed)";
1318
+ break;
1319
+ default:
1320
+ status = "(ILLEGAL)";
1321
+ break;
1322
+ }
1323
+
1324
+ PRINT_STRING(descriptor);
1325
+ PRINT_STRING(" : ");
1326
+ PRINT_STRING(context);
1327
+ PRINT_STRING(" ");
1328
+ PRINT_ITEM((PyObject *)asyncgen_asend);
1329
+ PRINT_STRING(" ");
1330
+ PRINT_STRING(status);
1331
+ PRINT_NEW_LINE();
1332
+ }
1333
+
1334
+ #define PRINT_ASYNCGEN_ASEND_STATUS(context, asyncgen_asend) \
1335
+ _PRINT_ASYNCGEN_ASEND_STATUS(__FUNCTION__, context, asyncgen_asend)
1336
+
1337
+ #endif
1338
+
1339
+ /**
1340
+ * These can be created by byte code loop, and we don't now its internals,
1341
+ * yet we have to unwrap ourselves too. These could break in future updates,
1342
+ * and ideally we would have checks to cover those.
1343
+ */
1344
+
1345
+ struct _PyAsyncGenWrappedValue {
1346
+ /* Python object folklore: */
1347
+ PyObject_HEAD
1348
+
1349
+ PyObject *agw_val;
1350
+ };
1351
+
1352
+ #if PYTHON_VERSION < 0x3d0
1353
+ #define _PyAsyncGenWrappedValue_CheckExact(o) (Py_TYPE(o) == &_PyAsyncGenWrappedValue_Type)
1354
+ #else
1355
+ static PyTypeObject *Nuitka_PyAsyncGenWrappedValue_Type = NULL;
1356
+
1357
+ #define _PyAsyncGenWrappedValue_CheckExact(o) (Py_TYPE(o) == Nuitka_PyAsyncGenWrappedValue_Type)
1358
+ #endif
1359
+
1360
+ static PyObject *_Nuitka_Asyncgen_unwrap_value(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen,
1361
+ PyObject *result) {
1362
+ CHECK_OBJECT(asyncgen);
1363
+ CHECK_OBJECT_X(result);
1364
+
1365
+ if (result == NULL) {
1366
+ PyObject *error = GET_ERROR_OCCURRED(tstate);
1367
+
1368
+ if (error == NULL) {
1369
+ SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
1370
+ asyncgen->m_closed = true;
1371
+ } else if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, error, PyExc_StopAsyncIteration) ||
1372
+ EXCEPTION_MATCH_BOOL_SINGLE(tstate, error, PyExc_GeneratorExit)) {
1373
+ asyncgen->m_closed = true;
1374
+ }
1375
+
1376
+ #if PYTHON_VERSION >= 0x380
1377
+ asyncgen->m_running_async = false;
1378
+ #endif
1379
+ return NULL;
1380
+ }
1381
+
1382
+ if (_PyAsyncGenWrappedValue_CheckExact(result)) {
1383
+ /* async yield */
1384
+ Nuitka_SetStopIterationValue(tstate, ((struct _PyAsyncGenWrappedValue *)result)->agw_val);
1385
+
1386
+ Py_DECREF(result);
1387
+
1388
+ #if PYTHON_VERSION >= 0x380
1389
+ asyncgen->m_running_async = false;
1390
+ #endif
1391
+ return NULL;
1392
+ } else if (Nuitka_AsyncgenWrappedValue_CheckExact(result)) {
1393
+ /* async yield */
1394
+ Nuitka_SetStopIterationValue(tstate, ((struct Nuitka_AsyncgenWrappedValueObject *)result)->m_value);
1395
+
1396
+ Py_DECREF(result);
1397
+
1398
+ #if PYTHON_VERSION >= 0x380
1399
+ asyncgen->m_running_async = false;
1400
+ #endif
1401
+ return NULL;
1402
+ }
1403
+
1404
+ return result;
1405
+ }
1406
+
1407
+ static struct Nuitka_AsyncgenAsendObject *free_list_asyncgen_asends = NULL;
1408
+ static int free_list_asyncgen_asends_count = 0;
1409
+
1410
+ static void Nuitka_AsyncgenAsend_tp_dealloc(struct Nuitka_AsyncgenAsendObject *asyncgen_asend) {
1411
+ #if _DEBUG_REFCOUNTS
1412
+ count_active_Nuitka_AsyncgenAsend_Type -= 1;
1413
+ count_released_Nuitka_AsyncgenAsend_Type += 1;
1414
+ #endif
1415
+
1416
+ Nuitka_GC_UnTrack(asyncgen_asend);
1417
+
1418
+ CHECK_OBJECT(asyncgen_asend->m_gen);
1419
+ Py_DECREF(asyncgen_asend->m_gen);
1420
+
1421
+ CHECK_OBJECT(asyncgen_asend->m_sendval);
1422
+ Py_DECREF(asyncgen_asend->m_sendval);
1423
+
1424
+ releaseToFreeList(free_list_asyncgen_asends, asyncgen_asend, MAX_ASYNCGEN_FREE_LIST_COUNT);
1425
+ }
1426
+
1427
+ static int Nuitka_AsyncgenAsend_tp_traverse(struct Nuitka_AsyncgenAsendObject *asyncgen_asend, visitproc visit,
1428
+ void *arg) {
1429
+ CHECK_OBJECT(asyncgen_asend);
1430
+
1431
+ CHECK_OBJECT(asyncgen_asend->m_gen);
1432
+ CHECK_OBJECT(asyncgen_asend->m_sendval);
1433
+
1434
+ Py_VISIT(asyncgen_asend->m_gen);
1435
+ Py_VISIT(asyncgen_asend->m_sendval);
1436
+
1437
+ return 0;
1438
+ }
1439
+
1440
+ static PyObject *Nuitka_AsyncgenAsend_send(struct Nuitka_AsyncgenAsendObject *asyncgen_asend, PyObject *arg) {
1441
+ #if _DEBUG_ASYNCGEN
1442
+ PRINT_ASYNCGEN_ASEND_STATUS("Enter", asyncgen_asend);
1443
+ PRINT_COROUTINE_VALUE("arg", arg);
1444
+ PRINT_NEW_LINE();
1445
+ #endif
1446
+
1447
+ PyThreadState *tstate = PyThreadState_GET();
1448
+
1449
+ if (asyncgen_asend->m_state == AWAITABLE_STATE_CLOSED) {
1450
+ #if PYTHON_VERSION < 0x390
1451
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
1452
+ #else
1453
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "cannot reuse already awaited __anext__()/asend()");
1454
+ #endif
1455
+
1456
+ #if _DEBUG_ASYNCGEN
1457
+ PRINT_ASYNCGEN_ASEND_STATUS("Leave", asyncgen_asend);
1458
+ PRINT_STRING("Closed -> StopIteration\n");
1459
+ PRINT_CURRENT_EXCEPTION();
1460
+ PRINT_NEW_LINE();
1461
+ #endif
1462
+
1463
+ return NULL;
1464
+ } else if (asyncgen_asend->m_state == AWAITABLE_STATE_INIT) {
1465
+ #if PYTHON_VERSION >= 0x380
1466
+ if (asyncgen_asend->m_gen->m_running_async) {
1467
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
1468
+ "anext(): asynchronous generator is already running");
1469
+ return NULL;
1470
+ }
1471
+ #endif
1472
+ if (arg == NULL || arg == Py_None) {
1473
+ arg = asyncgen_asend->m_sendval;
1474
+ }
1475
+
1476
+ asyncgen_asend->m_state = AWAITABLE_STATE_ITER;
1477
+
1478
+ #if _DEBUG_ASYNCGEN
1479
+ PRINT_STRING("Init -> begin iteration\n");
1480
+ PRINT_COROUTINE_VALUE("computed arg from sendval", arg);
1481
+ PRINT_NEW_LINE();
1482
+ #endif
1483
+ }
1484
+
1485
+ #if PYTHON_VERSION >= 0x380
1486
+ asyncgen_asend->m_gen->m_running_async = true;
1487
+ #endif
1488
+
1489
+ #if _DEBUG_ASYNCGEN
1490
+ PRINT_STRING("Deferring to _Nuitka_Asyncgen_send\n");
1491
+ PRINT_NEW_LINE();
1492
+ #endif
1493
+
1494
+ Py_INCREF(arg);
1495
+
1496
+ struct Nuitka_ExceptionPreservationItem exception_state;
1497
+ INIT_ERROR_OCCURRED_STATE(&exception_state);
1498
+
1499
+ PyObject *result = _Nuitka_Asyncgen_send(tstate, asyncgen_asend->m_gen, arg, false, &exception_state);
1500
+
1501
+ #if _DEBUG_ASYNCGEN
1502
+ PRINT_ASYNCGEN_ASEND_STATUS("Returned from _Nuitka_Asyncgen_send", asyncgen_asend);
1503
+ PRINT_COROUTINE_VALUE("result", result);
1504
+ PRINT_CURRENT_EXCEPTION();
1505
+ #endif
1506
+
1507
+ result = _Nuitka_Asyncgen_unwrap_value(tstate, asyncgen_asend->m_gen, result);
1508
+ #if _DEBUG_ASYNCGEN
1509
+ PRINT_ASYNCGEN_ASEND_STATUS("Returned from _Nuitka_Asyncgen_unwrap_value", asyncgen_asend);
1510
+ PRINT_COROUTINE_VALUE("result", result);
1511
+ PRINT_CURRENT_EXCEPTION();
1512
+ #endif
1513
+
1514
+ #if _DEBUG_ASYNCGEN
1515
+ PRINT_COROUTINE_VALUE("result", result);
1516
+ PRINT_CURRENT_EXCEPTION();
1517
+ PRINT_NEW_LINE();
1518
+ #endif
1519
+
1520
+ if (result == NULL) {
1521
+ asyncgen_asend->m_state = AWAITABLE_STATE_CLOSED;
1522
+ }
1523
+
1524
+ #if _DEBUG_ASYNCGEN
1525
+ PRINT_ASYNCGEN_ASEND_STATUS("Leave", asyncgen_asend);
1526
+ PRINT_COROUTINE_VALUE("result", result);
1527
+ PRINT_NEW_LINE();
1528
+ #endif
1529
+
1530
+ return result;
1531
+ }
1532
+
1533
+ static PyObject *Nuitka_AsyncgenAsend_tp_iternext(struct Nuitka_AsyncgenAsendObject *asyncgen_asend) {
1534
+ #if _DEBUG_ASYNCGEN
1535
+ PRINT_ASYNCGEN_ASEND_STATUS("Enter", asyncgen_asend);
1536
+ PRINT_STRING("Deferring to Nuitka_AsyncgenAsend_send(Py_None)\n");
1537
+ PRINT_NEW_LINE();
1538
+ #endif
1539
+
1540
+ PyObject *result = Nuitka_AsyncgenAsend_send(asyncgen_asend, Py_None);
1541
+
1542
+ #if _DEBUG_ASYNCGEN
1543
+ PRINT_ASYNCGEN_ASEND_STATUS("Leave", asyncgen_asend);
1544
+ PRINT_COROUTINE_VALUE("result", result);
1545
+ PRINT_NEW_LINE();
1546
+ #endif
1547
+
1548
+ return result;
1549
+ }
1550
+
1551
+ static PyObject *Nuitka_AsyncgenAsend_throw(struct Nuitka_AsyncgenAsendObject *asyncgen_asend, PyObject *args) {
1552
+ #if _DEBUG_ASYNCGEN
1553
+ PRINT_ASYNCGEN_ASEND_STATUS("Enter", asyncgen_asend);
1554
+ PRINT_STRING("Nuitka_AsyncgenAsend_throw: args:");
1555
+ PRINT_ITEM(args);
1556
+ PRINT_NEW_LINE();
1557
+ PRINT_STRING("Nuitka_AsyncgenAsend_throw: On entry: ");
1558
+ PRINT_CURRENT_EXCEPTION();
1559
+ #endif
1560
+
1561
+ PyThreadState *tstate = PyThreadState_GET();
1562
+
1563
+ if (asyncgen_asend->m_state == AWAITABLE_STATE_CLOSED) {
1564
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
1565
+ return NULL;
1566
+ }
1567
+
1568
+ PyObject *result = Nuitka_Asyncgen_throw(tstate, asyncgen_asend->m_gen, args);
1569
+
1570
+ #if _DEBUG_ASYNCGEN
1571
+ PRINT_STRING("Nuitka_AsyncgenAsend_throw: Async throw result:");
1572
+ PRINT_ITEM(result);
1573
+ PRINT_STRING(" exception: ");
1574
+ PRINT_CURRENT_EXCEPTION();
1575
+ #endif
1576
+
1577
+ result = _Nuitka_Asyncgen_unwrap_value(tstate, asyncgen_asend->m_gen, result);
1578
+
1579
+ if (result == NULL) {
1580
+ asyncgen_asend->m_state = AWAITABLE_STATE_CLOSED;
1581
+ }
1582
+
1583
+ #if _DEBUG_ASYNCGEN
1584
+ PRINT_STRING("Nuitka_AsyncgenAsend_throw: Leave with result: ");
1585
+ PRINT_ITEM(result);
1586
+ PRINT_NEW_LINE();
1587
+ PRINT_STRING("Nuitka_AsyncgenAsend_throw: Leave with exception: ");
1588
+ PRINT_CURRENT_EXCEPTION();
1589
+ PRINT_STRING("Nuitka_AsyncgenAsend_throw: Leave with exception: ");
1590
+ PRINT_PUBLISHED_EXCEPTION();
1591
+ PRINT_NEW_LINE();
1592
+ #endif
1593
+ CHECK_OBJECT_DEEP(args);
1594
+
1595
+ return result;
1596
+ }
1597
+
1598
+ static PyObject *_Nuitka_AsyncgenAsend_throw2(PyThreadState *tstate, struct Nuitka_AsyncgenAsendObject *asyncgen_asend,
1599
+ struct Nuitka_ExceptionPreservationItem *exception_state) {
1600
+ #if _DEBUG_ASYNCGEN
1601
+ PRINT_ASYNCGEN_ASEND_STATUS("Enter", asyncgen_asend);
1602
+ PRINT_EXCEPTION_STATE(exception_state);
1603
+ PRINT_CURRENT_EXCEPTION();
1604
+ PRINT_NEW_LINE();
1605
+ #endif
1606
+
1607
+ if (asyncgen_asend->m_state == AWAITABLE_STATE_CLOSED) {
1608
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
1609
+ return NULL;
1610
+ }
1611
+
1612
+ PyObject *result = _Nuitka_Asyncgen_throw2(tstate, asyncgen_asend->m_gen, false, exception_state);
1613
+
1614
+ // TODO: This might not be all that necessary as this is not directly outside facing,
1615
+ // but there were tests failing when this was not the specific value.
1616
+ if (result == NULL) {
1617
+ if (HAS_ERROR_OCCURRED(tstate) == false) {
1618
+ SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
1619
+ }
1620
+ }
1621
+
1622
+ #if _DEBUG_ASYNCGEN
1623
+ PRINT_ASYNCGEN_ASEND_STATUS("Got result", asyncgen_asend);
1624
+ PRINT_COROUTINE_VALUE("result", result);
1625
+ PRINT_CURRENT_EXCEPTION();
1626
+ #endif
1627
+
1628
+ result = _Nuitka_Asyncgen_unwrap_value(tstate, asyncgen_asend->m_gen, result);
1629
+
1630
+ #if _DEBUG_ASYNCGEN
1631
+ PRINT_COROUTINE_VALUE("unwrapped", result);
1632
+ PRINT_NEW_LINE();
1633
+ #endif
1634
+
1635
+ if (result == NULL) {
1636
+ asyncgen_asend->m_state = AWAITABLE_STATE_CLOSED;
1637
+ }
1638
+
1639
+ #if _DEBUG_ASYNCGEN
1640
+ PRINT_ASYNCGEN_ASEND_STATUS("Leave", asyncgen_asend);
1641
+ PRINT_COROUTINE_VALUE("result", result);
1642
+ PRINT_CURRENT_EXCEPTION();
1643
+ PRINT_NEW_LINE();
1644
+ #endif
1645
+ return result;
1646
+ }
1647
+
1648
+ static PyObject *Nuitka_AsyncgenAsend_close(struct Nuitka_AsyncgenAsendObject *asyncgen_asend, PyObject *args) {
1649
+ asyncgen_asend->m_state = AWAITABLE_STATE_CLOSED;
1650
+
1651
+ Py_INCREF_IMMORTAL(Py_None);
1652
+ return Py_None;
1653
+ }
1654
+
1655
+ static PyObject *Nuitka_AsyncgenAsend_tp_repr(struct Nuitka_AsyncgenAsendObject *asyncgen_asend) {
1656
+ return PyUnicode_FromFormat("<compiled_async_generator_asend of %s at %p>",
1657
+ Nuitka_String_AsString(asyncgen_asend->m_gen->m_qualname), asyncgen_asend);
1658
+ }
1659
+
1660
+ static PyMethodDef Nuitka_AsyncgenAsend_methods[] = {
1661
+ {"send", (PyCFunction)Nuitka_AsyncgenAsend_send, METH_O, NULL},
1662
+ {"throw", (PyCFunction)Nuitka_AsyncgenAsend_throw, METH_VARARGS, NULL},
1663
+ {"close", (PyCFunction)Nuitka_AsyncgenAsend_close, METH_NOARGS, NULL},
1664
+ {NULL}};
1665
+
1666
+ static PyAsyncMethods Nuitka_AsyncgenAsend_as_async = {
1667
+ 0, // am_await (PyObject_SelfIter)
1668
+ 0, // am_aiter
1669
+ 0 // am_anext
1670
+ };
1671
+
1672
+ static PyTypeObject Nuitka_AsyncgenAsend_Type = {
1673
+ PyVarObject_HEAD_INIT(NULL, 0) "compiled_async_generator_asend", // tp_name
1674
+ sizeof(struct Nuitka_AsyncgenAsendObject), // tp_basicsize
1675
+ 0, // tp_itemsize
1676
+ (destructor)Nuitka_AsyncgenAsend_tp_dealloc, // tp_dealloc
1677
+ 0, // tp_print
1678
+ 0, // tp_getattr
1679
+ 0, // tp_setattr
1680
+ &Nuitka_AsyncgenAsend_as_async, // tp_as_async
1681
+ (reprfunc)Nuitka_AsyncgenAsend_tp_repr, // tp_repr
1682
+ 0, // tp_as_number
1683
+ 0, // tp_as_sequence
1684
+ 0, // tp_as_mapping
1685
+ 0, // tp_hash
1686
+ 0, // tp_call
1687
+ 0, // tp_str
1688
+ 0, // tp_getattro (PyObject_GenericGetAttr)
1689
+ 0, // tp_setattro
1690
+ 0, // tp_as_buffer
1691
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, // tp_flags
1692
+ 0, // tp_doc
1693
+ (traverseproc)Nuitka_AsyncgenAsend_tp_traverse, // tp_traverse
1694
+ 0, // tp_clear
1695
+ 0, // tp_richcompare
1696
+ 0, // tp_weaklistoffset
1697
+ 0, // tp_iter (PyObject_SelfIter)
1698
+ (iternextfunc)Nuitka_AsyncgenAsend_tp_iternext, // tp_iternext
1699
+ Nuitka_AsyncgenAsend_methods, // tp_methods
1700
+ 0, // tp_members
1701
+ 0, // tp_getset
1702
+ 0, // tp_base
1703
+ 0, // tp_dict
1704
+ 0, // tp_descr_get
1705
+ 0, // tp_descr_set
1706
+ 0, // tp_dictoffset
1707
+ 0, // tp_init
1708
+ 0, // tp_alloc
1709
+ 0, // tp_new
1710
+ };
1711
+
1712
+ static bool Nuitka_AsyncgenAsend_Check(PyObject *object) { return Py_TYPE(object) == &Nuitka_AsyncgenAsend_Type; }
1713
+
1714
+ static PyObject *Nuitka_AsyncgenAsend_New(struct Nuitka_AsyncgenObject *asyncgen, PyObject *send_value) {
1715
+ CHECK_OBJECT(asyncgen);
1716
+ CHECK_OBJECT(send_value);
1717
+
1718
+ #if _DEBUG_REFCOUNTS
1719
+ count_active_Nuitka_AsyncgenAsend_Type += 1;
1720
+ count_allocated_Nuitka_AsyncgenAsend_Type += 1;
1721
+ #endif
1722
+
1723
+ struct Nuitka_AsyncgenAsendObject *result;
1724
+
1725
+ allocateFromFreeListFixed(free_list_asyncgen_asends, struct Nuitka_AsyncgenAsendObject, Nuitka_AsyncgenAsend_Type);
1726
+
1727
+ Py_INCREF(asyncgen);
1728
+ result->m_gen = asyncgen;
1729
+
1730
+ Py_INCREF(send_value);
1731
+ result->m_sendval = send_value;
1732
+
1733
+ result->m_state = AWAITABLE_STATE_INIT;
1734
+
1735
+ Nuitka_GC_Track(result);
1736
+ return (PyObject *)result;
1737
+ }
1738
+
1739
+ struct Nuitka_AsyncgenAthrowObject {
1740
+ /* Python object folklore: */
1741
+ PyObject_HEAD
1742
+
1743
+ // The asyncgen we are working for.
1744
+ struct Nuitka_AsyncgenObject *m_gen;
1745
+ // Arguments, NULL in case of close, otherwise throw arguments.
1746
+ PyObject *m_args;
1747
+
1748
+ AwaitableState m_state;
1749
+ };
1750
+
1751
+ #if _DEBUG_ASYNCGEN
1752
+
1753
+ NUITKA_MAY_BE_UNUSED static void _PRINT_ASYNCGEN_ATHROW_STATUS(char const *descriptor, char const *context,
1754
+ struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow) {
1755
+ char const *status;
1756
+
1757
+ switch (asyncgen_athrow->m_state) {
1758
+ case AWAITABLE_STATE_INIT:
1759
+ status = "(init)";
1760
+ break;
1761
+ case AWAITABLE_STATE_ITER:
1762
+ status = "(iter)";
1763
+ break;
1764
+ case AWAITABLE_STATE_CLOSED:
1765
+ status = "(closed)";
1766
+ break;
1767
+ default:
1768
+ status = "(ILLEGAL)";
1769
+ break;
1770
+ }
1771
+
1772
+ PRINT_STRING(descriptor);
1773
+ PRINT_STRING(" : ");
1774
+ PRINT_STRING(context);
1775
+ PRINT_STRING(" ");
1776
+ PRINT_ITEM((PyObject *)asyncgen_athrow);
1777
+ PRINT_STRING(" ");
1778
+ PRINT_STRING(status);
1779
+ PRINT_NEW_LINE();
1780
+ }
1781
+
1782
+ #define PRINT_ASYNCGEN_ATHROW_STATUS(context, coroutine) \
1783
+ _PRINT_ASYNCGEN_ATHROW_STATUS(__FUNCTION__, context, asyncgen_athrow)
1784
+
1785
+ #endif
1786
+
1787
+ static struct Nuitka_AsyncgenAthrowObject *free_list_asyncgen_athrows = NULL;
1788
+ static int free_list_asyncgen_athrows_count = 0;
1789
+
1790
+ static void Nuitka_AsyncgenAthrow_dealloc(struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow) {
1791
+ #if _DEBUG_REFCOUNTS
1792
+ count_active_Nuitka_AsyncgenAthrow_Type -= 1;
1793
+ count_released_Nuitka_AsyncgenAthrow_Type += 1;
1794
+ #endif
1795
+
1796
+ Nuitka_GC_UnTrack(asyncgen_athrow);
1797
+
1798
+ CHECK_OBJECT(asyncgen_athrow->m_gen);
1799
+ Py_DECREF(asyncgen_athrow->m_gen);
1800
+
1801
+ CHECK_OBJECT_X(asyncgen_athrow->m_args);
1802
+ Py_XDECREF(asyncgen_athrow->m_args);
1803
+
1804
+ /* Put the object into free list or release to GC */
1805
+ releaseToFreeList(free_list_asyncgen_athrows, asyncgen_athrow, MAX_ASYNCGEN_FREE_LIST_COUNT);
1806
+ }
1807
+
1808
+ static int Nuitka_AsyncgenAthrow_traverse(struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow, visitproc visit,
1809
+ void *arg) {
1810
+ Py_VISIT(asyncgen_athrow->m_gen);
1811
+ Py_VISIT(asyncgen_athrow->m_args);
1812
+
1813
+ return 0;
1814
+ }
1815
+
1816
+ static PyObject *Nuitka_AsyncgenAthrow_send(struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow, PyObject *arg) {
1817
+ #if _DEBUG_ASYNCGEN
1818
+ PRINT_ASYNCGEN_ATHROW_STATUS("Enter", asyncgen_athrow);
1819
+ PRINT_COROUTINE_VALUE("arg", arg);
1820
+ PRINT_NEW_LINE();
1821
+ #endif
1822
+ PyThreadState *tstate = PyThreadState_GET();
1823
+
1824
+ struct Nuitka_AsyncgenObject *asyncgen = asyncgen_athrow->m_gen;
1825
+
1826
+ // Closing twice is not allowed with 3.9 or higher.
1827
+ if (asyncgen_athrow->m_state == AWAITABLE_STATE_CLOSED) {
1828
+ #if PYTHON_VERSION < 0x390
1829
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
1830
+ #else
1831
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "cannot reuse already awaited aclose()/athrow()");
1832
+ #endif
1833
+
1834
+ return NULL;
1835
+ }
1836
+
1837
+ // If finished, just report StopIteration.
1838
+ if (asyncgen->m_status == status_Finished) {
1839
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
1840
+ return NULL;
1841
+ }
1842
+
1843
+ PyObject *retval;
1844
+
1845
+ if (asyncgen_athrow->m_state == AWAITABLE_STATE_INIT) {
1846
+ #if PYTHON_VERSION >= 0x380
1847
+ if (asyncgen_athrow->m_gen->m_running_async) {
1848
+ if (asyncgen_athrow->m_args == NULL) {
1849
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
1850
+ "aclose(): asynchronous generator is already running");
1851
+ } else {
1852
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
1853
+ "athrow(): asynchronous generator is already running");
1854
+ }
1855
+ return NULL;
1856
+ }
1857
+ #endif
1858
+
1859
+ // Can also close only once.
1860
+ if (asyncgen->m_closed) {
1861
+ #if PYTHON_VERSION >= 0x380
1862
+ asyncgen_athrow->m_state = AWAITABLE_STATE_CLOSED;
1863
+ SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
1864
+ #else
1865
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
1866
+ #endif
1867
+ return NULL;
1868
+ }
1869
+
1870
+ // Starting accepts only "None" as input value.
1871
+ if (arg != Py_None) {
1872
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
1873
+ "can't send non-None value to a just-started coroutine");
1874
+
1875
+ return NULL;
1876
+ }
1877
+
1878
+ #if PYTHON_VERSION >= 0x380
1879
+ asyncgen_athrow->m_gen->m_running_async = true;
1880
+ #endif
1881
+ asyncgen_athrow->m_state = AWAITABLE_STATE_ITER;
1882
+
1883
+ if (asyncgen_athrow->m_args == NULL) {
1884
+ asyncgen->m_closed = true;
1885
+
1886
+ struct Nuitka_ExceptionPreservationItem exception_state;
1887
+ SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, &exception_state, PyExc_GeneratorExit, NULL, NULL);
1888
+
1889
+ retval = _Nuitka_Asyncgen_throw2(tstate, asyncgen,
1890
+ 1, /* Do not close generator when PyExc_GeneratorExit is passed */
1891
+ &exception_state);
1892
+
1893
+ if (retval != NULL) {
1894
+ if (_PyAsyncGenWrappedValue_CheckExact(retval) || Nuitka_AsyncgenWrappedValue_CheckExact(retval)) {
1895
+ #if PYTHON_VERSION >= 0x380
1896
+ asyncgen_athrow->m_gen->m_running_async = false;
1897
+ #endif
1898
+
1899
+ Py_DECREF(retval);
1900
+
1901
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
1902
+ "async generator ignored GeneratorExit");
1903
+
1904
+ return NULL;
1905
+ }
1906
+ }
1907
+ } else {
1908
+ PyObject *exception_type;
1909
+ PyObject *exception_value = NULL;
1910
+ PyTracebackObject *exception_tb = NULL;
1911
+
1912
+ if (unlikely(!PyArg_UnpackTuple(asyncgen_athrow->m_args, "athrow", 1, 3, &exception_type, &exception_value,
1913
+ &exception_tb))) {
1914
+ return NULL;
1915
+ }
1916
+
1917
+ // Handing ownership of exception over, we need not release it ourselves
1918
+ struct Nuitka_ExceptionPreservationItem exception_state;
1919
+ if (_Nuitka_Generator_make_throw_exception_state(tstate, &exception_state, exception_type, exception_value,
1920
+ exception_tb) == false) {
1921
+ return NULL;
1922
+ }
1923
+
1924
+ retval = _Nuitka_Asyncgen_throw2(tstate, asyncgen,
1925
+ 0, /* Do not close generator when PyExc_GeneratorExit is passed */
1926
+ &exception_state);
1927
+
1928
+ retval = _Nuitka_Asyncgen_unwrap_value(tstate, asyncgen, retval);
1929
+ }
1930
+
1931
+ if (retval == NULL) {
1932
+ goto check_error;
1933
+ }
1934
+
1935
+ return retval;
1936
+ }
1937
+
1938
+ assert(asyncgen_athrow->m_state == AWAITABLE_STATE_ITER);
1939
+
1940
+ struct Nuitka_ExceptionPreservationItem exception_state;
1941
+ INIT_ERROR_OCCURRED_STATE(&exception_state);
1942
+
1943
+ Py_INCREF(arg);
1944
+ retval = _Nuitka_Asyncgen_send(tstate, asyncgen, arg, false, &exception_state);
1945
+
1946
+ if (asyncgen_athrow->m_args) {
1947
+ return _Nuitka_Asyncgen_unwrap_value(tstate, asyncgen, retval);
1948
+ } else {
1949
+ /* We are here to close if no args. */
1950
+ if (retval != NULL) {
1951
+ if (_PyAsyncGenWrappedValue_CheckExact(retval) || Nuitka_AsyncgenWrappedValue_CheckExact(retval)) {
1952
+ #if PYTHON_VERSION >= 0x380
1953
+ asyncgen_athrow->m_gen->m_running_async = false;
1954
+ #endif
1955
+ Py_DECREF(retval);
1956
+
1957
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "async generator ignored GeneratorExit");
1958
+
1959
+ return NULL;
1960
+ }
1961
+
1962
+ return retval;
1963
+ }
1964
+ }
1965
+
1966
+ check_error:
1967
+ #if PYTHON_VERSION >= 0x380
1968
+ asyncgen_athrow->m_gen->m_running_async = false;
1969
+ #endif
1970
+
1971
+ if (PyErr_ExceptionMatches(PyExc_StopAsyncIteration)) {
1972
+ asyncgen_athrow->m_state = AWAITABLE_STATE_CLOSED;
1973
+
1974
+ if (asyncgen_athrow->m_args == NULL) {
1975
+ CLEAR_ERROR_OCCURRED(tstate);
1976
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
1977
+ }
1978
+ } else if (PyErr_ExceptionMatches(PyExc_GeneratorExit)) {
1979
+ asyncgen_athrow->m_state = AWAITABLE_STATE_CLOSED;
1980
+
1981
+ #if PYTHON_VERSION >= 0x380
1982
+ if (asyncgen_athrow->m_args == NULL) {
1983
+ #endif
1984
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
1985
+ #if PYTHON_VERSION >= 0x380
1986
+ }
1987
+ #endif
1988
+ }
1989
+
1990
+ return NULL;
1991
+ }
1992
+
1993
+ static PyObject *Nuitka_AsyncgenAthrow_throw(struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow, PyObject *args) {
1994
+ #if _DEBUG_ASYNCGEN
1995
+ PRINT_ASYNCGEN_ATHROW_STATUS("Enter", asyncgen_athrow);
1996
+ PRINT_COROUTINE_VALUE("args", args);
1997
+ PRINT_NEW_LINE();
1998
+ #endif
1999
+
2000
+ PyThreadState *tstate = PyThreadState_GET();
2001
+
2002
+ PyObject *retval;
2003
+
2004
+ #if PYTHON_VERSION < 0x375
2005
+ if (asyncgen_athrow->m_state == AWAITABLE_STATE_INIT) {
2006
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
2007
+ "can't send non-None value to a just-started coroutine");
2008
+
2009
+ return NULL;
2010
+ }
2011
+ #endif
2012
+
2013
+ if (asyncgen_athrow->m_state == AWAITABLE_STATE_CLOSED) {
2014
+ #if PYTHON_VERSION < 0x390
2015
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
2016
+ #else
2017
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "cannot reuse already awaited aclose()/athrow()");
2018
+ #endif
2019
+
2020
+ return NULL;
2021
+ }
2022
+
2023
+ retval = Nuitka_Asyncgen_throw(tstate, asyncgen_athrow->m_gen, args);
2024
+
2025
+ if (asyncgen_athrow->m_args) {
2026
+ return _Nuitka_Asyncgen_unwrap_value(tstate, asyncgen_athrow->m_gen, retval);
2027
+ } else {
2028
+ if (retval != NULL) {
2029
+ if (_PyAsyncGenWrappedValue_CheckExact(retval) || Nuitka_AsyncgenWrappedValue_CheckExact(retval)) {
2030
+ #if PYTHON_VERSION >= 0x380
2031
+ asyncgen_athrow->m_gen->m_running_async = false;
2032
+ #endif
2033
+ Py_DECREF(retval);
2034
+
2035
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "async generator ignored GeneratorExit");
2036
+
2037
+ return NULL;
2038
+ }
2039
+ }
2040
+
2041
+ #if PYTHON_VERSION >= 0x390
2042
+ if (PyErr_ExceptionMatches(PyExc_StopAsyncIteration) || PyErr_ExceptionMatches(PyExc_GeneratorExit)) {
2043
+ SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
2044
+ }
2045
+ #endif
2046
+
2047
+ return retval;
2048
+ }
2049
+ }
2050
+
2051
+ static PyObject *Nuitka_AsyncgenAthrow_tp_iternext(struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow) {
2052
+ return Nuitka_AsyncgenAthrow_send(asyncgen_athrow, Py_None);
2053
+ }
2054
+
2055
+ static PyObject *Nuitka_AsyncgenAthrow_close(struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow) {
2056
+ asyncgen_athrow->m_state = AWAITABLE_STATE_CLOSED;
2057
+
2058
+ Py_INCREF_IMMORTAL(Py_None);
2059
+ return Py_None;
2060
+ }
2061
+
2062
+ static PyMethodDef Nuitka_AsyncgenAthrow_methods[] = {
2063
+ {"send", (PyCFunction)Nuitka_AsyncgenAthrow_send, METH_O, NULL},
2064
+ {"throw", (PyCFunction)Nuitka_AsyncgenAthrow_throw, METH_VARARGS, NULL},
2065
+ {"close", (PyCFunction)Nuitka_AsyncgenAthrow_close, METH_NOARGS, NULL},
2066
+ {NULL}};
2067
+
2068
+ static PyAsyncMethods Nuitka_AsyncgenAthrow_as_async = {
2069
+ 0, // am_await (PyObject_SelfIter)
2070
+ 0, // am_aiter
2071
+ 0 // am_anext
2072
+ };
2073
+
2074
+ static PyTypeObject Nuitka_AsyncgenAthrow_Type = {
2075
+ PyVarObject_HEAD_INIT(NULL, 0) "compiled_async_generator_athrow", // tp_name
2076
+ sizeof(struct Nuitka_AsyncgenAthrowObject), // tp_basicsize
2077
+ 0, // tp_itemsize
2078
+ (destructor)Nuitka_AsyncgenAthrow_dealloc, // tp_dealloc
2079
+ 0, // tp_print
2080
+ 0, // tp_getattr
2081
+ 0, // tp_setattr
2082
+ &Nuitka_AsyncgenAthrow_as_async, // tp_as_async
2083
+ 0, // tp_repr
2084
+ 0, // tp_as_number
2085
+ 0, // tp_as_sequence
2086
+ 0, // tp_as_mapping
2087
+ 0, // tp_hash
2088
+ 0, // tp_call
2089
+ 0, // tp_str
2090
+ 0, // tp_getattro (PyObject_GenericGetAttr)
2091
+ 0, // tp_setattro
2092
+ 0, // tp_as_buffer
2093
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, // tp_flags
2094
+ 0, // tp_doc
2095
+ (traverseproc)Nuitka_AsyncgenAthrow_traverse, // tp_traverse
2096
+ 0, // tp_clear
2097
+ 0, // tp_richcompare
2098
+ 0, // tp_weaklistoffset
2099
+ 0, // tp_iter (PyObject_SelfIter)
2100
+ (iternextfunc)Nuitka_AsyncgenAthrow_tp_iternext, // tp_iternext
2101
+ Nuitka_AsyncgenAthrow_methods, // tp_methods
2102
+ 0, // tp_members
2103
+ 0, // tp_getset
2104
+ 0, // tp_base
2105
+ 0, // tp_dict
2106
+ 0, // tp_descr_get
2107
+ 0, // tp_descr_set
2108
+ 0, // tp_dictoffset
2109
+ 0, // tp_init
2110
+ 0, // tp_alloc
2111
+ 0, // tp_new
2112
+ 0, // tp_free
2113
+ 0, // tp_is_gc
2114
+ 0, // tp_bases
2115
+ 0, // tp_mro
2116
+ 0, // tp_cache
2117
+ 0, // tp_subclasses
2118
+ 0, // tp_weaklist
2119
+ 0, // tp_del
2120
+ 0, // tp_version_tag
2121
+ 0, // tp_finalize
2122
+ };
2123
+
2124
+ static PyObject *Nuitka_AsyncgenAthrow_New(struct Nuitka_AsyncgenObject *asyncgen, PyObject *args) {
2125
+ CHECK_OBJECT(asyncgen);
2126
+ CHECK_OBJECT_X(args);
2127
+
2128
+ #if _DEBUG_REFCOUNTS
2129
+ count_active_Nuitka_AsyncgenAthrow_Type += 1;
2130
+ count_allocated_Nuitka_AsyncgenAthrow_Type += 1;
2131
+ #endif
2132
+
2133
+ struct Nuitka_AsyncgenAthrowObject *result;
2134
+
2135
+ allocateFromFreeListFixed(free_list_asyncgen_athrows, struct Nuitka_AsyncgenAthrowObject,
2136
+ Nuitka_AsyncgenAthrow_Type);
2137
+
2138
+ Py_INCREF(asyncgen);
2139
+ result->m_gen = asyncgen;
2140
+
2141
+ Py_XINCREF(args);
2142
+ result->m_args = args;
2143
+
2144
+ result->m_state = AWAITABLE_STATE_INIT;
2145
+
2146
+ Nuitka_GC_Track(result);
2147
+ return (PyObject *)result;
2148
+ }
2149
+
2150
+ static void _initCompiledAsyncgenTypes(void) {
2151
+
2152
+ Nuitka_PyType_Ready(&Nuitka_Asyncgen_Type, &PyAsyncGen_Type, true, false, false, false, true);
2153
+
2154
+ // Be a paranoid subtype of uncompiled function, we want nothing shared.
2155
+ assert(Nuitka_Asyncgen_Type.tp_doc != PyAsyncGen_Type.tp_doc || PyAsyncGen_Type.tp_doc == NULL);
2156
+ assert(Nuitka_Asyncgen_Type.tp_traverse != PyAsyncGen_Type.tp_traverse);
2157
+ assert(Nuitka_Asyncgen_Type.tp_clear != PyAsyncGen_Type.tp_clear || PyAsyncGen_Type.tp_clear == NULL);
2158
+ assert(Nuitka_Asyncgen_Type.tp_richcompare != PyAsyncGen_Type.tp_richcompare ||
2159
+ PyAsyncGen_Type.tp_richcompare == NULL);
2160
+ assert(Nuitka_Asyncgen_Type.tp_weaklistoffset != PyAsyncGen_Type.tp_weaklistoffset);
2161
+ assert(Nuitka_Asyncgen_Type.tp_iter != PyAsyncGen_Type.tp_iter || PyAsyncGen_Type.tp_iter == NULL);
2162
+ assert(Nuitka_Asyncgen_Type.tp_iternext != PyAsyncGen_Type.tp_iternext || PyAsyncGen_Type.tp_iternext == NULL);
2163
+ assert(Nuitka_Asyncgen_Type.tp_as_async != PyAsyncGen_Type.tp_as_async || PyAsyncGen_Type.tp_as_async == NULL);
2164
+ assert(Nuitka_Asyncgen_Type.tp_methods != PyAsyncGen_Type.tp_methods);
2165
+ assert(Nuitka_Asyncgen_Type.tp_members != PyAsyncGen_Type.tp_members);
2166
+ assert(Nuitka_Asyncgen_Type.tp_getset != PyAsyncGen_Type.tp_getset);
2167
+ assert(Nuitka_Asyncgen_Type.tp_base != PyAsyncGen_Type.tp_base);
2168
+ assert(Nuitka_Asyncgen_Type.tp_dict != PyAsyncGen_Type.tp_dict);
2169
+ assert(Nuitka_Asyncgen_Type.tp_descr_get != PyAsyncGen_Type.tp_descr_get || PyAsyncGen_Type.tp_descr_get == NULL);
2170
+
2171
+ assert(Nuitka_Asyncgen_Type.tp_descr_set != PyAsyncGen_Type.tp_descr_set || PyAsyncGen_Type.tp_descr_set == NULL);
2172
+ assert(Nuitka_Asyncgen_Type.tp_dictoffset != PyAsyncGen_Type.tp_dictoffset || PyAsyncGen_Type.tp_dictoffset == 0);
2173
+ // TODO: These get changed and into the same thing, not sure what to compare against, project something
2174
+ // assert(Nuitka_Asyncgen_Type.tp_init != PyAsyncGen_Type.tp_init || PyAsyncGen_Type.tp_init == NULL);
2175
+ // assert(Nuitka_Asyncgen_Type.tp_alloc != PyAsyncGen_Type.tp_alloc || PyAsyncGen_Type.tp_alloc == NULL);
2176
+ // assert(Nuitka_Asyncgen_Type.tp_new != PyAsyncGen_Type.tp_new || PyAsyncGen_Type.tp_new == NULL);
2177
+ // assert(Nuitka_Asyncgen_Type.tp_free != PyAsyncGen_Type.tp_free || PyAsyncGen_Type.tp_free == NULL);
2178
+ assert(Nuitka_Asyncgen_Type.tp_bases != PyAsyncGen_Type.tp_bases);
2179
+ assert(Nuitka_Asyncgen_Type.tp_mro != PyAsyncGen_Type.tp_mro);
2180
+ assert(Nuitka_Asyncgen_Type.tp_cache != PyAsyncGen_Type.tp_cache || PyAsyncGen_Type.tp_cache == NULL);
2181
+ assert(Nuitka_Asyncgen_Type.tp_subclasses != PyAsyncGen_Type.tp_subclasses || PyAsyncGen_Type.tp_cache == NULL);
2182
+ assert(Nuitka_Asyncgen_Type.tp_weaklist != PyAsyncGen_Type.tp_weaklist);
2183
+ assert(Nuitka_Asyncgen_Type.tp_del != PyAsyncGen_Type.tp_del || PyAsyncGen_Type.tp_del == NULL);
2184
+ assert(Nuitka_Asyncgen_Type.tp_finalize != PyAsyncGen_Type.tp_finalize || PyAsyncGen_Type.tp_finalize == NULL);
2185
+
2186
+ Nuitka_PyType_Ready(&Nuitka_AsyncgenAsend_Type, NULL, true, false, true, true, false);
2187
+ Nuitka_PyType_Ready(&Nuitka_AsyncgenAthrow_Type, NULL, true, false, true, true, false);
2188
+ Nuitka_PyType_Ready(&Nuitka_AsyncgenValueWrapper_Type, NULL, false, false, false, false, false);
2189
+
2190
+ #if PYTHON_VERSION >= 0x3d0
2191
+ PyThreadState *tstate = PyThreadState_GET();
2192
+ PyObject *asyncgen_wrapper_object = _PyIntrinsics_UnaryFunctions[INTRINSIC_ASYNC_GEN_WRAP].func(tstate, Py_None);
2193
+ Nuitka_PyAsyncGenWrappedValue_Type = Py_TYPE(asyncgen_wrapper_object);
2194
+ Py_DECREF(asyncgen_wrapper_object);
2195
+ #endif
2196
+ }
2197
+
2198
+ // Part of "Nuitka", an optimizing Python compiler that is compatible and
2199
+ // integrates with CPython, but also works on its own.
2200
+ //
2201
+ // Licensed under the Apache License, Version 2.0 (the "License");
2202
+ // you may not use this file except in compliance with the License.
2203
+ // You may obtain a copy of the License at
2204
+ //
2205
+ // http://www.apache.org/licenses/LICENSE-2.0
2206
+ //
2207
+ // Unless required by applicable law or agreed to in writing, software
2208
+ // distributed under the License is distributed on an "AS IS" BASIS,
2209
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2210
+ // See the License for the specific language governing permissions and
2211
+ // limitations under the License.