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,1739 @@
1
+ // Copyright 2025, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
2
+
3
+ /* These helpers are used to work with dictionaries.
4
+
5
+ */
6
+
7
+ // This file is included from another C file, help IDEs to still parse it on
8
+ // its own.
9
+ #ifdef __IDE_ONLY__
10
+ #include "nuitka/prelude.h"
11
+ #endif
12
+
13
+ // spell-checker: ignore ob_shash,dictiterobject,dictiteritems_type,dictiterkeys_type
14
+ // spell-checker: ignore dictitervalues_type,dictviewobject dictvaluesview_type,dictkeysview_type
15
+
16
+ #ifdef Py_GIL_DISABLED
17
+
18
+ #define IS_DICT_SHARED(mp) _PyObject_GC_IS_SHARED(mp)
19
+ #define SET_DICT_SHARED(mp) _PyObject_GC_SET_SHARED(mp)
20
+ #define LOAD_INDEX(keys, size, idx) \
21
+ _Py_atomic_load_int##size##_relaxed(&((const int##size##_t *)keys->dk_indices)[idx]);
22
+ #define STORE_INDEX(keys, size, idx, value) \
23
+ _Py_atomic_store_int##size##_relaxed(&((int##size##_t *)keys->dk_indices)[idx], (int##size##_t)value);
24
+
25
+ #define LOCK_KEYS(keys) PyMutex_LockFlags(&keys->dk_mutex, _Py_LOCK_DONT_DETACH)
26
+ #define UNLOCK_KEYS(keys) PyMutex_Unlock(&keys->dk_mutex)
27
+
28
+ #define INCREF_KEYS_FT(dk) Nuitka_Py_dictkeys_incref(dk)
29
+ #define DECREF_KEYS_FT(dk, shared) Nuitka_Py_dictkeys_decref(_PyInterpreterState_GET(), dk, shared)
30
+
31
+ #define LOCK_KEYS_IF_SPLIT(keys, kind) \
32
+ if (kind == DICT_KEYS_SPLIT) { \
33
+ LOCK_KEYS(keys); \
34
+ }
35
+
36
+ #define UNLOCK_KEYS_IF_SPLIT(keys, kind) \
37
+ if (kind == DICT_KEYS_SPLIT) { \
38
+ UNLOCK_KEYS(keys); \
39
+ }
40
+
41
+ #else
42
+
43
+ #define LOAD_INDEX(keys, size, idx) ((const int##size##_t *)(keys->dk_indices))[idx]
44
+ #define STORE_INDEX(keys, size, idx, value) ((int##size##_t *)(keys->dk_indices))[idx] = (int##size##_t)value
45
+
46
+ #define LOCK_KEYS(keys)
47
+ #define UNLOCK_KEYS(keys)
48
+ #define INCREF_KEYS_FT(dk)
49
+ #define DECREF_KEYS_FT(dk, shared)
50
+ #define LOCK_KEYS_IF_SPLIT(keys, kind)
51
+ #define UNLOCK_KEYS_IF_SPLIT(keys, kind)
52
+
53
+ #endif
54
+
55
+ PyObject *DICT_GET_ITEM0(PyThreadState *tstate, PyObject *dict, PyObject *key) {
56
+ CHECK_OBJECT(dict);
57
+ assert(PyDict_Check(dict));
58
+
59
+ CHECK_OBJECT(key);
60
+
61
+ Py_hash_t hash;
62
+
63
+ // This variant is uncertain about the hashing.
64
+ #if PYTHON_VERSION < 0x300
65
+ if (PyString_CheckExact(key)) {
66
+ hash = ((PyStringObject *)key)->ob_shash;
67
+
68
+ if (unlikely(hash == -1)) {
69
+ hash = HASH_VALUE_WITHOUT_ERROR(tstate, key);
70
+ }
71
+
72
+ if (unlikely(hash == -1)) {
73
+ return NULL;
74
+ }
75
+ } else {
76
+ hash = HASH_VALUE_WITHOUT_ERROR(tstate, key);
77
+
78
+ if (unlikely(hash == -1)) {
79
+ return NULL;
80
+ }
81
+ }
82
+
83
+ PyDictObject *dict_object = (PyDictObject *)dict;
84
+ PyDictEntry *entry = (dict_object->ma_lookup)(dict_object, key, hash);
85
+
86
+ if (unlikely(entry == NULL || entry->me_value == NULL)) {
87
+ return NULL;
88
+ }
89
+
90
+ CHECK_OBJECT(entry->me_value);
91
+ return entry->me_value;
92
+ #else
93
+ if (!PyUnicode_CheckExact(key) || (hash = ((PyASCIIObject *)key)->hash) == -1) {
94
+ hash = HASH_VALUE_WITHOUT_ERROR(tstate, key);
95
+
96
+ if (unlikely(hash == -1)) {
97
+ return NULL;
98
+ }
99
+ }
100
+
101
+ PyDictObject *dict_object = (PyDictObject *)dict;
102
+
103
+ #if PYTHON_VERSION < 0x360
104
+ PyObject **value_addr;
105
+ PyDictKeyEntry *entry = dict_object->ma_keys->dk_lookup(dict_object, key, hash, &value_addr);
106
+
107
+ if (unlikely(entry == NULL || *value_addr == NULL)) {
108
+ return NULL;
109
+ }
110
+ #else
111
+ #if PYTHON_VERSION < 0x370
112
+ PyObject **value_addr;
113
+ Py_ssize_t ix = (dict_object->ma_keys->dk_lookup)(dict_object, key, hash, &value_addr, NULL);
114
+ #elif PYTHON_VERSION < 0x3b0
115
+ PyObject *result;
116
+ Py_ssize_t ix = (dict_object->ma_keys->dk_lookup)(dict_object, key, hash, &result);
117
+ #else
118
+ PyObject **value_addr;
119
+ Py_ssize_t ix = Nuitka_PyDictLookup(dict_object, key, hash, &value_addr);
120
+ #endif
121
+
122
+ if (unlikely(ix < 0)) {
123
+ return NULL;
124
+ }
125
+ #endif
126
+
127
+ #if PYTHON_VERSION < 0x370 || PYTHON_VERSION >= 0x3b0
128
+ assert(value_addr != NULL);
129
+ PyObject *result = *value_addr;
130
+ #endif
131
+ if (unlikely(result == NULL)) {
132
+ return NULL;
133
+ }
134
+
135
+ CHECK_OBJECT(result);
136
+ return result;
137
+ #endif
138
+ }
139
+
140
+ PyObject *DICT_GET_ITEM1(PyThreadState *tstate, PyObject *dict, PyObject *key) {
141
+ CHECK_OBJECT(dict);
142
+ assert(PyDict_Check(dict));
143
+
144
+ CHECK_OBJECT(key);
145
+
146
+ Py_hash_t hash;
147
+
148
+ // This variant is uncertain about the hashing.
149
+ #if PYTHON_VERSION < 0x300
150
+ if (PyString_CheckExact(key)) {
151
+ hash = ((PyStringObject *)key)->ob_shash;
152
+
153
+ if (unlikely(hash == -1)) {
154
+ hash = HASH_VALUE_WITHOUT_ERROR(tstate, key);
155
+ }
156
+
157
+ if (unlikely(hash == -1)) {
158
+ return NULL;
159
+ }
160
+ } else {
161
+ hash = HASH_VALUE_WITHOUT_ERROR(tstate, key);
162
+
163
+ if (unlikely(hash == -1)) {
164
+ return NULL;
165
+ }
166
+ }
167
+
168
+ PyDictObject *dict_object = (PyDictObject *)dict;
169
+ PyDictEntry *entry = (dict_object->ma_lookup)(dict_object, key, hash);
170
+
171
+ if (unlikely(entry == NULL || entry->me_value == NULL)) {
172
+ return NULL;
173
+ }
174
+
175
+ CHECK_OBJECT(entry->me_value);
176
+ Py_INCREF(entry->me_value);
177
+ return entry->me_value;
178
+ #else
179
+ if (!PyUnicode_CheckExact(key) || (hash = ((PyASCIIObject *)key)->hash) == -1) {
180
+ hash = HASH_VALUE_WITHOUT_ERROR(tstate, key);
181
+
182
+ if (unlikely(hash == -1)) {
183
+ return NULL;
184
+ }
185
+ }
186
+
187
+ PyDictObject *dict_object = (PyDictObject *)dict;
188
+
189
+ #if PYTHON_VERSION < 0x360
190
+ PyObject **value_addr;
191
+ PyDictKeyEntry *entry = dict_object->ma_keys->dk_lookup(dict_object, key, hash, &value_addr);
192
+
193
+ if (unlikely(entry == NULL || *value_addr == NULL)) {
194
+ return NULL;
195
+ }
196
+ #else
197
+ #if PYTHON_VERSION < 0x370
198
+ PyObject **value_addr;
199
+ Py_ssize_t ix = (dict_object->ma_keys->dk_lookup)(dict_object, key, hash, &value_addr, NULL);
200
+ #elif PYTHON_VERSION < 0x3b0
201
+ PyObject *result;
202
+ Py_ssize_t ix = (dict_object->ma_keys->dk_lookup)(dict_object, key, hash, &result);
203
+ #else
204
+ PyObject **value_addr;
205
+ Py_ssize_t ix = Nuitka_PyDictLookup(dict_object, key, hash, &value_addr);
206
+ #endif
207
+
208
+ if (unlikely(ix < 0)) {
209
+ return NULL;
210
+ }
211
+ #endif
212
+
213
+ #if PYTHON_VERSION < 0x370 || PYTHON_VERSION >= 0x3b0
214
+ assert(value_addr != NULL);
215
+ PyObject *result = *value_addr;
216
+ #endif
217
+ if (unlikely(result == NULL)) {
218
+ return NULL;
219
+ }
220
+
221
+ CHECK_OBJECT(result);
222
+ Py_INCREF(result);
223
+ return result;
224
+ #endif
225
+ }
226
+
227
+ #if PYTHON_VERSION >= 0x3c0
228
+ static PyObject *Nuitka_CreateKeyError(PyThreadState *tstate, PyObject *key) {
229
+ return (PyObject *)Nuitka_BaseExceptionSingleArg_new(tstate, (PyTypeObject *)PyExc_KeyError, key);
230
+ }
231
+ #endif
232
+
233
+ static void SET_CURRENT_EXCEPTION_KEY_ERROR(PyThreadState *tstate, PyObject *key) {
234
+ #if PYTHON_VERSION < 0x3c0
235
+ /* Wrap all kinds of tuples, because normalization will later unwrap
236
+ * it, but then that changes the key for the KeyError, which is not
237
+ * welcome. The check is inexact, as the unwrapping one is too.
238
+ */
239
+ if (PyTuple_Check(key) || key == Py_None) {
240
+ PyObject *tuple = MAKE_TUPLE1(tstate, key);
241
+
242
+ SET_CURRENT_EXCEPTION_TYPE0_VALUE1(tstate, PyExc_KeyError, tuple);
243
+ } else {
244
+ SET_CURRENT_EXCEPTION_TYPE0_VALUE0(tstate, PyExc_KeyError, key);
245
+ }
246
+ #else
247
+ struct Nuitka_ExceptionPreservationItem exception_state = {Nuitka_CreateKeyError(tstate, key)};
248
+
249
+ RESTORE_ERROR_OCCURRED_STATE(tstate, &exception_state);
250
+ #endif
251
+ }
252
+
253
+ // TODO: This gives a reference, where would often be one time immediate users
254
+ // of the value, forcing temporary variable releases on the outside. We need
255
+ // to add indication of how long a value is going to be used, so in case where
256
+ // we have the knowledge, we can provide the reference or not. Maybe we can
257
+ // also include temporary nature of the key and/or dict releases to be done
258
+ // inside of such helper code, possibly in template generation, where also
259
+ // the hashing check wouldn't be needed anymore.
260
+ PyObject *DICT_GET_ITEM_WITH_ERROR(PyThreadState *tstate, PyObject *dict, PyObject *key) {
261
+ CHECK_OBJECT(dict);
262
+ assert(PyDict_CheckExact(dict));
263
+
264
+ CHECK_OBJECT(key);
265
+
266
+ Py_hash_t hash;
267
+
268
+ // This variant is uncertain about the hashing.
269
+ #if PYTHON_VERSION < 0x300
270
+ if (PyString_CheckExact(key)) {
271
+ hash = ((PyStringObject *)key)->ob_shash;
272
+
273
+ if (unlikely(hash == -1)) {
274
+ hash = HASH_VALUE_WITHOUT_ERROR(tstate, key);
275
+ }
276
+
277
+ if (unlikely(hash == -1)) {
278
+ return NULL;
279
+ }
280
+ } else {
281
+ hash = HASH_VALUE_WITH_ERROR(tstate, key);
282
+
283
+ if (unlikely(hash == -1)) {
284
+ return NULL;
285
+ }
286
+ }
287
+
288
+ PyDictObject *dict_object = (PyDictObject *)dict;
289
+ PyDictEntry *entry = (dict_object->ma_lookup)(dict_object, key, hash);
290
+
291
+ if (unlikely(entry == NULL || entry->me_value == NULL)) {
292
+ SET_CURRENT_EXCEPTION_KEY_ERROR(tstate, key);
293
+
294
+ return NULL;
295
+ }
296
+
297
+ CHECK_OBJECT(entry->me_value);
298
+ Py_INCREF(entry->me_value);
299
+ return entry->me_value;
300
+ #else
301
+ if (!PyUnicode_CheckExact(key) || (hash = ((PyASCIIObject *)key)->hash) == -1) {
302
+ hash = HASH_VALUE_WITH_ERROR(tstate, key);
303
+ if (unlikely(hash == -1)) {
304
+ return NULL;
305
+ }
306
+ }
307
+
308
+ PyDictObject *dict_object = (PyDictObject *)dict;
309
+
310
+ #if PYTHON_VERSION < 0x360
311
+ PyObject **value_addr;
312
+ PyDictKeyEntry *entry = dict_object->ma_keys->dk_lookup(dict_object, key, hash, &value_addr);
313
+
314
+ if (unlikely(entry == NULL || *value_addr == NULL)) {
315
+ if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
316
+ return NULL;
317
+ }
318
+
319
+ SET_CURRENT_EXCEPTION_KEY_ERROR(tstate, key);
320
+
321
+ return NULL;
322
+ }
323
+ #else
324
+ #if PYTHON_VERSION < 0x370
325
+ PyObject **value_addr;
326
+ Py_ssize_t ix = (dict_object->ma_keys->dk_lookup)(dict_object, key, hash, &value_addr, NULL);
327
+ #elif PYTHON_VERSION < 0x3b0
328
+ PyObject *result;
329
+ Py_ssize_t ix = (dict_object->ma_keys->dk_lookup)(dict_object, key, hash, &result);
330
+ #else
331
+ PyObject **value_addr;
332
+ Py_ssize_t ix = Nuitka_PyDictLookup(dict_object, key, hash, &value_addr);
333
+ #endif
334
+
335
+ if (unlikely(ix < 0)) {
336
+ if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
337
+ return NULL;
338
+ }
339
+
340
+ SET_CURRENT_EXCEPTION_KEY_ERROR(tstate, key);
341
+
342
+ return NULL;
343
+ }
344
+ #endif
345
+
346
+ #if PYTHON_VERSION < 0x370 || PYTHON_VERSION >= 0x3b0
347
+ assert(value_addr != NULL);
348
+ PyObject *result = *value_addr;
349
+ #endif
350
+
351
+ if (unlikely(result == NULL)) {
352
+ if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
353
+ return NULL;
354
+ }
355
+
356
+ SET_CURRENT_EXCEPTION_KEY_ERROR(tstate, key);
357
+
358
+ return NULL;
359
+ }
360
+
361
+ CHECK_OBJECT(result);
362
+ Py_INCREF(result);
363
+ return result;
364
+ #endif
365
+ }
366
+
367
+ PyObject *DICT_GET_ITEM_WITH_HASH_ERROR0(PyThreadState *tstate, PyObject *dict, PyObject *key) {
368
+ CHECK_OBJECT(dict);
369
+ assert(PyDict_CheckExact(dict));
370
+
371
+ CHECK_OBJECT(key);
372
+
373
+ Py_hash_t hash;
374
+
375
+ // This variant is uncertain about the hashing.
376
+ #if PYTHON_VERSION < 0x300
377
+ if (PyString_CheckExact(key)) {
378
+ hash = ((PyStringObject *)key)->ob_shash;
379
+
380
+ if (unlikely(hash == -1)) {
381
+ hash = HASH_VALUE_WITHOUT_ERROR(tstate, key);
382
+ }
383
+
384
+ if (unlikely(hash == -1)) {
385
+ return NULL;
386
+ }
387
+ } else {
388
+ hash = HASH_VALUE_WITH_ERROR(tstate, key);
389
+
390
+ if (unlikely(hash == -1)) {
391
+ return NULL;
392
+ }
393
+ }
394
+
395
+ PyDictObject *dict_object = (PyDictObject *)dict;
396
+ PyDictEntry *entry = (dict_object->ma_lookup)(dict_object, key, hash);
397
+
398
+ if (unlikely(entry == NULL || entry->me_value == NULL)) {
399
+ return NULL;
400
+ }
401
+
402
+ CHECK_OBJECT(entry->me_value);
403
+ return entry->me_value;
404
+ #else
405
+ if (!PyUnicode_CheckExact(key) || (hash = ((PyASCIIObject *)key)->hash) == -1) {
406
+ hash = HASH_VALUE_WITH_ERROR(tstate, key);
407
+ if (unlikely(hash == -1)) {
408
+ return NULL;
409
+ }
410
+ }
411
+
412
+ PyDictObject *dict_object = (PyDictObject *)dict;
413
+
414
+ #if PYTHON_VERSION < 0x360
415
+ PyObject **value_addr;
416
+ PyDictKeyEntry *entry = dict_object->ma_keys->dk_lookup(dict_object, key, hash, &value_addr);
417
+
418
+ if (unlikely(entry == NULL || *value_addr == NULL)) {
419
+ return NULL;
420
+ }
421
+ #else
422
+ #if PYTHON_VERSION < 0x370
423
+ PyObject **value_addr;
424
+ Py_ssize_t ix = (dict_object->ma_keys->dk_lookup)(dict_object, key, hash, &value_addr, NULL);
425
+ #elif PYTHON_VERSION < 0x3b0
426
+ PyObject *result;
427
+ Py_ssize_t ix = (dict_object->ma_keys->dk_lookup)(dict_object, key, hash, &result);
428
+ #else
429
+ PyObject **value_addr;
430
+ Py_ssize_t ix = Nuitka_PyDictLookup(dict_object, key, hash, &value_addr);
431
+ #endif
432
+
433
+ if (unlikely(ix < 0)) {
434
+ return NULL;
435
+ }
436
+ #endif
437
+
438
+ #if PYTHON_VERSION < 0x370 || PYTHON_VERSION >= 0x3b0
439
+ assert(value_addr != NULL);
440
+ PyObject *result = *value_addr;
441
+ #endif
442
+
443
+ if (unlikely(result == NULL)) {
444
+ return NULL;
445
+ }
446
+
447
+ CHECK_OBJECT(result);
448
+ return result;
449
+ #endif
450
+ }
451
+
452
+ // TODO: Exact copy of DICT_GET_ITEM_WITH_HASH_ERROR0 with just a Py_INCREF added, we should
453
+ // generate these and all other variants rather than manually maintaining them, so we can
454
+ // also specialize by type and not just result needs.
455
+ PyObject *DICT_GET_ITEM_WITH_HASH_ERROR1(PyThreadState *tstate, PyObject *dict, PyObject *key) {
456
+ CHECK_OBJECT(dict);
457
+ assert(PyDict_CheckExact(dict));
458
+
459
+ CHECK_OBJECT(key);
460
+
461
+ Py_hash_t hash;
462
+
463
+ // This variant is uncertain about the hashing.
464
+ #if PYTHON_VERSION < 0x300
465
+ if (PyString_CheckExact(key)) {
466
+ hash = ((PyStringObject *)key)->ob_shash;
467
+
468
+ if (unlikely(hash == -1)) {
469
+ hash = HASH_VALUE_WITHOUT_ERROR(tstate, key);
470
+ }
471
+
472
+ if (unlikely(hash == -1)) {
473
+ return NULL;
474
+ }
475
+ } else {
476
+ hash = HASH_VALUE_WITH_ERROR(tstate, key);
477
+
478
+ if (unlikely(hash == -1)) {
479
+ return NULL;
480
+ }
481
+ }
482
+
483
+ PyDictObject *dict_object = (PyDictObject *)dict;
484
+ PyDictEntry *entry = (dict_object->ma_lookup)(dict_object, key, hash);
485
+
486
+ if (unlikely(entry == NULL || entry->me_value == NULL)) {
487
+ return NULL;
488
+ }
489
+
490
+ CHECK_OBJECT(entry->me_value);
491
+ Py_INCREF(entry->me_value);
492
+ return entry->me_value;
493
+ #else
494
+ if (!PyUnicode_CheckExact(key) || (hash = ((PyASCIIObject *)key)->hash) == -1) {
495
+ hash = HASH_VALUE_WITH_ERROR(tstate, key);
496
+ if (unlikely(hash == -1)) {
497
+ return NULL;
498
+ }
499
+ }
500
+
501
+ PyDictObject *dict_object = (PyDictObject *)dict;
502
+
503
+ #if PYTHON_VERSION < 0x360
504
+ PyObject **value_addr;
505
+ PyDictKeyEntry *entry = dict_object->ma_keys->dk_lookup(dict_object, key, hash, &value_addr);
506
+
507
+ if (unlikely(entry == NULL || *value_addr == NULL)) {
508
+ return NULL;
509
+ }
510
+ #else
511
+ #if PYTHON_VERSION < 0x370
512
+ PyObject **value_addr;
513
+ Py_ssize_t ix = (dict_object->ma_keys->dk_lookup)(dict_object, key, hash, &value_addr, NULL);
514
+ #elif PYTHON_VERSION < 0x3b0
515
+ PyObject *result;
516
+ Py_ssize_t ix = (dict_object->ma_keys->dk_lookup)(dict_object, key, hash, &result);
517
+ #else
518
+ PyObject **value_addr;
519
+ Py_ssize_t ix = Nuitka_PyDictLookup(dict_object, key, hash, &value_addr);
520
+ #endif
521
+
522
+ if (unlikely(ix < 0)) {
523
+ return NULL;
524
+ }
525
+ #endif
526
+
527
+ #if PYTHON_VERSION < 0x370 || PYTHON_VERSION >= 0x3b0
528
+ assert(value_addr != NULL);
529
+ PyObject *result = *value_addr;
530
+ #endif
531
+
532
+ if (unlikely(result == NULL)) {
533
+ return NULL;
534
+ }
535
+
536
+ CHECK_OBJECT(result);
537
+ Py_INCREF(result);
538
+ return result;
539
+ #endif
540
+ }
541
+
542
+ int DICT_HAS_ITEM(PyThreadState *tstate, PyObject *dict, PyObject *key) {
543
+ CHECK_OBJECT(dict);
544
+ assert(PyDict_Check(dict));
545
+
546
+ CHECK_OBJECT(key);
547
+
548
+ Py_hash_t hash;
549
+
550
+ // This variant is uncertain about the hashing.
551
+ #if PYTHON_VERSION < 0x300
552
+ if (PyString_CheckExact(key)) {
553
+ hash = ((PyStringObject *)key)->ob_shash;
554
+
555
+ if (unlikely(hash == -1)) {
556
+ hash = HASH_VALUE_WITHOUT_ERROR(tstate, key);
557
+ }
558
+
559
+ if (unlikely(hash == -1)) {
560
+ return -1;
561
+ }
562
+ } else {
563
+ hash = HASH_VALUE_WITH_ERROR(tstate, key);
564
+
565
+ if (unlikely(hash == -1)) {
566
+ return -1;
567
+ }
568
+ }
569
+
570
+ PyDictObject *dict_object = (PyDictObject *)dict;
571
+ PyDictEntry *entry = (dict_object->ma_lookup)(dict_object, key, hash);
572
+
573
+ if (unlikely(entry == NULL || entry->me_value == NULL)) {
574
+ return 0;
575
+ }
576
+
577
+ return 1;
578
+ #else
579
+ if (!PyUnicode_CheckExact(key) || (hash = ((PyASCIIObject *)key)->hash) == -1) {
580
+ hash = HASH_VALUE_WITH_ERROR(tstate, key);
581
+ if (unlikely(hash == -1)) {
582
+ return -1;
583
+ }
584
+ }
585
+
586
+ PyDictObject *dict_object = (PyDictObject *)dict;
587
+
588
+ #if PYTHON_VERSION < 0x360
589
+ PyObject **value_addr;
590
+ PyDictKeyEntry *entry = dict_object->ma_keys->dk_lookup(dict_object, key, hash, &value_addr);
591
+
592
+ if (unlikely(entry == NULL || *value_addr == NULL)) {
593
+ return 0;
594
+ }
595
+
596
+ return 1;
597
+ #else
598
+ #if PYTHON_VERSION < 0x370
599
+ PyObject **value_addr;
600
+ Py_ssize_t ix = (dict_object->ma_keys->dk_lookup)(dict_object, key, hash, &value_addr, NULL);
601
+ #elif PYTHON_VERSION < 0x3b0
602
+ PyObject *result;
603
+ Py_ssize_t ix = (dict_object->ma_keys->dk_lookup)(dict_object, key, hash, &result);
604
+ #else
605
+ PyObject **value_addr;
606
+ Py_ssize_t ix = Nuitka_PyDictLookup(dict_object, key, hash, &value_addr);
607
+ #endif
608
+
609
+ if (unlikely(ix < 0)) {
610
+ if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
611
+ return -1;
612
+ }
613
+
614
+ return 0;
615
+ }
616
+
617
+ #if PYTHON_VERSION < 0x370 || PYTHON_VERSION >= 0x3b0
618
+ assert(value_addr != NULL);
619
+ PyObject *result = *value_addr;
620
+ #endif
621
+
622
+ if (unlikely(result == NULL)) {
623
+ return 0;
624
+ }
625
+ #endif
626
+ return 1;
627
+ #endif
628
+ }
629
+
630
+ #if PYTHON_VERSION < 0x300
631
+ PyObject *DICT_ITEMS(PyObject *dict) {
632
+ CHECK_OBJECT(dict);
633
+ assert(PyDict_Check(dict));
634
+
635
+ PyDictObject *mp = (PyDictObject *)dict;
636
+
637
+ PyObject *result;
638
+ Py_ssize_t size;
639
+
640
+ /* Preallocate the list of tuples, to avoid allocations during
641
+ * the loop over the items, which could trigger GC, which
642
+ * could resize the dict. :-(
643
+ */
644
+ retry:
645
+ size = mp->ma_used;
646
+ result = MAKE_LIST_EMPTY(tstate, size);
647
+ CHECK_OBJECT(result);
648
+
649
+ for (Py_ssize_t i = 0; i < size; i++) {
650
+ // Later populated.
651
+ PyObject *item = MAKE_TUPLE_EMPTY(tstate, 2);
652
+ CHECK_OBJECT(item);
653
+
654
+ PyList_SET_ITEM(result, i, item);
655
+ }
656
+
657
+ if (unlikely(size != mp->ma_used)) {
658
+ // Garbage collection can compactify dictionaries.
659
+ Py_DECREF(result);
660
+ goto retry;
661
+ }
662
+
663
+ // Nothing must cause any functions to be called
664
+ PyDictEntry *ep = mp->ma_table;
665
+ Py_ssize_t mask = mp->ma_mask;
666
+
667
+ for (Py_ssize_t i = 0, j = 0; i <= mask; i++) {
668
+ PyObject *value = ep[i].me_value;
669
+ if (value != NULL) {
670
+ PyObject *key = ep[i].me_key;
671
+ PyObject *item = PyList_GET_ITEM(result, j);
672
+ PyTuple_SET_ITEM0(item, 0, key);
673
+ PyTuple_SET_ITEM0(item, 1, value);
674
+
675
+ j++;
676
+ }
677
+ }
678
+
679
+ assert(PyList_GET_SIZE(result) == size);
680
+
681
+ return result;
682
+ }
683
+
684
+ #if PYTHON_VERSION < 0x300
685
+ PyObject *DICT_KEYS(PyObject *dict) {
686
+ CHECK_OBJECT(dict);
687
+ assert(PyDict_Check(dict));
688
+
689
+ PyDictObject *mp = (PyDictObject *)dict;
690
+
691
+ PyObject *result;
692
+ Py_ssize_t size;
693
+
694
+ /* Preallocate the list of tuples, to avoid allocations during
695
+ * the loop over the items, which could trigger GC, which
696
+ * could resize the dict. :-(
697
+ */
698
+ retry:
699
+ size = mp->ma_used;
700
+ result = MAKE_LIST_EMPTY(tstate, size);
701
+ CHECK_OBJECT(result);
702
+
703
+ if (unlikely(size != mp->ma_used)) {
704
+ // Garbage collection can compactify dictionaries.
705
+ Py_DECREF(result);
706
+ goto retry;
707
+ }
708
+
709
+ // Nothing must cause any functions to be called
710
+ PyDictEntry *ep = mp->ma_table;
711
+ Py_ssize_t mask = mp->ma_mask;
712
+
713
+ for (Py_ssize_t i = 0, j = 0; i <= mask; i++) {
714
+ PyObject *value = ep[i].me_value;
715
+ if (value != NULL) {
716
+ PyObject *key = ep[i].me_key;
717
+ PyList_SET_ITEM0(result, j, key);
718
+
719
+ j++;
720
+ }
721
+ }
722
+
723
+ assert(PyList_GET_SIZE(result) == size);
724
+
725
+ return result;
726
+ }
727
+ #endif
728
+
729
+ #if PYTHON_VERSION < 0x300
730
+ PyObject *DICT_VALUES(PyObject *dict) {
731
+ CHECK_OBJECT(dict);
732
+ assert(PyDict_Check(dict));
733
+
734
+ PyDictObject *mp = (PyDictObject *)dict;
735
+
736
+ PyObject *result;
737
+ Py_ssize_t size;
738
+
739
+ /* Preallocate the list of tuples, to avoid allocations during
740
+ * the loop over the items, which could trigger GC, which
741
+ * could resize the dict. :-(
742
+ */
743
+ retry:
744
+ size = mp->ma_used;
745
+ result = MAKE_LIST_EMPTY(tstate, size);
746
+ CHECK_OBJECT(result);
747
+
748
+ if (unlikely(size != mp->ma_used)) {
749
+ // Garbage collection can compactify dictionaries.
750
+ Py_DECREF(result);
751
+ goto retry;
752
+ }
753
+
754
+ // Nothing must cause any functions to be called
755
+ PyDictEntry *ep = mp->ma_table;
756
+ Py_ssize_t mask = mp->ma_mask;
757
+
758
+ for (Py_ssize_t i = 0, j = 0; i <= mask; i++) {
759
+ PyObject *value = ep[i].me_value;
760
+ if (value != NULL) {
761
+ PyList_SET_ITEM0(result, j, value);
762
+
763
+ j++;
764
+ }
765
+ }
766
+
767
+ assert(PyList_GET_SIZE(result) == size);
768
+
769
+ return result;
770
+ }
771
+ #endif
772
+
773
+ #endif
774
+
775
+ #if PYTHON_VERSION < 0x300
776
+ typedef struct {
777
+ PyObject_HEAD PyDictObject *di_dict;
778
+ Py_ssize_t di_used;
779
+ Py_ssize_t di_pos;
780
+ PyObject *di_result;
781
+ Py_ssize_t len;
782
+ } dictiterobject;
783
+ #endif
784
+
785
+ #if PYTHON_VERSION >= 0x300 && PYTHON_VERSION < 0x350
786
+ typedef struct {
787
+ PyObject_HEAD PyDictObject *dv_dict;
788
+ } _PyDictViewObject;
789
+
790
+ #endif
791
+
792
+ // Generic helper for various dictionary iterations, to be inlined.
793
+ static inline PyObject *_MAKE_DICT_ITERATOR(PyThreadState *tstate, PyDictObject *dict, PyTypeObject *type,
794
+ bool is_iteritems) {
795
+ CHECK_OBJECT((PyObject *)dict);
796
+ assert(PyDict_CheckExact((PyObject *)dict));
797
+
798
+ #if PYTHON_VERSION < 0x300
799
+ dictiterobject *di = (dictiterobject *)Nuitka_GC_New(type);
800
+ CHECK_OBJECT(di);
801
+ Py_INCREF(dict);
802
+ di->di_dict = dict;
803
+ di->di_used = dict->ma_used;
804
+ di->di_pos = 0;
805
+ di->len = dict->ma_used;
806
+ if (is_iteritems) {
807
+ // TODO: Have this as faster variants, we do these sometimes.
808
+ di->di_result = MAKE_TUPLE2(tstate, Py_None, Py_None);
809
+ CHECK_OBJECT(di->di_result);
810
+ } else {
811
+ di->di_result = NULL;
812
+ }
813
+
814
+ Nuitka_GC_Track(di);
815
+ return (PyObject *)di;
816
+ #else
817
+ _PyDictViewObject *dv = (_PyDictViewObject *)Nuitka_GC_New(type);
818
+ CHECK_OBJECT(dv);
819
+
820
+ Py_INCREF(dict);
821
+ dv->dv_dict = dict;
822
+
823
+ Nuitka_GC_Track(dv);
824
+ return (PyObject *)dv;
825
+ #endif
826
+ }
827
+
828
+ PyObject *DICT_ITERITEMS(PyThreadState *tstate, PyObject *dict) {
829
+ #if PYTHON_VERSION < 0x270
830
+ static PyTypeObject *dictiteritems_type = NULL;
831
+
832
+ if (unlikely(dictiteritems_type == NULL)) {
833
+ dictiteritems_type =
834
+ Py_TYPE(CALL_FUNCTION_NO_ARGS(tstate, PyObject_GetAttrString(const_dict_empty, "iteritems")));
835
+ }
836
+
837
+ return _MAKE_DICT_ITERATOR(tstate, (PyDictObject *)dict, dictiteritems_type, true);
838
+ #elif PYTHON_VERSION < 0x300
839
+ return _MAKE_DICT_ITERATOR(tstate, (PyDictObject *)dict, &PyDictIterItem_Type, true);
840
+ #else
841
+ return _MAKE_DICT_ITERATOR(tstate, (PyDictObject *)dict, &PyDictItems_Type, true);
842
+ #endif
843
+ }
844
+
845
+ PyObject *DICT_ITERKEYS(PyThreadState *tstate, PyObject *dict) {
846
+ #if PYTHON_VERSION < 0x270
847
+ static PyTypeObject *dictiterkeys_type = NULL;
848
+
849
+ if (unlikely(dictiterkeys_type == NULL)) {
850
+ dictiterkeys_type =
851
+ Py_TYPE(CALL_FUNCTION_NO_ARGS(tstate, PyObject_GetAttrString(const_dict_empty, "iterkeys")));
852
+ }
853
+
854
+ return _MAKE_DICT_ITERATOR(tstate, (PyDictObject *)dict, dictiterkeys_type, false);
855
+ #elif PYTHON_VERSION < 0x300
856
+ return _MAKE_DICT_ITERATOR(tstate, (PyDictObject *)dict, &PyDictIterKey_Type, false);
857
+ #else
858
+ return _MAKE_DICT_ITERATOR(tstate, (PyDictObject *)dict, &PyDictKeys_Type, false);
859
+ #endif
860
+ }
861
+
862
+ PyObject *DICT_ITERVALUES(PyThreadState *tstate, PyObject *dict) {
863
+ #if PYTHON_VERSION < 0x270
864
+ static PyTypeObject *dictitervalues_type = NULL;
865
+
866
+ if (unlikely(dictitervalues_type == NULL)) {
867
+ dictitervalues_type =
868
+ Py_TYPE(CALL_FUNCTION_NO_ARGS(tstate, PyObject_GetAttrString(const_dict_empty, "itervalues")));
869
+ }
870
+
871
+ return _MAKE_DICT_ITERATOR(tstate, (PyDictObject *)dict, dictitervalues_type, false);
872
+ #elif PYTHON_VERSION < 0x300
873
+ return _MAKE_DICT_ITERATOR(tstate, (PyDictObject *)dict, &PyDictIterValue_Type, false);
874
+ #else
875
+ return _MAKE_DICT_ITERATOR(tstate, (PyDictObject *)dict, &PyDictValues_Type, false);
876
+ #endif
877
+ }
878
+
879
+ typedef struct {
880
+ PyObject_HEAD PyDictObject *dv_dict;
881
+ } dictviewobject;
882
+
883
+ static PyObject *_MAKE_DICT_VIEW(PyDictObject *dict, PyTypeObject *type) {
884
+ CHECK_OBJECT((PyObject *)dict);
885
+ assert(PyDict_CheckExact((PyObject *)dict));
886
+
887
+ dictviewobject *dv = (dictviewobject *)Nuitka_GC_New(type);
888
+
889
+ CHECK_OBJECT(dv);
890
+ Py_INCREF(dict);
891
+ dv->dv_dict = (PyDictObject *)dict;
892
+ Nuitka_GC_Track(dv);
893
+ return (PyObject *)dv;
894
+ }
895
+
896
+ PyObject *DICT_VIEWKEYS(PyObject *dict) {
897
+ #if PYTHON_VERSION < 0x270
898
+ static PyTypeObject *dictkeysview_type = NULL;
899
+
900
+ if (unlikely(dictkeysview_type)) {
901
+ dictkeysview_type = Py_TYPE(PyObject_GetIter(PyObject_GetAttrString(const_dict_empty, "viewkeys")));
902
+ }
903
+
904
+ return _MAKE_DICT_VIEW((PyDictObject *)dict, dictkeysview_type);
905
+ #else
906
+ return _MAKE_DICT_VIEW((PyDictObject *)dict, &PyDictKeys_Type);
907
+ #endif
908
+ }
909
+
910
+ PyObject *DICT_VIEWVALUES(PyObject *dict) {
911
+ #if PYTHON_VERSION < 0x270
912
+ static PyTypeObject *dictvaluesview_type = NULL;
913
+
914
+ if (unlikely(dictvaluesview_type)) {
915
+ dictvaluesview_type = Py_TYPE(PyObject_GetIter(PyObject_GetAttrString(const_dict_empty, "viewvalues")));
916
+ }
917
+
918
+ return _MAKE_DICT_VIEW((PyDictObject *)dict, dictvaluesview_type);
919
+ #else
920
+ return _MAKE_DICT_VIEW((PyDictObject *)dict, &PyDictValues_Type);
921
+ #endif
922
+ }
923
+
924
+ PyObject *DICT_VIEWITEMS(PyObject *dict) {
925
+ #if PYTHON_VERSION < 0x270
926
+ static PyTypeObject *dictvaluesview_type = NULL;
927
+
928
+ if (unlikely(dictvaluesview_type)) {
929
+ dictvaluesview_type = Py_TYPE(PyObject_GetIter(PyObject_GetAttrString(const_dict_empty, "viewitems")));
930
+ }
931
+
932
+ return _MAKE_DICT_VIEW((PyDictObject *)dict, dictvaluesview_type);
933
+ #else
934
+ return _MAKE_DICT_VIEW((PyDictObject *)dict, &PyDictItems_Type);
935
+ #endif
936
+ }
937
+
938
+ #if PYTHON_VERSION >= 0x300
939
+ static PyDictObject *_Nuitka_AllocatePyDictObject(PyThreadState *tstate) {
940
+ PyDictObject *result_mp;
941
+
942
+ #if NUITKA_DICT_HAS_FREELIST
943
+ // This is the CPython name, spell-checker: ignore numfree
944
+
945
+ #if PYTHON_VERSION < 0x3d0
946
+ PyDictObject **items = tstate->interp->dict_state.free_list;
947
+ int *numfree = &tstate->interp->dict_state.numfree;
948
+ #else
949
+ struct _Py_object_freelists *freelists = _Nuitka_object_freelists_GET(tstate);
950
+ struct _Py_dict_freelist *state = &freelists->dicts;
951
+ PyDictObject **items = state->items;
952
+ int *numfree = &state->numfree;
953
+ #endif
954
+
955
+ if (*numfree) {
956
+ (*numfree) -= 1;
957
+ result_mp = items[*numfree];
958
+
959
+ Nuitka_Py_NewReference((PyObject *)result_mp);
960
+
961
+ assert(PyDict_CheckExact((PyObject *)result_mp));
962
+ assert(result_mp != NULL);
963
+ } else
964
+ #endif
965
+ {
966
+ result_mp = (PyDictObject *)Nuitka_GC_New(&PyDict_Type);
967
+ }
968
+
969
+ return result_mp;
970
+ }
971
+ #endif
972
+
973
+ #if PYTHON_VERSION >= 0x360
974
+ static PyDictKeysObject *_Nuitka_AllocatePyDictKeysObject(PyThreadState *tstate, Py_ssize_t keys_size) {
975
+ // CPython names, spell-checker: ignore numfree,dictkeys
976
+ PyDictKeysObject *dk;
977
+
978
+ // TODO: Cannot always use cached objects. Need to also consider
979
+ // "log2_size == PyDict_LOG_MINSIZE && unicode" as a criterion,
980
+ // seems it can only be used for the smallest keys type.
981
+ #if NUITKA_DICT_HAS_FREELIST && 0
982
+ #if PYTHON_VERSION < 0x3d0
983
+ PyDictKeysObject **items = tstate->interp->dict_state.keys_free_list;
984
+ int *numfree = &tstate->interp->dict_state.keys_numfree;
985
+ #else
986
+ struct _Py_object_freelists *freelists = _Nuitka_object_freelists_GET(tstate);
987
+ struct _Py_dictkeys_freelist *state = &freelists->dictkeys;
988
+ PyDictKeysObject **items = state->items;
989
+ int *numfree = &state->numfree;
990
+ #endif
991
+
992
+ if (*numfree) {
993
+ (*numfree) -= 1;
994
+ dk = items[*numfree];
995
+ } else
996
+ #endif
997
+ {
998
+ #if PYTHON_VERSION < 0x3d0
999
+ dk = (PyDictKeysObject *)NuitkaObject_Malloc(keys_size);
1000
+ #else
1001
+ dk = (PyDictKeysObject *)NuitkaMem_Malloc(keys_size);
1002
+ #endif
1003
+ }
1004
+
1005
+ return dk;
1006
+ }
1007
+ #endif
1008
+
1009
+ #if PYTHON_VERSION >= 0x360 && !defined(_NUITKA_EXPERIMENTAL_DISABLE_DICT_OPT)
1010
+
1011
+ // Usable fraction of keys.
1012
+ #define DK_USABLE_FRACTION(n) (((n) << 1) / 3)
1013
+
1014
+ static Py_ssize_t _Nuitka_Py_PyDict_KeysSize(PyDictKeysObject *keys) {
1015
+ #if PYTHON_VERSION < 0x360
1016
+ return sizeof(PyDictKeysObject) + (DK_SIZE(keys) - 1) * sizeof(PyDictKeyEntry);
1017
+ #elif PYTHON_VERSION < 0x370
1018
+ return (sizeof(PyDictKeysObject) - Py_MEMBER_SIZE(PyDictKeysObject, dk_indices) + DK_IXSIZE(keys) * DK_SIZE(keys) +
1019
+ DK_USABLE_FRACTION(DK_SIZE(keys)) * sizeof(PyDictKeyEntry));
1020
+ #elif PYTHON_VERSION < 0x3b0
1021
+ return (sizeof(PyDictKeysObject) + DK_IXSIZE(keys) * DK_SIZE(keys) +
1022
+ DK_USABLE_FRACTION(DK_SIZE(keys)) * sizeof(PyDictKeyEntry));
1023
+ #else
1024
+ size_t entry_size = keys->dk_kind == DICT_KEYS_GENERAL ? sizeof(PyDictKeyEntry) : sizeof(PyDictUnicodeEntry);
1025
+ return (sizeof(PyDictKeysObject) + ((size_t)1 << keys->dk_log2_index_bytes) +
1026
+ DK_USABLE_FRACTION(DK_SIZE(keys)) * entry_size);
1027
+ #endif
1028
+ }
1029
+ #endif
1030
+
1031
+ #if PYTHON_VERSION < 0x3b0
1032
+ typedef PyObject *PyDictValues;
1033
+ #endif
1034
+
1035
+ #if PYTHON_VERSION < 0x360
1036
+ #define DK_ENTRIES_SIZE(keys) (keys->dk_size)
1037
+ #elif PYTHON_VERSION < 0x3b0
1038
+ #define DK_ENTRIES_SIZE(keys) DK_USABLE_FRACTION(DK_SIZE(keys))
1039
+ #else
1040
+ #define DK_ENTRIES_SIZE(keys) (keys->dk_nentries)
1041
+ #endif
1042
+
1043
+ // More than 2/3 of the keys are used, i.e. no space is wasted.
1044
+ #if PYTHON_VERSION < 0x360
1045
+ #define IS_COMPACT(dict_mp) (dict_mp->ma_used >= (dict_mp->ma_keys->dk_size * 2) / 3)
1046
+ #else
1047
+ #define IS_COMPACT(dict_mp) (dict_mp->ma_used >= (dict_mp->ma_keys->dk_nentries * 2) / 3)
1048
+ #endif
1049
+
1050
+ static inline PyDictValues *_Nuitka_PyDict_new_values(Py_ssize_t size) {
1051
+ #if PYTHON_VERSION < 0x3b0
1052
+ Py_ssize_t values_size = sizeof(PyObject *) * size;
1053
+
1054
+ return (PyDictValues *)NuitkaMem_Malloc(values_size);
1055
+ #elif PYTHON_VERSION < 0x3d0
1056
+ Py_ssize_t values_size = sizeof(PyObject *) * size;
1057
+
1058
+ // With Python3.11-3.12 a prefix is allocated too.
1059
+ size_t prefix_size = _Py_SIZE_ROUND_UP(size + 2, sizeof(PyObject *));
1060
+ size_t n = prefix_size + values_size;
1061
+ uint8_t *mem = (uint8_t *)NuitkaMem_Malloc(n);
1062
+ assert(mem != NULL);
1063
+
1064
+ assert(prefix_size % sizeof(PyObject *) == 0);
1065
+ mem[prefix_size - 1] = (uint8_t)prefix_size;
1066
+
1067
+ return (PyDictValues *)(mem + prefix_size);
1068
+ #else
1069
+ assert(size >= 1);
1070
+ size_t suffix_size = _Py_SIZE_ROUND_UP(size, sizeof(PyObject *));
1071
+ assert(suffix_size < 128);
1072
+ assert(suffix_size % sizeof(PyObject *) == 0);
1073
+ size_t n = (size + 1) * sizeof(PyObject *) + suffix_size;
1074
+ PyDictValues *result = (PyDictValues *)NuitkaMem_Malloc(n);
1075
+
1076
+ result->embedded = 0;
1077
+ result->size = 0;
1078
+ assert(size < 256);
1079
+ result->capacity = (uint8_t)size;
1080
+ return result;
1081
+ #endif
1082
+ }
1083
+
1084
+ #if PYTHON_VERSION >= 0x3d0
1085
+
1086
+ static PyDictValues *_Nuitka_PyDict_copy_values(PyDictValues *values) {
1087
+ PyDictValues *new_values = _Nuitka_PyDict_new_values(values->capacity);
1088
+ if (unlikely(new_values == NULL)) {
1089
+ return NULL;
1090
+ }
1091
+
1092
+ new_values->size = values->size;
1093
+
1094
+ uint8_t *values_order = get_insertion_order_array(values);
1095
+ uint8_t *new_values_order = get_insertion_order_array(new_values);
1096
+
1097
+ memcpy(new_values_order, values_order, values->capacity);
1098
+
1099
+ for (int i = 0; i < values->capacity; i++) {
1100
+ new_values->values[i] = values->values[i];
1101
+ }
1102
+ assert(new_values->embedded == 0);
1103
+ return new_values;
1104
+ }
1105
+ #endif
1106
+
1107
+ #include "HelpersDictionariesGenerated.c"
1108
+
1109
+ void DICT_CLEAR(PyObject *dict) {
1110
+ CHECK_OBJECT(dict);
1111
+ assert(PyDict_CheckExact(dict));
1112
+
1113
+ // TODO: Could inline this for enhanced optimization, but it does
1114
+ // some pretty sophisticated memory handling.
1115
+ PyDict_Clear(dict);
1116
+ }
1117
+
1118
+ #if PYTHON_VERSION >= 0x3b0
1119
+ static inline int Nuitka_py_get_index_from_order(PyDictObject *mp, Py_ssize_t i) {
1120
+ assert(mp->ma_used <= SHARED_KEYS_MAX_SIZE);
1121
+ #if PYTHON_VERSION < 0x3d0
1122
+ assert(i < (((char *)mp->ma_values)[-2]));
1123
+ return ((char *)mp->ma_values)[-3 - i];
1124
+ #else
1125
+ assert(i < mp->ma_values->size);
1126
+ uint8_t *array = get_insertion_order_array(mp->ma_values);
1127
+ return array[i];
1128
+ #endif
1129
+ }
1130
+ #endif
1131
+
1132
+ #if PYTHON_VERSION >= 0x3b0
1133
+
1134
+ static inline Py_ssize_t Nuitka_Py_dictkeys_get_index(const PyDictKeysObject *keys, Py_ssize_t i) {
1135
+ int log2size = DK_LOG_SIZE(keys);
1136
+ Py_ssize_t ix;
1137
+
1138
+ if (log2size < 8) {
1139
+ ix = LOAD_INDEX(keys, 8, i);
1140
+
1141
+ } else if (log2size < 16) {
1142
+ ix = LOAD_INDEX(keys, 16, i);
1143
+ }
1144
+ #if SIZEOF_VOID_P > 4
1145
+ else if (log2size >= 32) {
1146
+ ix = LOAD_INDEX(keys, 64, i);
1147
+ }
1148
+ #endif
1149
+ else {
1150
+ ix = LOAD_INDEX(keys, 32, i);
1151
+ }
1152
+
1153
+ assert(ix >= DKIX_DUMMY);
1154
+ return ix;
1155
+ }
1156
+
1157
+ // From CPython
1158
+ #define PERTURB_SHIFT 5
1159
+
1160
+ static Py_ssize_t Nuitka_Py_unicodekeys_lookup_generic(PyDictObject *mp, PyDictKeysObject *dk, PyObject *key,
1161
+ Py_hash_t hash) {
1162
+ PyDictUnicodeEntry *ep0 = DK_UNICODE_ENTRIES(dk);
1163
+
1164
+ size_t mask = DK_MASK(dk);
1165
+ size_t perturb = hash;
1166
+ size_t i = (size_t)hash & mask;
1167
+
1168
+ while (1) {
1169
+ Py_ssize_t ix = Nuitka_Py_dictkeys_get_index(dk, i);
1170
+
1171
+ if (ix >= 0) {
1172
+ PyDictUnicodeEntry *ep = &ep0[ix];
1173
+
1174
+ assert(ep->me_key != NULL);
1175
+ assert(PyUnicode_CheckExact(ep->me_key));
1176
+
1177
+ if (ep->me_key == key) {
1178
+ return ix;
1179
+ }
1180
+
1181
+ if (Nuitka_Py_unicode_get_hash(ep->me_key) == hash) {
1182
+ PyObject *startkey = ep->me_key;
1183
+ Py_INCREF(startkey);
1184
+ nuitka_bool cmp = RICH_COMPARE_EQ_NBOOL_UNICODE_OBJECT(startkey, key);
1185
+ Py_DECREF(startkey);
1186
+
1187
+ if (unlikely(cmp == NUITKA_BOOL_EXCEPTION)) {
1188
+ return DKIX_ERROR;
1189
+ }
1190
+
1191
+ if (dk == mp->ma_keys && ep->me_key == startkey) {
1192
+ if (cmp == NUITKA_BOOL_TRUE) {
1193
+ return ix;
1194
+ }
1195
+ } else {
1196
+ // In case of changed dictionary, trigger restart in caller.
1197
+ return DKIX_KEY_CHANGED;
1198
+ }
1199
+ }
1200
+ } else if (ix == DKIX_EMPTY) {
1201
+ return DKIX_EMPTY;
1202
+ }
1203
+ perturb >>= PERTURB_SHIFT;
1204
+ i = mask & (i * 5 + perturb + 1);
1205
+ }
1206
+
1207
+ NUITKA_CANNOT_GET_HERE("Nuitka_Py_unicodekeys_lookup_generic failed");
1208
+ }
1209
+
1210
+ Py_ssize_t Nuitka_Py_unicodekeys_lookup_unicode(PyDictKeysObject *dk, PyObject *key, Py_hash_t hash) {
1211
+ assert(PyUnicode_CheckExact(key));
1212
+ assert(dk->dk_kind != DICT_KEYS_GENERAL);
1213
+
1214
+ PyDictUnicodeEntry *ep0 = DK_UNICODE_ENTRIES(dk);
1215
+
1216
+ size_t mask = DK_MASK(dk);
1217
+ size_t perturb = hash;
1218
+ size_t i = (size_t)hash & mask;
1219
+
1220
+ while (true) {
1221
+ Py_ssize_t ix = Nuitka_Py_dictkeys_get_index(dk, i);
1222
+
1223
+ // Found it.
1224
+ if (ix >= 0) {
1225
+ PyDictUnicodeEntry *ep = &ep0[ix];
1226
+ assert(ep->me_key != NULL);
1227
+ assert(PyUnicode_CheckExact(ep->me_key));
1228
+
1229
+ if (ep->me_key == key || (Nuitka_Py_unicode_get_hash(ep->me_key) == hash &&
1230
+ RICH_COMPARE_EQ_CBOOL_UNICODE_UNICODE(ep->me_key, key))) {
1231
+ return ix;
1232
+ }
1233
+ } else if (ix == DKIX_EMPTY) {
1234
+ return DKIX_EMPTY;
1235
+ }
1236
+ perturb >>= PERTURB_SHIFT;
1237
+
1238
+ i = mask & (i * 5 + perturb + 1);
1239
+ ix = Nuitka_Py_dictkeys_get_index(dk, i);
1240
+
1241
+ if (ix >= 0) {
1242
+ PyDictUnicodeEntry *ep = &ep0[ix];
1243
+
1244
+ assert(ep->me_key != NULL);
1245
+ assert(PyUnicode_CheckExact(ep->me_key));
1246
+
1247
+ if (ep->me_key == key || (Nuitka_Py_unicode_get_hash(ep->me_key) == hash &&
1248
+ RICH_COMPARE_EQ_CBOOL_UNICODE_UNICODE(ep->me_key, key))) {
1249
+ return ix;
1250
+ }
1251
+ } else if (ix == DKIX_EMPTY) {
1252
+ return DKIX_EMPTY;
1253
+ }
1254
+
1255
+ perturb >>= PERTURB_SHIFT;
1256
+ i = mask & (i * 5 + perturb + 1);
1257
+ }
1258
+
1259
+ NUITKA_CANNOT_GET_HERE("Nuitka_Py_unicodekeys_lookup_unicode failed");
1260
+ }
1261
+
1262
+ // Search key from Generic table.
1263
+ static Py_ssize_t Nuitka_Py_dictkeys_generic_lookup(PyDictObject *mp, PyDictKeysObject *dk, PyObject *key,
1264
+ Py_hash_t hash) {
1265
+ PyDictKeyEntry *ep0 = DK_ENTRIES(dk);
1266
+
1267
+ size_t mask = DK_MASK(dk);
1268
+ size_t perturb = hash;
1269
+ size_t i = (size_t)hash & mask;
1270
+
1271
+ while (1) {
1272
+ Py_ssize_t ix = Nuitka_Py_dictkeys_get_index(dk, i);
1273
+
1274
+ if (ix >= 0) {
1275
+ PyDictKeyEntry *ep = &ep0[ix];
1276
+ assert(ep->me_key != NULL);
1277
+ if (ep->me_key == key) {
1278
+ return ix;
1279
+ }
1280
+ if (ep->me_hash == hash) {
1281
+ PyObject *startkey = ep->me_key;
1282
+ Py_INCREF(startkey);
1283
+ nuitka_bool cmp = RICH_COMPARE_EQ_NBOOL_OBJECT_OBJECT(startkey, key);
1284
+ Py_DECREF(startkey);
1285
+
1286
+ if (unlikely(cmp == NUITKA_BOOL_EXCEPTION)) {
1287
+ return DKIX_ERROR;
1288
+ }
1289
+ if (dk == mp->ma_keys && ep->me_key == startkey) {
1290
+ if (cmp == NUITKA_BOOL_TRUE) {
1291
+ return ix;
1292
+ }
1293
+ } else {
1294
+ // In case of changed dictionary, trigger restart in caller.
1295
+ return DKIX_KEY_CHANGED;
1296
+ }
1297
+ }
1298
+ } else if (ix == DKIX_EMPTY) {
1299
+ return DKIX_EMPTY;
1300
+ }
1301
+ perturb >>= PERTURB_SHIFT;
1302
+ i = mask & (i * 5 + perturb + 1);
1303
+ }
1304
+ }
1305
+
1306
+ Py_ssize_t Nuitka_PyDictLookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject ***value_addr) {
1307
+ PyDictKeysObject *dk;
1308
+ DictKeysKind kind;
1309
+ Py_ssize_t ix;
1310
+
1311
+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(mp);
1312
+ restart:
1313
+ dk = mp->ma_keys;
1314
+ kind = (DictKeysKind)dk->dk_kind;
1315
+
1316
+ if (kind != DICT_KEYS_GENERAL) {
1317
+ if (PyUnicode_CheckExact(key)) {
1318
+ #ifdef Py_GIL_DISABLED
1319
+ if (kind == DICT_KEYS_SPLIT) {
1320
+ ix = Nuitka_Py_unicodekeys_lookup_unicode_threadsafe(dk, key, hash);
1321
+
1322
+ if (ix == DKIX_KEY_CHANGED) {
1323
+ LOCK_KEYS(dk);
1324
+ ix = Nuitka_Py_unicodekeys_lookup_unicode(dk, key, hash);
1325
+ UNLOCK_KEYS(dk);
1326
+ }
1327
+ } else
1328
+ #endif
1329
+ {
1330
+ ix = Nuitka_Py_unicodekeys_lookup_unicode(dk, key, hash);
1331
+ }
1332
+ } else {
1333
+ INCREF_KEYS_FT(dk);
1334
+ LOCK_KEYS_IF_SPLIT(dk, kind);
1335
+
1336
+ ix = Nuitka_Py_unicodekeys_lookup_generic(mp, dk, key, hash);
1337
+
1338
+ UNLOCK_KEYS_IF_SPLIT(dk, kind);
1339
+ DECREF_KEYS_FT(dk, IS_DICT_SHARED(mp));
1340
+
1341
+ // Dictionary lookup changed the dictionary, retry.
1342
+ if (ix == DKIX_KEY_CHANGED) {
1343
+ goto restart;
1344
+ }
1345
+ }
1346
+
1347
+ if (ix >= 0) {
1348
+ if (kind == DICT_KEYS_SPLIT) {
1349
+ *value_addr = &mp->ma_values->values[ix];
1350
+ } else {
1351
+ *value_addr = &DK_UNICODE_ENTRIES(dk)[ix].me_value;
1352
+ }
1353
+ } else {
1354
+ *value_addr = NULL;
1355
+ }
1356
+ } else {
1357
+ ix = Nuitka_Py_dictkeys_generic_lookup(mp, dk, key, hash);
1358
+
1359
+ // Dictionary lookup changed the dictionary, retry.
1360
+ if (ix == DKIX_KEY_CHANGED) {
1361
+ goto restart;
1362
+ }
1363
+
1364
+ if (ix >= 0) {
1365
+ *value_addr = &DK_ENTRIES(dk)[ix].me_value;
1366
+ } else {
1367
+ *value_addr = NULL;
1368
+ }
1369
+ }
1370
+
1371
+ return ix;
1372
+ }
1373
+
1374
+ Py_ssize_t Nuitka_PyDictLookupStr(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject ***value_addr) {
1375
+ assert(PyUnicode_CheckExact(key));
1376
+
1377
+ PyDictKeysObject *dk = mp->ma_keys;
1378
+ assert(dk->dk_kind != DICT_KEYS_GENERAL);
1379
+
1380
+ Py_ssize_t ix = Nuitka_Py_unicodekeys_lookup_unicode(dk, key, hash);
1381
+
1382
+ if (ix >= 0) {
1383
+ if (dk->dk_kind == DICT_KEYS_SPLIT) {
1384
+ *value_addr = &mp->ma_values->values[ix];
1385
+ } else {
1386
+ *value_addr = &DK_UNICODE_ENTRIES(dk)[ix].me_value;
1387
+ }
1388
+ } else {
1389
+ *value_addr = NULL;
1390
+ }
1391
+
1392
+ return ix;
1393
+ }
1394
+
1395
+ #endif
1396
+
1397
+ bool Nuitka_DictNext(PyObject *dict, Py_ssize_t *pos, PyObject **key_ptr, PyObject **value_ptr) {
1398
+ CHECK_OBJECT(dict);
1399
+ assert(PyDict_CheckExact(dict));
1400
+ assert(key_ptr != NULL);
1401
+ assert(value_ptr != NULL);
1402
+
1403
+ #if PYTHON_VERSION < 0x300
1404
+ Py_ssize_t i = *pos;
1405
+
1406
+ PyDictEntry *ep = ((PyDictObject *)dict)->ma_table;
1407
+ Py_ssize_t mask = ((PyDictObject *)dict)->ma_mask;
1408
+
1409
+ while (i <= mask && ep[i].me_value == NULL) {
1410
+ i++;
1411
+ }
1412
+
1413
+ *pos = i + 1;
1414
+
1415
+ if (i > mask) {
1416
+ return false;
1417
+ }
1418
+
1419
+ *key_ptr = ep[i].me_key;
1420
+ *value_ptr = ep[i].me_value;
1421
+
1422
+ return true;
1423
+
1424
+ #elif PYTHON_VERSION < 0x360
1425
+ PyDictObject *mp = (PyDictObject *)dict;
1426
+ PyObject **dict_value_ptr;
1427
+ Py_ssize_t offset;
1428
+
1429
+ Py_ssize_t i = *pos;
1430
+ assert(i >= 0);
1431
+
1432
+ if (mp->ma_values) {
1433
+ dict_value_ptr = &mp->ma_values[i];
1434
+ offset = sizeof(PyObject *);
1435
+ } else {
1436
+ dict_value_ptr = &mp->ma_keys->dk_entries[i].me_value;
1437
+ offset = sizeof(PyDictKeyEntry);
1438
+ }
1439
+
1440
+ Py_ssize_t mask = DK_MASK(mp->ma_keys);
1441
+
1442
+ while ((i <= mask) && (*dict_value_ptr == NULL)) {
1443
+ dict_value_ptr = (PyObject **)(((char *)dict_value_ptr) + offset);
1444
+ i++;
1445
+ }
1446
+
1447
+ if (i > mask) {
1448
+ return false;
1449
+ }
1450
+
1451
+ *key_ptr = mp->ma_keys->dk_entries[i].me_key;
1452
+ *value_ptr = *dict_value_ptr;
1453
+ *pos = i + 1;
1454
+
1455
+ return true;
1456
+
1457
+ #elif PYTHON_VERSION < 0x3b0
1458
+ PyDictObject *mp = (PyDictObject *)dict;
1459
+ PyDictKeyEntry *entry;
1460
+ PyObject *value;
1461
+
1462
+ Py_ssize_t i = *pos;
1463
+ assert(i >= 0);
1464
+
1465
+ if (mp->ma_values) {
1466
+ if (i >= mp->ma_used) {
1467
+ return false;
1468
+ }
1469
+
1470
+ entry = &DK_ENTRIES(mp->ma_keys)[i];
1471
+ value = DK_VALUE(mp, i);
1472
+
1473
+ assert(value != NULL);
1474
+ } else {
1475
+ Py_ssize_t n = mp->ma_keys->dk_nentries;
1476
+
1477
+ if (i >= n) {
1478
+ return false;
1479
+ }
1480
+
1481
+ entry = &DK_ENTRIES(mp->ma_keys)[i];
1482
+
1483
+ while (i < n && entry->me_value == NULL) {
1484
+ entry += 1;
1485
+ i += 1;
1486
+ }
1487
+
1488
+ if (i >= n) {
1489
+ return false;
1490
+ }
1491
+
1492
+ value = entry->me_value;
1493
+ }
1494
+
1495
+ *pos = i + 1;
1496
+
1497
+ *key_ptr = entry->me_key;
1498
+ *value_ptr = value;
1499
+
1500
+ return true;
1501
+ #else
1502
+ PyDictObject *mp = (PyDictObject *)dict;
1503
+ Py_ssize_t i = *pos;
1504
+ PyObject *key, *value;
1505
+
1506
+ if (mp->ma_values) {
1507
+ // Shared keys dictionary.
1508
+ assert(mp->ma_used <= SHARED_KEYS_MAX_SIZE);
1509
+
1510
+ if (i >= mp->ma_used) {
1511
+ return false;
1512
+ }
1513
+
1514
+ int index = Nuitka_py_get_index_from_order(mp, i);
1515
+ value = mp->ma_values->values[index];
1516
+
1517
+ key = DK_UNICODE_ENTRIES(mp->ma_keys)[index].me_key;
1518
+
1519
+ assert(value != NULL);
1520
+ } else {
1521
+ Py_ssize_t n = mp->ma_keys->dk_nentries;
1522
+
1523
+ if (i >= n) {
1524
+ return false;
1525
+ }
1526
+
1527
+ // Unicode keys or general keys have different sizes, make sure to index
1528
+ // the right type, the algorithm is the same however.
1529
+ if (DK_IS_UNICODE(mp->ma_keys)) {
1530
+ PyDictUnicodeEntry *entry_ptr = &DK_UNICODE_ENTRIES(mp->ma_keys)[i];
1531
+
1532
+ while (i < n && entry_ptr->me_value == NULL) {
1533
+ entry_ptr++;
1534
+ i++;
1535
+ }
1536
+
1537
+ if (i >= n) {
1538
+ return false;
1539
+ }
1540
+
1541
+ key = entry_ptr->me_key;
1542
+ value = entry_ptr->me_value;
1543
+ } else {
1544
+ PyDictKeyEntry *entry_ptr = &DK_ENTRIES(mp->ma_keys)[i];
1545
+
1546
+ while (i < n && entry_ptr->me_value == NULL) {
1547
+ entry_ptr++;
1548
+ i++;
1549
+ }
1550
+
1551
+ if (i >= n) {
1552
+ return false;
1553
+ }
1554
+
1555
+ key = entry_ptr->me_key;
1556
+ value = entry_ptr->me_value;
1557
+ }
1558
+ }
1559
+
1560
+ *pos = i + 1;
1561
+
1562
+ *key_ptr = key;
1563
+ *value_ptr = value;
1564
+
1565
+ return true;
1566
+ #endif
1567
+ }
1568
+
1569
+ PyObject *TO_DICT(PyThreadState *tstate, PyObject *seq_obj, PyObject *dict_obj) {
1570
+ PyObject *result;
1571
+
1572
+ if (seq_obj != NULL) {
1573
+ CHECK_OBJECT(seq_obj);
1574
+
1575
+ // Fast path for dictionaries.
1576
+ if (PyDict_CheckExact(seq_obj)) {
1577
+ result = DICT_COPY(tstate, seq_obj);
1578
+ } else {
1579
+ result = MAKE_DICT_EMPTY(tstate);
1580
+
1581
+ Py_INCREF(seq_obj);
1582
+
1583
+ #if PYTHON_VERSION >= 0x300
1584
+ int res = HAS_ATTR_BOOL2(tstate, seq_obj, const_str_plain_keys);
1585
+
1586
+ if (unlikely(res == -1)) {
1587
+ Py_DECREF(seq_obj);
1588
+ return NULL;
1589
+ }
1590
+ #else
1591
+ int res = HAS_ATTR_BOOL(tstate, seq_obj, const_str_plain_keys) ? 1 : 0;
1592
+ #endif
1593
+
1594
+ if (res) {
1595
+ res = PyDict_Merge(result, seq_obj, 1);
1596
+ } else {
1597
+ res = PyDict_MergeFromSeq2(result, seq_obj, 1);
1598
+ }
1599
+
1600
+ Py_DECREF(seq_obj);
1601
+
1602
+ if (unlikely(res == -1)) {
1603
+ return NULL;
1604
+ }
1605
+ }
1606
+ } else {
1607
+ result = MAKE_DICT_EMPTY(tstate);
1608
+ }
1609
+
1610
+ // TODO: Should specialize for dict_obj/seq_obj presence to save a bit of time
1611
+ // and complexity.
1612
+ if (dict_obj != NULL) {
1613
+ CHECK_OBJECT(dict_obj);
1614
+
1615
+ int res = PyDict_Merge(result, dict_obj, 1);
1616
+
1617
+ if (unlikely(res == -1)) {
1618
+ return NULL;
1619
+ }
1620
+ }
1621
+
1622
+ return result;
1623
+ }
1624
+
1625
+ #if _NUITKA_MAINTAIN_DICT_VERSION_TAG
1626
+ uint64_t nuitka_dict_version_tag_counter = ((uint64_t)1) << 32;
1627
+ #endif
1628
+
1629
+ #if NUITKA_DICT_HAS_FREELIST
1630
+ PyObject *MAKE_DICT_EMPTY(PyThreadState *tstate) {
1631
+ PyDictObject *empty_dict_mp = (PyDictObject *)const_dict_empty;
1632
+
1633
+ #if PYTHON_VERSION < 0x3c0
1634
+ empty_dict_mp->ma_keys->dk_refcnt++;
1635
+ #endif
1636
+
1637
+ PyDictObject *result_mp = _Nuitka_AllocatePyDictObject(tstate);
1638
+
1639
+ result_mp->ma_keys = empty_dict_mp->ma_keys;
1640
+ result_mp->ma_values = empty_dict_mp->ma_values;
1641
+ result_mp->ma_used = 0;
1642
+ #if PYTHON_VERSION >= 0x3c0
1643
+ result_mp->ma_version_tag = DICT_NEXT_VERSION(_PyInterpreterState_GET());
1644
+ #elif PYTHON_VERSION >= 0x360
1645
+ result_mp->ma_version_tag = 1;
1646
+ #endif
1647
+
1648
+ // Key reference needs to be counted on older Python
1649
+ #if defined(Py_REF_DEBUG) && PYTHON_VERSION < 0x3c0
1650
+ _Py_RefTotal++;
1651
+ #endif
1652
+
1653
+ // No Nuitka_GC_Track for the empty dictionary.
1654
+ return (PyObject *)result_mp;
1655
+ }
1656
+ #endif
1657
+
1658
+ PyObject *MAKE_DICT(PyObject **pairs, Py_ssize_t size) {
1659
+ PyObject *result = _PyDict_NewPresized(size);
1660
+
1661
+ // Reject usage like this.
1662
+ assert(size > 0);
1663
+ for (Py_ssize_t i = 0; i < size; i++) {
1664
+ PyObject *key = pairs[i * 2];
1665
+ PyObject *value = pairs[i * 2 + 1];
1666
+
1667
+ int res = PyDict_SetItem(result, key, value);
1668
+
1669
+ if (unlikely(res != 0)) {
1670
+ Py_DECREF(result);
1671
+ return NULL;
1672
+ }
1673
+ }
1674
+
1675
+ return result;
1676
+ }
1677
+
1678
+ PyObject *MAKE_DICT_X(PyObject **pairs, Py_ssize_t size) {
1679
+ PyObject *result = _PyDict_NewPresized(size);
1680
+
1681
+ // Reject usage like this.
1682
+ assert(size > 0);
1683
+ for (Py_ssize_t i = 0; i < size; i++) {
1684
+ PyObject *value = pairs[i * 2 + 1];
1685
+
1686
+ if (value != NULL) {
1687
+ PyObject *key = pairs[i * 2];
1688
+ CHECK_OBJECT(key);
1689
+ CHECK_OBJECT(value);
1690
+
1691
+ int res = PyDict_SetItem(result, key, value);
1692
+
1693
+ if (unlikely(res != 0)) {
1694
+ Py_DECREF(result);
1695
+ return NULL;
1696
+ }
1697
+ }
1698
+ }
1699
+
1700
+ return result;
1701
+ }
1702
+
1703
+ PyObject *MAKE_DICT_X_CSTR(char const **keys, PyObject **values, Py_ssize_t size) {
1704
+ PyObject *result = _PyDict_NewPresized(size);
1705
+
1706
+ // Reject usage like this.
1707
+ assert(size > 0);
1708
+ for (Py_ssize_t i = 0; i < size; i++) {
1709
+ PyObject *value = values[i];
1710
+
1711
+ if (value != NULL) {
1712
+ CHECK_OBJECT(value);
1713
+
1714
+ int res = PyDict_SetItemString(result, keys[i], value);
1715
+
1716
+ if (unlikely(res != 0)) {
1717
+ Py_DECREF(result);
1718
+ return NULL;
1719
+ }
1720
+ }
1721
+ }
1722
+
1723
+ return result;
1724
+ }
1725
+
1726
+ // Part of "Nuitka", an optimizing Python compiler that is compatible and
1727
+ // integrates with CPython, but also works on its own.
1728
+ //
1729
+ // Licensed under the Apache License, Version 2.0 (the "License");
1730
+ // you may not use this file except in compliance with the License.
1731
+ // You may obtain a copy of the License at
1732
+ //
1733
+ // http://www.apache.org/licenses/LICENSE-2.0
1734
+ //
1735
+ // Unless required by applicable law or agreed to in writing, software
1736
+ // distributed under the License is distributed on an "AS IS" BASIS,
1737
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1738
+ // See the License for the specific language governing permissions and
1739
+ // limitations under the License.