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

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

Potentially problematic release.


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

Files changed (728) hide show
  1. Nuitka_winsvc-1.8.data/scripts/nuitka-run.bat → Nuitka_winsvc-2.5.1.data/scripts/nuitka-run.cmd +9 -9
  2. Nuitka_winsvc-1.8.data/scripts/nuitka.bat → Nuitka_winsvc-2.5.1.data/scripts/nuitka.cmd +15 -15
  3. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/METADATA +5 -3
  4. Nuitka_winsvc-2.5.1.dist-info/RECORD +977 -0
  5. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/WHEEL +1 -1
  6. nuitka/Builtins.py +49 -17
  7. nuitka/BytecodeCaching.py +24 -20
  8. nuitka/Bytecodes.py +23 -19
  9. nuitka/CacheCleanup.py +28 -23
  10. nuitka/Constants.py +19 -17
  11. nuitka/Errors.py +23 -17
  12. nuitka/HardImportRegistry.py +408 -0
  13. nuitka/MainControl.py +209 -116
  14. nuitka/ModuleRegistry.py +83 -20
  15. nuitka/OptionParsing.py +467 -221
  16. nuitka/Options.py +701 -225
  17. nuitka/OutputDirectories.py +47 -23
  18. nuitka/PostProcessing.py +133 -79
  19. nuitka/Progress.py +73 -24
  20. nuitka/PythonFlavors.py +141 -32
  21. nuitka/PythonOperators.py +18 -17
  22. nuitka/PythonVersions.py +107 -19
  23. nuitka/Serialization.py +70 -55
  24. nuitka/SourceCodeReferences.py +19 -17
  25. nuitka/Tracing.py +176 -70
  26. nuitka/TreeXML.py +31 -26
  27. nuitka/Variables.py +39 -41
  28. nuitka/Version.py +22 -8
  29. nuitka/__init__.py +5 -4
  30. nuitka/__main__.py +95 -29
  31. nuitka/__past__.py +44 -34
  32. nuitka/build/Backend.scons +243 -141
  33. nuitka/build/CCompilerVersion.scons +45 -31
  34. nuitka/build/DataComposerInterface.py +20 -17
  35. nuitka/build/Onefile.scons +56 -54
  36. nuitka/build/SconsCaching.py +105 -92
  37. nuitka/build/SconsCompilerSettings.py +167 -68
  38. nuitka/build/SconsHacks.py +25 -19
  39. nuitka/build/SconsInterface.py +155 -54
  40. nuitka/build/SconsProgress.py +19 -18
  41. nuitka/build/SconsSpawn.py +62 -33
  42. nuitka/build/SconsUtils.py +152 -55
  43. nuitka/build/__init__.py +5 -4
  44. nuitka/build/include/nuitka/allocator.h +228 -22
  45. nuitka/build/include/nuitka/builtins.h +17 -17
  46. nuitka/build/include/nuitka/calling.h +24 -24
  47. nuitka/build/include/nuitka/checkers.h +17 -18
  48. nuitka/build/include/nuitka/checksum_tools.h +14 -19
  49. nuitka/build/include/nuitka/compiled_asyncgen.h +28 -25
  50. nuitka/build/include/nuitka/compiled_cell.h +33 -18
  51. nuitka/build/include/nuitka/compiled_coroutine.h +18 -18
  52. nuitka/build/include/nuitka/compiled_frame.h +93 -54
  53. nuitka/build/include/nuitka/compiled_function.h +42 -20
  54. nuitka/build/include/nuitka/compiled_generator.h +24 -18
  55. nuitka/build/include/nuitka/compiled_method.h +17 -18
  56. nuitka/build/include/nuitka/constants.h +35 -18
  57. nuitka/build/include/nuitka/constants_blob.h +17 -17
  58. nuitka/build/include/nuitka/debug_settings.h +60 -0
  59. nuitka/build/include/nuitka/environment_variables.h +30 -0
  60. nuitka/build/include/nuitka/environment_variables_system.h +45 -0
  61. nuitka/build/include/nuitka/exception_groups.h +23 -26
  62. nuitka/build/include/nuitka/exceptions.h +717 -171
  63. nuitka/build/include/nuitka/filesystem_paths.h +26 -20
  64. nuitka/build/include/nuitka/freelists.h +38 -18
  65. nuitka/build/include/nuitka/helper/attributes.h +24 -22
  66. nuitka/build/include/nuitka/helper/boolean.h +17 -17
  67. nuitka/build/include/nuitka/helper/bytearrays.h +17 -17
  68. nuitka/build/include/nuitka/helper/bytes.h +14 -15
  69. nuitka/build/include/nuitka/helper/calling_generated.h +69 -69
  70. nuitka/build/include/nuitka/helper/comparisons_dual_eq.h +47 -0
  71. nuitka/build/include/nuitka/helper/comparisons_dual_ge.h +39 -0
  72. nuitka/build/include/nuitka/helper/comparisons_dual_gt.h +39 -0
  73. nuitka/build/include/nuitka/helper/comparisons_dual_le.h +47 -0
  74. nuitka/build/include/nuitka/helper/comparisons_dual_lt.h +47 -0
  75. nuitka/build/include/nuitka/helper/comparisons_dual_ne.h +39 -0
  76. nuitka/build/include/nuitka/helper/comparisons_eq.h +17 -17
  77. nuitka/build/include/nuitka/helper/comparisons_ge.h +17 -17
  78. nuitka/build/include/nuitka/helper/comparisons_gt.h +17 -17
  79. nuitka/build/include/nuitka/helper/comparisons_le.h +17 -17
  80. nuitka/build/include/nuitka/helper/comparisons_lt.h +17 -17
  81. nuitka/build/include/nuitka/helper/comparisons_ne.h +17 -17
  82. nuitka/build/include/nuitka/helper/complex.h +17 -17
  83. nuitka/build/include/nuitka/helper/dictionaries.h +89 -51
  84. nuitka/build/include/nuitka/helper/floats.h +17 -18
  85. nuitka/build/include/nuitka/helper/import_hard.h +25 -17
  86. nuitka/build/include/nuitka/helper/indexes.h +17 -18
  87. nuitka/build/include/nuitka/helper/ints.h +115 -54
  88. nuitka/build/include/nuitka/helper/iterators.h +99 -51
  89. nuitka/build/include/nuitka/helper/lists.h +26 -24
  90. nuitka/build/include/nuitka/helper/lists_generated.h +22 -22
  91. nuitka/build/include/nuitka/helper/mappings.h +17 -18
  92. nuitka/build/include/nuitka/helper/operations.h +20 -17
  93. nuitka/build/include/nuitka/helper/operations_binary_add.h +23 -17
  94. nuitka/build/include/nuitka/helper/operations_binary_bitand.h +17 -17
  95. nuitka/build/include/nuitka/helper/operations_binary_bitor.h +17 -17
  96. nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +17 -17
  97. nuitka/build/include/nuitka/helper/operations_binary_divmod.h +17 -17
  98. nuitka/build/include/nuitka/helper/operations_binary_dual_add.h +34 -0
  99. nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +17 -17
  100. nuitka/build/include/nuitka/helper/operations_binary_lshift.h +17 -17
  101. nuitka/build/include/nuitka/helper/operations_binary_matmult.h +17 -17
  102. nuitka/build/include/nuitka/helper/operations_binary_mod.h +17 -17
  103. nuitka/build/include/nuitka/helper/operations_binary_mult.h +17 -17
  104. nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +17 -17
  105. nuitka/build/include/nuitka/helper/operations_binary_pow.h +17 -17
  106. nuitka/build/include/nuitka/helper/operations_binary_rshift.h +17 -17
  107. nuitka/build/include/nuitka/helper/operations_binary_sub.h +23 -17
  108. nuitka/build/include/nuitka/helper/operations_binary_truediv.h +17 -17
  109. nuitka/build/include/nuitka/helper/operations_builtin_types.h +17 -17
  110. nuitka/build/include/nuitka/helper/operations_inplace_add.h +20 -17
  111. nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +17 -17
  112. nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +17 -17
  113. nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +17 -17
  114. nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +17 -17
  115. nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +17 -17
  116. nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +17 -17
  117. nuitka/build/include/nuitka/helper/operations_inplace_mod.h +17 -17
  118. nuitka/build/include/nuitka/helper/operations_inplace_mult.h +17 -17
  119. nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +17 -17
  120. nuitka/build/include/nuitka/helper/operations_inplace_pow.h +17 -17
  121. nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +17 -17
  122. nuitka/build/include/nuitka/helper/operations_inplace_sub.h +20 -17
  123. nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +17 -17
  124. nuitka/build/include/nuitka/helper/raising.h +68 -37
  125. nuitka/build/include/nuitka/helper/rangeobjects.h +17 -17
  126. nuitka/build/include/nuitka/helper/richcomparisons.h +21 -14
  127. nuitka/build/include/nuitka/helper/sequences.h +19 -13
  128. nuitka/build/include/nuitka/helper/sets.h +11 -12
  129. nuitka/build/include/nuitka/helper/slices.h +31 -25
  130. nuitka/build/include/nuitka/helper/strings.h +16 -17
  131. nuitka/build/include/nuitka/helper/subscripts.h +18 -201
  132. nuitka/build/include/nuitka/helper/tuples.h +64 -52
  133. nuitka/build/include/nuitka/helpers.h +50 -22
  134. nuitka/build/include/nuitka/importing.h +28 -21
  135. nuitka/build/include/nuitka/jit_sources.h +25 -0
  136. nuitka/build/include/nuitka/prelude.h +163 -71
  137. nuitka/build/include/nuitka/printing.h +29 -22
  138. nuitka/build/include/nuitka/python_pgo.h +19 -18
  139. nuitka/build/include/nuitka/safe_string_ops.h +20 -18
  140. nuitka/build/include/nuitka/threading.h +45 -32
  141. nuitka/build/include/nuitka/tracing.h +28 -18
  142. nuitka/build/include/nuitka/type_aliases.h +30 -0
  143. nuitka/build/include/nuitka/unfreezing.h +29 -23
  144. nuitka/build/inline_copy/bin/scons.py +14 -0
  145. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +6 -6
  146. nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +0 -3
  147. nuitka/build/inline_copy/python_hacl/LICENSE.txt +201 -0
  148. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.c +1430 -0
  149. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.h +66 -0
  150. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.c +463 -0
  151. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.h +66 -0
  152. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.c +1273 -0
  153. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.h +204 -0
  154. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.c +734 -0
  155. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.h +131 -0
  156. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Streaming_Types.h +83 -0
  157. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt128_Verified.h +346 -0
  158. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt_8_16_32_64.h +107 -0
  159. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/fstar_uint128_struct_endianness.h +68 -0
  160. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/internal/target.h +293 -0
  161. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/lowstar_endianness.h +231 -0
  162. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/types.h +14 -0
  163. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_MD5.h +56 -0
  164. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA1.h +56 -0
  165. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA2.h +164 -0
  166. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA3.h +65 -0
  167. nuitka/build/inline_copy/python_hacl/hacl_312/python_hacl_namespaces.h +89 -0
  168. nuitka/build/inline_copy/stubgen/astunparse.py +938 -0
  169. nuitka/build/inline_copy/stubgen/six.py +998 -0
  170. nuitka/build/inline_copy/stubgen/stubgen.py +307 -0
  171. nuitka/build/inline_copy/tqdm/tqdm/__init__.py +2 -2
  172. nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +4 -1
  173. nuitka/build/inline_copy/tqdm/tqdm/utils.py +14 -8
  174. nuitka/build/inline_copy/tqdm/tqdm/version.py +1 -8
  175. nuitka/build/inline_copy/zlib/LICENSE +22 -0
  176. nuitka/build/inline_copy/zlib/crc32.c +1049 -0
  177. nuitka/build/inline_copy/zlib/crc32.h +9446 -0
  178. nuitka/build/inline_copy/zlib/zconf.h +551 -0
  179. nuitka/build/inline_copy/zlib/zlib.h +1938 -0
  180. nuitka/build/inline_copy/zlib/zutil.h +275 -0
  181. nuitka/build/static_src/CompiledAsyncgenType.c +221 -221
  182. nuitka/build/static_src/CompiledCellType.c +69 -44
  183. nuitka/build/static_src/CompiledCodeHelpers.c +276 -159
  184. nuitka/build/static_src/CompiledCoroutineType.c +229 -226
  185. nuitka/build/static_src/CompiledFrameType.c +323 -138
  186. nuitka/build/static_src/CompiledFunctionType.c +547 -231
  187. nuitka/build/static_src/CompiledGeneratorType.c +416 -290
  188. nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +593 -228
  189. nuitka/build/static_src/CompiledMethodType.c +91 -82
  190. nuitka/build/static_src/HelpersAllocator.c +352 -45
  191. nuitka/build/static_src/HelpersAttributes.c +30 -72
  192. nuitka/build/static_src/HelpersBuiltin.c +65 -46
  193. nuitka/build/static_src/HelpersBuiltinTypeMethods.c +17 -17
  194. nuitka/build/static_src/HelpersBytes.c +19 -20
  195. nuitka/build/static_src/HelpersCalling.c +40 -37
  196. nuitka/build/static_src/HelpersCallingGenerated.c +1061 -242
  197. nuitka/build/static_src/HelpersChecksumTools.c +35 -21
  198. nuitka/build/static_src/HelpersClasses.c +17 -17
  199. nuitka/build/static_src/HelpersComparisonDualEq.c +183 -0
  200. nuitka/build/static_src/HelpersComparisonDualGe.c +121 -0
  201. nuitka/build/static_src/HelpersComparisonDualGt.c +121 -0
  202. nuitka/build/static_src/HelpersComparisonDualLe.c +183 -0
  203. nuitka/build/static_src/HelpersComparisonDualLt.c +183 -0
  204. nuitka/build/static_src/HelpersComparisonDualNe.c +121 -0
  205. nuitka/build/static_src/HelpersComparisonEq.c +536 -496
  206. nuitka/build/static_src/HelpersComparisonEqUtils.c +22 -19
  207. nuitka/build/static_src/HelpersComparisonGe.c +531 -501
  208. nuitka/build/static_src/HelpersComparisonGt.c +530 -500
  209. nuitka/build/static_src/HelpersComparisonLe.c +531 -501
  210. nuitka/build/static_src/HelpersComparisonLt.c +530 -500
  211. nuitka/build/static_src/HelpersComparisonNe.c +538 -496
  212. nuitka/build/static_src/HelpersConsole.c +122 -0
  213. nuitka/build/static_src/HelpersConstantsBlob.c +550 -521
  214. nuitka/build/static_src/HelpersDeepcopy.c +33 -33
  215. nuitka/build/static_src/HelpersDictionaries.c +232 -63
  216. nuitka/build/static_src/HelpersDictionariesGenerated.c +130 -127
  217. nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
  218. nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
  219. nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +93 -0
  220. nuitka/build/static_src/HelpersExceptions.c +147 -62
  221. nuitka/build/static_src/HelpersFiles.c +116 -22
  222. nuitka/build/static_src/HelpersFilesystemPaths.c +292 -181
  223. nuitka/build/static_src/HelpersFloats.c +37 -31
  224. nuitka/build/static_src/HelpersHeapStorage.c +21 -17
  225. nuitka/build/static_src/HelpersImport.c +61 -29
  226. nuitka/build/static_src/HelpersImportHard.c +74 -61
  227. nuitka/build/static_src/HelpersJitSources.c +46 -0
  228. nuitka/build/static_src/HelpersLists.c +237 -58
  229. nuitka/build/static_src/HelpersListsGenerated.c +41 -41
  230. nuitka/build/static_src/HelpersMappings.c +17 -17
  231. nuitka/build/static_src/HelpersMatching.c +137 -51
  232. nuitka/build/static_src/HelpersOperationBinaryAdd.c +397 -152
  233. nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +102 -52
  234. nuitka/build/static_src/HelpersOperationBinaryBitand.c +55 -55
  235. nuitka/build/static_src/HelpersOperationBinaryBitor.c +55 -55
  236. nuitka/build/static_src/HelpersOperationBinaryBitxor.c +55 -55
  237. nuitka/build/static_src/HelpersOperationBinaryDivmod.c +49 -43
  238. nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +17 -17
  239. nuitka/build/static_src/HelpersOperationBinaryDualAdd.c +172 -0
  240. nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +55 -49
  241. nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +20 -21
  242. nuitka/build/static_src/HelpersOperationBinaryLshift.c +83 -83
  243. nuitka/build/static_src/HelpersOperationBinaryMatmult.c +25 -24
  244. nuitka/build/static_src/HelpersOperationBinaryMod.c +129 -117
  245. nuitka/build/static_src/HelpersOperationBinaryMult.c +98 -82
  246. nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +33 -30
  247. nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +55 -49
  248. nuitka/build/static_src/HelpersOperationBinaryPow.c +68 -68
  249. nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +12 -12
  250. nuitka/build/static_src/HelpersOperationBinaryRshift.c +51 -51
  251. nuitka/build/static_src/HelpersOperationBinarySub.c +309 -88
  252. nuitka/build/static_src/HelpersOperationBinaryTruediv.c +49 -43
  253. nuitka/build/static_src/HelpersOperationInplaceAdd.c +333 -163
  254. nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +24 -22
  255. nuitka/build/static_src/HelpersOperationInplaceBitand.c +58 -58
  256. nuitka/build/static_src/HelpersOperationInplaceBitor.c +58 -58
  257. nuitka/build/static_src/HelpersOperationInplaceBitxor.c +58 -58
  258. nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +73 -68
  259. nuitka/build/static_src/HelpersOperationInplaceLshift.c +64 -64
  260. nuitka/build/static_src/HelpersOperationInplaceMatmult.c +38 -37
  261. nuitka/build/static_src/HelpersOperationInplaceMod.c +145 -140
  262. nuitka/build/static_src/HelpersOperationInplaceMult.c +89 -84
  263. nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +73 -68
  264. nuitka/build/static_src/HelpersOperationInplacePow.c +82 -82
  265. nuitka/build/static_src/HelpersOperationInplaceRshift.c +48 -48
  266. nuitka/build/static_src/HelpersOperationInplaceSub.c +275 -122
  267. nuitka/build/static_src/HelpersOperationInplaceTruediv.c +68 -63
  268. nuitka/build/static_src/HelpersProfiling.c +25 -24
  269. nuitka/build/static_src/HelpersPythonPgo.c +22 -22
  270. nuitka/build/static_src/HelpersRaising.c +296 -283
  271. nuitka/build/static_src/HelpersSafeStrings.c +34 -22
  272. nuitka/build/static_src/HelpersSequences.c +18 -19
  273. nuitka/build/static_src/HelpersSlices.c +29 -23
  274. nuitka/build/static_src/HelpersStrings.c +235 -38
  275. nuitka/build/static_src/HelpersTuples.c +46 -34
  276. nuitka/build/static_src/HelpersTypes.c +166 -25
  277. nuitka/build/static_src/InspectPatcher.c +108 -27
  278. nuitka/build/static_src/MainProgram.c +464 -280
  279. nuitka/build/static_src/MetaPathBasedLoader.c +381 -257
  280. nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +39 -26
  281. nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +17 -18
  282. nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +227 -29
  283. nuitka/build/static_src/OnefileBootstrap.c +281 -164
  284. nuitka/build/static_src/OnefileSplashScreen.cpp +51 -27
  285. nuitka/code_generation/AsyncgenCodes.py +21 -23
  286. nuitka/code_generation/AttributeCodes.py +31 -27
  287. nuitka/code_generation/BinaryOperationHelperDefinitions.py +290 -184
  288. nuitka/code_generation/BranchCodes.py +19 -17
  289. nuitka/code_generation/BuiltinCodes.py +29 -18
  290. nuitka/code_generation/CallCodes.py +35 -33
  291. nuitka/code_generation/ClassCodes.py +19 -17
  292. nuitka/code_generation/CodeGeneration.py +61 -28
  293. nuitka/code_generation/CodeHelperSelection.py +20 -18
  294. nuitka/code_generation/CodeHelpers.py +28 -21
  295. nuitka/code_generation/CodeObjectCodes.py +36 -26
  296. nuitka/code_generation/ComparisonCodes.py +51 -22
  297. nuitka/code_generation/ComparisonHelperDefinitions.py +42 -25
  298. nuitka/code_generation/ConditionalCodes.py +19 -17
  299. nuitka/code_generation/ConstantCodes.py +82 -28
  300. nuitka/code_generation/Contexts.py +180 -42
  301. nuitka/code_generation/CoroutineCodes.py +21 -23
  302. nuitka/code_generation/CtypesCodes.py +19 -17
  303. nuitka/code_generation/DictCodes.py +28 -26
  304. nuitka/code_generation/Emission.py +21 -18
  305. nuitka/code_generation/ErrorCodes.py +57 -79
  306. nuitka/code_generation/EvalCodes.py +24 -20
  307. nuitka/code_generation/ExceptionCodes.py +182 -104
  308. nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +45 -27
  309. nuitka/code_generation/ExpressionCodes.py +19 -17
  310. nuitka/code_generation/FrameCodes.py +28 -31
  311. nuitka/code_generation/FunctionCodes.py +26 -27
  312. nuitka/code_generation/GeneratorCodes.py +25 -26
  313. nuitka/code_generation/GlobalConstants.py +51 -25
  314. nuitka/code_generation/GlobalsLocalsCodes.py +23 -21
  315. nuitka/code_generation/IdCodes.py +19 -17
  316. nuitka/code_generation/ImportCodes.py +90 -50
  317. nuitka/code_generation/Indentation.py +23 -22
  318. nuitka/code_generation/IndexCodes.py +19 -17
  319. nuitka/code_generation/InjectCCodes.py +14 -12
  320. nuitka/code_generation/IntegerCodes.py +19 -17
  321. nuitka/code_generation/IteratorCodes.py +86 -71
  322. nuitka/code_generation/JitCodes.py +44 -0
  323. nuitka/code_generation/LabelCodes.py +19 -17
  324. nuitka/code_generation/LineNumberCodes.py +20 -20
  325. nuitka/code_generation/ListCodes.py +32 -36
  326. nuitka/code_generation/LoaderCodes.py +22 -17
  327. nuitka/code_generation/LocalsDictCodes.py +56 -32
  328. nuitka/code_generation/LoopCodes.py +19 -17
  329. nuitka/code_generation/MatchCodes.py +42 -22
  330. nuitka/code_generation/ModuleCodes.py +71 -29
  331. nuitka/code_generation/Namify.py +27 -23
  332. nuitka/code_generation/NetworkxCodes.py +51 -0
  333. nuitka/code_generation/OperationCodes.py +80 -51
  334. nuitka/code_generation/PackageResourceCodes.py +96 -23
  335. nuitka/code_generation/PrintCodes.py +19 -17
  336. nuitka/code_generation/PythonAPICodes.py +19 -17
  337. nuitka/code_generation/RaisingCodes.py +183 -107
  338. nuitka/code_generation/Reports.py +32 -22
  339. nuitka/code_generation/ReturnCodes.py +20 -32
  340. nuitka/code_generation/SetCodes.py +19 -17
  341. nuitka/code_generation/SliceCodes.py +22 -20
  342. nuitka/code_generation/StringCodes.py +19 -17
  343. nuitka/code_generation/SubscriptCodes.py +24 -30
  344. nuitka/code_generation/TensorflowCodes.py +54 -0
  345. nuitka/code_generation/TryCodes.py +31 -41
  346. nuitka/code_generation/TupleCodes.py +20 -18
  347. nuitka/code_generation/TypeAliasCodes.py +119 -0
  348. nuitka/code_generation/VariableCodes.py +118 -55
  349. nuitka/code_generation/VariableDeclarations.py +28 -25
  350. nuitka/code_generation/YieldCodes.py +23 -21
  351. nuitka/code_generation/__init__.py +5 -4
  352. nuitka/code_generation/c_types/CTypeBases.py +29 -19
  353. nuitka/code_generation/c_types/CTypeBooleans.py +19 -17
  354. nuitka/code_generation/c_types/CTypeCFloats.py +19 -17
  355. nuitka/code_generation/c_types/CTypeCLongs.py +19 -18
  356. nuitka/code_generation/c_types/CTypeModuleDictVariables.py +22 -17
  357. nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +22 -21
  358. nuitka/code_generation/c_types/CTypeNuitkaInts.py +89 -43
  359. nuitka/code_generation/c_types/CTypeNuitkaVoids.py +20 -18
  360. nuitka/code_generation/c_types/CTypePyObjectPointers.py +43 -31
  361. nuitka/code_generation/c_types/CTypeVoids.py +20 -17
  362. nuitka/code_generation/c_types/__init__.py +5 -4
  363. nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +20 -19
  364. nuitka/code_generation/templates/CodeTemplatesConstants.py +143 -39
  365. nuitka/code_generation/templates/CodeTemplatesCoroutines.py +20 -19
  366. nuitka/code_generation/templates/CodeTemplatesExceptions.py +33 -33
  367. nuitka/code_generation/templates/CodeTemplatesFrames.py +36 -27
  368. nuitka/code_generation/templates/CodeTemplatesFunction.py +20 -19
  369. nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +21 -19
  370. nuitka/code_generation/templates/CodeTemplatesIterators.py +19 -53
  371. nuitka/code_generation/templates/CodeTemplatesLoader.py +25 -19
  372. nuitka/code_generation/templates/CodeTemplatesModules.py +278 -169
  373. nuitka/code_generation/templates/CodeTemplatesVariables.py +115 -27
  374. nuitka/code_generation/templates/TemplateDebugWrapper.py +19 -18
  375. nuitka/code_generation/templates/__init__.py +5 -4
  376. nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +19 -19
  377. nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +21 -21
  378. nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +79 -28
  379. nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +22 -22
  380. nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +19 -19
  381. nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +19 -19
  382. nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +17 -17
  383. nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +74 -106
  384. nuitka/code_generation/templates_c/HelperImportHard.c.j2 +19 -20
  385. nuitka/code_generation/templates_c/HelperLongTools.c.j2 +19 -19
  386. nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +6 -6
  387. nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +23 -23
  388. nuitka/code_generation/templates_c/HelperOperationBinaryDual.c.j2 +115 -0
  389. nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +35 -35
  390. nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +37 -37
  391. nuitka/code_generation/templates_c/HelperOperationComparisonDual.c.j2 +86 -0
  392. nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +17 -17
  393. nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +18 -18
  394. nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +50 -38
  395. nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +27 -27
  396. nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +37 -37
  397. nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +31 -31
  398. nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +35 -31
  399. nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +20 -20
  400. nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +28 -28
  401. nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +17 -17
  402. nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +17 -17
  403. nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +17 -17
  404. nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +48 -48
  405. nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +21 -18
  406. nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +27 -25
  407. nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +17 -17
  408. nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +17 -17
  409. nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +21 -18
  410. nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +17 -17
  411. nuitka/containers/Namedtuples.py +25 -18
  412. nuitka/containers/OrderedSets.py +105 -5
  413. nuitka/containers/OrderedSetsFallback.py +19 -17
  414. nuitka/containers/__init__.py +5 -4
  415. nuitka/distutils/Build.py +33 -18
  416. nuitka/distutils/DistutilCommands.py +84 -33
  417. nuitka/distutils/__init__.py +5 -4
  418. nuitka/finalizations/Finalization.py +21 -18
  419. nuitka/finalizations/FinalizeMarkups.py +31 -55
  420. nuitka/finalizations/__init__.py +5 -4
  421. nuitka/freezer/DependsExe.py +60 -30
  422. nuitka/freezer/DllDependenciesCommon.py +47 -20
  423. nuitka/freezer/DllDependenciesMacOS.py +165 -58
  424. nuitka/freezer/DllDependenciesPosix.py +29 -19
  425. nuitka/freezer/DllDependenciesWin32.py +55 -33
  426. nuitka/freezer/ImportDetection.py +23 -17
  427. nuitka/freezer/IncludedDataFiles.py +142 -48
  428. nuitka/freezer/IncludedEntryPoints.py +104 -39
  429. nuitka/freezer/Onefile.py +32 -22
  430. nuitka/freezer/Standalone.py +166 -53
  431. nuitka/freezer/__init__.py +5 -4
  432. nuitka/importing/IgnoreListing.py +19 -17
  433. nuitka/importing/ImportCache.py +24 -21
  434. nuitka/importing/ImportResolving.py +103 -95
  435. nuitka/importing/Importing.py +319 -98
  436. nuitka/importing/PreloadedPackages.py +21 -18
  437. nuitka/importing/Recursion.py +142 -47
  438. nuitka/importing/StandardLibrary.py +96 -80
  439. nuitka/importing/__init__.py +5 -4
  440. nuitka/nodes/AsyncgenNodes.py +22 -23
  441. nuitka/nodes/AttributeLookupNodes.py +19 -17
  442. nuitka/nodes/AttributeNodes.py +19 -17
  443. nuitka/nodes/AttributeNodesGenerated.py +49 -24
  444. nuitka/nodes/BuiltinAllNodes.py +19 -17
  445. nuitka/nodes/BuiltinAnyNodes.py +19 -17
  446. nuitka/nodes/BuiltinComplexNodes.py +20 -17
  447. nuitka/nodes/BuiltinDecodingNodes.py +19 -17
  448. nuitka/nodes/BuiltinDecoratorNodes.py +19 -17
  449. nuitka/nodes/BuiltinDictNodes.py +19 -17
  450. nuitka/nodes/BuiltinFormatNodes.py +20 -17
  451. nuitka/nodes/BuiltinHashNodes.py +19 -17
  452. nuitka/nodes/BuiltinInputNodes.py +19 -17
  453. nuitka/nodes/BuiltinIntegerNodes.py +19 -17
  454. nuitka/nodes/BuiltinIteratorNodes.py +25 -21
  455. nuitka/nodes/BuiltinLenNodes.py +19 -17
  456. nuitka/nodes/BuiltinNextNodes.py +19 -17
  457. nuitka/nodes/BuiltinOpenNodes.py +52 -18
  458. nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +40 -23
  459. nuitka/nodes/BuiltinRangeNodes.py +21 -19
  460. nuitka/nodes/BuiltinRefNodes.py +73 -40
  461. nuitka/nodes/BuiltinSumNodes.py +20 -18
  462. nuitka/nodes/BuiltinTypeNodes.py +19 -17
  463. nuitka/nodes/BuiltinVarsNodes.py +19 -18
  464. nuitka/nodes/BytesNodes.py +19 -17
  465. nuitka/nodes/CallNodes.py +19 -17
  466. nuitka/nodes/Checkers.py +19 -17
  467. nuitka/nodes/ChildrenHavingMixins.py +1624 -283
  468. nuitka/nodes/ClassNodes.py +49 -29
  469. nuitka/nodes/CodeObjectSpecs.py +29 -18
  470. nuitka/nodes/ComparisonNodes.py +19 -17
  471. nuitka/nodes/ConditionalNodes.py +24 -25
  472. nuitka/nodes/ConstantRefNodes.py +57 -17
  473. nuitka/nodes/ContainerMakingNodes.py +19 -17
  474. nuitka/nodes/ContainerOperationNodes.py +19 -17
  475. nuitka/nodes/CoroutineNodes.py +22 -23
  476. nuitka/nodes/CtypesNodes.py +19 -18
  477. nuitka/nodes/DictionaryNodes.py +19 -18
  478. nuitka/nodes/ExceptionNodes.py +131 -43
  479. nuitka/nodes/ExecEvalNodes.py +19 -17
  480. nuitka/nodes/ExpressionBases.py +34 -26
  481. nuitka/nodes/ExpressionBasesGenerated.py +341 -35
  482. nuitka/nodes/ExpressionShapeMixins.py +19 -17
  483. nuitka/nodes/FrameNodes.py +41 -28
  484. nuitka/nodes/FunctionAttributeNodes.py +19 -17
  485. nuitka/nodes/FunctionNodes.py +84 -38
  486. nuitka/nodes/FutureSpecs.py +35 -20
  487. nuitka/nodes/GeneratorNodes.py +24 -25
  488. nuitka/nodes/GlobalsLocalsNodes.py +22 -17
  489. nuitka/nodes/HardImportNodesGenerated.py +746 -148
  490. nuitka/nodes/ImportHardNodes.py +46 -38
  491. nuitka/nodes/ImportNodes.py +438 -448
  492. nuitka/nodes/IndicatorMixins.py +19 -17
  493. nuitka/nodes/InjectCNodes.py +19 -18
  494. nuitka/nodes/IterationHandles.py +55 -34
  495. nuitka/nodes/KeyValuePairNodes.py +19 -17
  496. nuitka/nodes/ListOperationNodes.py +33 -21
  497. nuitka/nodes/LocalsDictNodes.py +19 -17
  498. nuitka/nodes/LocalsScopes.py +41 -41
  499. nuitka/nodes/LoopNodes.py +28 -17
  500. nuitka/nodes/MatchNodes.py +37 -24
  501. nuitka/nodes/ModuleAttributeNodes.py +18 -35
  502. nuitka/nodes/ModuleNodes.py +90 -31
  503. nuitka/nodes/NetworkxNodes.py +45 -0
  504. nuitka/nodes/NodeBases.py +73 -44
  505. nuitka/nodes/NodeMakingHelpers.py +92 -69
  506. nuitka/nodes/NodeMetaClasses.py +45 -28
  507. nuitka/nodes/OperatorNodes.py +28 -26
  508. nuitka/nodes/OperatorNodesUnary.py +148 -20
  509. nuitka/nodes/OsSysNodes.py +97 -18
  510. nuitka/nodes/OutlineNodes.py +24 -22
  511. nuitka/nodes/PackageMetadataNodes.py +37 -27
  512. nuitka/nodes/PackageResourceNodes.py +29 -23
  513. nuitka/nodes/PrintNodes.py +19 -17
  514. nuitka/nodes/ReturnNodes.py +20 -18
  515. nuitka/nodes/SideEffectNodes.py +19 -17
  516. nuitka/nodes/SliceNodes.py +20 -18
  517. nuitka/nodes/StatementBasesGenerated.py +125 -79
  518. nuitka/nodes/StatementNodes.py +27 -24
  519. nuitka/nodes/StrNodes.py +19 -17
  520. nuitka/nodes/StringConcatenationNodes.py +20 -17
  521. nuitka/nodes/SubscriptNodes.py +27 -25
  522. nuitka/nodes/TensorflowNodes.py +38 -0
  523. nuitka/nodes/TryNodes.py +19 -17
  524. nuitka/nodes/TypeMatchNodes.py +19 -17
  525. nuitka/nodes/TypeNodes.py +68 -18
  526. nuitka/nodes/VariableAssignNodes.py +122 -64
  527. nuitka/nodes/VariableDelNodes.py +19 -17
  528. nuitka/nodes/VariableNameNodes.py +19 -17
  529. nuitka/nodes/VariableRefNodes.py +63 -26
  530. nuitka/nodes/VariableReleaseNodes.py +19 -17
  531. nuitka/nodes/YieldNodes.py +21 -19
  532. nuitka/nodes/__init__.py +5 -4
  533. nuitka/nodes/shapes/BuiltinTypeShapes.py +169 -46
  534. nuitka/nodes/shapes/ControlFlowDescriptions.py +19 -17
  535. nuitka/nodes/shapes/ShapeMixins.py +57 -17
  536. nuitka/nodes/shapes/StandardShapes.py +80 -21
  537. nuitka/nodes/shapes/__init__.py +5 -4
  538. nuitka/optimizations/BytecodeDemotion.py +21 -18
  539. nuitka/optimizations/FunctionInlining.py +22 -23
  540. nuitka/optimizations/Graphs.py +19 -17
  541. nuitka/optimizations/Optimization.py +39 -35
  542. nuitka/optimizations/OptimizeBuiltinCalls.py +31 -27
  543. nuitka/optimizations/Tags.py +19 -18
  544. nuitka/optimizations/TraceCollections.py +67 -24
  545. nuitka/optimizations/ValueTraces.py +92 -25
  546. nuitka/optimizations/__init__.py +5 -4
  547. nuitka/pgo/PGO.py +33 -23
  548. nuitka/pgo/__init__.py +5 -4
  549. nuitka/plugins/PluginBase.py +655 -112
  550. nuitka/plugins/Plugins.py +247 -61
  551. nuitka/plugins/YamlPluginBase.py +121 -0
  552. nuitka/plugins/__init__.py +5 -4
  553. nuitka/plugins/standard/AntiBloatPlugin.py +374 -135
  554. nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +20 -19
  555. nuitka/plugins/standard/DataFilesPlugin.py +65 -29
  556. nuitka/plugins/standard/DelvewheelPlugin.py +32 -24
  557. nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
  558. nuitka/plugins/standard/DillPlugin/dill-postLoad.py +256 -0
  559. nuitka/plugins/standard/DillPlugin.py +42 -134
  560. nuitka/plugins/standard/DllFilesPlugin.py +125 -42
  561. nuitka/plugins/standard/EnumPlugin.py +19 -17
  562. nuitka/plugins/standard/EventletPlugin.py +19 -17
  563. nuitka/plugins/standard/GeventPlugin.py +19 -17
  564. nuitka/plugins/standard/GiPlugin.py +44 -28
  565. nuitka/plugins/standard/GlfwPlugin.py +20 -17
  566. nuitka/plugins/standard/ImplicitImports.py +403 -54
  567. nuitka/plugins/standard/KivyPlugin.py +24 -20
  568. nuitka/plugins/standard/MatplotlibPlugin.py +99 -42
  569. nuitka/plugins/standard/MultiprocessingPlugin.py +35 -39
  570. nuitka/plugins/standard/NumpyPlugin.py +19 -17
  571. nuitka/plugins/standard/OptionsNannyPlugin.py +48 -76
  572. nuitka/plugins/standard/PbrPlugin.py +21 -19
  573. nuitka/plugins/standard/PkgResourcesPlugin.py +34 -23
  574. nuitka/plugins/standard/PlaywrightPlugin.py +184 -0
  575. nuitka/plugins/standard/PmwPlugin.py +30 -27
  576. nuitka/plugins/standard/PySidePyQtPlugin.py +82 -80
  577. nuitka/plugins/standard/PywebViewPlugin.py +19 -17
  578. nuitka/plugins/standard/SpacyPlugin.py +136 -0
  579. nuitka/plugins/standard/TensorflowPlugin.py +20 -17
  580. nuitka/plugins/standard/TkinterPlugin.py +102 -108
  581. nuitka/plugins/standard/TorchPlugin.py +20 -17
  582. nuitka/plugins/standard/TransformersPlugin.py +90 -231
  583. nuitka/plugins/standard/TrioPlugin.py +18 -15
  584. nuitka/plugins/standard/UpxPlugin.py +21 -19
  585. nuitka/plugins/standard/__init__.py +5 -4
  586. nuitka/plugins/standard/standard.nuitka-package.config.yml +3925 -1293
  587. nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +14 -14
  588. nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +154 -66
  589. nuitka/reports/CompilationReportReader.py +79 -0
  590. nuitka/reports/LicenseReport.rst.j2 +21 -21
  591. nuitka/reports/Reports.py +363 -76
  592. nuitka/reports/__init__.py +5 -4
  593. nuitka/specs/BuiltinBytesOperationSpecs.py +18 -17
  594. nuitka/specs/BuiltinDictOperationSpecs.py +18 -17
  595. nuitka/specs/BuiltinListOperationSpecs.py +18 -17
  596. nuitka/specs/BuiltinParameterSpecs.py +35 -21
  597. nuitka/specs/BuiltinStrOperationSpecs.py +19 -18
  598. nuitka/specs/BuiltinTypeOperationSpecs.py +18 -18
  599. nuitka/specs/BuiltinUnicodeOperationSpecs.py +18 -17
  600. nuitka/specs/HardImportSpecs.py +74 -22
  601. nuitka/specs/ParameterSpecs.py +60 -45
  602. nuitka/specs/__init__.py +5 -4
  603. nuitka/tools/Basics.py +20 -18
  604. nuitka/tools/__init__.py +5 -4
  605. nuitka/tools/commercial/__init__.py +7 -6
  606. nuitka/tools/data_composer/DataComposer.py +78 -62
  607. nuitka/tools/data_composer/__init__.py +5 -4
  608. nuitka/tools/data_composer/__main__.py +18 -17
  609. nuitka/tools/environments/CreateEnvironment.py +20 -17
  610. nuitka/tools/environments/Virtualenv.py +60 -32
  611. nuitka/tools/environments/__init__.py +5 -4
  612. nuitka/tools/general/__init__.py +5 -4
  613. nuitka/tools/general/dll_report/__init__.py +5 -4
  614. nuitka/tools/general/dll_report/__main__.py +29 -22
  615. nuitka/tools/general/find_module/FindModuleCode.py +35 -22
  616. nuitka/tools/general/find_module/__init__.py +5 -4
  617. nuitka/tools/onefile_compressor/OnefileCompressor.py +213 -131
  618. nuitka/tools/onefile_compressor/__init__.py +5 -4
  619. nuitka/tools/onefile_compressor/__main__.py +18 -17
  620. nuitka/tools/podman/Podman.py +19 -17
  621. nuitka/tools/podman/__init__.py +5 -4
  622. nuitka/tools/podman/__main__.py +35 -19
  623. nuitka/tools/profiler/__init__.py +5 -4
  624. nuitka/tools/profiler/__main__.py +18 -17
  625. nuitka/tools/scanning/DisplayPackageDLLs.py +47 -22
  626. nuitka/tools/scanning/DisplayPackageData.py +31 -19
  627. nuitka/tools/scanning/__init__.py +5 -4
  628. nuitka/tools/specialize/CTypeDescriptions.py +251 -80
  629. nuitka/tools/specialize/Common.py +18 -17
  630. nuitka/tools/specialize/SpecializeC.py +248 -82
  631. nuitka/tools/specialize/SpecializePython.py +108 -45
  632. nuitka/tools/specialize/__init__.py +5 -4
  633. nuitka/tools/testing/Common.py +175 -114
  634. nuitka/tools/testing/Constructs.py +19 -17
  635. nuitka/tools/testing/OutputComparison.py +54 -18
  636. nuitka/tools/testing/Pythons.py +19 -18
  637. nuitka/tools/testing/RuntimeTracing.py +20 -19
  638. nuitka/tools/testing/SearchModes.py +26 -20
  639. nuitka/tools/testing/Valgrind.py +19 -17
  640. nuitka/tools/testing/__init__.py +5 -4
  641. nuitka/tools/testing/check_reference_counts/__init__.py +5 -4
  642. nuitka/tools/testing/check_reference_counts/__main__.py +18 -18
  643. nuitka/tools/testing/compare_with_cpython/__init__.py +5 -4
  644. nuitka/tools/testing/compare_with_cpython/__main__.py +39 -30
  645. nuitka/tools/testing/find_sxs_modules/__init__.py +5 -4
  646. nuitka/tools/testing/find_sxs_modules/__main__.py +17 -17
  647. nuitka/tools/testing/measure_construct_performance/__init__.py +5 -4
  648. nuitka/tools/testing/measure_construct_performance/__main__.py +23 -33
  649. nuitka/tools/testing/run_nuitka_tests/__init__.py +5 -4
  650. nuitka/tools/testing/run_nuitka_tests/__main__.py +134 -51
  651. nuitka/tools/watch/AutoStage.py +145 -0
  652. nuitka/tools/watch/GitHub.py +113 -0
  653. nuitka/tools/watch/__init__.py +5 -4
  654. nuitka/tools/watch/__main__.py +322 -91
  655. nuitka/tree/Building.py +184 -182
  656. nuitka/tree/ComplexCallHelperFunctions.py +84 -58
  657. nuitka/tree/Extractions.py +19 -17
  658. nuitka/tree/InternalModule.py +29 -20
  659. nuitka/tree/Operations.py +19 -17
  660. nuitka/tree/ReformulationAssertStatements.py +51 -31
  661. nuitka/tree/ReformulationAssignmentStatements.py +96 -91
  662. nuitka/tree/ReformulationBooleanExpressions.py +19 -17
  663. nuitka/tree/ReformulationCallExpressions.py +20 -18
  664. nuitka/tree/ReformulationClasses.py +45 -39
  665. nuitka/tree/ReformulationClasses3.py +239 -116
  666. nuitka/tree/ReformulationComparisonExpressions.py +29 -35
  667. nuitka/tree/ReformulationContractionExpressions.py +58 -55
  668. nuitka/tree/ReformulationDictionaryCreation.py +41 -35
  669. nuitka/tree/ReformulationExecStatements.py +42 -39
  670. nuitka/tree/ReformulationForLoopStatements.py +30 -34
  671. nuitka/tree/ReformulationFunctionStatements.py +59 -55
  672. nuitka/tree/ReformulationImportStatements.py +34 -29
  673. nuitka/tree/ReformulationLambdaExpressions.py +23 -24
  674. nuitka/tree/ReformulationMatchStatements.py +246 -92
  675. nuitka/tree/ReformulationMultidist.py +22 -18
  676. nuitka/tree/ReformulationNamespacePackages.py +55 -46
  677. nuitka/tree/ReformulationPrintStatements.py +23 -24
  678. nuitka/tree/ReformulationSequenceCreation.py +50 -49
  679. nuitka/tree/ReformulationSubscriptExpressions.py +19 -17
  680. nuitka/tree/ReformulationTryExceptStatements.py +19 -17
  681. nuitka/tree/ReformulationTryFinallyStatements.py +34 -17
  682. nuitka/tree/ReformulationWhileLoopStatements.py +19 -17
  683. nuitka/tree/ReformulationWithStatements.py +39 -41
  684. nuitka/tree/ReformulationYieldExpressions.py +44 -24
  685. nuitka/tree/SourceHandling.py +76 -31
  686. nuitka/tree/SyntaxErrors.py +19 -17
  687. nuitka/tree/TreeHelpers.py +33 -20
  688. nuitka/tree/VariableClosure.py +35 -39
  689. nuitka/tree/__init__.py +5 -4
  690. nuitka/utils/AppDirs.py +41 -20
  691. nuitka/utils/CStrings.py +66 -21
  692. nuitka/utils/CommandLineOptions.py +111 -22
  693. nuitka/utils/Distributions.py +445 -54
  694. nuitka/utils/Download.py +89 -57
  695. nuitka/utils/Execution.py +102 -58
  696. nuitka/utils/FileOperations.py +357 -128
  697. nuitka/utils/Hashing.py +55 -33
  698. nuitka/utils/Images.py +26 -19
  699. nuitka/utils/Importing.py +119 -37
  700. nuitka/utils/InlineCopies.py +52 -0
  701. nuitka/utils/InstalledPythons.py +85 -75
  702. nuitka/utils/InstanceCounters.py +20 -17
  703. nuitka/utils/Jinja2.py +30 -22
  704. nuitka/utils/Json.py +21 -19
  705. nuitka/utils/MacOSApp.py +26 -18
  706. nuitka/utils/MemoryUsage.py +20 -18
  707. nuitka/utils/ModuleNames.py +42 -26
  708. nuitka/utils/PackageResources.py +44 -0
  709. nuitka/utils/ReExecute.py +50 -28
  710. nuitka/utils/Rest.py +20 -17
  711. nuitka/utils/SharedLibraries.py +161 -75
  712. nuitka/utils/Shebang.py +20 -17
  713. nuitka/utils/Signing.py +63 -18
  714. nuitka/utils/SlotMetaClasses.py +57 -0
  715. nuitka/utils/StaticLibraries.py +83 -56
  716. nuitka/utils/ThreadedExecutor.py +18 -17
  717. nuitka/utils/Timing.py +22 -20
  718. nuitka/utils/Utils.py +132 -25
  719. nuitka/utils/WindowsFileUsage.py +22 -20
  720. nuitka/utils/WindowsResources.py +25 -18
  721. nuitka/utils/Yaml.py +62 -24
  722. nuitka/utils/__init__.py +5 -4
  723. Nuitka_winsvc-1.8.dist-info/RECORD +0 -905
  724. nuitka/build/inline_copy/tqdm/tqdm/_tqdm_gui.py +0 -9
  725. nuitka/build/inline_copy/tqdm/tqdm/gui.py +0 -191
  726. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/LICENSE.txt +0 -0
  727. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/entry_points.txt +0 -0
  728. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/top_level.txt +0 -0
