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,2807 @@
1
+ // Copyright 2025, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
2
+
3
+ /* WARNING, this code is GENERATED. Modify the template HelperOperationInplace.c.j2 instead! */
4
+
5
+ /* This file is included from another C file, help IDEs to still parse it on its own. */
6
+ #ifdef __IDE_ONLY__
7
+ #include "nuitka/prelude.h"
8
+ #endif
9
+
10
+ /* C helpers for type in-place "**" (POW) operations */
11
+
12
+ /* Code referring to "FLOAT" corresponds to Python 'float' and "FLOAT" to Python 'float'. */
13
+ static inline bool _INPLACE_OPERATION_POW_FLOAT_FLOAT(PyObject **operand1, PyObject *operand2) {
14
+ assert(operand1); // Pointer must be non-null.
15
+
16
+ CHECK_OBJECT(*operand1);
17
+ assert(PyFloat_CheckExact(*operand1));
18
+ CHECK_OBJECT(operand2);
19
+ assert(PyFloat_CheckExact(operand2));
20
+
21
+ #ifdef _MSC_VER
22
+ #pragma warning(push)
23
+ #pragma warning(disable : 4101)
24
+ #endif
25
+ // Not every code path will make use of all possible results.
26
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
27
+ NUITKA_MAY_BE_UNUSED long clong_result;
28
+ NUITKA_MAY_BE_UNUSED double cfloat_result;
29
+ #ifdef _MSC_VER
30
+ #pragma warning(pop)
31
+ #endif
32
+
33
+ CHECK_OBJECT(*operand1);
34
+ assert(PyFloat_CheckExact(*operand1));
35
+ CHECK_OBJECT(operand2);
36
+ assert(PyFloat_CheckExact(operand2));
37
+
38
+ double a = PyFloat_AS_DOUBLE(*operand1);
39
+ const double b = PyFloat_AS_DOUBLE(operand2);
40
+
41
+ if (b == 0) {
42
+ goto exit_result_ok_const_float_1_0;
43
+ }
44
+
45
+ if (Py_IS_NAN(a)) {
46
+ goto exit_result_ok_left;
47
+ }
48
+
49
+ if (Py_IS_NAN(b)) {
50
+ if (a == 1.0) {
51
+ goto exit_result_ok_const_float_1_0;
52
+ } else {
53
+ goto exit_result_ok_right;
54
+ }
55
+ }
56
+
57
+ if (Py_IS_INFINITY(b)) {
58
+ a = fabs(a);
59
+ if (a == 1.0) {
60
+ goto exit_result_ok_const_float_1_0;
61
+ } else if ((b > 0.0) == (a > 1.0)) {
62
+ long r = (long)fabs(b);
63
+
64
+ cfloat_result = r;
65
+ goto exit_result_ok_cfloat;
66
+ } else {
67
+ goto exit_result_ok_const_float_0_0;
68
+ }
69
+ }
70
+
71
+ if (Py_IS_INFINITY(a)) {
72
+ bool b_is_odd = DOUBLE_IS_ODD_INTEGER(b);
73
+ double r;
74
+
75
+ if (b > 0.0) {
76
+ r = b_is_odd ? a : fabs(a);
77
+ } else {
78
+ r = b_is_odd ? copysign(0.0, a) : 0.0;
79
+ }
80
+
81
+ cfloat_result = r;
82
+ goto exit_result_ok_cfloat;
83
+ }
84
+
85
+ if (a == 0.0) {
86
+ if (unlikely(b < 0.0)) {
87
+ PyThreadState *tstate = PyThreadState_GET();
88
+
89
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ZeroDivisionError,
90
+ "0.0 cannot be raised to a negative power");
91
+ goto exit_result_exception;
92
+ }
93
+
94
+ bool b_is_odd = DOUBLE_IS_ODD_INTEGER(b);
95
+ double r = b_is_odd ? a : 0.0;
96
+
97
+ cfloat_result = r;
98
+ goto exit_result_ok_cfloat;
99
+ }
100
+
101
+ {
102
+ bool negate_result = false;
103
+
104
+ if (a < 0.0) {
105
+ if (unlikely(b != floor(b))) {
106
+ PyThreadState *tstate = PyThreadState_GET();
107
+
108
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ValueError,
109
+ "negative number cannot be raised to a fractional power");
110
+ goto exit_result_exception;
111
+ }
112
+
113
+ a = -a;
114
+ negate_result = DOUBLE_IS_ODD_INTEGER(b);
115
+ }
116
+
117
+ if (a == 1.0) {
118
+ if (negate_result) {
119
+ goto exit_result_ok_const_float_minus_1_0;
120
+ } else {
121
+ goto exit_result_ok_const_float_1_0;
122
+ }
123
+ } else {
124
+ errno = 0;
125
+ double r = pow(a, b);
126
+
127
+ if (unlikely(errno != 0)) {
128
+ PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError : PyExc_ValueError);
129
+ goto exit_result_exception;
130
+ }
131
+
132
+ r = negate_result ? -r : r;
133
+
134
+ cfloat_result = r;
135
+ goto exit_result_ok_cfloat;
136
+ }
137
+ }
138
+
139
+ exit_result_ok_cfloat:
140
+ if (Py_REFCNT(*operand1) == 1) {
141
+ PyFloat_SET_DOUBLE(*operand1, cfloat_result);
142
+ } else {
143
+ // We got an object handed, that we have to release.
144
+ Py_DECREF(*operand1);
145
+
146
+ *operand1 = MAKE_FLOAT_FROM_DOUBLE(cfloat_result);
147
+ }
148
+ goto exit_result_ok;
149
+
150
+ exit_result_ok_left:
151
+ goto exit_result_ok;
152
+
153
+ exit_result_ok_right:
154
+ // We got an object handed, that we have to release.
155
+ Py_DECREF(*operand1);
156
+ *operand1 = operand2;
157
+ goto exit_result_ok;
158
+
159
+ exit_result_ok_const_float_0_0:
160
+ // We got an object handed, that we have to release.
161
+ Py_DECREF(*operand1);
162
+ *operand1 = MAKE_FLOAT_FROM_DOUBLE(0.0);
163
+ goto exit_result_ok;
164
+
165
+ exit_result_ok_const_float_1_0:
166
+ // We got an object handed, that we have to release.
167
+ Py_DECREF(*operand1);
168
+ *operand1 = MAKE_FLOAT_FROM_DOUBLE(1.0);
169
+ goto exit_result_ok;
170
+
171
+ exit_result_ok_const_float_minus_1_0:
172
+ // We got an object handed, that we have to release.
173
+ Py_DECREF(*operand1);
174
+ *operand1 = MAKE_FLOAT_FROM_DOUBLE(-1.0);
175
+ goto exit_result_ok;
176
+
177
+ exit_result_ok:
178
+ return true;
179
+
180
+ exit_result_exception:
181
+ return false;
182
+ }
183
+
184
+ bool INPLACE_OPERATION_POW_FLOAT_FLOAT(PyObject **operand1, PyObject *operand2) {
185
+ return _INPLACE_OPERATION_POW_FLOAT_FLOAT(operand1, operand2);
186
+ }
187
+
188
+ /* Code referring to "OBJECT" corresponds to any Python object and "FLOAT" to Python 'float'. */
189
+ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_POW_OBJECT_FLOAT(PyObject **operand1, PyObject *operand2) {
190
+ PyTypeObject *type1 = Py_TYPE(*operand1);
191
+
192
+ #ifdef _MSC_VER
193
+ #pragma warning(push)
194
+ #pragma warning(disable : 4101)
195
+ #endif
196
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
197
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
198
+ #ifdef _MSC_VER
199
+ #pragma warning(pop)
200
+ #endif
201
+
202
+ ternaryfunc islot =
203
+ (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_inplace_power : NULL;
204
+
205
+ if (islot != NULL) {
206
+ PyObject *x = islot(*operand1, operand2, Py_None);
207
+
208
+ if (x != Py_NotImplemented) {
209
+ obj_result = x;
210
+ goto exit_inplace_result_object;
211
+ }
212
+
213
+ Py_DECREF_IMMORTAL(x);
214
+ }
215
+
216
+ {
217
+ ternaryfunc slot1 =
218
+ (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_power : NULL;
219
+ ternaryfunc slot2 = NULL;
220
+
221
+ if (!(type1 == &PyFloat_Type)) {
222
+ // Different types, need to consider second value slot.
223
+
224
+ slot2 = PyFloat_Type.tp_as_number->nb_power;
225
+
226
+ if (slot1 == slot2) {
227
+ slot2 = NULL;
228
+ }
229
+ }
230
+
231
+ if (slot1 != NULL) {
232
+ PyObject *x = slot1(*operand1, operand2, Py_None);
233
+
234
+ if (x != Py_NotImplemented) {
235
+ obj_result = x;
236
+ goto exit_inplace_result_object;
237
+ }
238
+
239
+ Py_DECREF_IMMORTAL(x);
240
+ }
241
+
242
+ if (slot2 != NULL) {
243
+ PyObject *x = slot2(*operand1, operand2, Py_None);
244
+
245
+ if (x != Py_NotImplemented) {
246
+ obj_result = x;
247
+ goto exit_inplace_result_object;
248
+ }
249
+
250
+ Py_DECREF_IMMORTAL(x);
251
+ }
252
+
253
+ #if PYTHON_VERSION < 0x300
254
+ if (!NEW_STYLE_NUMBER_TYPE(type1) || !1) {
255
+ coercion c1 =
256
+ (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_coerce : NULL;
257
+
258
+ if (c1 != NULL) {
259
+ PyObject *coerced1 = *operand1;
260
+ PyObject *coerced2 = operand2;
261
+
262
+ int err = c1(&coerced1, &coerced2);
263
+
264
+ if (unlikely(err < 0)) {
265
+ goto exit_inplace_exception;
266
+ }
267
+
268
+ if (err == 0) {
269
+ PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
270
+
271
+ if (likely(mv == NULL)) {
272
+ ternaryfunc slot = mv->nb_power;
273
+
274
+ if (likely(slot != NULL)) {
275
+ PyObject *x = slot(coerced1, coerced2, Py_None);
276
+
277
+ Py_DECREF(coerced1);
278
+ Py_DECREF(coerced2);
279
+
280
+ obj_result = x;
281
+ goto exit_inplace_result_object;
282
+ }
283
+ }
284
+
285
+ // nb_coerce took a reference.
286
+ Py_DECREF(coerced1);
287
+ Py_DECREF(coerced2);
288
+ }
289
+ }
290
+ coercion c2 = PyFloat_Type.tp_as_number->nb_coerce;
291
+
292
+ if (c2 != NULL) {
293
+ PyObject *coerced1 = *operand1;
294
+ PyObject *coerced2 = operand2;
295
+
296
+ int err = c2(&coerced2, &coerced1);
297
+
298
+ if (unlikely(err < 0)) {
299
+ goto exit_inplace_exception;
300
+ }
301
+
302
+ if (err == 0) {
303
+ PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
304
+
305
+ if (likely(mv == NULL)) {
306
+ ternaryfunc slot = mv->nb_power;
307
+
308
+ if (likely(slot != NULL)) {
309
+ PyObject *x = slot(coerced1, coerced2, Py_None);
310
+
311
+ Py_DECREF(coerced1);
312
+ Py_DECREF(coerced2);
313
+
314
+ obj_result = x;
315
+ goto exit_inplace_result_object;
316
+ }
317
+ }
318
+
319
+ // nb_coerce took a reference.
320
+ Py_DECREF(coerced1);
321
+ Py_DECREF(coerced2);
322
+ }
323
+ }
324
+ }
325
+ #endif
326
+
327
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: '%s' and 'float'", type1->tp_name);
328
+ goto exit_inplace_exception;
329
+ }
330
+
331
+ exit_inplace_result_object:
332
+ if (unlikely(obj_result == NULL)) {
333
+ return false;
334
+ }
335
+
336
+ // We got an object handed, that we have to release.
337
+ Py_DECREF(*operand1);
338
+
339
+ // That's our return value then. As we use a dedicated variable, it's
340
+ // OK that way.
341
+ *operand1 = obj_result;
342
+
343
+ return true;
344
+
345
+ exit_inplace_exception:
346
+ return false;
347
+ }
348
+ static inline bool _INPLACE_OPERATION_POW_OBJECT_FLOAT(PyObject **operand1, PyObject *operand2) {
349
+ assert(operand1); // Pointer must be non-null.
350
+
351
+ CHECK_OBJECT(*operand1);
352
+ CHECK_OBJECT(operand2);
353
+ assert(PyFloat_CheckExact(operand2));
354
+
355
+ PyTypeObject *type1 = Py_TYPE(*operand1);
356
+
357
+ if (type1 == &PyFloat_Type) {
358
+ // return _BINARY_OPERATION_POW_FLOAT_FLOAT_INPLACE(operand1, operand2);
359
+
360
+ #ifdef _MSC_VER
361
+ #pragma warning(push)
362
+ #pragma warning(disable : 4101)
363
+ #endif
364
+ // Not every code path will make use of all possible results.
365
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
366
+ NUITKA_MAY_BE_UNUSED long clong_result;
367
+ NUITKA_MAY_BE_UNUSED double cfloat_result;
368
+ #ifdef _MSC_VER
369
+ #pragma warning(pop)
370
+ #endif
371
+
372
+ CHECK_OBJECT(*operand1);
373
+ assert(PyFloat_CheckExact(*operand1));
374
+ CHECK_OBJECT(operand2);
375
+ assert(PyFloat_CheckExact(operand2));
376
+
377
+ double a = PyFloat_AS_DOUBLE(*operand1);
378
+ const double b = PyFloat_AS_DOUBLE(operand2);
379
+
380
+ if (b == 0) {
381
+ goto exit_result_ok_const_float_1_0;
382
+ }
383
+
384
+ if (Py_IS_NAN(a)) {
385
+ goto exit_result_ok_left;
386
+ }
387
+
388
+ if (Py_IS_NAN(b)) {
389
+ if (a == 1.0) {
390
+ goto exit_result_ok_const_float_1_0;
391
+ } else {
392
+ goto exit_result_ok_right;
393
+ }
394
+ }
395
+
396
+ if (Py_IS_INFINITY(b)) {
397
+ a = fabs(a);
398
+ if (a == 1.0) {
399
+ goto exit_result_ok_const_float_1_0;
400
+ } else if ((b > 0.0) == (a > 1.0)) {
401
+ long r = (long)fabs(b);
402
+
403
+ cfloat_result = r;
404
+ goto exit_result_ok_cfloat;
405
+ } else {
406
+ goto exit_result_ok_const_float_0_0;
407
+ }
408
+ }
409
+
410
+ if (Py_IS_INFINITY(a)) {
411
+ bool b_is_odd = DOUBLE_IS_ODD_INTEGER(b);
412
+ double r;
413
+
414
+ if (b > 0.0) {
415
+ r = b_is_odd ? a : fabs(a);
416
+ } else {
417
+ r = b_is_odd ? copysign(0.0, a) : 0.0;
418
+ }
419
+
420
+ cfloat_result = r;
421
+ goto exit_result_ok_cfloat;
422
+ }
423
+
424
+ if (a == 0.0) {
425
+ if (unlikely(b < 0.0)) {
426
+ PyThreadState *tstate = PyThreadState_GET();
427
+
428
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ZeroDivisionError,
429
+ "0.0 cannot be raised to a negative power");
430
+ goto exit_result_exception;
431
+ }
432
+
433
+ bool b_is_odd = DOUBLE_IS_ODD_INTEGER(b);
434
+ double r = b_is_odd ? a : 0.0;
435
+
436
+ cfloat_result = r;
437
+ goto exit_result_ok_cfloat;
438
+ }
439
+
440
+ {
441
+ bool negate_result = false;
442
+
443
+ if (a < 0.0) {
444
+ if (unlikely(b != floor(b))) {
445
+ PyThreadState *tstate = PyThreadState_GET();
446
+
447
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ValueError,
448
+ "negative number cannot be raised to a fractional power");
449
+ goto exit_result_exception;
450
+ }
451
+
452
+ a = -a;
453
+ negate_result = DOUBLE_IS_ODD_INTEGER(b);
454
+ }
455
+
456
+ if (a == 1.0) {
457
+ if (negate_result) {
458
+ goto exit_result_ok_const_float_minus_1_0;
459
+ } else {
460
+ goto exit_result_ok_const_float_1_0;
461
+ }
462
+ } else {
463
+ errno = 0;
464
+ double r = pow(a, b);
465
+
466
+ if (unlikely(errno != 0)) {
467
+ PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError : PyExc_ValueError);
468
+ goto exit_result_exception;
469
+ }
470
+
471
+ r = negate_result ? -r : r;
472
+
473
+ cfloat_result = r;
474
+ goto exit_result_ok_cfloat;
475
+ }
476
+ }
477
+
478
+ exit_result_ok_cfloat:
479
+ if (Py_REFCNT(*operand1) == 1) {
480
+ PyFloat_SET_DOUBLE(*operand1, cfloat_result);
481
+ } else {
482
+ // We got an object handed, that we have to release.
483
+ Py_DECREF(*operand1);
484
+
485
+ *operand1 = MAKE_FLOAT_FROM_DOUBLE(cfloat_result);
486
+ }
487
+ goto exit_result_ok;
488
+
489
+ exit_result_ok_left:
490
+ goto exit_result_ok;
491
+
492
+ exit_result_ok_right:
493
+ // We got an object handed, that we have to release.
494
+ Py_DECREF(*operand1);
495
+ *operand1 = operand2;
496
+ goto exit_result_ok;
497
+
498
+ exit_result_ok_const_float_0_0:
499
+ // We got an object handed, that we have to release.
500
+ Py_DECREF(*operand1);
501
+ *operand1 = MAKE_FLOAT_FROM_DOUBLE(0.0);
502
+ goto exit_result_ok;
503
+
504
+ exit_result_ok_const_float_1_0:
505
+ // We got an object handed, that we have to release.
506
+ Py_DECREF(*operand1);
507
+ *operand1 = MAKE_FLOAT_FROM_DOUBLE(1.0);
508
+ goto exit_result_ok;
509
+
510
+ exit_result_ok_const_float_minus_1_0:
511
+ // We got an object handed, that we have to release.
512
+ Py_DECREF(*operand1);
513
+ *operand1 = MAKE_FLOAT_FROM_DOUBLE(-1.0);
514
+ goto exit_result_ok;
515
+
516
+ exit_result_ok:
517
+ return true;
518
+
519
+ exit_result_exception:
520
+ return false;
521
+ }
522
+
523
+ return __INPLACE_OPERATION_POW_OBJECT_FLOAT(operand1, operand2);
524
+ }
525
+
526
+ bool INPLACE_OPERATION_POW_OBJECT_FLOAT(PyObject **operand1, PyObject *operand2) {
527
+ return _INPLACE_OPERATION_POW_OBJECT_FLOAT(operand1, operand2);
528
+ }
529
+
530
+ /* Code referring to "FLOAT" corresponds to Python 'float' and "OBJECT" to any Python object. */
531
+ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_POW_FLOAT_OBJECT(PyObject **operand1, PyObject *operand2) {
532
+ PyTypeObject *type2 = Py_TYPE(operand2);
533
+
534
+ #ifdef _MSC_VER
535
+ #pragma warning(push)
536
+ #pragma warning(disable : 4101)
537
+ #endif
538
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
539
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
540
+ #ifdef _MSC_VER
541
+ #pragma warning(pop)
542
+ #endif
543
+
544
+ // No inplace number slot nb_inplace_power available for this type.
545
+
546
+ {
547
+ ternaryfunc slot1 = PyFloat_Type.tp_as_number->nb_power;
548
+ ternaryfunc slot2 = NULL;
549
+
550
+ if (!(&PyFloat_Type == type2)) {
551
+ // Different types, need to consider second value slot.
552
+
553
+ slot2 =
554
+ (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_power : NULL;
555
+
556
+ if (slot1 == slot2) {
557
+ slot2 = NULL;
558
+ }
559
+ }
560
+
561
+ if (slot1 != NULL) {
562
+ if (slot2 != NULL) {
563
+ if (Nuitka_Type_IsSubtype(type2, &PyFloat_Type)) {
564
+ PyObject *x = slot2(*operand1, operand2, Py_None);
565
+
566
+ if (x != Py_NotImplemented) {
567
+ obj_result = x;
568
+ goto exit_inplace_result_object;
569
+ }
570
+
571
+ Py_DECREF_IMMORTAL(x);
572
+ slot2 = NULL;
573
+ }
574
+ }
575
+
576
+ PyObject *x = slot1(*operand1, operand2, Py_None);
577
+
578
+ if (x != Py_NotImplemented) {
579
+ obj_result = x;
580
+ goto exit_inplace_result_object;
581
+ }
582
+
583
+ Py_DECREF_IMMORTAL(x);
584
+ }
585
+
586
+ if (slot2 != NULL) {
587
+ PyObject *x = slot2(*operand1, operand2, Py_None);
588
+
589
+ if (x != Py_NotImplemented) {
590
+ obj_result = x;
591
+ goto exit_inplace_result_object;
592
+ }
593
+
594
+ Py_DECREF_IMMORTAL(x);
595
+ }
596
+
597
+ #if PYTHON_VERSION < 0x300
598
+ if (!1 || !NEW_STYLE_NUMBER_TYPE(type2)) {
599
+ coercion c1 = PyFloat_Type.tp_as_number->nb_coerce;
600
+
601
+ if (c1 != NULL) {
602
+ PyObject *coerced1 = *operand1;
603
+ PyObject *coerced2 = operand2;
604
+
605
+ int err = c1(&coerced1, &coerced2);
606
+
607
+ if (unlikely(err < 0)) {
608
+ goto exit_inplace_exception;
609
+ }
610
+
611
+ if (err == 0) {
612
+ PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
613
+
614
+ if (likely(mv == NULL)) {
615
+ ternaryfunc slot = mv->nb_power;
616
+
617
+ if (likely(slot != NULL)) {
618
+ PyObject *x = slot(coerced1, coerced2, Py_None);
619
+
620
+ Py_DECREF(coerced1);
621
+ Py_DECREF(coerced2);
622
+
623
+ obj_result = x;
624
+ goto exit_inplace_result_object;
625
+ }
626
+ }
627
+
628
+ // nb_coerce took a reference.
629
+ Py_DECREF(coerced1);
630
+ Py_DECREF(coerced2);
631
+ }
632
+ }
633
+ coercion c2 =
634
+ (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_coerce : NULL;
635
+
636
+ if (c2 != NULL) {
637
+ PyObject *coerced1 = *operand1;
638
+ PyObject *coerced2 = operand2;
639
+
640
+ int err = c2(&coerced2, &coerced1);
641
+
642
+ if (unlikely(err < 0)) {
643
+ goto exit_inplace_exception;
644
+ }
645
+
646
+ if (err == 0) {
647
+ PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
648
+
649
+ if (likely(mv == NULL)) {
650
+ ternaryfunc slot = mv->nb_power;
651
+
652
+ if (likely(slot != NULL)) {
653
+ PyObject *x = slot(coerced1, coerced2, Py_None);
654
+
655
+ Py_DECREF(coerced1);
656
+ Py_DECREF(coerced2);
657
+
658
+ obj_result = x;
659
+ goto exit_inplace_result_object;
660
+ }
661
+ }
662
+
663
+ // nb_coerce took a reference.
664
+ Py_DECREF(coerced1);
665
+ Py_DECREF(coerced2);
666
+ }
667
+ }
668
+ }
669
+ #endif
670
+
671
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: 'float' and '%s'", type2->tp_name);
672
+ goto exit_inplace_exception;
673
+ }
674
+
675
+ exit_inplace_result_object:
676
+ if (unlikely(obj_result == NULL)) {
677
+ return false;
678
+ }
679
+
680
+ // We got an object handed, that we have to release.
681
+ Py_DECREF(*operand1);
682
+
683
+ // That's our return value then. As we use a dedicated variable, it's
684
+ // OK that way.
685
+ *operand1 = obj_result;
686
+
687
+ return true;
688
+
689
+ exit_inplace_exception:
690
+ return false;
691
+ }
692
+ static inline bool _INPLACE_OPERATION_POW_FLOAT_OBJECT(PyObject **operand1, PyObject *operand2) {
693
+ assert(operand1); // Pointer must be non-null.
694
+
695
+ CHECK_OBJECT(*operand1);
696
+ assert(PyFloat_CheckExact(*operand1));
697
+ CHECK_OBJECT(operand2);
698
+
699
+ PyTypeObject *type2 = Py_TYPE(operand2);
700
+
701
+ if (&PyFloat_Type == type2) {
702
+ // return _BINARY_OPERATION_POW_FLOAT_FLOAT_INPLACE(operand1, operand2);
703
+
704
+ #ifdef _MSC_VER
705
+ #pragma warning(push)
706
+ #pragma warning(disable : 4101)
707
+ #endif
708
+ // Not every code path will make use of all possible results.
709
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
710
+ NUITKA_MAY_BE_UNUSED long clong_result;
711
+ NUITKA_MAY_BE_UNUSED double cfloat_result;
712
+ #ifdef _MSC_VER
713
+ #pragma warning(pop)
714
+ #endif
715
+
716
+ CHECK_OBJECT(*operand1);
717
+ assert(PyFloat_CheckExact(*operand1));
718
+ CHECK_OBJECT(operand2);
719
+ assert(PyFloat_CheckExact(operand2));
720
+
721
+ double a = PyFloat_AS_DOUBLE(*operand1);
722
+ const double b = PyFloat_AS_DOUBLE(operand2);
723
+
724
+ if (b == 0) {
725
+ goto exit_result_ok_const_float_1_0;
726
+ }
727
+
728
+ if (Py_IS_NAN(a)) {
729
+ goto exit_result_ok_left;
730
+ }
731
+
732
+ if (Py_IS_NAN(b)) {
733
+ if (a == 1.0) {
734
+ goto exit_result_ok_const_float_1_0;
735
+ } else {
736
+ goto exit_result_ok_right;
737
+ }
738
+ }
739
+
740
+ if (Py_IS_INFINITY(b)) {
741
+ a = fabs(a);
742
+ if (a == 1.0) {
743
+ goto exit_result_ok_const_float_1_0;
744
+ } else if ((b > 0.0) == (a > 1.0)) {
745
+ long r = (long)fabs(b);
746
+
747
+ cfloat_result = r;
748
+ goto exit_result_ok_cfloat;
749
+ } else {
750
+ goto exit_result_ok_const_float_0_0;
751
+ }
752
+ }
753
+
754
+ if (Py_IS_INFINITY(a)) {
755
+ bool b_is_odd = DOUBLE_IS_ODD_INTEGER(b);
756
+ double r;
757
+
758
+ if (b > 0.0) {
759
+ r = b_is_odd ? a : fabs(a);
760
+ } else {
761
+ r = b_is_odd ? copysign(0.0, a) : 0.0;
762
+ }
763
+
764
+ cfloat_result = r;
765
+ goto exit_result_ok_cfloat;
766
+ }
767
+
768
+ if (a == 0.0) {
769
+ if (unlikely(b < 0.0)) {
770
+ PyThreadState *tstate = PyThreadState_GET();
771
+
772
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ZeroDivisionError,
773
+ "0.0 cannot be raised to a negative power");
774
+ goto exit_result_exception;
775
+ }
776
+
777
+ bool b_is_odd = DOUBLE_IS_ODD_INTEGER(b);
778
+ double r = b_is_odd ? a : 0.0;
779
+
780
+ cfloat_result = r;
781
+ goto exit_result_ok_cfloat;
782
+ }
783
+
784
+ {
785
+ bool negate_result = false;
786
+
787
+ if (a < 0.0) {
788
+ if (unlikely(b != floor(b))) {
789
+ PyThreadState *tstate = PyThreadState_GET();
790
+
791
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ValueError,
792
+ "negative number cannot be raised to a fractional power");
793
+ goto exit_result_exception;
794
+ }
795
+
796
+ a = -a;
797
+ negate_result = DOUBLE_IS_ODD_INTEGER(b);
798
+ }
799
+
800
+ if (a == 1.0) {
801
+ if (negate_result) {
802
+ goto exit_result_ok_const_float_minus_1_0;
803
+ } else {
804
+ goto exit_result_ok_const_float_1_0;
805
+ }
806
+ } else {
807
+ errno = 0;
808
+ double r = pow(a, b);
809
+
810
+ if (unlikely(errno != 0)) {
811
+ PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError : PyExc_ValueError);
812
+ goto exit_result_exception;
813
+ }
814
+
815
+ r = negate_result ? -r : r;
816
+
817
+ cfloat_result = r;
818
+ goto exit_result_ok_cfloat;
819
+ }
820
+ }
821
+
822
+ exit_result_ok_cfloat:
823
+ if (Py_REFCNT(*operand1) == 1) {
824
+ PyFloat_SET_DOUBLE(*operand1, cfloat_result);
825
+ } else {
826
+ // We got an object handed, that we have to release.
827
+ Py_DECREF(*operand1);
828
+
829
+ *operand1 = MAKE_FLOAT_FROM_DOUBLE(cfloat_result);
830
+ }
831
+ goto exit_result_ok;
832
+
833
+ exit_result_ok_left:
834
+ goto exit_result_ok;
835
+
836
+ exit_result_ok_right:
837
+ // We got an object handed, that we have to release.
838
+ Py_DECREF(*operand1);
839
+ *operand1 = operand2;
840
+ goto exit_result_ok;
841
+
842
+ exit_result_ok_const_float_0_0:
843
+ // We got an object handed, that we have to release.
844
+ Py_DECREF(*operand1);
845
+ *operand1 = MAKE_FLOAT_FROM_DOUBLE(0.0);
846
+ goto exit_result_ok;
847
+
848
+ exit_result_ok_const_float_1_0:
849
+ // We got an object handed, that we have to release.
850
+ Py_DECREF(*operand1);
851
+ *operand1 = MAKE_FLOAT_FROM_DOUBLE(1.0);
852
+ goto exit_result_ok;
853
+
854
+ exit_result_ok_const_float_minus_1_0:
855
+ // We got an object handed, that we have to release.
856
+ Py_DECREF(*operand1);
857
+ *operand1 = MAKE_FLOAT_FROM_DOUBLE(-1.0);
858
+ goto exit_result_ok;
859
+
860
+ exit_result_ok:
861
+ return true;
862
+
863
+ exit_result_exception:
864
+ return false;
865
+ }
866
+
867
+ return __INPLACE_OPERATION_POW_FLOAT_OBJECT(operand1, operand2);
868
+ }
869
+
870
+ bool INPLACE_OPERATION_POW_FLOAT_OBJECT(PyObject **operand1, PyObject *operand2) {
871
+ return _INPLACE_OPERATION_POW_FLOAT_OBJECT(operand1, operand2);
872
+ }
873
+
874
+ /* Code referring to "LONG" corresponds to Python2 'long', Python3 'int' and "LONG" to Python2 'long', Python3 'int'. */
875
+ static inline bool _INPLACE_OPERATION_POW_LONG_LONG(PyObject **operand1, PyObject *operand2) {
876
+ assert(operand1); // Pointer must be non-null.
877
+
878
+ CHECK_OBJECT(*operand1);
879
+ assert(PyLong_CheckExact(*operand1));
880
+ CHECK_OBJECT(operand2);
881
+ assert(PyLong_CheckExact(operand2));
882
+
883
+ // Not every code path will make use of all possible results.
884
+ #ifdef _MSC_VER
885
+ #pragma warning(push)
886
+ #pragma warning(disable : 4101)
887
+ #endif
888
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
889
+ NUITKA_MAY_BE_UNUSED long clong_result;
890
+ #ifdef _MSC_VER
891
+ #pragma warning(pop)
892
+ #endif
893
+
894
+ PyObject *x = PyLong_Type.tp_as_number->nb_power(*operand1, operand2, Py_None);
895
+ assert(x != Py_NotImplemented);
896
+
897
+ obj_result = x;
898
+ goto exit_result_object;
899
+
900
+ exit_result_object:
901
+ if (unlikely(obj_result == NULL)) {
902
+ goto exit_result_exception;
903
+ }
904
+ // We got an object handed, that we have to release.
905
+ Py_DECREF(*operand1);
906
+ *operand1 = obj_result;
907
+ goto exit_result_ok;
908
+
909
+ exit_result_ok:
910
+ return true;
911
+
912
+ exit_result_exception:
913
+ return false;
914
+ }
915
+
916
+ bool INPLACE_OPERATION_POW_LONG_LONG(PyObject **operand1, PyObject *operand2) {
917
+ return _INPLACE_OPERATION_POW_LONG_LONG(operand1, operand2);
918
+ }
919
+
920
+ /* Code referring to "OBJECT" corresponds to any Python object and "LONG" to Python2 'long', Python3 'int'. */
921
+ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_POW_OBJECT_LONG(PyObject **operand1, PyObject *operand2) {
922
+ PyTypeObject *type1 = Py_TYPE(*operand1);
923
+
924
+ #ifdef _MSC_VER
925
+ #pragma warning(push)
926
+ #pragma warning(disable : 4101)
927
+ #endif
928
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
929
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
930
+ #ifdef _MSC_VER
931
+ #pragma warning(pop)
932
+ #endif
933
+
934
+ ternaryfunc islot =
935
+ (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_inplace_power : NULL;
936
+
937
+ if (islot != NULL) {
938
+ PyObject *x = islot(*operand1, operand2, Py_None);
939
+
940
+ if (x != Py_NotImplemented) {
941
+ obj_result = x;
942
+ goto exit_inplace_result_object;
943
+ }
944
+
945
+ Py_DECREF_IMMORTAL(x);
946
+ }
947
+
948
+ {
949
+ ternaryfunc slot1 =
950
+ (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_power : NULL;
951
+ ternaryfunc slot2 = NULL;
952
+
953
+ if (!(type1 == &PyLong_Type)) {
954
+ // Different types, need to consider second value slot.
955
+
956
+ slot2 = PyLong_Type.tp_as_number->nb_power;
957
+
958
+ if (slot1 == slot2) {
959
+ slot2 = NULL;
960
+ }
961
+ }
962
+
963
+ if (slot1 != NULL) {
964
+ PyObject *x = slot1(*operand1, operand2, Py_None);
965
+
966
+ if (x != Py_NotImplemented) {
967
+ obj_result = x;
968
+ goto exit_inplace_result_object;
969
+ }
970
+
971
+ Py_DECREF_IMMORTAL(x);
972
+ }
973
+
974
+ if (slot2 != NULL) {
975
+ PyObject *x = slot2(*operand1, operand2, Py_None);
976
+
977
+ if (x != Py_NotImplemented) {
978
+ obj_result = x;
979
+ goto exit_inplace_result_object;
980
+ }
981
+
982
+ Py_DECREF_IMMORTAL(x);
983
+ }
984
+
985
+ #if PYTHON_VERSION < 0x300
986
+ if (!NEW_STYLE_NUMBER_TYPE(type1) || !1) {
987
+ coercion c1 =
988
+ (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_coerce : NULL;
989
+
990
+ if (c1 != NULL) {
991
+ PyObject *coerced1 = *operand1;
992
+ PyObject *coerced2 = operand2;
993
+
994
+ int err = c1(&coerced1, &coerced2);
995
+
996
+ if (unlikely(err < 0)) {
997
+ goto exit_inplace_exception;
998
+ }
999
+
1000
+ if (err == 0) {
1001
+ PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1002
+
1003
+ if (likely(mv == NULL)) {
1004
+ ternaryfunc slot = mv->nb_power;
1005
+
1006
+ if (likely(slot != NULL)) {
1007
+ PyObject *x = slot(coerced1, coerced2, Py_None);
1008
+
1009
+ Py_DECREF(coerced1);
1010
+ Py_DECREF(coerced2);
1011
+
1012
+ obj_result = x;
1013
+ goto exit_inplace_result_object;
1014
+ }
1015
+ }
1016
+
1017
+ // nb_coerce took a reference.
1018
+ Py_DECREF(coerced1);
1019
+ Py_DECREF(coerced2);
1020
+ }
1021
+ }
1022
+ coercion c2 = PyLong_Type.tp_as_number->nb_coerce;
1023
+
1024
+ if (c2 != NULL) {
1025
+ PyObject *coerced1 = *operand1;
1026
+ PyObject *coerced2 = operand2;
1027
+
1028
+ int err = c2(&coerced2, &coerced1);
1029
+
1030
+ if (unlikely(err < 0)) {
1031
+ goto exit_inplace_exception;
1032
+ }
1033
+
1034
+ if (err == 0) {
1035
+ PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1036
+
1037
+ if (likely(mv == NULL)) {
1038
+ ternaryfunc slot = mv->nb_power;
1039
+
1040
+ if (likely(slot != NULL)) {
1041
+ PyObject *x = slot(coerced1, coerced2, Py_None);
1042
+
1043
+ Py_DECREF(coerced1);
1044
+ Py_DECREF(coerced2);
1045
+
1046
+ obj_result = x;
1047
+ goto exit_inplace_result_object;
1048
+ }
1049
+ }
1050
+
1051
+ // nb_coerce took a reference.
1052
+ Py_DECREF(coerced1);
1053
+ Py_DECREF(coerced2);
1054
+ }
1055
+ }
1056
+ }
1057
+ #endif
1058
+
1059
+ #if PYTHON_VERSION < 0x300
1060
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: '%s' and 'long'", type1->tp_name);
1061
+ #else
1062
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: '%s' and 'int'", type1->tp_name);
1063
+ #endif
1064
+ goto exit_inplace_exception;
1065
+ }
1066
+
1067
+ exit_inplace_result_object:
1068
+ if (unlikely(obj_result == NULL)) {
1069
+ return false;
1070
+ }
1071
+
1072
+ // We got an object handed, that we have to release.
1073
+ Py_DECREF(*operand1);
1074
+
1075
+ // That's our return value then. As we use a dedicated variable, it's
1076
+ // OK that way.
1077
+ *operand1 = obj_result;
1078
+
1079
+ return true;
1080
+
1081
+ exit_inplace_exception:
1082
+ return false;
1083
+ }
1084
+ static inline bool _INPLACE_OPERATION_POW_OBJECT_LONG(PyObject **operand1, PyObject *operand2) {
1085
+ assert(operand1); // Pointer must be non-null.
1086
+
1087
+ CHECK_OBJECT(*operand1);
1088
+ CHECK_OBJECT(operand2);
1089
+ assert(PyLong_CheckExact(operand2));
1090
+
1091
+ PyTypeObject *type1 = Py_TYPE(*operand1);
1092
+
1093
+ if (type1 == &PyLong_Type) {
1094
+ // return _BINARY_OPERATION_POW_LONG_LONG_INPLACE(operand1, operand2);
1095
+
1096
+ // Not every code path will make use of all possible results.
1097
+ #ifdef _MSC_VER
1098
+ #pragma warning(push)
1099
+ #pragma warning(disable : 4101)
1100
+ #endif
1101
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1102
+ NUITKA_MAY_BE_UNUSED long clong_result;
1103
+ #ifdef _MSC_VER
1104
+ #pragma warning(pop)
1105
+ #endif
1106
+
1107
+ PyObject *x = PyLong_Type.tp_as_number->nb_power(*operand1, operand2, Py_None);
1108
+ assert(x != Py_NotImplemented);
1109
+
1110
+ obj_result = x;
1111
+ goto exit_result_object;
1112
+
1113
+ exit_result_object:
1114
+ if (unlikely(obj_result == NULL)) {
1115
+ goto exit_result_exception;
1116
+ }
1117
+ // We got an object handed, that we have to release.
1118
+ Py_DECREF(*operand1);
1119
+ *operand1 = obj_result;
1120
+ goto exit_result_ok;
1121
+
1122
+ exit_result_ok:
1123
+ return true;
1124
+
1125
+ exit_result_exception:
1126
+ return false;
1127
+ }
1128
+
1129
+ return __INPLACE_OPERATION_POW_OBJECT_LONG(operand1, operand2);
1130
+ }
1131
+
1132
+ bool INPLACE_OPERATION_POW_OBJECT_LONG(PyObject **operand1, PyObject *operand2) {
1133
+ return _INPLACE_OPERATION_POW_OBJECT_LONG(operand1, operand2);
1134
+ }
1135
+
1136
+ /* Code referring to "LONG" corresponds to Python2 'long', Python3 'int' and "OBJECT" to any Python object. */
1137
+ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_POW_LONG_OBJECT(PyObject **operand1, PyObject *operand2) {
1138
+ PyTypeObject *type2 = Py_TYPE(operand2);
1139
+
1140
+ #ifdef _MSC_VER
1141
+ #pragma warning(push)
1142
+ #pragma warning(disable : 4101)
1143
+ #endif
1144
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
1145
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1146
+ #ifdef _MSC_VER
1147
+ #pragma warning(pop)
1148
+ #endif
1149
+
1150
+ // No inplace number slot nb_inplace_power available for this type.
1151
+
1152
+ {
1153
+ ternaryfunc slot1 = PyLong_Type.tp_as_number->nb_power;
1154
+ ternaryfunc slot2 = NULL;
1155
+
1156
+ if (!(&PyLong_Type == type2)) {
1157
+ // Different types, need to consider second value slot.
1158
+
1159
+ slot2 =
1160
+ (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_power : NULL;
1161
+
1162
+ if (slot1 == slot2) {
1163
+ slot2 = NULL;
1164
+ }
1165
+ }
1166
+
1167
+ if (slot1 != NULL) {
1168
+ if (slot2 != NULL) {
1169
+ if (Nuitka_Type_IsSubtype(type2, &PyLong_Type)) {
1170
+ PyObject *x = slot2(*operand1, operand2, Py_None);
1171
+
1172
+ if (x != Py_NotImplemented) {
1173
+ obj_result = x;
1174
+ goto exit_inplace_result_object;
1175
+ }
1176
+
1177
+ Py_DECREF_IMMORTAL(x);
1178
+ slot2 = NULL;
1179
+ }
1180
+ }
1181
+
1182
+ PyObject *x = slot1(*operand1, operand2, Py_None);
1183
+
1184
+ if (x != Py_NotImplemented) {
1185
+ obj_result = x;
1186
+ goto exit_inplace_result_object;
1187
+ }
1188
+
1189
+ Py_DECREF_IMMORTAL(x);
1190
+ }
1191
+
1192
+ if (slot2 != NULL) {
1193
+ PyObject *x = slot2(*operand1, operand2, Py_None);
1194
+
1195
+ if (x != Py_NotImplemented) {
1196
+ obj_result = x;
1197
+ goto exit_inplace_result_object;
1198
+ }
1199
+
1200
+ Py_DECREF_IMMORTAL(x);
1201
+ }
1202
+
1203
+ #if PYTHON_VERSION < 0x300
1204
+ if (!1 || !NEW_STYLE_NUMBER_TYPE(type2)) {
1205
+ coercion c1 = PyLong_Type.tp_as_number->nb_coerce;
1206
+
1207
+ if (c1 != NULL) {
1208
+ PyObject *coerced1 = *operand1;
1209
+ PyObject *coerced2 = operand2;
1210
+
1211
+ int err = c1(&coerced1, &coerced2);
1212
+
1213
+ if (unlikely(err < 0)) {
1214
+ goto exit_inplace_exception;
1215
+ }
1216
+
1217
+ if (err == 0) {
1218
+ PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1219
+
1220
+ if (likely(mv == NULL)) {
1221
+ ternaryfunc slot = mv->nb_power;
1222
+
1223
+ if (likely(slot != NULL)) {
1224
+ PyObject *x = slot(coerced1, coerced2, Py_None);
1225
+
1226
+ Py_DECREF(coerced1);
1227
+ Py_DECREF(coerced2);
1228
+
1229
+ obj_result = x;
1230
+ goto exit_inplace_result_object;
1231
+ }
1232
+ }
1233
+
1234
+ // nb_coerce took a reference.
1235
+ Py_DECREF(coerced1);
1236
+ Py_DECREF(coerced2);
1237
+ }
1238
+ }
1239
+ coercion c2 =
1240
+ (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_coerce : NULL;
1241
+
1242
+ if (c2 != NULL) {
1243
+ PyObject *coerced1 = *operand1;
1244
+ PyObject *coerced2 = operand2;
1245
+
1246
+ int err = c2(&coerced2, &coerced1);
1247
+
1248
+ if (unlikely(err < 0)) {
1249
+ goto exit_inplace_exception;
1250
+ }
1251
+
1252
+ if (err == 0) {
1253
+ PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1254
+
1255
+ if (likely(mv == NULL)) {
1256
+ ternaryfunc slot = mv->nb_power;
1257
+
1258
+ if (likely(slot != NULL)) {
1259
+ PyObject *x = slot(coerced1, coerced2, Py_None);
1260
+
1261
+ Py_DECREF(coerced1);
1262
+ Py_DECREF(coerced2);
1263
+
1264
+ obj_result = x;
1265
+ goto exit_inplace_result_object;
1266
+ }
1267
+ }
1268
+
1269
+ // nb_coerce took a reference.
1270
+ Py_DECREF(coerced1);
1271
+ Py_DECREF(coerced2);
1272
+ }
1273
+ }
1274
+ }
1275
+ #endif
1276
+
1277
+ #if PYTHON_VERSION < 0x300
1278
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: 'long' and '%s'", type2->tp_name);
1279
+ #else
1280
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: 'int' and '%s'", type2->tp_name);
1281
+ #endif
1282
+ goto exit_inplace_exception;
1283
+ }
1284
+
1285
+ exit_inplace_result_object:
1286
+ if (unlikely(obj_result == NULL)) {
1287
+ return false;
1288
+ }
1289
+
1290
+ // We got an object handed, that we have to release.
1291
+ Py_DECREF(*operand1);
1292
+
1293
+ // That's our return value then. As we use a dedicated variable, it's
1294
+ // OK that way.
1295
+ *operand1 = obj_result;
1296
+
1297
+ return true;
1298
+
1299
+ exit_inplace_exception:
1300
+ return false;
1301
+ }
1302
+ static inline bool _INPLACE_OPERATION_POW_LONG_OBJECT(PyObject **operand1, PyObject *operand2) {
1303
+ assert(operand1); // Pointer must be non-null.
1304
+
1305
+ CHECK_OBJECT(*operand1);
1306
+ assert(PyLong_CheckExact(*operand1));
1307
+ CHECK_OBJECT(operand2);
1308
+
1309
+ PyTypeObject *type2 = Py_TYPE(operand2);
1310
+
1311
+ if (&PyLong_Type == type2) {
1312
+ // return _BINARY_OPERATION_POW_LONG_LONG_INPLACE(operand1, operand2);
1313
+
1314
+ // Not every code path will make use of all possible results.
1315
+ #ifdef _MSC_VER
1316
+ #pragma warning(push)
1317
+ #pragma warning(disable : 4101)
1318
+ #endif
1319
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1320
+ NUITKA_MAY_BE_UNUSED long clong_result;
1321
+ #ifdef _MSC_VER
1322
+ #pragma warning(pop)
1323
+ #endif
1324
+
1325
+ PyObject *x = PyLong_Type.tp_as_number->nb_power(*operand1, operand2, Py_None);
1326
+ assert(x != Py_NotImplemented);
1327
+
1328
+ obj_result = x;
1329
+ goto exit_result_object;
1330
+
1331
+ exit_result_object:
1332
+ if (unlikely(obj_result == NULL)) {
1333
+ goto exit_result_exception;
1334
+ }
1335
+ // We got an object handed, that we have to release.
1336
+ Py_DECREF(*operand1);
1337
+ *operand1 = obj_result;
1338
+ goto exit_result_ok;
1339
+
1340
+ exit_result_ok:
1341
+ return true;
1342
+
1343
+ exit_result_exception:
1344
+ return false;
1345
+ }
1346
+
1347
+ return __INPLACE_OPERATION_POW_LONG_OBJECT(operand1, operand2);
1348
+ }
1349
+
1350
+ bool INPLACE_OPERATION_POW_LONG_OBJECT(PyObject **operand1, PyObject *operand2) {
1351
+ return _INPLACE_OPERATION_POW_LONG_OBJECT(operand1, operand2);
1352
+ }
1353
+
1354
+ #if PYTHON_VERSION < 0x300
1355
+ /* Code referring to "INT" corresponds to Python2 'int' and "INT" to Python2 'int'. */
1356
+ static inline bool _INPLACE_OPERATION_POW_INT_INT(PyObject **operand1, PyObject *operand2) {
1357
+ assert(operand1); // Pointer must be non-null.
1358
+
1359
+ CHECK_OBJECT(*operand1);
1360
+ assert(PyInt_CheckExact(*operand1));
1361
+ CHECK_OBJECT(operand2);
1362
+ assert(PyInt_CheckExact(operand2));
1363
+
1364
+ // Not every code path will make use of all possible results.
1365
+ #ifdef _MSC_VER
1366
+ #pragma warning(push)
1367
+ #pragma warning(disable : 4101)
1368
+ #endif
1369
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
1370
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1371
+ NUITKA_MAY_BE_UNUSED long clong_result;
1372
+ NUITKA_MAY_BE_UNUSED double cfloat_result;
1373
+ #ifdef _MSC_VER
1374
+ #pragma warning(pop)
1375
+ #endif
1376
+
1377
+ CHECK_OBJECT(*operand1);
1378
+ assert(PyInt_CheckExact(*operand1));
1379
+ CHECK_OBJECT(operand2);
1380
+ assert(PyInt_CheckExact(operand2));
1381
+
1382
+ const long a = PyInt_AS_LONG(*operand1);
1383
+ const long b = PyInt_AS_LONG(operand2);
1384
+
1385
+ if (b < 0) {
1386
+ // TODO: Use CFLOAT once available.
1387
+ PyObject *operand1_float = MAKE_FLOAT_FROM_DOUBLE(a);
1388
+ PyObject *operand2_float = MAKE_FLOAT_FROM_DOUBLE(b);
1389
+
1390
+ PyObject *r = _BINARY_OPERATION_POW_OBJECT_FLOAT_FLOAT(operand1_float, operand2_float);
1391
+
1392
+ Py_DECREF(operand1_float);
1393
+ Py_DECREF(operand2_float);
1394
+
1395
+ obj_result = r;
1396
+ goto exit_result_object;
1397
+ } else {
1398
+ long temp = a;
1399
+ long ix = 1;
1400
+ long bb = b;
1401
+
1402
+ while (bb > 0) {
1403
+ long prev = ix;
1404
+ if (bb & 1) {
1405
+ ix = (unsigned long)ix * temp;
1406
+ if (temp == 0) {
1407
+ break;
1408
+ }
1409
+ if (ix / temp != prev) {
1410
+ PyObject *operand1_long = Nuitka_PyLong_FromLong(a);
1411
+ PyObject *operand2_long = Nuitka_PyLong_FromLong(b);
1412
+
1413
+ PyObject *r = _BINARY_OPERATION_POW_OBJECT_LONG_LONG(operand1_long, operand2_long);
1414
+
1415
+ Py_DECREF(operand1_long);
1416
+ Py_DECREF(operand2_long);
1417
+
1418
+ obj_result = r;
1419
+ goto exit_result_object;
1420
+ }
1421
+ }
1422
+ bb >>= 1;
1423
+ if (bb == 0) {
1424
+ break;
1425
+ }
1426
+ prev = temp;
1427
+ temp = (unsigned long)temp * temp;
1428
+
1429
+ if (prev != 0 && temp / prev != prev) {
1430
+ PyObject *operand1_long = Nuitka_PyLong_FromLong(a);
1431
+ PyObject *operand2_long = Nuitka_PyLong_FromLong(b);
1432
+
1433
+ PyObject *r = _BINARY_OPERATION_POW_OBJECT_LONG_LONG(operand1_long, operand2_long);
1434
+
1435
+ Py_DECREF(operand1_long);
1436
+ Py_DECREF(operand2_long);
1437
+
1438
+ obj_result = r;
1439
+ goto exit_result_object;
1440
+ }
1441
+ }
1442
+
1443
+ clong_result = ix;
1444
+ goto exit_result_ok_clong;
1445
+ }
1446
+
1447
+ exit_result_ok_clong:
1448
+
1449
+ // We got an object handed, that we have to release.
1450
+ Py_DECREF(*operand1);
1451
+
1452
+ // That's our return value then. As we use a dedicated variable, it's
1453
+ // OK that way.
1454
+ *operand1 = Nuitka_PyInt_FromLong(clong_result);
1455
+ goto exit_result_ok;
1456
+
1457
+ exit_result_object:
1458
+ if (unlikely(obj_result == NULL)) {
1459
+ goto exit_result_exception;
1460
+ }
1461
+ // We got an object handed, that we have to release.
1462
+ Py_DECREF(*operand1);
1463
+
1464
+ *operand1 = obj_result;
1465
+ goto exit_result_ok;
1466
+
1467
+ exit_result_ok:
1468
+ return true;
1469
+
1470
+ exit_result_exception:
1471
+ return false;
1472
+ }
1473
+
1474
+ bool INPLACE_OPERATION_POW_INT_INT(PyObject **operand1, PyObject *operand2) {
1475
+ return _INPLACE_OPERATION_POW_INT_INT(operand1, operand2);
1476
+ }
1477
+ #endif
1478
+
1479
+ #if PYTHON_VERSION < 0x300
1480
+ /* Code referring to "OBJECT" corresponds to any Python object and "INT" to Python2 'int'. */
1481
+ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_POW_OBJECT_INT(PyObject **operand1, PyObject *operand2) {
1482
+ PyTypeObject *type1 = Py_TYPE(*operand1);
1483
+
1484
+ #ifdef _MSC_VER
1485
+ #pragma warning(push)
1486
+ #pragma warning(disable : 4101)
1487
+ #endif
1488
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
1489
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1490
+ #ifdef _MSC_VER
1491
+ #pragma warning(pop)
1492
+ #endif
1493
+
1494
+ ternaryfunc islot =
1495
+ (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_inplace_power : NULL;
1496
+
1497
+ if (islot != NULL) {
1498
+ PyObject *x = islot(*operand1, operand2, Py_None);
1499
+
1500
+ if (x != Py_NotImplemented) {
1501
+ obj_result = x;
1502
+ goto exit_inplace_result_object;
1503
+ }
1504
+
1505
+ Py_DECREF_IMMORTAL(x);
1506
+ }
1507
+
1508
+ {
1509
+ ternaryfunc slot1 =
1510
+ (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_power : NULL;
1511
+ ternaryfunc slot2 = NULL;
1512
+
1513
+ if (!(type1 == &PyInt_Type)) {
1514
+ // Different types, need to consider second value slot.
1515
+
1516
+ slot2 = PyInt_Type.tp_as_number->nb_power;
1517
+
1518
+ if (slot1 == slot2) {
1519
+ slot2 = NULL;
1520
+ }
1521
+ }
1522
+
1523
+ if (slot1 != NULL) {
1524
+ PyObject *x = slot1(*operand1, operand2, Py_None);
1525
+
1526
+ if (x != Py_NotImplemented) {
1527
+ obj_result = x;
1528
+ goto exit_inplace_result_object;
1529
+ }
1530
+
1531
+ Py_DECREF_IMMORTAL(x);
1532
+ }
1533
+
1534
+ if (slot2 != NULL) {
1535
+ PyObject *x = slot2(*operand1, operand2, Py_None);
1536
+
1537
+ if (x != Py_NotImplemented) {
1538
+ obj_result = x;
1539
+ goto exit_inplace_result_object;
1540
+ }
1541
+
1542
+ Py_DECREF_IMMORTAL(x);
1543
+ }
1544
+
1545
+ #if PYTHON_VERSION < 0x300
1546
+ if (!NEW_STYLE_NUMBER_TYPE(type1) || !1) {
1547
+ coercion c1 =
1548
+ (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_coerce : NULL;
1549
+
1550
+ if (c1 != NULL) {
1551
+ PyObject *coerced1 = *operand1;
1552
+ PyObject *coerced2 = operand2;
1553
+
1554
+ int err = c1(&coerced1, &coerced2);
1555
+
1556
+ if (unlikely(err < 0)) {
1557
+ goto exit_inplace_exception;
1558
+ }
1559
+
1560
+ if (err == 0) {
1561
+ PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1562
+
1563
+ if (likely(mv == NULL)) {
1564
+ ternaryfunc slot = mv->nb_power;
1565
+
1566
+ if (likely(slot != NULL)) {
1567
+ PyObject *x = slot(coerced1, coerced2, Py_None);
1568
+
1569
+ Py_DECREF(coerced1);
1570
+ Py_DECREF(coerced2);
1571
+
1572
+ obj_result = x;
1573
+ goto exit_inplace_result_object;
1574
+ }
1575
+ }
1576
+
1577
+ // nb_coerce took a reference.
1578
+ Py_DECREF(coerced1);
1579
+ Py_DECREF(coerced2);
1580
+ }
1581
+ }
1582
+ coercion c2 = PyInt_Type.tp_as_number->nb_coerce;
1583
+
1584
+ if (c2 != NULL) {
1585
+ PyObject *coerced1 = *operand1;
1586
+ PyObject *coerced2 = operand2;
1587
+
1588
+ int err = c2(&coerced2, &coerced1);
1589
+
1590
+ if (unlikely(err < 0)) {
1591
+ goto exit_inplace_exception;
1592
+ }
1593
+
1594
+ if (err == 0) {
1595
+ PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1596
+
1597
+ if (likely(mv == NULL)) {
1598
+ ternaryfunc slot = mv->nb_power;
1599
+
1600
+ if (likely(slot != NULL)) {
1601
+ PyObject *x = slot(coerced1, coerced2, Py_None);
1602
+
1603
+ Py_DECREF(coerced1);
1604
+ Py_DECREF(coerced2);
1605
+
1606
+ obj_result = x;
1607
+ goto exit_inplace_result_object;
1608
+ }
1609
+ }
1610
+
1611
+ // nb_coerce took a reference.
1612
+ Py_DECREF(coerced1);
1613
+ Py_DECREF(coerced2);
1614
+ }
1615
+ }
1616
+ }
1617
+ #endif
1618
+
1619
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: '%s' and 'int'", type1->tp_name);
1620
+ goto exit_inplace_exception;
1621
+ }
1622
+
1623
+ exit_inplace_result_object:
1624
+ if (unlikely(obj_result == NULL)) {
1625
+ return false;
1626
+ }
1627
+
1628
+ // We got an object handed, that we have to release.
1629
+ Py_DECREF(*operand1);
1630
+
1631
+ // That's our return value then. As we use a dedicated variable, it's
1632
+ // OK that way.
1633
+ *operand1 = obj_result;
1634
+
1635
+ return true;
1636
+
1637
+ exit_inplace_exception:
1638
+ return false;
1639
+ }
1640
+ static inline bool _INPLACE_OPERATION_POW_OBJECT_INT(PyObject **operand1, PyObject *operand2) {
1641
+ assert(operand1); // Pointer must be non-null.
1642
+
1643
+ CHECK_OBJECT(*operand1);
1644
+ CHECK_OBJECT(operand2);
1645
+ assert(PyInt_CheckExact(operand2));
1646
+
1647
+ PyTypeObject *type1 = Py_TYPE(*operand1);
1648
+
1649
+ if (type1 == &PyInt_Type) {
1650
+ // return _BINARY_OPERATION_POW_INT_INT_INPLACE(operand1, operand2);
1651
+
1652
+ // Not every code path will make use of all possible results.
1653
+ #ifdef _MSC_VER
1654
+ #pragma warning(push)
1655
+ #pragma warning(disable : 4101)
1656
+ #endif
1657
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
1658
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1659
+ NUITKA_MAY_BE_UNUSED long clong_result;
1660
+ NUITKA_MAY_BE_UNUSED double cfloat_result;
1661
+ #ifdef _MSC_VER
1662
+ #pragma warning(pop)
1663
+ #endif
1664
+
1665
+ CHECK_OBJECT(*operand1);
1666
+ assert(PyInt_CheckExact(*operand1));
1667
+ CHECK_OBJECT(operand2);
1668
+ assert(PyInt_CheckExact(operand2));
1669
+
1670
+ const long a = PyInt_AS_LONG(*operand1);
1671
+ const long b = PyInt_AS_LONG(operand2);
1672
+
1673
+ if (b < 0) {
1674
+ // TODO: Use CFLOAT once available.
1675
+ PyObject *operand1_float = MAKE_FLOAT_FROM_DOUBLE(a);
1676
+ PyObject *operand2_float = MAKE_FLOAT_FROM_DOUBLE(b);
1677
+
1678
+ PyObject *r = _BINARY_OPERATION_POW_OBJECT_FLOAT_FLOAT(operand1_float, operand2_float);
1679
+
1680
+ Py_DECREF(operand1_float);
1681
+ Py_DECREF(operand2_float);
1682
+
1683
+ obj_result = r;
1684
+ goto exit_result_object;
1685
+ } else {
1686
+ long temp = a;
1687
+ long ix = 1;
1688
+ long bb = b;
1689
+
1690
+ while (bb > 0) {
1691
+ long prev = ix;
1692
+ if (bb & 1) {
1693
+ ix = (unsigned long)ix * temp;
1694
+ if (temp == 0) {
1695
+ break;
1696
+ }
1697
+ if (ix / temp != prev) {
1698
+ PyObject *operand1_long = Nuitka_PyLong_FromLong(a);
1699
+ PyObject *operand2_long = Nuitka_PyLong_FromLong(b);
1700
+
1701
+ PyObject *r = _BINARY_OPERATION_POW_OBJECT_LONG_LONG(operand1_long, operand2_long);
1702
+
1703
+ Py_DECREF(operand1_long);
1704
+ Py_DECREF(operand2_long);
1705
+
1706
+ obj_result = r;
1707
+ goto exit_result_object;
1708
+ }
1709
+ }
1710
+ bb >>= 1;
1711
+ if (bb == 0) {
1712
+ break;
1713
+ }
1714
+ prev = temp;
1715
+ temp = (unsigned long)temp * temp;
1716
+
1717
+ if (prev != 0 && temp / prev != prev) {
1718
+ PyObject *operand1_long = Nuitka_PyLong_FromLong(a);
1719
+ PyObject *operand2_long = Nuitka_PyLong_FromLong(b);
1720
+
1721
+ PyObject *r = _BINARY_OPERATION_POW_OBJECT_LONG_LONG(operand1_long, operand2_long);
1722
+
1723
+ Py_DECREF(operand1_long);
1724
+ Py_DECREF(operand2_long);
1725
+
1726
+ obj_result = r;
1727
+ goto exit_result_object;
1728
+ }
1729
+ }
1730
+
1731
+ clong_result = ix;
1732
+ goto exit_result_ok_clong;
1733
+ }
1734
+
1735
+ exit_result_ok_clong:
1736
+
1737
+ // We got an object handed, that we have to release.
1738
+ Py_DECREF(*operand1);
1739
+
1740
+ // That's our return value then. As we use a dedicated variable, it's
1741
+ // OK that way.
1742
+ *operand1 = Nuitka_PyInt_FromLong(clong_result);
1743
+ goto exit_result_ok;
1744
+
1745
+ exit_result_object:
1746
+ if (unlikely(obj_result == NULL)) {
1747
+ goto exit_result_exception;
1748
+ }
1749
+ // We got an object handed, that we have to release.
1750
+ Py_DECREF(*operand1);
1751
+
1752
+ *operand1 = obj_result;
1753
+ goto exit_result_ok;
1754
+
1755
+ exit_result_ok:
1756
+ return true;
1757
+
1758
+ exit_result_exception:
1759
+ return false;
1760
+ }
1761
+
1762
+ return __INPLACE_OPERATION_POW_OBJECT_INT(operand1, operand2);
1763
+ }
1764
+
1765
+ bool INPLACE_OPERATION_POW_OBJECT_INT(PyObject **operand1, PyObject *operand2) {
1766
+ return _INPLACE_OPERATION_POW_OBJECT_INT(operand1, operand2);
1767
+ }
1768
+ #endif
1769
+
1770
+ #if PYTHON_VERSION < 0x300
1771
+ /* Code referring to "INT" corresponds to Python2 'int' and "OBJECT" to any Python object. */
1772
+ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_POW_INT_OBJECT(PyObject **operand1, PyObject *operand2) {
1773
+ PyTypeObject *type2 = Py_TYPE(operand2);
1774
+
1775
+ #ifdef _MSC_VER
1776
+ #pragma warning(push)
1777
+ #pragma warning(disable : 4101)
1778
+ #endif
1779
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
1780
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1781
+ #ifdef _MSC_VER
1782
+ #pragma warning(pop)
1783
+ #endif
1784
+
1785
+ // No inplace number slot nb_inplace_power available for this type.
1786
+
1787
+ {
1788
+ ternaryfunc slot1 = PyInt_Type.tp_as_number->nb_power;
1789
+ ternaryfunc slot2 = NULL;
1790
+
1791
+ if (!(&PyInt_Type == type2)) {
1792
+ // Different types, need to consider second value slot.
1793
+
1794
+ slot2 =
1795
+ (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_power : NULL;
1796
+
1797
+ if (slot1 == slot2) {
1798
+ slot2 = NULL;
1799
+ }
1800
+ }
1801
+
1802
+ if (slot1 != NULL) {
1803
+ if (slot2 != NULL) {
1804
+ if (Nuitka_Type_IsSubtype(type2, &PyInt_Type)) {
1805
+ PyObject *x = slot2(*operand1, operand2, Py_None);
1806
+
1807
+ if (x != Py_NotImplemented) {
1808
+ obj_result = x;
1809
+ goto exit_inplace_result_object;
1810
+ }
1811
+
1812
+ Py_DECREF_IMMORTAL(x);
1813
+ slot2 = NULL;
1814
+ }
1815
+ }
1816
+
1817
+ PyObject *x = slot1(*operand1, operand2, Py_None);
1818
+
1819
+ if (x != Py_NotImplemented) {
1820
+ obj_result = x;
1821
+ goto exit_inplace_result_object;
1822
+ }
1823
+
1824
+ Py_DECREF_IMMORTAL(x);
1825
+ }
1826
+
1827
+ if (slot2 != NULL) {
1828
+ PyObject *x = slot2(*operand1, operand2, Py_None);
1829
+
1830
+ if (x != Py_NotImplemented) {
1831
+ obj_result = x;
1832
+ goto exit_inplace_result_object;
1833
+ }
1834
+
1835
+ Py_DECREF_IMMORTAL(x);
1836
+ }
1837
+
1838
+ #if PYTHON_VERSION < 0x300
1839
+ if (!1 || !NEW_STYLE_NUMBER_TYPE(type2)) {
1840
+ coercion c1 = PyInt_Type.tp_as_number->nb_coerce;
1841
+
1842
+ if (c1 != NULL) {
1843
+ PyObject *coerced1 = *operand1;
1844
+ PyObject *coerced2 = operand2;
1845
+
1846
+ int err = c1(&coerced1, &coerced2);
1847
+
1848
+ if (unlikely(err < 0)) {
1849
+ goto exit_inplace_exception;
1850
+ }
1851
+
1852
+ if (err == 0) {
1853
+ PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1854
+
1855
+ if (likely(mv == NULL)) {
1856
+ ternaryfunc slot = mv->nb_power;
1857
+
1858
+ if (likely(slot != NULL)) {
1859
+ PyObject *x = slot(coerced1, coerced2, Py_None);
1860
+
1861
+ Py_DECREF(coerced1);
1862
+ Py_DECREF(coerced2);
1863
+
1864
+ obj_result = x;
1865
+ goto exit_inplace_result_object;
1866
+ }
1867
+ }
1868
+
1869
+ // nb_coerce took a reference.
1870
+ Py_DECREF(coerced1);
1871
+ Py_DECREF(coerced2);
1872
+ }
1873
+ }
1874
+ coercion c2 =
1875
+ (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_coerce : NULL;
1876
+
1877
+ if (c2 != NULL) {
1878
+ PyObject *coerced1 = *operand1;
1879
+ PyObject *coerced2 = operand2;
1880
+
1881
+ int err = c2(&coerced2, &coerced1);
1882
+
1883
+ if (unlikely(err < 0)) {
1884
+ goto exit_inplace_exception;
1885
+ }
1886
+
1887
+ if (err == 0) {
1888
+ PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
1889
+
1890
+ if (likely(mv == NULL)) {
1891
+ ternaryfunc slot = mv->nb_power;
1892
+
1893
+ if (likely(slot != NULL)) {
1894
+ PyObject *x = slot(coerced1, coerced2, Py_None);
1895
+
1896
+ Py_DECREF(coerced1);
1897
+ Py_DECREF(coerced2);
1898
+
1899
+ obj_result = x;
1900
+ goto exit_inplace_result_object;
1901
+ }
1902
+ }
1903
+
1904
+ // nb_coerce took a reference.
1905
+ Py_DECREF(coerced1);
1906
+ Py_DECREF(coerced2);
1907
+ }
1908
+ }
1909
+ }
1910
+ #endif
1911
+
1912
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: 'int' and '%s'", type2->tp_name);
1913
+ goto exit_inplace_exception;
1914
+ }
1915
+
1916
+ exit_inplace_result_object:
1917
+ if (unlikely(obj_result == NULL)) {
1918
+ return false;
1919
+ }
1920
+
1921
+ // We got an object handed, that we have to release.
1922
+ Py_DECREF(*operand1);
1923
+
1924
+ // That's our return value then. As we use a dedicated variable, it's
1925
+ // OK that way.
1926
+ *operand1 = obj_result;
1927
+
1928
+ return true;
1929
+
1930
+ exit_inplace_exception:
1931
+ return false;
1932
+ }
1933
+ static inline bool _INPLACE_OPERATION_POW_INT_OBJECT(PyObject **operand1, PyObject *operand2) {
1934
+ assert(operand1); // Pointer must be non-null.
1935
+
1936
+ CHECK_OBJECT(*operand1);
1937
+ assert(PyInt_CheckExact(*operand1));
1938
+ CHECK_OBJECT(operand2);
1939
+
1940
+ PyTypeObject *type2 = Py_TYPE(operand2);
1941
+
1942
+ if (&PyInt_Type == type2) {
1943
+ // return _BINARY_OPERATION_POW_INT_INT_INPLACE(operand1, operand2);
1944
+
1945
+ // Not every code path will make use of all possible results.
1946
+ #ifdef _MSC_VER
1947
+ #pragma warning(push)
1948
+ #pragma warning(disable : 4101)
1949
+ #endif
1950
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
1951
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
1952
+ NUITKA_MAY_BE_UNUSED long clong_result;
1953
+ NUITKA_MAY_BE_UNUSED double cfloat_result;
1954
+ #ifdef _MSC_VER
1955
+ #pragma warning(pop)
1956
+ #endif
1957
+
1958
+ CHECK_OBJECT(*operand1);
1959
+ assert(PyInt_CheckExact(*operand1));
1960
+ CHECK_OBJECT(operand2);
1961
+ assert(PyInt_CheckExact(operand2));
1962
+
1963
+ const long a = PyInt_AS_LONG(*operand1);
1964
+ const long b = PyInt_AS_LONG(operand2);
1965
+
1966
+ if (b < 0) {
1967
+ // TODO: Use CFLOAT once available.
1968
+ PyObject *operand1_float = MAKE_FLOAT_FROM_DOUBLE(a);
1969
+ PyObject *operand2_float = MAKE_FLOAT_FROM_DOUBLE(b);
1970
+
1971
+ PyObject *r = _BINARY_OPERATION_POW_OBJECT_FLOAT_FLOAT(operand1_float, operand2_float);
1972
+
1973
+ Py_DECREF(operand1_float);
1974
+ Py_DECREF(operand2_float);
1975
+
1976
+ obj_result = r;
1977
+ goto exit_result_object;
1978
+ } else {
1979
+ long temp = a;
1980
+ long ix = 1;
1981
+ long bb = b;
1982
+
1983
+ while (bb > 0) {
1984
+ long prev = ix;
1985
+ if (bb & 1) {
1986
+ ix = (unsigned long)ix * temp;
1987
+ if (temp == 0) {
1988
+ break;
1989
+ }
1990
+ if (ix / temp != prev) {
1991
+ PyObject *operand1_long = Nuitka_PyLong_FromLong(a);
1992
+ PyObject *operand2_long = Nuitka_PyLong_FromLong(b);
1993
+
1994
+ PyObject *r = _BINARY_OPERATION_POW_OBJECT_LONG_LONG(operand1_long, operand2_long);
1995
+
1996
+ Py_DECREF(operand1_long);
1997
+ Py_DECREF(operand2_long);
1998
+
1999
+ obj_result = r;
2000
+ goto exit_result_object;
2001
+ }
2002
+ }
2003
+ bb >>= 1;
2004
+ if (bb == 0) {
2005
+ break;
2006
+ }
2007
+ prev = temp;
2008
+ temp = (unsigned long)temp * temp;
2009
+
2010
+ if (prev != 0 && temp / prev != prev) {
2011
+ PyObject *operand1_long = Nuitka_PyLong_FromLong(a);
2012
+ PyObject *operand2_long = Nuitka_PyLong_FromLong(b);
2013
+
2014
+ PyObject *r = _BINARY_OPERATION_POW_OBJECT_LONG_LONG(operand1_long, operand2_long);
2015
+
2016
+ Py_DECREF(operand1_long);
2017
+ Py_DECREF(operand2_long);
2018
+
2019
+ obj_result = r;
2020
+ goto exit_result_object;
2021
+ }
2022
+ }
2023
+
2024
+ clong_result = ix;
2025
+ goto exit_result_ok_clong;
2026
+ }
2027
+
2028
+ exit_result_ok_clong:
2029
+
2030
+ // We got an object handed, that we have to release.
2031
+ Py_DECREF(*operand1);
2032
+
2033
+ // That's our return value then. As we use a dedicated variable, it's
2034
+ // OK that way.
2035
+ *operand1 = Nuitka_PyInt_FromLong(clong_result);
2036
+ goto exit_result_ok;
2037
+
2038
+ exit_result_object:
2039
+ if (unlikely(obj_result == NULL)) {
2040
+ goto exit_result_exception;
2041
+ }
2042
+ // We got an object handed, that we have to release.
2043
+ Py_DECREF(*operand1);
2044
+
2045
+ *operand1 = obj_result;
2046
+ goto exit_result_ok;
2047
+
2048
+ exit_result_ok:
2049
+ return true;
2050
+
2051
+ exit_result_exception:
2052
+ return false;
2053
+ }
2054
+
2055
+ return __INPLACE_OPERATION_POW_INT_OBJECT(operand1, operand2);
2056
+ }
2057
+
2058
+ bool INPLACE_OPERATION_POW_INT_OBJECT(PyObject **operand1, PyObject *operand2) {
2059
+ return _INPLACE_OPERATION_POW_INT_OBJECT(operand1, operand2);
2060
+ }
2061
+ #endif
2062
+
2063
+ /* Code referring to "FLOAT" corresponds to Python 'float' and "LONG" to Python2 'long', Python3 'int'. */
2064
+ static inline bool _INPLACE_OPERATION_POW_FLOAT_LONG(PyObject **operand1, PyObject *operand2) {
2065
+ assert(operand1); // Pointer must be non-null.
2066
+
2067
+ CHECK_OBJECT(*operand1);
2068
+ assert(PyFloat_CheckExact(*operand1));
2069
+ CHECK_OBJECT(operand2);
2070
+ assert(PyLong_CheckExact(operand2));
2071
+
2072
+ #ifdef _MSC_VER
2073
+ #pragma warning(push)
2074
+ #pragma warning(disable : 4101)
2075
+ #endif
2076
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
2077
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2078
+ #ifdef _MSC_VER
2079
+ #pragma warning(pop)
2080
+ #endif
2081
+
2082
+ // No inplace number slot nb_inplace_power available for this type.
2083
+
2084
+ {
2085
+ ternaryfunc slot1 = PyFloat_Type.tp_as_number->nb_power;
2086
+ // Slot2 ignored on purpose, type1 takes precedence.
2087
+
2088
+ if (slot1 != NULL) {
2089
+ PyObject *x = slot1(*operand1, operand2, Py_None);
2090
+
2091
+ if (x != Py_NotImplemented) {
2092
+ obj_result = x;
2093
+ goto exit_inplace_result_object;
2094
+ }
2095
+
2096
+ Py_DECREF_IMMORTAL(x);
2097
+ }
2098
+
2099
+ // Statically recognized that coercion is not possible with these types
2100
+
2101
+ #if PYTHON_VERSION < 0x300
2102
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: 'float' and 'long'");
2103
+ #else
2104
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: 'float' and 'int'");
2105
+ #endif
2106
+ goto exit_inplace_exception;
2107
+ }
2108
+
2109
+ exit_inplace_result_object:
2110
+ if (unlikely(obj_result == NULL)) {
2111
+ return false;
2112
+ }
2113
+
2114
+ // We got an object handed, that we have to release.
2115
+ Py_DECREF(*operand1);
2116
+
2117
+ // That's our return value then. As we use a dedicated variable, it's
2118
+ // OK that way.
2119
+ *operand1 = obj_result;
2120
+
2121
+ return true;
2122
+
2123
+ exit_inplace_exception:
2124
+ return false;
2125
+ }
2126
+
2127
+ bool INPLACE_OPERATION_POW_FLOAT_LONG(PyObject **operand1, PyObject *operand2) {
2128
+ return _INPLACE_OPERATION_POW_FLOAT_LONG(operand1, operand2);
2129
+ }
2130
+
2131
+ /* Code referring to "LONG" corresponds to Python2 'long', Python3 'int' and "FLOAT" to Python 'float'. */
2132
+ static inline bool _INPLACE_OPERATION_POW_LONG_FLOAT(PyObject **operand1, PyObject *operand2) {
2133
+ assert(operand1); // Pointer must be non-null.
2134
+
2135
+ CHECK_OBJECT(*operand1);
2136
+ assert(PyLong_CheckExact(*operand1));
2137
+ CHECK_OBJECT(operand2);
2138
+ assert(PyFloat_CheckExact(operand2));
2139
+
2140
+ #ifdef _MSC_VER
2141
+ #pragma warning(push)
2142
+ #pragma warning(disable : 4101)
2143
+ #endif
2144
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
2145
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2146
+ #ifdef _MSC_VER
2147
+ #pragma warning(pop)
2148
+ #endif
2149
+
2150
+ // No inplace number slot nb_inplace_power available for this type.
2151
+
2152
+ {
2153
+ // Slot1 ignored on purpose, type2 takes precedence.
2154
+ ternaryfunc slot2 = NULL;
2155
+
2156
+ if (!(0)) {
2157
+ // Different types, need to consider second value slot.
2158
+
2159
+ slot2 = PyFloat_Type.tp_as_number->nb_power;
2160
+ }
2161
+
2162
+ if (slot2 != NULL) {
2163
+ PyObject *x = slot2(*operand1, operand2, Py_None);
2164
+
2165
+ if (x != Py_NotImplemented) {
2166
+ obj_result = x;
2167
+ goto exit_inplace_result_object;
2168
+ }
2169
+
2170
+ Py_DECREF_IMMORTAL(x);
2171
+ }
2172
+
2173
+ // Statically recognized that coercion is not possible with these types
2174
+
2175
+ #if PYTHON_VERSION < 0x300
2176
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: 'long' and 'float'");
2177
+ #else
2178
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: 'int' and 'float'");
2179
+ #endif
2180
+ goto exit_inplace_exception;
2181
+ }
2182
+
2183
+ exit_inplace_result_object:
2184
+ if (unlikely(obj_result == NULL)) {
2185
+ return false;
2186
+ }
2187
+
2188
+ // We got an object handed, that we have to release.
2189
+ Py_DECREF(*operand1);
2190
+
2191
+ // That's our return value then. As we use a dedicated variable, it's
2192
+ // OK that way.
2193
+ *operand1 = obj_result;
2194
+
2195
+ return true;
2196
+
2197
+ exit_inplace_exception:
2198
+ return false;
2199
+ }
2200
+
2201
+ bool INPLACE_OPERATION_POW_LONG_FLOAT(PyObject **operand1, PyObject *operand2) {
2202
+ return _INPLACE_OPERATION_POW_LONG_FLOAT(operand1, operand2);
2203
+ }
2204
+
2205
+ #if PYTHON_VERSION < 0x300
2206
+ /* Code referring to "FLOAT" corresponds to Python 'float' and "INT" to Python2 'int'. */
2207
+ static inline bool _INPLACE_OPERATION_POW_FLOAT_INT(PyObject **operand1, PyObject *operand2) {
2208
+ assert(operand1); // Pointer must be non-null.
2209
+
2210
+ CHECK_OBJECT(*operand1);
2211
+ assert(PyFloat_CheckExact(*operand1));
2212
+ CHECK_OBJECT(operand2);
2213
+ assert(PyInt_CheckExact(operand2));
2214
+
2215
+ #ifdef _MSC_VER
2216
+ #pragma warning(push)
2217
+ #pragma warning(disable : 4101)
2218
+ #endif
2219
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
2220
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2221
+ #ifdef _MSC_VER
2222
+ #pragma warning(pop)
2223
+ #endif
2224
+
2225
+ // No inplace number slot nb_inplace_power available for this type.
2226
+
2227
+ {
2228
+ ternaryfunc slot1 = PyFloat_Type.tp_as_number->nb_power;
2229
+ // Slot2 ignored on purpose, type1 takes precedence.
2230
+
2231
+ if (slot1 != NULL) {
2232
+ PyObject *x = slot1(*operand1, operand2, Py_None);
2233
+
2234
+ if (x != Py_NotImplemented) {
2235
+ obj_result = x;
2236
+ goto exit_inplace_result_object;
2237
+ }
2238
+
2239
+ Py_DECREF_IMMORTAL(x);
2240
+ }
2241
+
2242
+ // Statically recognized that coercion is not possible with these types
2243
+
2244
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: 'float' and 'int'");
2245
+ goto exit_inplace_exception;
2246
+ }
2247
+
2248
+ exit_inplace_result_object:
2249
+ if (unlikely(obj_result == NULL)) {
2250
+ return false;
2251
+ }
2252
+
2253
+ // We got an object handed, that we have to release.
2254
+ Py_DECREF(*operand1);
2255
+
2256
+ // That's our return value then. As we use a dedicated variable, it's
2257
+ // OK that way.
2258
+ *operand1 = obj_result;
2259
+
2260
+ return true;
2261
+
2262
+ exit_inplace_exception:
2263
+ return false;
2264
+ }
2265
+
2266
+ bool INPLACE_OPERATION_POW_FLOAT_INT(PyObject **operand1, PyObject *operand2) {
2267
+ return _INPLACE_OPERATION_POW_FLOAT_INT(operand1, operand2);
2268
+ }
2269
+ #endif
2270
+
2271
+ #if PYTHON_VERSION < 0x300
2272
+ /* Code referring to "INT" corresponds to Python2 'int' and "FLOAT" to Python 'float'. */
2273
+ static inline bool _INPLACE_OPERATION_POW_INT_FLOAT(PyObject **operand1, PyObject *operand2) {
2274
+ assert(operand1); // Pointer must be non-null.
2275
+
2276
+ CHECK_OBJECT(*operand1);
2277
+ assert(PyInt_CheckExact(*operand1));
2278
+ CHECK_OBJECT(operand2);
2279
+ assert(PyFloat_CheckExact(operand2));
2280
+
2281
+ #ifdef _MSC_VER
2282
+ #pragma warning(push)
2283
+ #pragma warning(disable : 4101)
2284
+ #endif
2285
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
2286
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2287
+ #ifdef _MSC_VER
2288
+ #pragma warning(pop)
2289
+ #endif
2290
+
2291
+ // No inplace number slot nb_inplace_power available for this type.
2292
+
2293
+ {
2294
+ // Slot1 ignored on purpose, type2 takes precedence.
2295
+ ternaryfunc slot2 = NULL;
2296
+
2297
+ if (!(0)) {
2298
+ // Different types, need to consider second value slot.
2299
+
2300
+ slot2 = PyFloat_Type.tp_as_number->nb_power;
2301
+ }
2302
+
2303
+ if (slot2 != NULL) {
2304
+ PyObject *x = slot2(*operand1, operand2, Py_None);
2305
+
2306
+ if (x != Py_NotImplemented) {
2307
+ obj_result = x;
2308
+ goto exit_inplace_result_object;
2309
+ }
2310
+
2311
+ Py_DECREF_IMMORTAL(x);
2312
+ }
2313
+
2314
+ // Statically recognized that coercion is not possible with these types
2315
+
2316
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: 'int' and 'float'");
2317
+ goto exit_inplace_exception;
2318
+ }
2319
+
2320
+ exit_inplace_result_object:
2321
+ if (unlikely(obj_result == NULL)) {
2322
+ return false;
2323
+ }
2324
+
2325
+ // We got an object handed, that we have to release.
2326
+ Py_DECREF(*operand1);
2327
+
2328
+ // That's our return value then. As we use a dedicated variable, it's
2329
+ // OK that way.
2330
+ *operand1 = obj_result;
2331
+
2332
+ return true;
2333
+
2334
+ exit_inplace_exception:
2335
+ return false;
2336
+ }
2337
+
2338
+ bool INPLACE_OPERATION_POW_INT_FLOAT(PyObject **operand1, PyObject *operand2) {
2339
+ return _INPLACE_OPERATION_POW_INT_FLOAT(operand1, operand2);
2340
+ }
2341
+ #endif
2342
+
2343
+ #if PYTHON_VERSION < 0x300
2344
+ /* Code referring to "LONG" corresponds to Python2 'long', Python3 'int' and "INT" to Python2 'int'. */
2345
+ static inline bool _INPLACE_OPERATION_POW_LONG_INT(PyObject **operand1, PyObject *operand2) {
2346
+ assert(operand1); // Pointer must be non-null.
2347
+
2348
+ CHECK_OBJECT(*operand1);
2349
+ assert(PyLong_CheckExact(*operand1));
2350
+ CHECK_OBJECT(operand2);
2351
+ assert(PyInt_CheckExact(operand2));
2352
+
2353
+ #ifdef _MSC_VER
2354
+ #pragma warning(push)
2355
+ #pragma warning(disable : 4101)
2356
+ #endif
2357
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
2358
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2359
+ #ifdef _MSC_VER
2360
+ #pragma warning(pop)
2361
+ #endif
2362
+
2363
+ // No inplace number slot nb_inplace_power available for this type.
2364
+
2365
+ {
2366
+ ternaryfunc slot1 = PyLong_Type.tp_as_number->nb_power;
2367
+ // Slot2 ignored on purpose, type1 takes precedence.
2368
+
2369
+ if (slot1 != NULL) {
2370
+ PyObject *x = slot1(*operand1, operand2, Py_None);
2371
+
2372
+ if (x != Py_NotImplemented) {
2373
+ obj_result = x;
2374
+ goto exit_inplace_result_object;
2375
+ }
2376
+
2377
+ Py_DECREF_IMMORTAL(x);
2378
+ }
2379
+
2380
+ // Statically recognized that coercion is not possible with these types
2381
+
2382
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: 'long' and 'int'");
2383
+ goto exit_inplace_exception;
2384
+ }
2385
+
2386
+ exit_inplace_result_object:
2387
+ if (unlikely(obj_result == NULL)) {
2388
+ return false;
2389
+ }
2390
+
2391
+ // We got an object handed, that we have to release.
2392
+ Py_DECREF(*operand1);
2393
+
2394
+ // That's our return value then. As we use a dedicated variable, it's
2395
+ // OK that way.
2396
+ *operand1 = obj_result;
2397
+
2398
+ return true;
2399
+
2400
+ exit_inplace_exception:
2401
+ return false;
2402
+ }
2403
+
2404
+ bool INPLACE_OPERATION_POW_LONG_INT(PyObject **operand1, PyObject *operand2) {
2405
+ return _INPLACE_OPERATION_POW_LONG_INT(operand1, operand2);
2406
+ }
2407
+ #endif
2408
+
2409
+ #if PYTHON_VERSION < 0x300
2410
+ /* Code referring to "INT" corresponds to Python2 'int' and "LONG" to Python2 'long', Python3 'int'. */
2411
+ static inline bool _INPLACE_OPERATION_POW_INT_LONG(PyObject **operand1, PyObject *operand2) {
2412
+ assert(operand1); // Pointer must be non-null.
2413
+
2414
+ CHECK_OBJECT(*operand1);
2415
+ assert(PyInt_CheckExact(*operand1));
2416
+ CHECK_OBJECT(operand2);
2417
+ assert(PyLong_CheckExact(operand2));
2418
+
2419
+ #ifdef _MSC_VER
2420
+ #pragma warning(push)
2421
+ #pragma warning(disable : 4101)
2422
+ #endif
2423
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
2424
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2425
+ #ifdef _MSC_VER
2426
+ #pragma warning(pop)
2427
+ #endif
2428
+
2429
+ // No inplace number slot nb_inplace_power available for this type.
2430
+
2431
+ {
2432
+ // Slot1 ignored on purpose, type2 takes precedence.
2433
+ ternaryfunc slot2 = NULL;
2434
+
2435
+ if (!(0)) {
2436
+ // Different types, need to consider second value slot.
2437
+
2438
+ slot2 = PyLong_Type.tp_as_number->nb_power;
2439
+ }
2440
+
2441
+ if (slot2 != NULL) {
2442
+ PyObject *x = slot2(*operand1, operand2, Py_None);
2443
+
2444
+ if (x != Py_NotImplemented) {
2445
+ obj_result = x;
2446
+ goto exit_inplace_result_object;
2447
+ }
2448
+
2449
+ Py_DECREF_IMMORTAL(x);
2450
+ }
2451
+
2452
+ // Statically recognized that coercion is not possible with these types
2453
+
2454
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: 'int' and 'long'");
2455
+ goto exit_inplace_exception;
2456
+ }
2457
+
2458
+ exit_inplace_result_object:
2459
+ if (unlikely(obj_result == NULL)) {
2460
+ return false;
2461
+ }
2462
+
2463
+ // We got an object handed, that we have to release.
2464
+ Py_DECREF(*operand1);
2465
+
2466
+ // That's our return value then. As we use a dedicated variable, it's
2467
+ // OK that way.
2468
+ *operand1 = obj_result;
2469
+
2470
+ return true;
2471
+
2472
+ exit_inplace_exception:
2473
+ return false;
2474
+ }
2475
+
2476
+ bool INPLACE_OPERATION_POW_INT_LONG(PyObject **operand1, PyObject *operand2) {
2477
+ return _INPLACE_OPERATION_POW_INT_LONG(operand1, operand2);
2478
+ }
2479
+ #endif
2480
+
2481
+ /* Code referring to "OBJECT" corresponds to any Python object and "OBJECT" to any Python object. */
2482
+ static inline bool _INPLACE_OPERATION_POW_OBJECT_OBJECT(PyObject **operand1, PyObject *operand2) {
2483
+ assert(operand1); // Pointer must be non-null.
2484
+
2485
+ CHECK_OBJECT(*operand1);
2486
+ CHECK_OBJECT(operand2);
2487
+
2488
+ #if PYTHON_VERSION < 0x300
2489
+ if (PyInt_CheckExact(*operand1) && PyInt_CheckExact(operand2)) {
2490
+
2491
+ // Not every code path will make use of all possible results.
2492
+ #ifdef _MSC_VER
2493
+ #pragma warning(push)
2494
+ #pragma warning(disable : 4101)
2495
+ #endif
2496
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
2497
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2498
+ NUITKA_MAY_BE_UNUSED long clong_result;
2499
+ NUITKA_MAY_BE_UNUSED double cfloat_result;
2500
+ #ifdef _MSC_VER
2501
+ #pragma warning(pop)
2502
+ #endif
2503
+
2504
+ CHECK_OBJECT(*operand1);
2505
+ assert(PyInt_CheckExact(*operand1));
2506
+ CHECK_OBJECT(operand2);
2507
+ assert(PyInt_CheckExact(operand2));
2508
+
2509
+ const long a = PyInt_AS_LONG(*operand1);
2510
+ const long b = PyInt_AS_LONG(operand2);
2511
+
2512
+ if (b < 0) {
2513
+ // TODO: Use CFLOAT once available.
2514
+ PyObject *operand1_float = MAKE_FLOAT_FROM_DOUBLE(a);
2515
+ PyObject *operand2_float = MAKE_FLOAT_FROM_DOUBLE(b);
2516
+
2517
+ PyObject *r = _BINARY_OPERATION_POW_OBJECT_FLOAT_FLOAT(operand1_float, operand2_float);
2518
+
2519
+ Py_DECREF(operand1_float);
2520
+ Py_DECREF(operand2_float);
2521
+
2522
+ obj_result = r;
2523
+ goto exit_result_object;
2524
+ } else {
2525
+ long temp = a;
2526
+ long ix = 1;
2527
+ long bb = b;
2528
+
2529
+ while (bb > 0) {
2530
+ long prev = ix;
2531
+ if (bb & 1) {
2532
+ ix = (unsigned long)ix * temp;
2533
+ if (temp == 0) {
2534
+ break;
2535
+ }
2536
+ if (ix / temp != prev) {
2537
+ PyObject *operand1_long = Nuitka_PyLong_FromLong(a);
2538
+ PyObject *operand2_long = Nuitka_PyLong_FromLong(b);
2539
+
2540
+ PyObject *r = _BINARY_OPERATION_POW_OBJECT_LONG_LONG(operand1_long, operand2_long);
2541
+
2542
+ Py_DECREF(operand1_long);
2543
+ Py_DECREF(operand2_long);
2544
+
2545
+ obj_result = r;
2546
+ goto exit_result_object;
2547
+ }
2548
+ }
2549
+ bb >>= 1;
2550
+ if (bb == 0) {
2551
+ break;
2552
+ }
2553
+ prev = temp;
2554
+ temp = (unsigned long)temp * temp;
2555
+
2556
+ if (prev != 0 && temp / prev != prev) {
2557
+ PyObject *operand1_long = Nuitka_PyLong_FromLong(a);
2558
+ PyObject *operand2_long = Nuitka_PyLong_FromLong(b);
2559
+
2560
+ PyObject *r = _BINARY_OPERATION_POW_OBJECT_LONG_LONG(operand1_long, operand2_long);
2561
+
2562
+ Py_DECREF(operand1_long);
2563
+ Py_DECREF(operand2_long);
2564
+
2565
+ obj_result = r;
2566
+ goto exit_result_object;
2567
+ }
2568
+ }
2569
+
2570
+ clong_result = ix;
2571
+ goto exit_result_ok_clong;
2572
+ }
2573
+
2574
+ exit_result_ok_clong:
2575
+
2576
+ // We got an object handed, that we have to release.
2577
+ Py_DECREF(*operand1);
2578
+
2579
+ // That's our return value then. As we use a dedicated variable, it's
2580
+ // OK that way.
2581
+ *operand1 = Nuitka_PyInt_FromLong(clong_result);
2582
+ goto exit_result_ok;
2583
+
2584
+ exit_result_object:
2585
+ if (unlikely(obj_result == NULL)) {
2586
+ goto exit_result_exception;
2587
+ }
2588
+ // We got an object handed, that we have to release.
2589
+ Py_DECREF(*operand1);
2590
+
2591
+ *operand1 = obj_result;
2592
+ goto exit_result_ok;
2593
+
2594
+ exit_result_ok:
2595
+ return true;
2596
+
2597
+ exit_result_exception:
2598
+ return false;
2599
+ }
2600
+ #endif
2601
+
2602
+ if (Py_TYPE(*operand1) == Py_TYPE(operand2)) {
2603
+ if (PyFloat_CheckExact(operand2)) {
2604
+ return _INPLACE_OPERATION_POW_FLOAT_FLOAT(operand1, operand2);
2605
+ }
2606
+ #if PYTHON_VERSION >= 0x300
2607
+ if (PyLong_CheckExact(operand2)) {
2608
+ return _INPLACE_OPERATION_POW_LONG_LONG(operand1, operand2);
2609
+ }
2610
+ #endif
2611
+ }
2612
+
2613
+ PyTypeObject *type1 = Py_TYPE(*operand1);
2614
+ PyTypeObject *type2 = Py_TYPE(operand2);
2615
+
2616
+ #ifdef _MSC_VER
2617
+ #pragma warning(push)
2618
+ #pragma warning(disable : 4101)
2619
+ #endif
2620
+ NUITKA_MAY_BE_UNUSED bool cbool_result;
2621
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2622
+ #ifdef _MSC_VER
2623
+ #pragma warning(pop)
2624
+ #endif
2625
+
2626
+ ternaryfunc islot =
2627
+ (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_inplace_power : NULL;
2628
+
2629
+ if (islot != NULL) {
2630
+ PyObject *x = islot(*operand1, operand2, Py_None);
2631
+
2632
+ if (x != Py_NotImplemented) {
2633
+ obj_result = x;
2634
+ goto exit_inplace_result_object;
2635
+ }
2636
+
2637
+ Py_DECREF_IMMORTAL(x);
2638
+ }
2639
+
2640
+ {
2641
+ ternaryfunc slot1 =
2642
+ (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_power : NULL;
2643
+ ternaryfunc slot2 = NULL;
2644
+
2645
+ if (!(type1 == type2)) {
2646
+ // Different types, need to consider second value slot.
2647
+
2648
+ slot2 =
2649
+ (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_power : NULL;
2650
+
2651
+ if (slot1 == slot2) {
2652
+ slot2 = NULL;
2653
+ }
2654
+ }
2655
+
2656
+ if (slot1 != NULL) {
2657
+ if (slot2 != NULL) {
2658
+ if (Nuitka_Type_IsSubtype(type2, type1)) {
2659
+ PyObject *x = slot2(*operand1, operand2, Py_None);
2660
+
2661
+ if (x != Py_NotImplemented) {
2662
+ obj_result = x;
2663
+ goto exit_inplace_result_object;
2664
+ }
2665
+
2666
+ Py_DECREF_IMMORTAL(x);
2667
+ slot2 = NULL;
2668
+ }
2669
+ }
2670
+
2671
+ PyObject *x = slot1(*operand1, operand2, Py_None);
2672
+
2673
+ if (x != Py_NotImplemented) {
2674
+ obj_result = x;
2675
+ goto exit_inplace_result_object;
2676
+ }
2677
+
2678
+ Py_DECREF_IMMORTAL(x);
2679
+ }
2680
+
2681
+ if (slot2 != NULL) {
2682
+ PyObject *x = slot2(*operand1, operand2, Py_None);
2683
+
2684
+ if (x != Py_NotImplemented) {
2685
+ obj_result = x;
2686
+ goto exit_inplace_result_object;
2687
+ }
2688
+
2689
+ Py_DECREF_IMMORTAL(x);
2690
+ }
2691
+
2692
+ #if PYTHON_VERSION < 0x300
2693
+ if (!NEW_STYLE_NUMBER_TYPE(type1) || !NEW_STYLE_NUMBER_TYPE(type2)) {
2694
+ coercion c1 =
2695
+ (type1->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type1)) ? type1->tp_as_number->nb_coerce : NULL;
2696
+
2697
+ if (c1 != NULL) {
2698
+ PyObject *coerced1 = *operand1;
2699
+ PyObject *coerced2 = operand2;
2700
+
2701
+ int err = c1(&coerced1, &coerced2);
2702
+
2703
+ if (unlikely(err < 0)) {
2704
+ goto exit_inplace_exception;
2705
+ }
2706
+
2707
+ if (err == 0) {
2708
+ PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
2709
+
2710
+ if (likely(mv == NULL)) {
2711
+ ternaryfunc slot = mv->nb_power;
2712
+
2713
+ if (likely(slot != NULL)) {
2714
+ PyObject *x = slot(coerced1, coerced2, Py_None);
2715
+
2716
+ Py_DECREF(coerced1);
2717
+ Py_DECREF(coerced2);
2718
+
2719
+ obj_result = x;
2720
+ goto exit_inplace_result_object;
2721
+ }
2722
+ }
2723
+
2724
+ // nb_coerce took a reference.
2725
+ Py_DECREF(coerced1);
2726
+ Py_DECREF(coerced2);
2727
+ }
2728
+ }
2729
+ coercion c2 =
2730
+ (type2->tp_as_number != NULL && NEW_STYLE_NUMBER_TYPE(type2)) ? type2->tp_as_number->nb_coerce : NULL;
2731
+
2732
+ if (c2 != NULL) {
2733
+ PyObject *coerced1 = *operand1;
2734
+ PyObject *coerced2 = operand2;
2735
+
2736
+ int err = c2(&coerced2, &coerced1);
2737
+
2738
+ if (unlikely(err < 0)) {
2739
+ goto exit_inplace_exception;
2740
+ }
2741
+
2742
+ if (err == 0) {
2743
+ PyNumberMethods *mv = Py_TYPE(coerced1)->tp_as_number;
2744
+
2745
+ if (likely(mv == NULL)) {
2746
+ ternaryfunc slot = mv->nb_power;
2747
+
2748
+ if (likely(slot != NULL)) {
2749
+ PyObject *x = slot(coerced1, coerced2, Py_None);
2750
+
2751
+ Py_DECREF(coerced1);
2752
+ Py_DECREF(coerced2);
2753
+
2754
+ obj_result = x;
2755
+ goto exit_inplace_result_object;
2756
+ }
2757
+ }
2758
+
2759
+ // nb_coerce took a reference.
2760
+ Py_DECREF(coerced1);
2761
+ Py_DECREF(coerced2);
2762
+ }
2763
+ }
2764
+ }
2765
+ #endif
2766
+
2767
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for **=: '%s' and '%s'", type1->tp_name,
2768
+ type2->tp_name);
2769
+ goto exit_inplace_exception;
2770
+ }
2771
+
2772
+ exit_inplace_result_object:
2773
+ if (unlikely(obj_result == NULL)) {
2774
+ return false;
2775
+ }
2776
+
2777
+ // We got an object handed, that we have to release.
2778
+ Py_DECREF(*operand1);
2779
+
2780
+ // That's our return value then. As we use a dedicated variable, it's
2781
+ // OK that way.
2782
+ *operand1 = obj_result;
2783
+
2784
+ return true;
2785
+
2786
+ exit_inplace_exception:
2787
+ return false;
2788
+ }
2789
+
2790
+ bool INPLACE_OPERATION_POW_OBJECT_OBJECT(PyObject **operand1, PyObject *operand2) {
2791
+ return _INPLACE_OPERATION_POW_OBJECT_OBJECT(operand1, operand2);
2792
+ }
2793
+
2794
+ // Part of "Nuitka", an optimizing Python compiler that is compatible and
2795
+ // integrates with CPython, but also works on its own.
2796
+ //
2797
+ // Licensed under the Apache License, Version 2.0 (the "License");
2798
+ // you may not use this file except in compliance with the License.
2799
+ // You may obtain a copy of the License at
2800
+ //
2801
+ // http://www.apache.org/licenses/LICENSE-2.0
2802
+ //
2803
+ // Unless required by applicable law or agreed to in writing, software
2804
+ // distributed under the License is distributed on an "AS IS" BASIS,
2805
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2806
+ // See the License for the specific language governing permissions and
2807
+ // limitations under the License.