@@ -1,20 +1,5 @@
1
- // Copyright 2023, Kay Hayen, mailto:kay.hayen@gmail.com
2
- //
3
- // Part of "Nuitka", an optimizing Python compiler that is compatible and
4
- // integrates with CPython, but also works on its own.
5
- //
6
- // Licensed under the Apache License, Version 2.0 (the "License");
7
- // you may not use this file except in compliance with the License.
8
- // You may obtain a copy of the License at
9
- //
10
- // http://www.apache.org/licenses/LICENSE-2.0
11
- //
12
- // Unless required by applicable law or agreed to in writing, software
13
- // distributed under the License is distributed on an "AS IS" BASIS,
14
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- // See the License for the specific language governing permissions and
16
- // limitations under the License.
17
- //
1
+ // Copyright 2024, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
2
+
18
3
  /* WARNING, this code is GENERATED. Modify the template HelperOperationInplace.c.j2 instead! */
19
4
 
20
5
  /* This file is included from another C file, help IDEs to still parse it on its own. */
@@ -62,6 +47,7 @@ static inline bool _INPLACE_OPERATION_ADD_INT_INT(PyObject **operand1, PyObject
62
47
  clong_result = x;
63
48
  goto exit_result_ok_clong;
64
49
  }
50
+
65
51
  {
66
52
  PyObject *operand1_object = *operand1;
67
53
  PyObject *operand2_object = operand2;
@@ -80,7 +66,7 @@ exit_result_ok_clong:
80
66
 
81
67
  // That's our return value then. As we use a dedicated variable, it's
82
68
  // OK that way.
83
- *operand1 = PyInt_FromLong(clong_result);
69
+ *operand1 = Nuitka_PyInt_FromLong(clong_result);
84
70
  goto exit_result_ok;
85
71
 
86
72
  exit_result_object:
@@ -131,7 +117,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_INT(PyObject **op
131
117
  goto exit_inplace_result_object;
132
118
  }
133
119
 
134
- Py_DECREF(x);
120
+ Py_DECREF_IMMORTAL(x);
135
121
  }
136
122
 
137
123
  {
@@ -157,7 +143,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_INT(PyObject **op
157
143
  goto exit_inplace_result_object;
158
144
  }
159
145
 
160
- Py_DECREF(x);
146
+ Py_DECREF_IMMORTAL(x);
161
147
  }
162
148
 
163
149
  if (slot2 != NULL) {
@@ -168,7 +154,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_INT(PyObject **op
168
154
  goto exit_inplace_result_object;
169
155
  }
170
156
 
171
- Py_DECREF(x);
157
+ Py_DECREF_IMMORTAL(x);
172
158
  }
173
159
 
174
160
  #if PYTHON_VERSION < 0x300
@@ -260,7 +246,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_INT(PyObject **op
260
246
  }
261
247
  }
262
248
 
263
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: '%s' and 'int'", type1->tp_name);
249
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: '%s' and 'int'", type1->tp_name);
264
250
  goto exit_inplace_exception;
265
251
  }
266
252
 
@@ -320,6 +306,7 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_INT(PyObject **operand1, PyObje
320
306
  clong_result = x;
321
307
  goto exit_result_ok_clong;
322
308
  }
309
+
323
310
  {
324
311
  PyObject *operand1_object = *operand1;
325
312
  PyObject *operand2_object = operand2;
@@ -338,7 +325,7 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_INT(PyObject **operand1, PyObje
338
325
 
339
326
  // That's our return value then. As we use a dedicated variable, it's
340
327
  // OK that way.
341
- *operand1 = PyInt_FromLong(clong_result);
328
+ *operand1 = Nuitka_PyInt_FromLong(clong_result);
342
329
  goto exit_result_ok;
343
330
 
344
331
  exit_result_object:
@@ -407,7 +394,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_INT_OBJECT(PyObject **op
407
394
  goto exit_inplace_result_object;
408
395
  }
409
396
 
410
- Py_DECREF(x);
397
+ Py_DECREF_IMMORTAL(x);
411
398
  slot2 = NULL;
412
399
  }
413
400
  }
@@ -419,7 +406,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_INT_OBJECT(PyObject **op
419
406
  goto exit_inplace_result_object;
420
407
  }
421
408
 
422
- Py_DECREF(x);
409
+ Py_DECREF_IMMORTAL(x);
423
410
  }
424
411
 
425
412
  if (slot2 != NULL) {
@@ -430,7 +417,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_INT_OBJECT(PyObject **op
430
417
  goto exit_inplace_result_object;
431
418
  }
432
419
 
433
- Py_DECREF(x);
420
+ Py_DECREF_IMMORTAL(x);
434
421
  }
435
422
 
436
423
  #if PYTHON_VERSION < 0x300
@@ -512,7 +499,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_INT_OBJECT(PyObject **op
512
499
  // No inplace sequence repeat slot sq_inplace_concat available for this type.
513
500
  }
514
501
 
515
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: 'int' and '%s'", type2->tp_name);
502
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: 'int' and '%s'", type2->tp_name);
516
503
  goto exit_inplace_exception;
517
504
  }
518
505
 
@@ -572,6 +559,7 @@ static inline bool _INPLACE_OPERATION_ADD_INT_OBJECT(PyObject **operand1, PyObje
572
559
  clong_result = x;
573
560
  goto exit_result_ok_clong;
574
561
  }
562
+
575
563
  {
576
564
  PyObject *operand1_object = *operand1;
577
565
  PyObject *operand2_object = operand2;
@@ -590,7 +578,7 @@ static inline bool _INPLACE_OPERATION_ADD_INT_OBJECT(PyObject **operand1, PyObje
590
578
 
591
579
  // That's our return value then. As we use a dedicated variable, it's
592
580
  // OK that way.
593
- *operand1 = PyInt_FromLong(clong_result);
581
+ *operand1 = Nuitka_PyInt_FromLong(clong_result);
594
582
  goto exit_result_ok;
595
583
 
596
584
  exit_result_object:
@@ -642,11 +630,11 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_LONG(PyObject **operand1, PyObjec
642
630
 
643
631
  PyLongObject *operand2_long_object = (PyLongObject *)operand2;
644
632
 
645
- if (Py_ABS(Py_SIZE(operand1_long_object)) <= 1 && Py_ABS(Py_SIZE(operand2_long_object)) <= 1) {
646
- long r = MEDIUM_VALUE(operand1_long_object) + MEDIUM_VALUE(operand2_long_object);
633
+ if (Nuitka_LongGetDigitSize(operand1_long_object) <= 1 && Nuitka_LongGetDigitSize(operand2_long_object) <= 1) {
634
+ long r = (long)(MEDIUM_VALUE(operand1_long_object) + MEDIUM_VALUE(operand2_long_object));
647
635
 
648
636
  if (Py_REFCNT(*operand1) == 1) {
649
- Nuitka_LongUpdateFromCLong(&*operand1, r);
637
+ Nuitka_LongUpdateFromCLong(&*operand1, (long)r);
650
638
  goto exit_result_ok;
651
639
  } else {
652
640
  PyObject *obj = Nuitka_LongFromCLong(r);
@@ -659,16 +647,16 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_LONG(PyObject **operand1, PyObjec
659
647
  }
660
648
 
661
649
  if (Py_REFCNT(*operand1) == 1) {
662
- digit const *b_digits = operand2_long_object->ob_digit;
663
- Py_ssize_t b_digit_count = Py_ABS(Py_SIZE(operand2_long_object));
650
+ digit const *b_digits = Nuitka_LongGetDigitPointer(operand2_long_object);
651
+ Py_ssize_t b_digit_count = Nuitka_LongGetDigitSize(operand2_long_object);
664
652
 
665
- bool a_negative = Py_SIZE(operand1_long_object) < 0;
666
- bool b_negative = Py_SIZE(operand2_long_object) < 0;
653
+ bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
654
+ bool b_negative = Nuitka_LongIsNegative(operand2_long_object);
667
655
 
668
656
  if (a_negative) {
669
657
  if (b_negative) {
670
658
  *operand1 = _Nuitka_LongAddInplaceDigits(*operand1, b_digits, b_digit_count);
671
- Py_SET_SIZE(*operand1, -Py_ABS(Py_SIZE(*operand1)));
659
+ Nuitka_LongSetSignNegative(*operand1);
672
660
  } else {
673
661
  *operand1 = _Nuitka_LongSubInplaceDigits(*operand1, b_digits, b_digit_count, -1);
674
662
  }
@@ -685,17 +673,17 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_LONG(PyObject **operand1, PyObjec
685
673
  {
686
674
  PyLongObject *z;
687
675
 
688
- digit const *a_digits = operand1_long_object->ob_digit;
689
- Py_ssize_t a_digit_count = Py_ABS(Py_SIZE(operand1_long_object));
690
- bool a_negative = Py_SIZE(operand1_long_object) < 0;
691
- digit const *b_digits = operand2_long_object->ob_digit;
692
- Py_ssize_t b_digit_count = Py_ABS(Py_SIZE(operand2_long_object));
693
- bool b_negative = Py_SIZE(operand2_long_object) < 0;
676
+ digit const *a_digits = Nuitka_LongGetDigitPointer(operand1_long_object);
677
+ Py_ssize_t a_digit_count = Nuitka_LongGetDigitSize(operand1_long_object);
678
+ bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
679
+ digit const *b_digits = Nuitka_LongGetDigitPointer(operand2_long_object);
680
+ Py_ssize_t b_digit_count = Nuitka_LongGetDigitSize(operand2_long_object);
681
+ bool b_negative = Nuitka_LongIsNegative(operand2_long_object);
694
682
 
695
683
  if (a_negative) {
696
684
  if (b_negative) {
697
685
  z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
698
- Py_SET_SIZE(z, -(Py_SIZE(z)));
686
+ Nuitka_LongFlipSign(z);
699
687
  } else {
700
688
  z = _Nuitka_LongSubDigits(b_digits, b_digit_count, a_digits, a_digit_count);
701
689
  }
@@ -727,7 +715,7 @@ exit_result_ok_clong:
727
715
 
728
716
  // That's our return value then. As we use a dedicated variable, it's
729
717
  // OK that way.
730
- *operand1 = PyLong_FromLong(clong_result);
718
+ *operand1 = Nuitka_PyLong_FromLong(clong_result);
731
719
  goto exit_result_ok;
732
720
 
733
721
  exit_result_ok:
@@ -766,7 +754,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_LONG(PyObject **o
766
754
  goto exit_inplace_result_object;
767
755
  }
768
756
 
769
- Py_DECREF(x);
757
+ Py_DECREF_IMMORTAL(x);
770
758
  }
771
759
 
772
760
  {
@@ -792,7 +780,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_LONG(PyObject **o
792
780
  goto exit_inplace_result_object;
793
781
  }
794
782
 
795
- Py_DECREF(x);
783
+ Py_DECREF_IMMORTAL(x);
796
784
  }
797
785
 
798
786
  if (slot2 != NULL) {
@@ -803,7 +791,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_LONG(PyObject **o
803
791
  goto exit_inplace_result_object;
804
792
  }
805
793
 
806
- Py_DECREF(x);
794
+ Py_DECREF_IMMORTAL(x);
807
795
  }
808
796
 
809
797
  #if PYTHON_VERSION < 0x300
@@ -896,9 +884,9 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_LONG(PyObject **o
896
884
  }
897
885
 
898
886
  #if PYTHON_VERSION < 0x300
899
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: '%s' and 'long'", type1->tp_name);
887
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: '%s' and 'long'", type1->tp_name);
900
888
  #else
901
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: '%s' and 'int'", type1->tp_name);
889
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: '%s' and 'int'", type1->tp_name);
902
890
  #endif
903
891
  goto exit_inplace_exception;
904
892
  }
@@ -947,11 +935,11 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_LONG(PyObject **operand1, PyObj
947
935
 
948
936
  PyLongObject *operand2_long_object = (PyLongObject *)operand2;
949
937
 
950
- if (Py_ABS(Py_SIZE(operand1_long_object)) <= 1 && Py_ABS(Py_SIZE(operand2_long_object)) <= 1) {
951
- long r = MEDIUM_VALUE(operand1_long_object) + MEDIUM_VALUE(operand2_long_object);
938
+ if (Nuitka_LongGetDigitSize(operand1_long_object) <= 1 && Nuitka_LongGetDigitSize(operand2_long_object) <= 1) {
939
+ long r = (long)(MEDIUM_VALUE(operand1_long_object) + MEDIUM_VALUE(operand2_long_object));
952
940
 
953
941
  if (Py_REFCNT(*operand1) == 1) {
954
- Nuitka_LongUpdateFromCLong(&*operand1, r);
942
+ Nuitka_LongUpdateFromCLong(&*operand1, (long)r);
955
943
  goto exit_result_ok;
956
944
  } else {
957
945
  PyObject *obj = Nuitka_LongFromCLong(r);
@@ -964,16 +952,16 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_LONG(PyObject **operand1, PyObj
964
952
  }
965
953
 
966
954
  if (Py_REFCNT(*operand1) == 1) {
967
- digit const *b_digits = operand2_long_object->ob_digit;
968
- Py_ssize_t b_digit_count = Py_ABS(Py_SIZE(operand2_long_object));
955
+ digit const *b_digits = Nuitka_LongGetDigitPointer(operand2_long_object);
956
+ Py_ssize_t b_digit_count = Nuitka_LongGetDigitSize(operand2_long_object);
969
957
 
970
- bool a_negative = Py_SIZE(operand1_long_object) < 0;
971
- bool b_negative = Py_SIZE(operand2_long_object) < 0;
958
+ bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
959
+ bool b_negative = Nuitka_LongIsNegative(operand2_long_object);
972
960
 
973
961
  if (a_negative) {
974
962
  if (b_negative) {
975
963
  *operand1 = _Nuitka_LongAddInplaceDigits(*operand1, b_digits, b_digit_count);
976
- Py_SET_SIZE(*operand1, -Py_ABS(Py_SIZE(*operand1)));
964
+ Nuitka_LongSetSignNegative(*operand1);
977
965
  } else {
978
966
  *operand1 = _Nuitka_LongSubInplaceDigits(*operand1, b_digits, b_digit_count, -1);
979
967
  }
@@ -990,17 +978,17 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_LONG(PyObject **operand1, PyObj
990
978
  {
991
979
  PyLongObject *z;
992
980
 
993
- digit const *a_digits = operand1_long_object->ob_digit;
994
- Py_ssize_t a_digit_count = Py_ABS(Py_SIZE(operand1_long_object));
995
- bool a_negative = Py_SIZE(operand1_long_object) < 0;
996
- digit const *b_digits = operand2_long_object->ob_digit;
997
- Py_ssize_t b_digit_count = Py_ABS(Py_SIZE(operand2_long_object));
998
- bool b_negative = Py_SIZE(operand2_long_object) < 0;
981
+ digit const *a_digits = Nuitka_LongGetDigitPointer(operand1_long_object);
982
+ Py_ssize_t a_digit_count = Nuitka_LongGetDigitSize(operand1_long_object);
983
+ bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
984
+ digit const *b_digits = Nuitka_LongGetDigitPointer(operand2_long_object);
985
+ Py_ssize_t b_digit_count = Nuitka_LongGetDigitSize(operand2_long_object);
986
+ bool b_negative = Nuitka_LongIsNegative(operand2_long_object);
999
987
 
1000
988
  if (a_negative) {
1001
989
  if (b_negative) {
1002
990
  z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
1003
- Py_SET_SIZE(z, -(Py_SIZE(z)));
991
+ Nuitka_LongFlipSign(z);
1004
992
  } else {
1005
993
  z = _Nuitka_LongSubDigits(b_digits, b_digit_count, a_digits, a_digit_count);
1006
994
  }
@@ -1032,7 +1020,7 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_LONG(PyObject **operand1, PyObj
1032
1020
 
1033
1021
  // That's our return value then. As we use a dedicated variable, it's
1034
1022
  // OK that way.
1035
- *operand1 = PyLong_FromLong(clong_result);
1023
+ *operand1 = Nuitka_PyLong_FromLong(clong_result);
1036
1024
  goto exit_result_ok;
1037
1025
 
1038
1026
  exit_result_ok:
@@ -1089,7 +1077,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_LONG_OBJECT(PyObject **o
1089
1077
  goto exit_inplace_result_object;
1090
1078
  }
1091
1079
 
1092
- Py_DECREF(x);
1080
+ Py_DECREF_IMMORTAL(x);
1093
1081
  slot2 = NULL;
1094
1082
  }
1095
1083
  }
@@ -1101,7 +1089,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_LONG_OBJECT(PyObject **o
1101
1089
  goto exit_inplace_result_object;
1102
1090
  }
1103
1091
 
1104
- Py_DECREF(x);
1092
+ Py_DECREF_IMMORTAL(x);
1105
1093
  }
1106
1094
 
1107
1095
  if (slot2 != NULL) {
@@ -1112,7 +1100,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_LONG_OBJECT(PyObject **o
1112
1100
  goto exit_inplace_result_object;
1113
1101
  }
1114
1102
 
1115
- Py_DECREF(x);
1103
+ Py_DECREF_IMMORTAL(x);
1116
1104
  }
1117
1105
 
1118
1106
  #if PYTHON_VERSION < 0x300
@@ -1195,9 +1183,9 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_LONG_OBJECT(PyObject **o
1195
1183
  }
1196
1184
 
1197
1185
  #if PYTHON_VERSION < 0x300
1198
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: 'long' and '%s'", type2->tp_name);
1186
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: 'long' and '%s'", type2->tp_name);
1199
1187
  #else
1200
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: 'int' and '%s'", type2->tp_name);
1188
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: 'int' and '%s'", type2->tp_name);
1201
1189
  #endif
1202
1190
  goto exit_inplace_exception;
1203
1191
  }
@@ -1246,11 +1234,11 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_OBJECT(PyObject **operand1, PyObj
1246
1234
 
1247
1235
  PyLongObject *operand2_long_object = (PyLongObject *)operand2;
1248
1236
 
1249
- if (Py_ABS(Py_SIZE(operand1_long_object)) <= 1 && Py_ABS(Py_SIZE(operand2_long_object)) <= 1) {
1250
- long r = MEDIUM_VALUE(operand1_long_object) + MEDIUM_VALUE(operand2_long_object);
1237
+ if (Nuitka_LongGetDigitSize(operand1_long_object) <= 1 && Nuitka_LongGetDigitSize(operand2_long_object) <= 1) {
1238
+ long r = (long)(MEDIUM_VALUE(operand1_long_object) + MEDIUM_VALUE(operand2_long_object));
1251
1239
 
1252
1240
  if (Py_REFCNT(*operand1) == 1) {
1253
- Nuitka_LongUpdateFromCLong(&*operand1, r);
1241
+ Nuitka_LongUpdateFromCLong(&*operand1, (long)r);
1254
1242
  goto exit_result_ok;
1255
1243
  } else {
1256
1244
  PyObject *obj = Nuitka_LongFromCLong(r);
@@ -1263,16 +1251,16 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_OBJECT(PyObject **operand1, PyObj
1263
1251
  }
1264
1252
 
1265
1253
  if (Py_REFCNT(*operand1) == 1) {
1266
- digit const *b_digits = operand2_long_object->ob_digit;
1267
- Py_ssize_t b_digit_count = Py_ABS(Py_SIZE(operand2_long_object));
1254
+ digit const *b_digits = Nuitka_LongGetDigitPointer(operand2_long_object);
1255
+ Py_ssize_t b_digit_count = Nuitka_LongGetDigitSize(operand2_long_object);
1268
1256
 
1269
- bool a_negative = Py_SIZE(operand1_long_object) < 0;
1270
- bool b_negative = Py_SIZE(operand2_long_object) < 0;
1257
+ bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
1258
+ bool b_negative = Nuitka_LongIsNegative(operand2_long_object);
1271
1259
 
1272
1260
  if (a_negative) {
1273
1261
  if (b_negative) {
1274
1262
  *operand1 = _Nuitka_LongAddInplaceDigits(*operand1, b_digits, b_digit_count);
1275
- Py_SET_SIZE(*operand1, -Py_ABS(Py_SIZE(*operand1)));
1263
+ Nuitka_LongSetSignNegative(*operand1);
1276
1264
  } else {
1277
1265
  *operand1 = _Nuitka_LongSubInplaceDigits(*operand1, b_digits, b_digit_count, -1);
1278
1266
  }
@@ -1289,17 +1277,17 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_OBJECT(PyObject **operand1, PyObj
1289
1277
  {
1290
1278
  PyLongObject *z;
1291
1279
 
1292
- digit const *a_digits = operand1_long_object->ob_digit;
1293
- Py_ssize_t a_digit_count = Py_ABS(Py_SIZE(operand1_long_object));
1294
- bool a_negative = Py_SIZE(operand1_long_object) < 0;
1295
- digit const *b_digits = operand2_long_object->ob_digit;
1296
- Py_ssize_t b_digit_count = Py_ABS(Py_SIZE(operand2_long_object));
1297
- bool b_negative = Py_SIZE(operand2_long_object) < 0;
1280
+ digit const *a_digits = Nuitka_LongGetDigitPointer(operand1_long_object);
1281
+ Py_ssize_t a_digit_count = Nuitka_LongGetDigitSize(operand1_long_object);
1282
+ bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
1283
+ digit const *b_digits = Nuitka_LongGetDigitPointer(operand2_long_object);
1284
+ Py_ssize_t b_digit_count = Nuitka_LongGetDigitSize(operand2_long_object);
1285
+ bool b_negative = Nuitka_LongIsNegative(operand2_long_object);
1298
1286
 
1299
1287
  if (a_negative) {
1300
1288
  if (b_negative) {
1301
1289
  z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
1302
- Py_SET_SIZE(z, -(Py_SIZE(z)));
1290
+ Nuitka_LongFlipSign(z);
1303
1291
  } else {
1304
1292
  z = _Nuitka_LongSubDigits(b_digits, b_digit_count, a_digits, a_digit_count);
1305
1293
  }
@@ -1331,7 +1319,7 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_OBJECT(PyObject **operand1, PyObj
1331
1319
 
1332
1320
  // That's our return value then. As we use a dedicated variable, it's
1333
1321
  // OK that way.
1334
- *operand1 = PyLong_FromLong(clong_result);
1322
+ *operand1 = Nuitka_PyLong_FromLong(clong_result);
1335
1323
  goto exit_result_ok;
1336
1324
 
1337
1325
  exit_result_ok:
@@ -1426,7 +1414,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_FLOAT(PyObject **
1426
1414
  goto exit_inplace_result_object;
1427
1415
  }
1428
1416
 
1429
- Py_DECREF(x);
1417
+ Py_DECREF_IMMORTAL(x);
1430
1418
  }
1431
1419
 
1432
1420
  {
@@ -1452,7 +1440,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_FLOAT(PyObject **
1452
1440
  goto exit_inplace_result_object;
1453
1441
  }
1454
1442
 
1455
- Py_DECREF(x);
1443
+ Py_DECREF_IMMORTAL(x);
1456
1444
  }
1457
1445
 
1458
1446
  if (slot2 != NULL) {
@@ -1463,7 +1451,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_FLOAT(PyObject **
1463
1451
  goto exit_inplace_result_object;
1464
1452
  }
1465
1453
 
1466
- Py_DECREF(x);
1454
+ Py_DECREF_IMMORTAL(x);
1467
1455
  }
1468
1456
 
1469
1457
  #if PYTHON_VERSION < 0x300
@@ -1555,7 +1543,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_FLOAT(PyObject **
1555
1543
  }
1556
1544
  }
1557
1545
 
1558
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: '%s' and 'float'", type1->tp_name);
1546
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: '%s' and 'float'", type1->tp_name);
1559
1547
  goto exit_inplace_exception;
1560
1548
  }
1561
1549
 
@@ -1675,7 +1663,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_FLOAT_OBJECT(PyObject **
1675
1663
  goto exit_inplace_result_object;
1676
1664
  }
1677
1665
 
1678
- Py_DECREF(x);
1666
+ Py_DECREF_IMMORTAL(x);
1679
1667
  slot2 = NULL;
1680
1668
  }
1681
1669
  }
@@ -1687,7 +1675,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_FLOAT_OBJECT(PyObject **
1687
1675
  goto exit_inplace_result_object;
1688
1676
  }
1689
1677
 
1690
- Py_DECREF(x);
1678
+ Py_DECREF_IMMORTAL(x);
1691
1679
  }
1692
1680
 
1693
1681
  if (slot2 != NULL) {
@@ -1698,7 +1686,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_FLOAT_OBJECT(PyObject **
1698
1686
  goto exit_inplace_result_object;
1699
1687
  }
1700
1688
 
1701
- Py_DECREF(x);
1689
+ Py_DECREF_IMMORTAL(x);
1702
1690
  }
1703
1691
 
1704
1692
  #if PYTHON_VERSION < 0x300
@@ -1780,7 +1768,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_FLOAT_OBJECT(PyObject **
1780
1768
  // No inplace sequence repeat slot sq_inplace_concat available for this type.
1781
1769
  }
1782
1770
 
1783
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: 'float' and '%s'", type2->tp_name);
1771
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: 'float' and '%s'", type2->tp_name);
1784
1772
  goto exit_inplace_exception;
1785
1773
  }
1786
1774
 
@@ -1893,7 +1881,7 @@ static inline bool _INPLACE_OPERATION_ADD_FLOAT_LONG(PyObject **operand1, PyObje
1893
1881
  goto exit_inplace_result_object;
1894
1882
  }
1895
1883
 
1896
- Py_DECREF(x);
1884
+ Py_DECREF_IMMORTAL(x);
1897
1885
  }
1898
1886
 
1899
1887
  // Statically recognized that coercion is not possible with these types
@@ -1904,9 +1892,9 @@ static inline bool _INPLACE_OPERATION_ADD_FLOAT_LONG(PyObject **operand1, PyObje
1904
1892
  }
1905
1893
 
1906
1894
  #if PYTHON_VERSION < 0x300
1907
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: 'float' and 'long'");
1895
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: 'float' and 'long'");
1908
1896
  #else
1909
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: 'float' and 'int'");
1897
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: 'float' and 'int'");
1910
1898
  #endif
1911
1899
  goto exit_inplace_exception;
1912
1900
  }
@@ -1972,7 +1960,7 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_FLOAT(PyObject **operand1, PyObje
1972
1960
  goto exit_inplace_result_object;
1973
1961
  }
1974
1962
 
1975
- Py_DECREF(x);
1963
+ Py_DECREF_IMMORTAL(x);
1976
1964
  }
1977
1965
 
1978
1966
  // Statically recognized that coercion is not possible with these types
@@ -1983,9 +1971,9 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_FLOAT(PyObject **operand1, PyObje
1983
1971
  }
1984
1972
 
1985
1973
  #if PYTHON_VERSION < 0x300
1986
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: 'long' and 'float'");
1974
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: 'long' and 'float'");
1987
1975
  #else
1988
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: 'int' and 'float'");
1976
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: 'int' and 'float'");
1989
1977
  #endif
1990
1978
  goto exit_inplace_exception;
1991
1979
  }
@@ -2046,7 +2034,7 @@ static inline bool _INPLACE_OPERATION_ADD_FLOAT_INT(PyObject **operand1, PyObjec
2046
2034
  goto exit_inplace_result_object;
2047
2035
  }
2048
2036
 
2049
- Py_DECREF(x);
2037
+ Py_DECREF_IMMORTAL(x);
2050
2038
  }
2051
2039
 
2052
2040
  // Statically recognized that coercion is not possible with these types
@@ -2056,7 +2044,7 @@ static inline bool _INPLACE_OPERATION_ADD_FLOAT_INT(PyObject **operand1, PyObjec
2056
2044
  // No inplace sequence repeat slot sq_inplace_concat available for this type.
2057
2045
  }
2058
2046
 
2059
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: 'float' and 'int'");
2047
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: 'float' and 'int'");
2060
2048
  goto exit_inplace_exception;
2061
2049
  }
2062
2050
 
@@ -2123,7 +2111,7 @@ static inline bool _INPLACE_OPERATION_ADD_INT_FLOAT(PyObject **operand1, PyObjec
2123
2111
  goto exit_inplace_result_object;
2124
2112
  }
2125
2113
 
2126
- Py_DECREF(x);
2114
+ Py_DECREF_IMMORTAL(x);
2127
2115
  }
2128
2116
 
2129
2117
  // Statically recognized that coercion is not possible with these types
@@ -2133,7 +2121,7 @@ static inline bool _INPLACE_OPERATION_ADD_INT_FLOAT(PyObject **operand1, PyObjec
2133
2121
  // No inplace sequence repeat slot sq_inplace_concat available for this type.
2134
2122
  }
2135
2123
 
2136
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: 'int' and 'float'");
2124
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: 'int' and 'float'");
2137
2125
  goto exit_inplace_exception;
2138
2126
  }
2139
2127
 
@@ -2194,7 +2182,7 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_INT(PyObject **operand1, PyObject
2194
2182
  goto exit_inplace_result_object;
2195
2183
  }
2196
2184
 
2197
- Py_DECREF(x);
2185
+ Py_DECREF_IMMORTAL(x);
2198
2186
  }
2199
2187
 
2200
2188
  // Statically recognized that coercion is not possible with these types
@@ -2204,7 +2192,7 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_INT(PyObject **operand1, PyObject
2204
2192
  // No inplace sequence repeat slot sq_inplace_concat available for this type.
2205
2193
  }
2206
2194
 
2207
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: 'long' and 'int'");
2195
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: 'long' and 'int'");
2208
2196
  goto exit_inplace_exception;
2209
2197
  }
2210
2198
 
@@ -2271,7 +2259,7 @@ static inline bool _INPLACE_OPERATION_ADD_INT_LONG(PyObject **operand1, PyObject
2271
2259
  goto exit_inplace_result_object;
2272
2260
  }
2273
2261
 
2274
- Py_DECREF(x);
2262
+ Py_DECREF_IMMORTAL(x);
2275
2263
  }
2276
2264
 
2277
2265
  // Statically recognized that coercion is not possible with these types
@@ -2281,7 +2269,7 @@ static inline bool _INPLACE_OPERATION_ADD_INT_LONG(PyObject **operand1, PyObject
2281
2269
  // No inplace sequence repeat slot sq_inplace_concat available for this type.
2282
2270
  }
2283
2271
 
2284
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: 'int' and 'long'");
2272
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: 'int' and 'long'");
2285
2273
  goto exit_inplace_exception;
2286
2274
  }
2287
2275
 
@@ -2341,9 +2329,10 @@ static inline bool _INPLACE_OPERATION_ADD_INT_CLONG(PyObject **operand1, long op
2341
2329
  clong_result = x;
2342
2330
  goto exit_result_ok_clong;
2343
2331
  }
2332
+
2344
2333
  {
2345
2334
  PyObject *operand1_object = *operand1;
2346
- PyObject *operand2_object = PyLong_FromLong(operand2);
2335
+ PyObject *operand2_object = Nuitka_PyLong_FromLong(operand2);
2347
2336
 
2348
2337
  PyObject *r = PyLong_Type.tp_as_number->nb_add(operand1_object, operand2_object);
2349
2338
  assert(r != Py_NotImplemented);
@@ -2361,7 +2350,7 @@ exit_result_ok_clong:
2361
2350
 
2362
2351
  // That's our return value then. As we use a dedicated variable, it's
2363
2352
  // OK that way.
2364
- *operand1 = PyInt_FromLong(clong_result);
2353
+ *operand1 = Nuitka_PyInt_FromLong(clong_result);
2365
2354
  goto exit_result_ok;
2366
2355
 
2367
2356
  exit_result_object:
@@ -2408,11 +2397,11 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_DIGIT(PyObject **operand1, long o
2408
2397
 
2409
2398
  PyLongObject *operand1_long_object = (PyLongObject *)*operand1;
2410
2399
 
2411
- if (Py_ABS(Py_SIZE(operand1_long_object)) <= 1 && (operand2 == 0 ? 0 : 1) <= 1) {
2412
- long r = MEDIUM_VALUE(operand1_long_object) + (sdigit)operand2;
2400
+ if (Nuitka_LongGetDigitSize(operand1_long_object) <= 1 && (operand2 == 0 ? 0 : 1) <= 1) {
2401
+ long r = (long)(MEDIUM_VALUE(operand1_long_object) + (sdigit)operand2);
2413
2402
 
2414
2403
  if (Py_REFCNT(*operand1) == 1) {
2415
- Nuitka_LongUpdateFromCLong(&*operand1, r);
2404
+ Nuitka_LongUpdateFromCLong(&*operand1, (long)r);
2416
2405
  goto exit_result_ok;
2417
2406
  } else {
2418
2407
  PyObject *obj = Nuitka_LongFromCLong(r);
@@ -2428,13 +2417,13 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_DIGIT(PyObject **operand1, long o
2428
2417
  digit const *b_digits = (digit *)&operand2;
2429
2418
  Py_ssize_t b_digit_count = (operand2 == 0 ? 0 : 1);
2430
2419
 
2431
- bool a_negative = Py_SIZE(operand1_long_object) < 0;
2420
+ bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
2432
2421
  bool b_negative = operand2 < 0;
2433
2422
 
2434
2423
  if (a_negative) {
2435
2424
  if (b_negative) {
2436
2425
  *operand1 = _Nuitka_LongAddInplaceDigits(*operand1, b_digits, b_digit_count);
2437
- Py_SET_SIZE(*operand1, -Py_ABS(Py_SIZE(*operand1)));
2426
+ Nuitka_LongSetSignNegative(*operand1);
2438
2427
  } else {
2439
2428
  *operand1 = _Nuitka_LongSubInplaceDigits(*operand1, b_digits, b_digit_count, -1);
2440
2429
  }
@@ -2451,9 +2440,9 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_DIGIT(PyObject **operand1, long o
2451
2440
  {
2452
2441
  PyLongObject *z;
2453
2442
 
2454
- digit const *a_digits = operand1_long_object->ob_digit;
2455
- Py_ssize_t a_digit_count = Py_ABS(Py_SIZE(operand1_long_object));
2456
- bool a_negative = Py_SIZE(operand1_long_object) < 0;
2443
+ digit const *a_digits = Nuitka_LongGetDigitPointer(operand1_long_object);
2444
+ Py_ssize_t a_digit_count = Nuitka_LongGetDigitSize(operand1_long_object);
2445
+ bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
2457
2446
  digit const *b_digits = (digit *)&operand2;
2458
2447
  Py_ssize_t b_digit_count = (operand2 == 0 ? 0 : 1);
2459
2448
  bool b_negative = operand2 < 0;
@@ -2461,7 +2450,7 @@ static inline bool _INPLACE_OPERATION_ADD_LONG_DIGIT(PyObject **operand1, long o
2461
2450
  if (a_negative) {
2462
2451
  if (b_negative) {
2463
2452
  z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2464
- Py_SET_SIZE(z, -(Py_SIZE(z)));
2453
+ Nuitka_LongFlipSign(z);
2465
2454
  } else {
2466
2455
  z = _Nuitka_LongSubDigits(b_digits, b_digit_count, a_digits, a_digit_count);
2467
2456
  }
@@ -2493,7 +2482,7 @@ exit_result_ok_clong:
2493
2482
 
2494
2483
  // That's our return value then. As we use a dedicated variable, it's
2495
2484
  // OK that way.
2496
- *operand1 = PyLong_FromLong(clong_result);
2485
+ *operand1 = Nuitka_PyLong_FromLong(clong_result);
2497
2486
  goto exit_result_ok;
2498
2487
 
2499
2488
  exit_result_ok:
@@ -2507,6 +2496,153 @@ bool INPLACE_OPERATION_ADD_LONG_DIGIT(PyObject **operand1, long operand2) {
2507
2496
  return _INPLACE_OPERATION_ADD_LONG_DIGIT(operand1, operand2);
2508
2497
  }
2509
2498
 
2499
+ /* Code referring to "LONG" corresponds to Python2 'long', Python3 'int' and "CLONG" to C platform long value. */
2500
+ static inline bool _INPLACE_OPERATION_ADD_LONG_CLONG(PyObject **operand1, long operand2) {
2501
+ assert(operand1); // Pointer must be non-null.
2502
+
2503
+ CHECK_OBJECT(*operand1);
2504
+ assert(PyLong_CheckExact(*operand1));
2505
+
2506
+ // Not every code path will make use of all possible results.
2507
+ #ifdef _MSC_VER
2508
+ #pragma warning(push)
2509
+ #pragma warning(disable : 4101)
2510
+ #endif
2511
+ NUITKA_MAY_BE_UNUSED PyObject *obj_result;
2512
+ NUITKA_MAY_BE_UNUSED long clong_result;
2513
+ #ifdef _MSC_VER
2514
+ #pragma warning(pop)
2515
+ #endif
2516
+
2517
+ PyLongObject *operand1_long_object = (PyLongObject *)*operand1;
2518
+
2519
+ bool operand2_is_negative;
2520
+ unsigned long operand2_abs_ival;
2521
+
2522
+ if (operand2 < 0) {
2523
+ operand2_abs_ival = (unsigned long)(-1 - operand2) + 1;
2524
+ operand2_is_negative = true;
2525
+ } else {
2526
+ operand2_abs_ival = (unsigned long)operand2;
2527
+ operand2_is_negative = false;
2528
+ }
2529
+
2530
+ Py_ssize_t operand2_digit_count = 0;
2531
+ digit operand2_digits[5] = {0}; // Could be more minimal and depend on sizeof(digit)
2532
+ {
2533
+ unsigned long t = operand2_abs_ival;
2534
+
2535
+ while (t != 0) {
2536
+ operand2_digit_count += 1;
2537
+ assert(operand2_digit_count <= (Py_ssize_t)(sizeof(operand2_digit_count) / sizeof(digit)));
2538
+
2539
+ operand2_digits[operand2_digit_count] = (digit)(t & PyLong_MASK);
2540
+ t >>= PyLong_SHIFT;
2541
+ }
2542
+ }
2543
+
2544
+ NUITKA_MAY_BE_UNUSED Py_ssize_t operand2_size =
2545
+ operand2_is_negative == false ? operand2_digit_count : -operand2_digit_count;
2546
+
2547
+ if (Nuitka_LongGetDigitSize(operand1_long_object) <= 1 && operand2_digit_count <= 1) {
2548
+ long r = (long)(MEDIUM_VALUE(operand1_long_object) + (sdigit)operand2);
2549
+
2550
+ if (Py_REFCNT(*operand1) == 1) {
2551
+ Nuitka_LongUpdateFromCLong(&*operand1, (long)r);
2552
+ goto exit_result_ok;
2553
+ } else {
2554
+ PyObject *obj = Nuitka_LongFromCLong(r);
2555
+
2556
+ obj_result = obj;
2557
+ goto exit_result_object;
2558
+ }
2559
+ clong_result = r;
2560
+ goto exit_result_ok_clong;
2561
+ }
2562
+
2563
+ if (Py_REFCNT(*operand1) == 1) {
2564
+ digit const *b_digits = operand2_digits;
2565
+ Py_ssize_t b_digit_count = operand2_digit_count;
2566
+
2567
+ bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
2568
+ bool b_negative = operand2_is_negative;
2569
+
2570
+ if (a_negative) {
2571
+ if (b_negative) {
2572
+ *operand1 = _Nuitka_LongAddInplaceDigits(*operand1, b_digits, b_digit_count);
2573
+ Nuitka_LongSetSignNegative(*operand1);
2574
+ } else {
2575
+ *operand1 = _Nuitka_LongSubInplaceDigits(*operand1, b_digits, b_digit_count, -1);
2576
+ }
2577
+ } else {
2578
+ if (b_negative) {
2579
+ *operand1 = _Nuitka_LongSubInplaceDigits(*operand1, b_digits, b_digit_count, 1);
2580
+ } else {
2581
+ *operand1 = _Nuitka_LongAddInplaceDigits(*operand1, b_digits, b_digit_count);
2582
+ }
2583
+ }
2584
+
2585
+ goto exit_result_ok;
2586
+ }
2587
+ {
2588
+ PyLongObject *z;
2589
+
2590
+ digit const *a_digits = Nuitka_LongGetDigitPointer(operand1_long_object);
2591
+ Py_ssize_t a_digit_count = Nuitka_LongGetDigitSize(operand1_long_object);
2592
+ bool a_negative = Nuitka_LongIsNegative(operand1_long_object);
2593
+ digit const *b_digits = operand2_digits;
2594
+ Py_ssize_t b_digit_count = operand2_digit_count;
2595
+ bool b_negative = operand2_is_negative;
2596
+
2597
+ if (a_negative) {
2598
+ if (b_negative) {
2599
+ z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2600
+ Nuitka_LongFlipSign(z);
2601
+ } else {
2602
+ z = _Nuitka_LongSubDigits(b_digits, b_digit_count, a_digits, a_digit_count);
2603
+ }
2604
+ } else {
2605
+ if (b_negative) {
2606
+ z = _Nuitka_LongSubDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2607
+ } else {
2608
+ z = _Nuitka_LongAddDigits(a_digits, a_digit_count, b_digits, b_digit_count);
2609
+ }
2610
+ }
2611
+
2612
+ obj_result = (PyObject *)z;
2613
+ goto exit_result_object;
2614
+ }
2615
+
2616
+ exit_result_object:
2617
+ if (unlikely(obj_result == NULL)) {
2618
+ goto exit_result_exception;
2619
+ }
2620
+ // We got an object handed, that we have to release.
2621
+ Py_DECREF(*operand1);
2622
+ *operand1 = obj_result;
2623
+ goto exit_result_ok;
2624
+
2625
+ exit_result_ok_clong:
2626
+
2627
+ // We got an object handed, that we have to release.
2628
+ Py_DECREF(*operand1);
2629
+
2630
+ // That's our return value then. As we use a dedicated variable, it's
2631
+ // OK that way.
2632
+ *operand1 = Nuitka_PyLong_FromLong(clong_result);
2633
+ goto exit_result_ok;
2634
+
2635
+ exit_result_ok:
2636
+ return true;
2637
+
2638
+ exit_result_exception:
2639
+ return false;
2640
+ }
2641
+
2642
+ bool INPLACE_OPERATION_ADD_LONG_CLONG(PyObject **operand1, long operand2) {
2643
+ return _INPLACE_OPERATION_ADD_LONG_CLONG(operand1, operand2);
2644
+ }
2645
+
2510
2646
  /* Code referring to "FLOAT" corresponds to Python 'float' and "CFLOAT" to C platform float value. */
2511
2647
  static inline bool _INPLACE_OPERATION_ADD_FLOAT_CFLOAT(PyObject **operand1, double operand2) {
2512
2648
  assert(operand1); // Pointer must be non-null.
@@ -2567,7 +2703,7 @@ static inline bool _INPLACE_OPERATION_ADD_STR_STR(PyObject **operand1, PyObject
2567
2703
  assert(PyString_CheckExact(operand2));
2568
2704
 
2569
2705
  if (Py_REFCNT(*operand1) == 1) {
2570
- // We more or less own the operand, so we might re-use its storage and
2706
+ // We more or less own the operand, so we might reuse its storage and
2571
2707
  // execute stuff in-place.
2572
2708
  #if PYTHON_VERSION < 0x300
2573
2709
  if (1 && !PyString_CHECK_INTERNED(*operand1) && 1) {
@@ -2645,7 +2781,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_STR(PyObject **op
2645
2781
  goto exit_inplace_result_object;
2646
2782
  }
2647
2783
 
2648
- Py_DECREF(x);
2784
+ Py_DECREF_IMMORTAL(x);
2649
2785
  }
2650
2786
 
2651
2787
  {
@@ -2660,7 +2796,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_STR(PyObject **op
2660
2796
  goto exit_inplace_result_object;
2661
2797
  }
2662
2798
 
2663
- Py_DECREF(x);
2799
+ Py_DECREF_IMMORTAL(x);
2664
2800
  }
2665
2801
 
2666
2802
  #if PYTHON_VERSION < 0x300
@@ -2718,7 +2854,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_STR(PyObject **op
2718
2854
  }
2719
2855
  }
2720
2856
 
2721
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: '%s' and 'str'", type1->tp_name);
2857
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: '%s' and 'str'", type1->tp_name);
2722
2858
  goto exit_inplace_exception;
2723
2859
  }
2724
2860
 
@@ -2747,7 +2883,7 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_STR(PyObject **operand1, PyObje
2747
2883
  assert(PyString_CheckExact(operand2));
2748
2884
 
2749
2885
  if (Py_REFCNT(*operand1) == 1) {
2750
- // We more or less own the operand, so we might re-use its storage and
2886
+ // We more or less own the operand, so we might reuse its storage and
2751
2887
  // execute stuff in-place.
2752
2888
  #if PYTHON_VERSION < 0x300
2753
2889
  if (PyString_CheckExact(*operand1) && !PyString_CHECK_INTERNED(*operand1) && 1) {
@@ -2829,7 +2965,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_STR_OBJECT(PyObject **op
2829
2965
  goto exit_inplace_result_object;
2830
2966
  }
2831
2967
 
2832
- Py_DECREF(x);
2968
+ Py_DECREF_IMMORTAL(x);
2833
2969
  }
2834
2970
 
2835
2971
  #if PYTHON_VERSION < 0x300
@@ -2908,7 +3044,7 @@ static inline bool _INPLACE_OPERATION_ADD_STR_OBJECT(PyObject **operand1, PyObje
2908
3044
  CHECK_OBJECT(operand2);
2909
3045
 
2910
3046
  if (Py_REFCNT(*operand1) == 1) {
2911
- // We more or less own the operand, so we might re-use its storage and
3047
+ // We more or less own the operand, so we might reuse its storage and
2912
3048
  // execute stuff in-place.
2913
3049
  #if PYTHON_VERSION < 0x300
2914
3050
  if (1 && !PyString_CHECK_INTERNED(*operand1) && PyString_CheckExact(operand2)) {
@@ -2967,7 +3103,7 @@ static inline bool _INPLACE_OPERATION_ADD_UNICODE_UNICODE(PyObject **operand1, P
2967
3103
  assert(PyUnicode_CheckExact(operand2));
2968
3104
 
2969
3105
  if (Py_REFCNT(*operand1) == 1) {
2970
- // We more or less own the operand, so we might re-use its storage and
3106
+ // We more or less own the operand, so we might reuse its storage and
2971
3107
  // execute stuff in-place.
2972
3108
 
2973
3109
  #if PYTHON_VERSION >= 0x300
@@ -3037,7 +3173,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_UNICODE(PyObject
3037
3173
  goto exit_inplace_result_object;
3038
3174
  }
3039
3175
 
3040
- Py_DECREF(x);
3176
+ Py_DECREF_IMMORTAL(x);
3041
3177
  }
3042
3178
 
3043
3179
  {
@@ -3052,7 +3188,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_UNICODE(PyObject
3052
3188
  goto exit_inplace_result_object;
3053
3189
  }
3054
3190
 
3055
- Py_DECREF(x);
3191
+ Py_DECREF_IMMORTAL(x);
3056
3192
  }
3057
3193
 
3058
3194
  #if PYTHON_VERSION < 0x300
@@ -3111,9 +3247,9 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_UNICODE(PyObject
3111
3247
  }
3112
3248
 
3113
3249
  #if PYTHON_VERSION < 0x300
3114
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: '%s' and 'unicode'", type1->tp_name);
3250
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: '%s' and 'unicode'", type1->tp_name);
3115
3251
  #else
3116
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: '%s' and 'str'", type1->tp_name);
3252
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: '%s' and 'str'", type1->tp_name);
3117
3253
  #endif
3118
3254
  goto exit_inplace_exception;
3119
3255
  }
@@ -3143,7 +3279,7 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_UNICODE(PyObject **operand1, Py
3143
3279
  assert(PyUnicode_CheckExact(operand2));
3144
3280
 
3145
3281
  if (Py_REFCNT(*operand1) == 1) {
3146
- // We more or less own the operand, so we might re-use its storage and
3282
+ // We more or less own the operand, so we might reuse its storage and
3147
3283
  // execute stuff in-place.
3148
3284
 
3149
3285
  #if PYTHON_VERSION >= 0x300
@@ -3229,7 +3365,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_UNICODE_OBJECT(PyObject
3229
3365
  goto exit_inplace_result_object;
3230
3366
  }
3231
3367
 
3232
- Py_DECREF(x);
3368
+ Py_DECREF_IMMORTAL(x);
3233
3369
  }
3234
3370
 
3235
3371
  #if PYTHON_VERSION < 0x300
@@ -3308,7 +3444,7 @@ static inline bool _INPLACE_OPERATION_ADD_UNICODE_OBJECT(PyObject **operand1, Py
3308
3444
  CHECK_OBJECT(operand2);
3309
3445
 
3310
3446
  if (Py_REFCNT(*operand1) == 1) {
3311
- // We more or less own the operand, so we might re-use its storage and
3447
+ // We more or less own the operand, so we might reuse its storage and
3312
3448
  // execute stuff in-place.
3313
3449
 
3314
3450
  #if PYTHON_VERSION >= 0x300
@@ -3372,7 +3508,7 @@ static inline bool _INPLACE_OPERATION_ADD_BYTES_BYTES(PyObject **operand1, PyObj
3372
3508
  assert(PyBytes_CheckExact(operand2));
3373
3509
 
3374
3510
  if (Py_REFCNT(*operand1) == 1) {
3375
- // We more or less own the operand, so we might re-use its storage and
3511
+ // We more or less own the operand, so we might reuse its storage and
3376
3512
  // execute stuff in-place.
3377
3513
 
3378
3514
  #if PYTHON_VERSION >= 0x300
@@ -3439,7 +3575,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_BYTES(PyObject **
3439
3575
  goto exit_inplace_result_object;
3440
3576
  }
3441
3577
 
3442
- Py_DECREF(x);
3578
+ Py_DECREF_IMMORTAL(x);
3443
3579
  }
3444
3580
 
3445
3581
  {
@@ -3454,7 +3590,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_BYTES(PyObject **
3454
3590
  goto exit_inplace_result_object;
3455
3591
  }
3456
3592
 
3457
- Py_DECREF(x);
3593
+ Py_DECREF_IMMORTAL(x);
3458
3594
  }
3459
3595
 
3460
3596
  #if PYTHON_VERSION < 0x300
@@ -3512,7 +3648,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_BYTES(PyObject **
3512
3648
  }
3513
3649
  }
3514
3650
 
3515
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: '%s' and 'bytes'", type1->tp_name);
3651
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: '%s' and 'bytes'", type1->tp_name);
3516
3652
  goto exit_inplace_exception;
3517
3653
  }
3518
3654
 
@@ -3541,7 +3677,7 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_BYTES(PyObject **operand1, PyOb
3541
3677
  assert(PyBytes_CheckExact(operand2));
3542
3678
 
3543
3679
  if (Py_REFCNT(*operand1) == 1) {
3544
- // We more or less own the operand, so we might re-use its storage and
3680
+ // We more or less own the operand, so we might reuse its storage and
3545
3681
  // execute stuff in-place.
3546
3682
 
3547
3683
  #if PYTHON_VERSION >= 0x300
@@ -3624,7 +3760,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_BYTES_OBJECT(PyObject **
3624
3760
  goto exit_inplace_result_object;
3625
3761
  }
3626
3762
 
3627
- Py_DECREF(x);
3763
+ Py_DECREF_IMMORTAL(x);
3628
3764
  }
3629
3765
 
3630
3766
  #if PYTHON_VERSION < 0x300
@@ -3703,7 +3839,7 @@ static inline bool _INPLACE_OPERATION_ADD_BYTES_OBJECT(PyObject **operand1, PyOb
3703
3839
  CHECK_OBJECT(operand2);
3704
3840
 
3705
3841
  if (Py_REFCNT(*operand1) == 1) {
3706
- // We more or less own the operand, so we might re-use its storage and
3842
+ // We more or less own the operand, so we might reuse its storage and
3707
3843
  // execute stuff in-place.
3708
3844
 
3709
3845
  #if PYTHON_VERSION >= 0x300
@@ -3777,7 +3913,10 @@ static inline bool _INPLACE_OPERATION_ADD_TUPLE_TUPLE(PyObject **operand1, PyObj
3777
3913
  // Not every code path will make use of all possible results.
3778
3914
  NUITKA_MAY_BE_UNUSED PyObject *obj_result;
3779
3915
 
3780
- PyObject *x = TUPLE_CONCAT(*operand1, operand2);
3916
+ // TODO: Have this more globally passed in
3917
+ PyThreadState *tstate = PyThreadState_GET();
3918
+
3919
+ PyObject *x = TUPLE_CONCAT(tstate, *operand1, operand2);
3781
3920
 
3782
3921
  assert(x != Py_NotImplemented);
3783
3922
  obj_result = x;
@@ -3829,7 +3968,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_TUPLE(PyObject **
3829
3968
  goto exit_inplace_result_object;
3830
3969
  }
3831
3970
 
3832
- Py_DECREF(x);
3971
+ Py_DECREF_IMMORTAL(x);
3833
3972
  }
3834
3973
 
3835
3974
  {
@@ -3844,7 +3983,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_TUPLE(PyObject **
3844
3983
  goto exit_inplace_result_object;
3845
3984
  }
3846
3985
 
3847
- Py_DECREF(x);
3986
+ Py_DECREF_IMMORTAL(x);
3848
3987
  }
3849
3988
 
3850
3989
  #if PYTHON_VERSION < 0x300
@@ -3902,7 +4041,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_TUPLE(PyObject **
3902
4041
  }
3903
4042
  }
3904
4043
 
3905
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: '%s' and 'tuple'", type1->tp_name);
4044
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: '%s' and 'tuple'", type1->tp_name);
3906
4045
  goto exit_inplace_exception;
3907
4046
  }
3908
4047
 
@@ -3938,7 +4077,10 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_TUPLE(PyObject **operand1, PyOb
3938
4077
  // Not every code path will make use of all possible results.
3939
4078
  NUITKA_MAY_BE_UNUSED PyObject *obj_result;
3940
4079
 
3941
- PyObject *x = TUPLE_CONCAT(*operand1, operand2);
4080
+ // TODO: Have this more globally passed in
4081
+ PyThreadState *tstate = PyThreadState_GET();
4082
+
4083
+ PyObject *x = TUPLE_CONCAT(tstate, *operand1, operand2);
3942
4084
 
3943
4085
  assert(x != Py_NotImplemented);
3944
4086
  obj_result = x;
@@ -4001,7 +4143,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_TUPLE_OBJECT(PyObject **
4001
4143
  goto exit_inplace_result_object;
4002
4144
  }
4003
4145
 
4004
- Py_DECREF(x);
4146
+ Py_DECREF_IMMORTAL(x);
4005
4147
  }
4006
4148
 
4007
4149
  #if PYTHON_VERSION < 0x300
@@ -4100,7 +4242,10 @@ static inline bool _INPLACE_OPERATION_ADD_TUPLE_OBJECT(PyObject **operand1, PyOb
4100
4242
  // Not every code path will make use of all possible results.
4101
4243
  NUITKA_MAY_BE_UNUSED PyObject *obj_result;
4102
4244
 
4103
- PyObject *x = TUPLE_CONCAT(*operand1, operand2);
4245
+ // TODO: Have this more globally passed in
4246
+ PyThreadState *tstate = PyThreadState_GET();
4247
+
4248
+ PyObject *x = TUPLE_CONCAT(tstate, *operand1, operand2);
4104
4249
 
4105
4250
  assert(x != Py_NotImplemented);
4106
4251
  obj_result = x;
@@ -4159,7 +4304,10 @@ static inline bool _INPLACE_OPERATION_ADD_LIST_LIST(PyObject **operand1, PyObjec
4159
4304
  // Not every code path will make use of all possible results.
4160
4305
  NUITKA_MAY_BE_UNUSED PyObject *obj_result;
4161
4306
 
4162
- PyObject *x = LIST_CONCAT(*operand1, operand2);
4307
+ // TODO: Have this more globally passed in
4308
+ PyThreadState *tstate = PyThreadState_GET();
4309
+
4310
+ PyObject *x = LIST_CONCAT(tstate, *operand1, operand2);
4163
4311
  assert(x != Py_NotImplemented);
4164
4312
 
4165
4313
  obj_result = x;
@@ -4212,7 +4360,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_LIST(PyObject **o
4212
4360
  goto exit_inplace_result_object;
4213
4361
  }
4214
4362
 
4215
- Py_DECREF(x);
4363
+ Py_DECREF_IMMORTAL(x);
4216
4364
  }
4217
4365
 
4218
4366
  {
@@ -4227,7 +4375,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_LIST(PyObject **o
4227
4375
  goto exit_inplace_result_object;
4228
4376
  }
4229
4377
 
4230
- Py_DECREF(x);
4378
+ Py_DECREF_IMMORTAL(x);
4231
4379
  }
4232
4380
 
4233
4381
  #if PYTHON_VERSION < 0x300
@@ -4285,7 +4433,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_OBJECT_LIST(PyObject **o
4285
4433
  }
4286
4434
  }
4287
4435
 
4288
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: '%s' and 'list'", type1->tp_name);
4436
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: '%s' and 'list'", type1->tp_name);
4289
4437
  goto exit_inplace_exception;
4290
4438
  }
4291
4439
 
@@ -4325,7 +4473,10 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_LIST(PyObject **operand1, PyObj
4325
4473
  // Not every code path will make use of all possible results.
4326
4474
  NUITKA_MAY_BE_UNUSED PyObject *obj_result;
4327
4475
 
4328
- PyObject *x = LIST_CONCAT(*operand1, operand2);
4476
+ // TODO: Have this more globally passed in
4477
+ PyThreadState *tstate = PyThreadState_GET();
4478
+
4479
+ PyObject *x = LIST_CONCAT(tstate, *operand1, operand2);
4329
4480
  assert(x != Py_NotImplemented);
4330
4481
 
4331
4482
  obj_result = x;
@@ -4389,7 +4540,7 @@ static HEDLEY_NEVER_INLINE bool __INPLACE_OPERATION_ADD_LIST_OBJECT(PyObject **o
4389
4540
  goto exit_inplace_result_object;
4390
4541
  }
4391
4542
 
4392
- Py_DECREF(x);
4543
+ Py_DECREF_IMMORTAL(x);
4393
4544
  }
4394
4545
 
4395
4546
  #if PYTHON_VERSION < 0x300
@@ -4497,7 +4648,10 @@ static inline bool _INPLACE_OPERATION_ADD_LIST_OBJECT(PyObject **operand1, PyObj
4497
4648
  // Not every code path will make use of all possible results.
4498
4649
  NUITKA_MAY_BE_UNUSED PyObject *obj_result;
4499
4650
 
4500
- PyObject *x = LIST_CONCAT(*operand1, operand2);
4651
+ // TODO: Have this more globally passed in
4652
+ PyThreadState *tstate = PyThreadState_GET();
4653
+
4654
+ PyObject *x = LIST_CONCAT(tstate, *operand1, operand2);
4501
4655
  assert(x != Py_NotImplemented);
4502
4656
 
4503
4657
  obj_result = x;
@@ -4675,6 +4829,7 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_OBJECT(PyObject **operand1, PyO
4675
4829
  clong_result = x;
4676
4830
  goto exit_result_ok_clong;
4677
4831
  }
4832
+
4678
4833
  {
4679
4834
  PyObject *operand1_object = *operand1;
4680
4835
  PyObject *operand2_object = operand2;
@@ -4693,7 +4848,7 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_OBJECT(PyObject **operand1, PyO
4693
4848
 
4694
4849
  // That's our return value then. As we use a dedicated variable, it's
4695
4850
  // OK that way.
4696
- *operand1 = PyInt_FromLong(clong_result);
4851
+ *operand1 = Nuitka_PyInt_FromLong(clong_result);
4697
4852
  goto exit_result_ok;
4698
4853
 
4699
4854
  exit_result_object:
@@ -4715,7 +4870,7 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_OBJECT(PyObject **operand1, PyO
4715
4870
  #endif
4716
4871
 
4717
4872
  if (Py_REFCNT(*operand1) == 1) {
4718
- // We more or less own the operand, so we might re-use its storage and
4873
+ // We more or less own the operand, so we might reuse its storage and
4719
4874
  // execute stuff in-place.
4720
4875
  #if PYTHON_VERSION < 0x300
4721
4876
  if (PyString_CheckExact(*operand1) && !PyString_CHECK_INTERNED(*operand1) && PyString_CheckExact(operand2)) {
@@ -4798,7 +4953,7 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_OBJECT(PyObject **operand1, PyO
4798
4953
  goto exit_inplace_result_object;
4799
4954
  }
4800
4955
 
4801
- Py_DECREF(x);
4956
+ Py_DECREF_IMMORTAL(x);
4802
4957
  }
4803
4958
 
4804
4959
  {
@@ -4826,7 +4981,7 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_OBJECT(PyObject **operand1, PyO
4826
4981
  goto exit_inplace_result_object;
4827
4982
  }
4828
4983
 
4829
- Py_DECREF(x);
4984
+ Py_DECREF_IMMORTAL(x);
4830
4985
  slot2 = NULL;
4831
4986
  }
4832
4987
  }
@@ -4838,7 +4993,7 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_OBJECT(PyObject **operand1, PyO
4838
4993
  goto exit_inplace_result_object;
4839
4994
  }
4840
4995
 
4841
- Py_DECREF(x);
4996
+ Py_DECREF_IMMORTAL(x);
4842
4997
  }
4843
4998
 
4844
4999
  if (slot2 != NULL) {
@@ -4849,7 +5004,7 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_OBJECT(PyObject **operand1, PyO
4849
5004
  goto exit_inplace_result_object;
4850
5005
  }
4851
5006
 
4852
- Py_DECREF(x);
5007
+ Py_DECREF_IMMORTAL(x);
4853
5008
  }
4854
5009
 
4855
5010
  #if PYTHON_VERSION < 0x300
@@ -4942,7 +5097,7 @@ static inline bool _INPLACE_OPERATION_ADD_OBJECT_OBJECT(PyObject **operand1, PyO
4942
5097
  }
4943
5098
  }
4944
5099
 
4945
- PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +: '%s' and '%s'", type1->tp_name,
5100
+ PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for +=: '%s' and '%s'", type1->tp_name,
4946
5101
  type2->tp_name);
4947
5102
  goto exit_inplace_exception;
4948
5103
  }
@@ -5039,3 +5194,18 @@ exit_inplace_result_object:
5039
5194
  bool INPLACE_OPERATION_ADD_LIST_TUPLE(PyObject **operand1, PyObject *operand2) {
5040
5195
  return _INPLACE_OPERATION_ADD_LIST_TUPLE(operand1, operand2);
5041
5196
  }
5197
+
5198
+ // Part of "Nuitka", an optimizing Python compiler that is compatible and
5199
+ // integrates with CPython, but also works on its own.
5200
+ //
5201
+ // Licensed under the Apache License, Version 2.0 (the "License");
5202
+ // you may not use this file except in compliance with the License.
5203
+ // You may obtain a copy of the License at
5204
+ //
5205
+ // http://www.apache.org/licenses/LICENSE-2.0
5206
+ //
5207
+ // Unless required by applicable law or agreed to in writing, software
5208
+ // distributed under the License is distributed on an "AS IS" BASIS,
5209
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5210
+ // See the License for the specific language governing permissions and
5211
+ // limitations under the License.