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

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

Potentially problematic release.


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

Files changed (704) hide show
  1. Nuitka_winsvc-1.8.data/scripts/nuitka-run.bat → Nuitka_winsvc-2.4.8.data/scripts/nuitka-run.cmd +9 -9
  2. Nuitka_winsvc-1.8.data/scripts/nuitka.bat → Nuitka_winsvc-2.4.8.data/scripts/nuitka.cmd +15 -15
  3. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/METADATA +4 -3
  4. Nuitka_winsvc-2.4.8.dist-info/RECORD +954 -0
  5. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/WHEEL +1 -1
  6. nuitka/Builtins.py +18 -17
  7. nuitka/BytecodeCaching.py +24 -20
  8. nuitka/Bytecodes.py +23 -19
  9. nuitka/CacheCleanup.py +28 -23
  10. nuitka/Constants.py +19 -17
  11. nuitka/Errors.py +23 -17
  12. nuitka/HardImportRegistry.py +400 -0
  13. nuitka/MainControl.py +200 -112
  14. nuitka/ModuleRegistry.py +83 -20
  15. nuitka/OptionParsing.py +368 -175
  16. nuitka/Options.py +632 -213
  17. nuitka/OutputDirectories.py +40 -21
  18. nuitka/PostProcessing.py +73 -50
  19. nuitka/Progress.py +58 -24
  20. nuitka/PythonFlavors.py +141 -32
  21. nuitka/PythonOperators.py +18 -17
  22. nuitka/PythonVersions.py +106 -19
  23. nuitka/Serialization.py +68 -55
  24. nuitka/SourceCodeReferences.py +19 -17
  25. nuitka/Tracing.py +108 -70
  26. nuitka/TreeXML.py +31 -26
  27. nuitka/Variables.py +39 -41
  28. nuitka/Version.py +21 -7
  29. nuitka/__init__.py +5 -4
  30. nuitka/__main__.py +95 -29
  31. nuitka/__past__.py +44 -34
  32. nuitka/build/Backend.scons +202 -140
  33. nuitka/build/CCompilerVersion.scons +39 -31
  34. nuitka/build/DataComposerInterface.py +20 -17
  35. nuitka/build/Onefile.scons +50 -54
  36. nuitka/build/SconsCaching.py +93 -90
  37. nuitka/build/SconsCompilerSettings.py +157 -69
  38. nuitka/build/SconsHacks.py +25 -19
  39. nuitka/build/SconsInterface.py +154 -54
  40. nuitka/build/SconsProgress.py +19 -18
  41. nuitka/build/SconsSpawn.py +62 -33
  42. nuitka/build/SconsUtils.py +147 -55
  43. nuitka/build/__init__.py +5 -4
  44. nuitka/build/include/nuitka/allocator.h +105 -22
  45. nuitka/build/include/nuitka/builtins.h +17 -17
  46. nuitka/build/include/nuitka/calling.h +18 -18
  47. nuitka/build/include/nuitka/checkers.h +17 -18
  48. nuitka/build/include/nuitka/checksum_tools.h +14 -19
  49. nuitka/build/include/nuitka/compiled_asyncgen.h +18 -18
  50. nuitka/build/include/nuitka/compiled_cell.h +33 -18
  51. nuitka/build/include/nuitka/compiled_coroutine.h +18 -18
  52. nuitka/build/include/nuitka/compiled_frame.h +91 -53
  53. nuitka/build/include/nuitka/compiled_function.h +42 -20
  54. nuitka/build/include/nuitka/compiled_generator.h +24 -18
  55. nuitka/build/include/nuitka/compiled_method.h +17 -18
  56. nuitka/build/include/nuitka/constants.h +29 -18
  57. nuitka/build/include/nuitka/constants_blob.h +17 -17
  58. nuitka/build/include/nuitka/environment_variables.h +30 -0
  59. nuitka/build/include/nuitka/environment_variables_system.h +45 -0
  60. nuitka/build/include/nuitka/exception_groups.h +23 -26
  61. nuitka/build/include/nuitka/exceptions.h +593 -190
  62. nuitka/build/include/nuitka/filesystem_paths.h +26 -20
  63. nuitka/build/include/nuitka/freelists.h +38 -18
  64. nuitka/build/include/nuitka/helper/attributes.h +24 -18
  65. nuitka/build/include/nuitka/helper/boolean.h +17 -17
  66. nuitka/build/include/nuitka/helper/bytearrays.h +17 -17
  67. nuitka/build/include/nuitka/helper/bytes.h +14 -15
  68. nuitka/build/include/nuitka/helper/calling_generated.h +17 -17
  69. nuitka/build/include/nuitka/helper/comparisons_eq.h +17 -17
  70. nuitka/build/include/nuitka/helper/comparisons_ge.h +17 -17
  71. nuitka/build/include/nuitka/helper/comparisons_gt.h +17 -17
  72. nuitka/build/include/nuitka/helper/comparisons_le.h +17 -17
  73. nuitka/build/include/nuitka/helper/comparisons_lt.h +17 -17
  74. nuitka/build/include/nuitka/helper/comparisons_ne.h +17 -17
  75. nuitka/build/include/nuitka/helper/complex.h +17 -17
  76. nuitka/build/include/nuitka/helper/dictionaries.h +24 -22
  77. nuitka/build/include/nuitka/helper/floats.h +17 -18
  78. nuitka/build/include/nuitka/helper/import_hard.h +25 -17
  79. nuitka/build/include/nuitka/helper/indexes.h +17 -18
  80. nuitka/build/include/nuitka/helper/ints.h +32 -20
  81. nuitka/build/include/nuitka/helper/iterators.h +17 -17
  82. nuitka/build/include/nuitka/helper/lists.h +26 -24
  83. nuitka/build/include/nuitka/helper/lists_generated.h +22 -22
  84. nuitka/build/include/nuitka/helper/mappings.h +17 -18
  85. nuitka/build/include/nuitka/helper/operations.h +17 -17
  86. nuitka/build/include/nuitka/helper/operations_binary_add.h +17 -17
  87. nuitka/build/include/nuitka/helper/operations_binary_bitand.h +17 -17
  88. nuitka/build/include/nuitka/helper/operations_binary_bitor.h +17 -17
  89. nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +17 -17
  90. nuitka/build/include/nuitka/helper/operations_binary_divmod.h +17 -17
  91. nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +17 -17
  92. nuitka/build/include/nuitka/helper/operations_binary_lshift.h +17 -17
  93. nuitka/build/include/nuitka/helper/operations_binary_matmult.h +17 -17
  94. nuitka/build/include/nuitka/helper/operations_binary_mod.h +17 -17
  95. nuitka/build/include/nuitka/helper/operations_binary_mult.h +17 -17
  96. nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +17 -17
  97. nuitka/build/include/nuitka/helper/operations_binary_pow.h +17 -17
  98. nuitka/build/include/nuitka/helper/operations_binary_rshift.h +17 -17
  99. nuitka/build/include/nuitka/helper/operations_binary_sub.h +17 -17
  100. nuitka/build/include/nuitka/helper/operations_binary_truediv.h +17 -17
  101. nuitka/build/include/nuitka/helper/operations_builtin_types.h +17 -17
  102. nuitka/build/include/nuitka/helper/operations_inplace_add.h +17 -17
  103. nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +17 -17
  104. nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +17 -17
  105. nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +17 -17
  106. nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +17 -17
  107. nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +17 -17
  108. nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +17 -17
  109. nuitka/build/include/nuitka/helper/operations_inplace_mod.h +17 -17
  110. nuitka/build/include/nuitka/helper/operations_inplace_mult.h +17 -17
  111. nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +17 -17
  112. nuitka/build/include/nuitka/helper/operations_inplace_pow.h +17 -17
  113. nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +17 -17
  114. nuitka/build/include/nuitka/helper/operations_inplace_sub.h +17 -17
  115. nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +17 -17
  116. nuitka/build/include/nuitka/helper/raising.h +29 -17
  117. nuitka/build/include/nuitka/helper/rangeobjects.h +17 -17
  118. nuitka/build/include/nuitka/helper/richcomparisons.h +14 -14
  119. nuitka/build/include/nuitka/helper/sequences.h +19 -13
  120. nuitka/build/include/nuitka/helper/sets.h +11 -12
  121. nuitka/build/include/nuitka/helper/slices.h +31 -25
  122. nuitka/build/include/nuitka/helper/strings.h +16 -17
  123. nuitka/build/include/nuitka/helper/subscripts.h +18 -201
  124. nuitka/build/include/nuitka/helper/tuples.h +64 -52
  125. nuitka/build/include/nuitka/helpers.h +38 -20
  126. nuitka/build/include/nuitka/importing.h +28 -21
  127. nuitka/build/include/nuitka/jit_sources.h +25 -0
  128. nuitka/build/include/nuitka/prelude.h +128 -46
  129. nuitka/build/include/nuitka/printing.h +22 -17
  130. nuitka/build/include/nuitka/python_pgo.h +19 -18
  131. nuitka/build/include/nuitka/safe_string_ops.h +20 -18
  132. nuitka/build/include/nuitka/threading.h +32 -33
  133. nuitka/build/include/nuitka/tracing.h +28 -18
  134. nuitka/build/include/nuitka/type_aliases.h +27 -0
  135. nuitka/build/include/nuitka/unfreezing.h +29 -23
  136. nuitka/build/inline_copy/bin/scons.py +14 -0
  137. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +6 -6
  138. nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +0 -3
  139. nuitka/build/inline_copy/python_hacl/LICENSE.txt +201 -0
  140. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.c +1430 -0
  141. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.h +66 -0
  142. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.c +463 -0
  143. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.h +66 -0
  144. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.c +1273 -0
  145. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.h +204 -0
  146. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.c +734 -0
  147. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.h +131 -0
  148. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Streaming_Types.h +83 -0
  149. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt128_Verified.h +346 -0
  150. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt_8_16_32_64.h +107 -0
  151. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/fstar_uint128_struct_endianness.h +68 -0
  152. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/internal/target.h +293 -0
  153. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/lowstar_endianness.h +231 -0
  154. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/types.h +14 -0
  155. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_MD5.h +56 -0
  156. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA1.h +56 -0
  157. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA2.h +164 -0
  158. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA3.h +65 -0
  159. nuitka/build/inline_copy/python_hacl/hacl_312/python_hacl_namespaces.h +89 -0
  160. nuitka/build/inline_copy/tqdm/tqdm/__init__.py +2 -2
  161. nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +4 -1
  162. nuitka/build/inline_copy/tqdm/tqdm/utils.py +14 -8
  163. nuitka/build/inline_copy/tqdm/tqdm/version.py +1 -8
  164. nuitka/build/inline_copy/zlib/LICENSE +22 -0
  165. nuitka/build/inline_copy/zlib/crc32.c +1049 -0
  166. nuitka/build/inline_copy/zlib/crc32.h +9446 -0
  167. nuitka/build/inline_copy/zlib/zconf.h +551 -0
  168. nuitka/build/inline_copy/zlib/zlib.h +1938 -0
  169. nuitka/build/inline_copy/zlib/zutil.h +275 -0
  170. nuitka/build/static_src/CompiledAsyncgenType.c +176 -182
  171. nuitka/build/static_src/CompiledCellType.c +63 -40
  172. nuitka/build/static_src/CompiledCodeHelpers.c +181 -128
  173. nuitka/build/static_src/CompiledCoroutineType.c +196 -203
  174. nuitka/build/static_src/CompiledFrameType.c +287 -133
  175. nuitka/build/static_src/CompiledFunctionType.c +389 -95
  176. nuitka/build/static_src/CompiledGeneratorType.c +376 -252
  177. nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +185 -198
  178. nuitka/build/static_src/CompiledMethodType.c +83 -71
  179. nuitka/build/static_src/HelpersAllocator.c +88 -19
  180. nuitka/build/static_src/HelpersAttributes.c +33 -54
  181. nuitka/build/static_src/HelpersBuiltin.c +43 -33
  182. nuitka/build/static_src/HelpersBuiltinTypeMethods.c +17 -17
  183. nuitka/build/static_src/HelpersBytes.c +19 -20
  184. nuitka/build/static_src/HelpersCalling.c +33 -30
  185. nuitka/build/static_src/HelpersCallingGenerated.c +1000 -181
  186. nuitka/build/static_src/HelpersChecksumTools.c +35 -21
  187. nuitka/build/static_src/HelpersClasses.c +17 -17
  188. nuitka/build/static_src/HelpersComparisonEq.c +518 -492
  189. nuitka/build/static_src/HelpersComparisonEqUtils.c +21 -19
  190. nuitka/build/static_src/HelpersComparisonGe.c +513 -497
  191. nuitka/build/static_src/HelpersComparisonGt.c +512 -496
  192. nuitka/build/static_src/HelpersComparisonLe.c +513 -497
  193. nuitka/build/static_src/HelpersComparisonLt.c +512 -496
  194. nuitka/build/static_src/HelpersComparisonNe.c +520 -492
  195. nuitka/build/static_src/HelpersConsole.c +96 -0
  196. nuitka/build/static_src/HelpersConstantsBlob.c +542 -519
  197. nuitka/build/static_src/HelpersDeepcopy.c +33 -33
  198. nuitka/build/static_src/HelpersDictionaries.c +51 -29
  199. nuitka/build/static_src/HelpersDictionariesGenerated.c +177 -68
  200. nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
  201. nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
  202. nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +93 -0
  203. nuitka/build/static_src/HelpersExceptions.c +161 -50
  204. nuitka/build/static_src/HelpersFiles.c +37 -17
  205. nuitka/build/static_src/HelpersFilesystemPaths.c +292 -181
  206. nuitka/build/static_src/HelpersFloats.c +37 -31
  207. nuitka/build/static_src/HelpersHeapStorage.c +21 -17
  208. nuitka/build/static_src/HelpersImport.c +48 -20
  209. nuitka/build/static_src/HelpersImportHard.c +53 -17
  210. nuitka/build/static_src/HelpersJitSources.c +46 -0
  211. nuitka/build/static_src/HelpersLists.c +140 -50
  212. nuitka/build/static_src/HelpersListsGenerated.c +41 -41
  213. nuitka/build/static_src/HelpersMappings.c +17 -17
  214. nuitka/build/static_src/HelpersMatching.c +137 -51
  215. nuitka/build/static_src/HelpersOperationBinaryAdd.c +173 -146
  216. nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +99 -52
  217. nuitka/build/static_src/HelpersOperationBinaryBitand.c +50 -50
  218. nuitka/build/static_src/HelpersOperationBinaryBitor.c +50 -50
  219. nuitka/build/static_src/HelpersOperationBinaryBitxor.c +50 -50
  220. nuitka/build/static_src/HelpersOperationBinaryDivmod.c +41 -41
  221. nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +17 -17
  222. nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +41 -41
  223. nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +20 -21
  224. nuitka/build/static_src/HelpersOperationBinaryLshift.c +47 -47
  225. nuitka/build/static_src/HelpersOperationBinaryMatmult.c +24 -24
  226. nuitka/build/static_src/HelpersOperationBinaryMod.c +107 -107
  227. nuitka/build/static_src/HelpersOperationBinaryMult.c +81 -75
  228. nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +33 -30
  229. nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +41 -41
  230. nuitka/build/static_src/HelpersOperationBinaryPow.c +44 -44
  231. nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +12 -12
  232. nuitka/build/static_src/HelpersOperationBinaryRshift.c +47 -47
  233. nuitka/build/static_src/HelpersOperationBinarySub.c +80 -80
  234. nuitka/build/static_src/HelpersOperationBinaryTruediv.c +41 -41
  235. nuitka/build/static_src/HelpersOperationInplaceAdd.c +171 -153
  236. nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +24 -22
  237. nuitka/build/static_src/HelpersOperationInplaceBitand.c +53 -53
  238. nuitka/build/static_src/HelpersOperationInplaceBitor.c +53 -53
  239. nuitka/build/static_src/HelpersOperationInplaceBitxor.c +53 -53
  240. nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +62 -62
  241. nuitka/build/static_src/HelpersOperationInplaceLshift.c +44 -44
  242. nuitka/build/static_src/HelpersOperationInplaceMatmult.c +37 -37
  243. nuitka/build/static_src/HelpersOperationInplaceMod.c +134 -134
  244. nuitka/build/static_src/HelpersOperationInplaceMult.c +78 -78
  245. nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +62 -62
  246. nuitka/build/static_src/HelpersOperationInplacePow.c +62 -62
  247. nuitka/build/static_src/HelpersOperationInplaceRshift.c +44 -44
  248. nuitka/build/static_src/HelpersOperationInplaceSub.c +112 -112
  249. nuitka/build/static_src/HelpersOperationInplaceTruediv.c +62 -62
  250. nuitka/build/static_src/HelpersProfiling.c +24 -23
  251. nuitka/build/static_src/HelpersPythonPgo.c +22 -22
  252. nuitka/build/static_src/HelpersRaising.c +88 -20
  253. nuitka/build/static_src/HelpersSafeStrings.c +34 -22
  254. nuitka/build/static_src/HelpersSequences.c +18 -19
  255. nuitka/build/static_src/HelpersSlices.c +29 -23
  256. nuitka/build/static_src/HelpersStrings.c +234 -37
  257. nuitka/build/static_src/HelpersTuples.c +46 -34
  258. nuitka/build/static_src/HelpersTypes.c +68 -23
  259. nuitka/build/static_src/InspectPatcher.c +108 -27
  260. nuitka/build/static_src/MainProgram.c +359 -263
  261. nuitka/build/static_src/MetaPathBasedLoader.c +367 -242
  262. nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +39 -26
  263. nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +17 -18
  264. nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +97 -22
  265. nuitka/build/static_src/OnefileBootstrap.c +276 -164
  266. nuitka/build/static_src/OnefileSplashScreen.cpp +51 -27
  267. nuitka/code_generation/AsyncgenCodes.py +19 -17
  268. nuitka/code_generation/AttributeCodes.py +31 -27
  269. nuitka/code_generation/BinaryOperationHelperDefinitions.py +24 -20
  270. nuitka/code_generation/BranchCodes.py +19 -17
  271. nuitka/code_generation/BuiltinCodes.py +20 -17
  272. nuitka/code_generation/CallCodes.py +19 -17
  273. nuitka/code_generation/ClassCodes.py +19 -17
  274. nuitka/code_generation/CodeGeneration.py +48 -27
  275. nuitka/code_generation/CodeHelperSelection.py +19 -17
  276. nuitka/code_generation/CodeHelpers.py +24 -20
  277. nuitka/code_generation/CodeObjectCodes.py +34 -24
  278. nuitka/code_generation/ComparisonCodes.py +38 -20
  279. nuitka/code_generation/ComparisonHelperDefinitions.py +19 -17
  280. nuitka/code_generation/ConditionalCodes.py +19 -17
  281. nuitka/code_generation/ConstantCodes.py +82 -28
  282. nuitka/code_generation/Contexts.py +152 -26
  283. nuitka/code_generation/CoroutineCodes.py +19 -17
  284. nuitka/code_generation/CtypesCodes.py +19 -17
  285. nuitka/code_generation/DictCodes.py +25 -23
  286. nuitka/code_generation/Emission.py +21 -18
  287. nuitka/code_generation/ErrorCodes.py +27 -33
  288. nuitka/code_generation/EvalCodes.py +24 -20
  289. nuitka/code_generation/ExceptionCodes.py +27 -18
  290. nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +20 -17
  291. nuitka/code_generation/ExpressionCodes.py +19 -17
  292. nuitka/code_generation/FrameCodes.py +24 -20
  293. nuitka/code_generation/FunctionCodes.py +24 -21
  294. nuitka/code_generation/GeneratorCodes.py +23 -20
  295. nuitka/code_generation/GlobalConstants.py +43 -23
  296. nuitka/code_generation/GlobalsLocalsCodes.py +21 -19
  297. nuitka/code_generation/IdCodes.py +19 -17
  298. nuitka/code_generation/ImportCodes.py +90 -50
  299. nuitka/code_generation/Indentation.py +23 -22
  300. nuitka/code_generation/IndexCodes.py +19 -17
  301. nuitka/code_generation/InjectCCodes.py +14 -12
  302. nuitka/code_generation/IntegerCodes.py +19 -17
  303. nuitka/code_generation/IteratorCodes.py +19 -17
  304. nuitka/code_generation/JitCodes.py +44 -0
  305. nuitka/code_generation/LabelCodes.py +19 -17
  306. nuitka/code_generation/LineNumberCodes.py +19 -17
  307. nuitka/code_generation/ListCodes.py +32 -36
  308. nuitka/code_generation/LoaderCodes.py +22 -17
  309. nuitka/code_generation/LocalsDictCodes.py +56 -32
  310. nuitka/code_generation/LoopCodes.py +19 -17
  311. nuitka/code_generation/MatchCodes.py +42 -22
  312. nuitka/code_generation/ModuleCodes.py +43 -25
  313. nuitka/code_generation/Namify.py +27 -23
  314. nuitka/code_generation/NetworkxCodes.py +51 -0
  315. nuitka/code_generation/OperationCodes.py +29 -31
  316. nuitka/code_generation/PackageResourceCodes.py +59 -23
  317. nuitka/code_generation/PrintCodes.py +19 -17
  318. nuitka/code_generation/PythonAPICodes.py +19 -17
  319. nuitka/code_generation/RaisingCodes.py +19 -17
  320. nuitka/code_generation/Reports.py +19 -17
  321. nuitka/code_generation/ReturnCodes.py +19 -17
  322. nuitka/code_generation/SetCodes.py +19 -17
  323. nuitka/code_generation/SliceCodes.py +22 -20
  324. nuitka/code_generation/StringCodes.py +19 -17
  325. nuitka/code_generation/SubscriptCodes.py +24 -30
  326. nuitka/code_generation/TensorflowCodes.py +54 -0
  327. nuitka/code_generation/TryCodes.py +19 -17
  328. nuitka/code_generation/TupleCodes.py +20 -18
  329. nuitka/code_generation/TypeAliasCodes.py +71 -0
  330. nuitka/code_generation/VariableCodes.py +26 -22
  331. nuitka/code_generation/VariableDeclarations.py +20 -17
  332. nuitka/code_generation/YieldCodes.py +22 -20
  333. nuitka/code_generation/__init__.py +5 -4
  334. nuitka/code_generation/c_types/CTypeBases.py +19 -17
  335. nuitka/code_generation/c_types/CTypeBooleans.py +19 -17
  336. nuitka/code_generation/c_types/CTypeCFloats.py +19 -17
  337. nuitka/code_generation/c_types/CTypeCLongs.py +19 -18
  338. nuitka/code_generation/c_types/CTypeModuleDictVariables.py +19 -17
  339. nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +19 -17
  340. nuitka/code_generation/c_types/CTypeNuitkaInts.py +19 -18
  341. nuitka/code_generation/c_types/CTypeNuitkaVoids.py +19 -17
  342. nuitka/code_generation/c_types/CTypePyObjectPointers.py +27 -25
  343. nuitka/code_generation/c_types/CTypeVoids.py +20 -17
  344. nuitka/code_generation/c_types/__init__.py +5 -4
  345. nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +18 -17
  346. nuitka/code_generation/templates/CodeTemplatesConstants.py +132 -36
  347. nuitka/code_generation/templates/CodeTemplatesCoroutines.py +18 -17
  348. nuitka/code_generation/templates/CodeTemplatesExceptions.py +19 -18
  349. nuitka/code_generation/templates/CodeTemplatesFrames.py +18 -17
  350. nuitka/code_generation/templates/CodeTemplatesFunction.py +18 -17
  351. nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +19 -17
  352. nuitka/code_generation/templates/CodeTemplatesIterators.py +18 -18
  353. nuitka/code_generation/templates/CodeTemplatesLoader.py +25 -19
  354. nuitka/code_generation/templates/CodeTemplatesModules.py +244 -165
  355. nuitka/code_generation/templates/CodeTemplatesVariables.py +42 -27
  356. nuitka/code_generation/templates/TemplateDebugWrapper.py +19 -18
  357. nuitka/code_generation/templates/__init__.py +5 -4
  358. nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +19 -19
  359. nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +18 -18
  360. nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +76 -25
  361. nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +22 -22
  362. nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +19 -19
  363. nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +19 -19
  364. nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +17 -17
  365. nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +121 -48
  366. nuitka/code_generation/templates_c/HelperImportHard.c.j2 +18 -18
  367. nuitka/code_generation/templates_c/HelperLongTools.c.j2 +18 -18
  368. nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +6 -6
  369. nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +23 -23
  370. nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +35 -35
  371. nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +28 -28
  372. nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +17 -17
  373. nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +18 -18
  374. nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +44 -32
  375. nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +20 -20
  376. nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +28 -28
  377. nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +24 -24
  378. nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +33 -29
  379. nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +20 -20
  380. nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +27 -27
  381. nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +17 -17
  382. nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +17 -17
  383. nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +17 -17
  384. nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +17 -17
  385. nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +21 -18
  386. nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +26 -24
  387. nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +17 -17
  388. nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +17 -17
  389. nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +21 -18
  390. nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +17 -17
  391. nuitka/containers/Namedtuples.py +19 -18
  392. nuitka/containers/OrderedSetsFallback.py +19 -17
  393. nuitka/containers/__init__.py +5 -4
  394. nuitka/distutils/Build.py +19 -18
  395. nuitka/distutils/DistutilCommands.py +34 -23
  396. nuitka/distutils/__init__.py +5 -4
  397. nuitka/finalizations/Finalization.py +20 -17
  398. nuitka/finalizations/FinalizeMarkups.py +21 -41
  399. nuitka/finalizations/__init__.py +5 -4
  400. nuitka/freezer/DependsExe.py +48 -28
  401. nuitka/freezer/DllDependenciesCommon.py +47 -20
  402. nuitka/freezer/DllDependenciesMacOS.py +147 -57
  403. nuitka/freezer/DllDependenciesPosix.py +29 -19
  404. nuitka/freezer/DllDependenciesWin32.py +29 -21
  405. nuitka/freezer/ImportDetection.py +20 -17
  406. nuitka/freezer/IncludedDataFiles.py +118 -47
  407. nuitka/freezer/IncludedEntryPoints.py +102 -38
  408. nuitka/freezer/Onefile.py +32 -22
  409. nuitka/freezer/Standalone.py +105 -50
  410. nuitka/freezer/__init__.py +5 -4
  411. nuitka/importing/IgnoreListing.py +19 -17
  412. nuitka/importing/ImportCache.py +24 -21
  413. nuitka/importing/ImportResolving.py +103 -95
  414. nuitka/importing/Importing.py +286 -92
  415. nuitka/importing/PreloadedPackages.py +21 -18
  416. nuitka/importing/Recursion.py +131 -47
  417. nuitka/importing/StandardLibrary.py +46 -28
  418. nuitka/importing/__init__.py +5 -4
  419. nuitka/nodes/AsyncgenNodes.py +19 -17
  420. nuitka/nodes/AttributeLookupNodes.py +19 -17
  421. nuitka/nodes/AttributeNodes.py +19 -17
  422. nuitka/nodes/AttributeNodesGenerated.py +49 -24
  423. nuitka/nodes/BuiltinAllNodes.py +19 -17
  424. nuitka/nodes/BuiltinAnyNodes.py +19 -17
  425. nuitka/nodes/BuiltinComplexNodes.py +20 -17
  426. nuitka/nodes/BuiltinDecodingNodes.py +19 -17
  427. nuitka/nodes/BuiltinDecoratorNodes.py +19 -17
  428. nuitka/nodes/BuiltinDictNodes.py +19 -17
  429. nuitka/nodes/BuiltinFormatNodes.py +20 -17
  430. nuitka/nodes/BuiltinHashNodes.py +19 -17
  431. nuitka/nodes/BuiltinInputNodes.py +19 -17
  432. nuitka/nodes/BuiltinIntegerNodes.py +19 -17
  433. nuitka/nodes/BuiltinIteratorNodes.py +24 -20
  434. nuitka/nodes/BuiltinLenNodes.py +19 -17
  435. nuitka/nodes/BuiltinNextNodes.py +19 -17
  436. nuitka/nodes/BuiltinOpenNodes.py +52 -18
  437. nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +40 -23
  438. nuitka/nodes/BuiltinRangeNodes.py +21 -19
  439. nuitka/nodes/BuiltinRefNodes.py +68 -19
  440. nuitka/nodes/BuiltinSumNodes.py +20 -18
  441. nuitka/nodes/BuiltinTypeNodes.py +19 -17
  442. nuitka/nodes/BuiltinVarsNodes.py +19 -18
  443. nuitka/nodes/BytesNodes.py +19 -17
  444. nuitka/nodes/CallNodes.py +19 -17
  445. nuitka/nodes/Checkers.py +19 -17
  446. nuitka/nodes/ChildrenHavingMixins.py +1250 -302
  447. nuitka/nodes/ClassNodes.py +49 -29
  448. nuitka/nodes/CodeObjectSpecs.py +29 -18
  449. nuitka/nodes/ComparisonNodes.py +19 -17
  450. nuitka/nodes/ConditionalNodes.py +21 -23
  451. nuitka/nodes/ConstantRefNodes.py +57 -17
  452. nuitka/nodes/ContainerMakingNodes.py +19 -17
  453. nuitka/nodes/ContainerOperationNodes.py +19 -17
  454. nuitka/nodes/CoroutineNodes.py +19 -17
  455. nuitka/nodes/CtypesNodes.py +19 -18
  456. nuitka/nodes/DictionaryNodes.py +19 -18
  457. nuitka/nodes/ExceptionNodes.py +29 -17
  458. nuitka/nodes/ExecEvalNodes.py +19 -17
  459. nuitka/nodes/ExpressionBases.py +34 -26
  460. nuitka/nodes/ExpressionBasesGenerated.py +54 -32
  461. nuitka/nodes/ExpressionShapeMixins.py +19 -17
  462. nuitka/nodes/FrameNodes.py +19 -17
  463. nuitka/nodes/FunctionAttributeNodes.py +19 -17
  464. nuitka/nodes/FunctionNodes.py +81 -35
  465. nuitka/nodes/FutureSpecs.py +35 -20
  466. nuitka/nodes/GeneratorNodes.py +21 -19
  467. nuitka/nodes/GlobalsLocalsNodes.py +22 -17
  468. nuitka/nodes/HardImportNodesGenerated.py +545 -129
  469. nuitka/nodes/ImportHardNodes.py +46 -38
  470. nuitka/nodes/ImportNodes.py +436 -446
  471. nuitka/nodes/IndicatorMixins.py +19 -17
  472. nuitka/nodes/InjectCNodes.py +19 -18
  473. nuitka/nodes/IterationHandles.py +55 -34
  474. nuitka/nodes/KeyValuePairNodes.py +19 -17
  475. nuitka/nodes/ListOperationNodes.py +33 -21
  476. nuitka/nodes/LocalsDictNodes.py +19 -17
  477. nuitka/nodes/LocalsScopes.py +41 -41
  478. nuitka/nodes/LoopNodes.py +28 -17
  479. nuitka/nodes/MatchNodes.py +37 -24
  480. nuitka/nodes/ModuleAttributeNodes.py +18 -35
  481. nuitka/nodes/ModuleNodes.py +90 -31
  482. nuitka/nodes/NetworkxNodes.py +45 -0
  483. nuitka/nodes/NodeBases.py +45 -43
  484. nuitka/nodes/NodeMakingHelpers.py +21 -19
  485. nuitka/nodes/NodeMetaClasses.py +45 -28
  486. nuitka/nodes/OperatorNodes.py +28 -26
  487. nuitka/nodes/OperatorNodesUnary.py +20 -17
  488. nuitka/nodes/OsSysNodes.py +66 -18
  489. nuitka/nodes/OutlineNodes.py +22 -20
  490. nuitka/nodes/PackageMetadataNodes.py +37 -27
  491. nuitka/nodes/PackageResourceNodes.py +29 -23
  492. nuitka/nodes/PrintNodes.py +19 -17
  493. nuitka/nodes/ReturnNodes.py +20 -18
  494. nuitka/nodes/SideEffectNodes.py +19 -17
  495. nuitka/nodes/SliceNodes.py +20 -18
  496. nuitka/nodes/StatementBasesGenerated.py +125 -77
  497. nuitka/nodes/StatementNodes.py +19 -17
  498. nuitka/nodes/StrNodes.py +19 -17
  499. nuitka/nodes/StringConcatenationNodes.py +20 -17
  500. nuitka/nodes/SubscriptNodes.py +26 -24
  501. nuitka/nodes/TensorflowNodes.py +38 -0
  502. nuitka/nodes/TryNodes.py +19 -17
  503. nuitka/nodes/TypeMatchNodes.py +19 -17
  504. nuitka/nodes/TypeNodes.py +40 -17
  505. nuitka/nodes/VariableAssignNodes.py +122 -64
  506. nuitka/nodes/VariableDelNodes.py +19 -17
  507. nuitka/nodes/VariableNameNodes.py +19 -17
  508. nuitka/nodes/VariableRefNodes.py +63 -26
  509. nuitka/nodes/VariableReleaseNodes.py +19 -17
  510. nuitka/nodes/YieldNodes.py +21 -19
  511. nuitka/nodes/__init__.py +5 -4
  512. nuitka/nodes/shapes/BuiltinTypeShapes.py +145 -39
  513. nuitka/nodes/shapes/ControlFlowDescriptions.py +19 -17
  514. nuitka/nodes/shapes/ShapeMixins.py +40 -17
  515. nuitka/nodes/shapes/StandardShapes.py +27 -20
  516. nuitka/nodes/shapes/__init__.py +5 -4
  517. nuitka/optimizations/BytecodeDemotion.py +19 -17
  518. nuitka/optimizations/FunctionInlining.py +22 -23
  519. nuitka/optimizations/Graphs.py +19 -17
  520. nuitka/optimizations/Optimization.py +39 -35
  521. nuitka/optimizations/OptimizeBuiltinCalls.py +31 -27
  522. nuitka/optimizations/Tags.py +19 -18
  523. nuitka/optimizations/TraceCollections.py +67 -24
  524. nuitka/optimizations/ValueTraces.py +92 -25
  525. nuitka/optimizations/__init__.py +5 -4
  526. nuitka/pgo/PGO.py +33 -23
  527. nuitka/pgo/__init__.py +5 -4
  528. nuitka/plugins/PluginBase.py +610 -109
  529. nuitka/plugins/Plugins.py +241 -58
  530. nuitka/plugins/YamlPluginBase.py +121 -0
  531. nuitka/plugins/__init__.py +5 -4
  532. nuitka/plugins/standard/AntiBloatPlugin.py +357 -129
  533. nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +20 -19
  534. nuitka/plugins/standard/DataFilesPlugin.py +65 -29
  535. nuitka/plugins/standard/DelvewheelPlugin.py +32 -24
  536. nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
  537. nuitka/plugins/standard/DillPlugin/dill-postLoad.py +256 -0
  538. nuitka/plugins/standard/DillPlugin.py +42 -134
  539. nuitka/plugins/standard/DllFilesPlugin.py +125 -42
  540. nuitka/plugins/standard/EnumPlugin.py +19 -17
  541. nuitka/plugins/standard/EventletPlugin.py +19 -17
  542. nuitka/plugins/standard/GeventPlugin.py +19 -17
  543. nuitka/plugins/standard/GiPlugin.py +44 -28
  544. nuitka/plugins/standard/GlfwPlugin.py +20 -17
  545. nuitka/plugins/standard/ImplicitImports.py +407 -46
  546. nuitka/plugins/standard/KivyPlugin.py +30 -17
  547. nuitka/plugins/standard/MatplotlibPlugin.py +88 -42
  548. nuitka/plugins/standard/MultiprocessingPlugin.py +25 -20
  549. nuitka/plugins/standard/NumpyPlugin.py +19 -17
  550. nuitka/plugins/standard/OptionsNannyPlugin.py +48 -76
  551. nuitka/plugins/standard/PbrPlugin.py +21 -19
  552. nuitka/plugins/standard/PkgResourcesPlugin.py +34 -23
  553. nuitka/plugins/standard/PmwPlugin.py +30 -27
  554. nuitka/plugins/standard/PySidePyQtPlugin.py +74 -80
  555. nuitka/plugins/standard/PywebViewPlugin.py +19 -17
  556. nuitka/plugins/standard/SpacyPlugin.py +136 -0
  557. nuitka/plugins/standard/TensorflowPlugin.py +20 -17
  558. nuitka/plugins/standard/TkinterPlugin.py +103 -53
  559. nuitka/plugins/standard/TorchPlugin.py +20 -17
  560. nuitka/plugins/standard/TransformersPlugin.py +94 -30
  561. nuitka/plugins/standard/TrioPlugin.py +18 -15
  562. nuitka/plugins/standard/UpxPlugin.py +21 -19
  563. nuitka/plugins/standard/__init__.py +5 -4
  564. nuitka/plugins/standard/standard.nuitka-package.config.yml +3449 -1299
  565. nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +14 -14
  566. nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +121 -66
  567. nuitka/reports/CompilationReportReader.py +67 -0
  568. nuitka/reports/LicenseReport.rst.j2 +21 -21
  569. nuitka/reports/Reports.py +352 -76
  570. nuitka/reports/__init__.py +5 -4
  571. nuitka/specs/BuiltinBytesOperationSpecs.py +18 -17
  572. nuitka/specs/BuiltinDictOperationSpecs.py +18 -17
  573. nuitka/specs/BuiltinListOperationSpecs.py +18 -17
  574. nuitka/specs/BuiltinParameterSpecs.py +30 -20
  575. nuitka/specs/BuiltinStrOperationSpecs.py +19 -18
  576. nuitka/specs/BuiltinTypeOperationSpecs.py +18 -18
  577. nuitka/specs/BuiltinUnicodeOperationSpecs.py +18 -17
  578. nuitka/specs/HardImportSpecs.py +67 -22
  579. nuitka/specs/ParameterSpecs.py +56 -41
  580. nuitka/specs/__init__.py +5 -4
  581. nuitka/tools/Basics.py +20 -18
  582. nuitka/tools/__init__.py +5 -4
  583. nuitka/tools/commercial/__init__.py +7 -6
  584. nuitka/tools/data_composer/DataComposer.py +78 -62
  585. nuitka/tools/data_composer/__init__.py +5 -4
  586. nuitka/tools/data_composer/__main__.py +18 -17
  587. nuitka/tools/environments/CreateEnvironment.py +20 -17
  588. nuitka/tools/environments/Virtualenv.py +60 -32
  589. nuitka/tools/environments/__init__.py +5 -4
  590. nuitka/tools/general/__init__.py +5 -4
  591. nuitka/tools/general/dll_report/__init__.py +5 -4
  592. nuitka/tools/general/dll_report/__main__.py +19 -21
  593. nuitka/tools/general/find_module/FindModuleCode.py +35 -22
  594. nuitka/tools/general/find_module/__init__.py +5 -4
  595. nuitka/tools/onefile_compressor/OnefileCompressor.py +213 -131
  596. nuitka/tools/onefile_compressor/__init__.py +5 -4
  597. nuitka/tools/onefile_compressor/__main__.py +18 -17
  598. nuitka/tools/podman/Podman.py +19 -17
  599. nuitka/tools/podman/__init__.py +5 -4
  600. nuitka/tools/podman/__main__.py +35 -19
  601. nuitka/tools/profiler/__init__.py +5 -4
  602. nuitka/tools/profiler/__main__.py +18 -17
  603. nuitka/tools/scanning/DisplayPackageDLLs.py +47 -22
  604. nuitka/tools/scanning/DisplayPackageData.py +31 -19
  605. nuitka/tools/scanning/__init__.py +5 -4
  606. nuitka/tools/specialize/CTypeDescriptions.py +93 -71
  607. nuitka/tools/specialize/Common.py +18 -17
  608. nuitka/tools/specialize/SpecializeC.py +31 -27
  609. nuitka/tools/specialize/SpecializePython.py +108 -45
  610. nuitka/tools/specialize/__init__.py +5 -4
  611. nuitka/tools/testing/Common.py +106 -52
  612. nuitka/tools/testing/Constructs.py +19 -17
  613. nuitka/tools/testing/OutputComparison.py +54 -18
  614. nuitka/tools/testing/Pythons.py +19 -18
  615. nuitka/tools/testing/RuntimeTracing.py +20 -19
  616. nuitka/tools/testing/SearchModes.py +26 -20
  617. nuitka/tools/testing/Valgrind.py +19 -17
  618. nuitka/tools/testing/__init__.py +5 -4
  619. nuitka/tools/testing/check_reference_counts/__init__.py +5 -4
  620. nuitka/tools/testing/check_reference_counts/__main__.py +18 -18
  621. nuitka/tools/testing/compare_with_cpython/__init__.py +5 -4
  622. nuitka/tools/testing/compare_with_cpython/__main__.py +36 -29
  623. nuitka/tools/testing/find_sxs_modules/__init__.py +5 -4
  624. nuitka/tools/testing/find_sxs_modules/__main__.py +17 -17
  625. nuitka/tools/testing/measure_construct_performance/__init__.py +5 -4
  626. nuitka/tools/testing/measure_construct_performance/__main__.py +22 -25
  627. nuitka/tools/testing/run_nuitka_tests/__init__.py +5 -4
  628. nuitka/tools/testing/run_nuitka_tests/__main__.py +57 -40
  629. nuitka/tools/watch/AutoStage.py +144 -0
  630. nuitka/tools/watch/GitHub.py +113 -0
  631. nuitka/tools/watch/__init__.py +5 -4
  632. nuitka/tools/watch/__main__.py +322 -91
  633. nuitka/tree/Building.py +176 -147
  634. nuitka/tree/ComplexCallHelperFunctions.py +80 -58
  635. nuitka/tree/Extractions.py +19 -17
  636. nuitka/tree/InternalModule.py +29 -20
  637. nuitka/tree/Operations.py +19 -17
  638. nuitka/tree/ReformulationAssertStatements.py +20 -17
  639. nuitka/tree/ReformulationAssignmentStatements.py +92 -91
  640. nuitka/tree/ReformulationBooleanExpressions.py +19 -17
  641. nuitka/tree/ReformulationCallExpressions.py +20 -18
  642. nuitka/tree/ReformulationClasses.py +45 -39
  643. nuitka/tree/ReformulationClasses3.py +146 -98
  644. nuitka/tree/ReformulationComparisonExpressions.py +29 -35
  645. nuitka/tree/ReformulationContractionExpressions.py +58 -55
  646. nuitka/tree/ReformulationDictionaryCreation.py +40 -35
  647. nuitka/tree/ReformulationExecStatements.py +42 -39
  648. nuitka/tree/ReformulationForLoopStatements.py +30 -34
  649. nuitka/tree/ReformulationFunctionStatements.py +58 -54
  650. nuitka/tree/ReformulationImportStatements.py +34 -29
  651. nuitka/tree/ReformulationLambdaExpressions.py +23 -24
  652. nuitka/tree/ReformulationMatchStatements.py +244 -92
  653. nuitka/tree/ReformulationMultidist.py +22 -18
  654. nuitka/tree/ReformulationNamespacePackages.py +55 -46
  655. nuitka/tree/ReformulationPrintStatements.py +23 -24
  656. nuitka/tree/ReformulationSequenceCreation.py +50 -49
  657. nuitka/tree/ReformulationSubscriptExpressions.py +19 -17
  658. nuitka/tree/ReformulationTryExceptStatements.py +19 -17
  659. nuitka/tree/ReformulationTryFinallyStatements.py +34 -17
  660. nuitka/tree/ReformulationWhileLoopStatements.py +19 -17
  661. nuitka/tree/ReformulationWithStatements.py +39 -41
  662. nuitka/tree/ReformulationYieldExpressions.py +21 -19
  663. nuitka/tree/SourceHandling.py +76 -31
  664. nuitka/tree/SyntaxErrors.py +19 -17
  665. nuitka/tree/TreeHelpers.py +33 -20
  666. nuitka/tree/VariableClosure.py +35 -39
  667. nuitka/tree/__init__.py +5 -4
  668. nuitka/utils/AppDirs.py +41 -20
  669. nuitka/utils/CStrings.py +66 -21
  670. nuitka/utils/CommandLineOptions.py +84 -19
  671. nuitka/utils/Distributions.py +445 -54
  672. nuitka/utils/Download.py +89 -57
  673. nuitka/utils/Execution.py +73 -34
  674. nuitka/utils/FileOperations.py +318 -74
  675. nuitka/utils/Hashing.py +55 -33
  676. nuitka/utils/Images.py +26 -19
  677. nuitka/utils/Importing.py +118 -24
  678. nuitka/utils/InstalledPythons.py +80 -75
  679. nuitka/utils/InstanceCounters.py +20 -17
  680. nuitka/utils/Jinja2.py +30 -22
  681. nuitka/utils/Json.py +19 -17
  682. nuitka/utils/MacOSApp.py +26 -18
  683. nuitka/utils/MemoryUsage.py +20 -18
  684. nuitka/utils/ModuleNames.py +42 -26
  685. nuitka/utils/ReExecute.py +50 -28
  686. nuitka/utils/Rest.py +20 -17
  687. nuitka/utils/SharedLibraries.py +161 -75
  688. nuitka/utils/Shebang.py +20 -17
  689. nuitka/utils/Signing.py +63 -18
  690. nuitka/utils/SlotMetaClasses.py +57 -0
  691. nuitka/utils/StaticLibraries.py +83 -56
  692. nuitka/utils/ThreadedExecutor.py +18 -17
  693. nuitka/utils/Timing.py +22 -20
  694. nuitka/utils/Utils.py +115 -25
  695. nuitka/utils/WindowsFileUsage.py +22 -20
  696. nuitka/utils/WindowsResources.py +25 -18
  697. nuitka/utils/Yaml.py +62 -24
  698. nuitka/utils/__init__.py +5 -4
  699. Nuitka_winsvc-1.8.dist-info/RECORD +0 -905
  700. nuitka/build/inline_copy/tqdm/tqdm/_tqdm_gui.py +0 -9
  701. nuitka/build/inline_copy/tqdm/tqdm/gui.py +0 -191
  702. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/LICENSE.txt +0 -0
  703. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/entry_points.txt +0 -0
  704. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/top_level.txt +0 -0
@@ -1,20 +1,5 @@
1
- // Copyright 2023, Kay Hayen, mailto:kay.hayen@gmail.com
2
- //
3
- // Part of "Nuitka", an optimizing Python compiler that is compatible and
4
- // integrates with CPython, but also works on its own.
5
- //
6
- // Licensed under the Apache License, Version 2.0 (the "License");
7
- // you may not use this file except in compliance with the License.
8
- // You may obtain a copy of the License at
9
- //
10
- // http://www.apache.org/licenses/LICENSE-2.0
11
- //
12
- // Unless required by applicable law or agreed to in writing, software
13
- // distributed under the License is distributed on an "AS IS" BASIS,
14
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- // See the License for the specific language governing permissions and
16
- // limitations under the License.
17
- //
1
+ // Copyright 2024, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
2
+
18
3
  // This implements the loading of C compiled modules and shared library
19
4
  // extension modules bundled for standalone mode.
20
5
 
@@ -37,6 +22,9 @@
37
22
  #ifdef _WIN32
38
23
  #undef SEP
39
24
  #define SEP '\\'
25
+ #define SEP_L L'\\'
26
+ #else
27
+ #define SEP_L SEP
40
28
  #endif
41
29
 
42
30
  #ifdef _WIN32
@@ -64,7 +52,7 @@ static inline bool isVerbose(void) { return false; }
64
52
  static struct Nuitka_MetaPathBasedLoaderEntry *loader_entries = NULL;
65
53
 
66
54
  static bool hasFrozenModule(char const *name) {
67
- for (struct _frozen const *p = PyImport_FrozenModules;; p++) {
55
+ for (struct _frozen const *p = PyImport_FrozenModules; p != NULL; p++) {
68
56
  if (p->name == NULL) {
69
57
  return false;
70
58
  }
@@ -77,10 +65,11 @@ static bool hasFrozenModule(char const *name) {
77
65
  return true;
78
66
  }
79
67
 
80
- static char *appendModulenameAsPath(char *buffer, char const *module_name, size_t buffer_size) {
68
+ static char *appendModuleNameAsPath(char *buffer, char const *module_name, size_t buffer_size) {
81
69
  // Skip to the end
82
70
  while (*buffer != 0) {
83
71
  buffer++;
72
+ buffer_size -= 1;
84
73
  }
85
74
 
86
75
  while (*module_name) {
@@ -105,20 +94,17 @@ static char *appendModulenameAsPath(char *buffer, char const *module_name, size_
105
94
 
106
95
  #if defined(_WIN32) && defined(_NUITKA_STANDALONE)
107
96
 
108
- static void appendModulenameAsPathW(wchar_t *buffer, char const *module_name, size_t buffer_size) {
109
- // Skip to the end
110
- while (*buffer != 0) {
111
- buffer++;
112
- }
97
+ static void appendModuleNameAsPathW(wchar_t *buffer, PyObject *module_name, size_t buffer_size) {
98
+ wchar_t const *module_name_wstr = PyUnicode_AsWideCharString(module_name, NULL);
113
99
 
114
- while (*module_name) {
115
- char c = *module_name++;
100
+ while (*module_name_wstr != 0) {
101
+ wchar_t c = *module_name_wstr++;
116
102
 
117
- if (c == '.') {
118
- c = SEP;
103
+ if (c == L'.') {
104
+ c = SEP_L;
119
105
  }
120
106
 
121
- appendCharSafeW(buffer, c, buffer_size);
107
+ appendWCharSafeW(buffer, c, buffer_size);
122
108
  }
123
109
  }
124
110
  #endif
@@ -150,7 +136,7 @@ static void patchCodeObjectPaths(PyCodeObject *code_object, PyObject *module_pat
150
136
  NUITKA_MAY_BE_UNUSED static PyObject *MAKE_RELATIVE_PATH_FROM_NAME(char const *name, bool is_package, bool dir_only) {
151
137
  char buffer[MAXPATHLEN + 1] = {0};
152
138
 
153
- appendModulenameAsPath(buffer, name, sizeof(buffer));
139
+ appendModuleNameAsPath(buffer, name, sizeof(buffer));
154
140
 
155
141
  if (dir_only == false) {
156
142
  if (is_package) {
@@ -180,19 +166,35 @@ NUITKA_MAY_BE_UNUSED static PyObject *MAKE_RELATIVE_PATH_FROM_NAME(char const *n
180
166
  return result;
181
167
  }
182
168
 
183
- static PyObject *loadModuleFromCodeObject(PyObject *module, PyCodeObject *code_object, char const *name,
184
- bool is_package) {
169
+ static PyObject *_makeDunderPathObject(PyThreadState *tstate, PyObject *module_path_entry) {
170
+ CHECK_OBJECT(module_path_entry);
171
+
172
+ PyObject *path_list = MAKE_LIST_EMPTY(tstate, 1);
173
+ if (unlikely(path_list == NULL)) {
174
+ return NULL;
175
+ }
176
+
177
+ PyList_SET_ITEM0(path_list, 0, module_path_entry);
178
+
179
+ CHECK_OBJECT(path_list);
180
+ return path_list;
181
+ }
182
+
183
+ static PyObject *loadModuleFromCodeObject(PyThreadState *tstate, PyObject *module, PyCodeObject *code_object,
184
+ char const *name, bool is_package) {
185
185
  assert(code_object != NULL);
186
186
 
187
- bool b_res = Nuitka_SetModuleString(name, module);
188
- assert(b_res != false);
187
+ {
188
+ NUITKA_MAY_BE_UNUSED bool b_res = Nuitka_SetModuleString(name, module);
189
+ assert(b_res != false);
190
+ }
189
191
 
190
192
  char buffer[MAXPATHLEN + 1] = {0};
191
193
 
192
194
  PyObject *module_path_entry = NULL;
193
195
 
194
196
  if (is_package) {
195
- appendModulenameAsPath(buffer, name, sizeof(buffer));
197
+ appendModuleNameAsPath(buffer, name, sizeof(buffer));
196
198
  PyObject *module_path_entry_base = Nuitka_String_FromString(buffer);
197
199
 
198
200
  module_path_entry = MAKE_RELATIVE_PATH(module_path_entry_base);
@@ -201,7 +203,7 @@ static PyObject *loadModuleFromCodeObject(PyObject *module, PyCodeObject *code_o
201
203
  appendCharSafe(buffer, SEP, sizeof(buffer));
202
204
  appendStringSafe(buffer, "__init__.py", sizeof(buffer));
203
205
  } else {
204
- appendModulenameAsPath(buffer, name, sizeof(buffer));
206
+ appendModuleNameAsPath(buffer, name, sizeof(buffer));
205
207
  appendStringSafe(buffer, ".py", sizeof(buffer));
206
208
  }
207
209
 
@@ -212,17 +214,9 @@ static PyObject *loadModuleFromCodeObject(PyObject *module, PyCodeObject *code_o
212
214
 
213
215
  if (is_package) {
214
216
  /* Set __path__ properly, unlike frozen module importer does. */
215
- PyObject *path_list = MAKE_LIST_EMPTY(1);
216
- if (unlikely(path_list == NULL))
217
- return NULL;
218
-
219
- int res = PyList_SetItem(path_list, 0, module_path_entry);
220
- if (unlikely(res != 0)) {
221
- return NULL;
222
- }
223
- Py_INCREF(module_path_entry);
217
+ PyObject *path_list = _makeDunderPathObject(tstate, module_path_entry);
224
218
 
225
- res = PyObject_SetAttr(module, const_str_plain___path__, path_list);
219
+ int res = PyObject_SetAttr(module, const_str_plain___path__, path_list);
226
220
  if (unlikely(res != 0)) {
227
221
  return NULL;
228
222
  }
@@ -258,7 +252,7 @@ static struct Nuitka_MetaPathBasedLoaderEntry *findEntry(char const *name) {
258
252
 
259
253
  while (current->name != NULL) {
260
254
  if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
261
- current->name = UNTRANSLATE(current->name);
255
+ current->name = UN_TRANSLATE(current->name);
262
256
  current->flags -= NUITKA_TRANSLATED_FLAG;
263
257
  }
264
258
 
@@ -286,7 +280,7 @@ static struct Nuitka_MetaPathBasedLoaderEntry *findContainingPackageEntry(char c
286
280
 
287
281
  while (current->name != NULL) {
288
282
  if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
289
- current->name = UNTRANSLATE(current->name);
283
+ current->name = UN_TRANSLATE(current->name);
290
284
  current->flags -= NUITKA_TRANSLATED_FLAG;
291
285
  }
292
286
 
@@ -325,7 +319,7 @@ static PyObject *_getImportingSuffixesByPriority(PyThreadState *tstate, int kind
325
319
  static PyObject *result = NULL;
326
320
 
327
321
  if (result == NULL) {
328
- result = MAKE_LIST_EMPTY(0);
322
+ result = MAKE_LIST_EMPTY(tstate, 0);
329
323
 
330
324
  PyObject *imp_module = PyImport_ImportModule("imp");
331
325
  PyObject *get_suffixes_func = PyObject_GetAttrString(imp_module, "get_suffixes");
@@ -383,10 +377,10 @@ static bool scanModuleInPackagePath(PyThreadState *tstate, PyObject *module_name
383
377
  return false;
384
378
  }
385
379
 
386
- PyObject *candidates = MAKE_LIST_EMPTY(0);
380
+ PyObject *candidates = MAKE_LIST_EMPTY(tstate, 0);
387
381
 
388
382
  // Search only relative to the parent name of course.
389
- char const *module_relname_str = Nuitka_String_AsString(module_name) + strlen(parent_module_name) + 1;
383
+ char const *module_relative_name_str = Nuitka_String_AsString(module_name) + strlen(parent_module_name) + 1;
390
384
 
391
385
  Py_ssize_t parent_path_size = PyList_GET_SIZE(parent_path);
392
386
 
@@ -408,8 +402,8 @@ static bool scanModuleInPackagePath(PyThreadState *tstate, PyObject *module_name
408
402
  if (Nuitka_String_CheckExact(filename)) {
409
403
  char const *filename_str = Nuitka_String_AsString(filename);
410
404
 
411
- if (strncmp(filename_str, module_relname_str, strlen(module_relname_str)) == 0 &&
412
- filename_str[strlen(module_relname_str)] == '.') {
405
+ if (strncmp(filename_str, module_relative_name_str, strlen(module_relative_name_str)) == 0 &&
406
+ filename_str[strlen(module_relative_name_str)] == '.') {
413
407
  LIST_APPEND1(candidates, PyTuple_Pack(2, path_element, filename));
414
408
  }
415
409
  }
@@ -419,7 +413,7 @@ static bool scanModuleInPackagePath(PyThreadState *tstate, PyObject *module_name
419
413
  #if 0
420
414
  PRINT_STRING("CANDIDATES:");
421
415
  PRINT_STRING(Nuitka_String_AsString(module_name));
422
- PRINT_STRING(module_relname_str);
416
+ PRINT_STRING(module_relative_name_str);
423
417
  PRINT_ITEM(candidates);
424
418
  PRINT_NEW_LINE();
425
419
  #endif
@@ -442,11 +436,11 @@ static bool scanModuleInPackagePath(PyThreadState *tstate, PyObject *module_name
442
436
 
443
437
  char const *candidate_str = Nuitka_String_AsString(candidate);
444
438
 
445
- if (strcmp(suffix_str, candidate_str + strlen(module_relname_str)) == 0) {
439
+ if (strcmp(suffix_str, candidate_str + strlen(module_relative_name_str)) == 0) {
446
440
  PyObject *fullpath = JOIN_PATH2(directory, candidate);
447
441
 
448
442
  if (installed_extension_modules == NULL) {
449
- installed_extension_modules = MAKE_DICT_EMPTY();
443
+ installed_extension_modules = MAKE_DICT_EMPTY(tstate);
450
444
  }
451
445
 
452
446
  // Force path to unicode, to have easier consumption, as we need a wchar_t or char *
@@ -470,11 +464,8 @@ static bool scanModuleInPackagePath(PyThreadState *tstate, PyObject *module_name
470
464
  return result;
471
465
  }
472
466
 
473
- #ifdef _WIN32
474
- static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full_name, const wchar_t *filename);
475
- #else
476
- static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full_name, const char *filename);
477
- #endif
467
+ static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full_name, const filename_char_t *filename,
468
+ bool is_package);
478
469
 
479
470
  static PyObject *callIntoInstalledExtensionModule(PyThreadState *tstate, PyObject *module_name,
480
471
  PyObject *extension_module_filename) {
@@ -492,7 +483,9 @@ static PyObject *callIntoInstalledExtensionModule(PyThreadState *tstate, PyObjec
492
483
  char const *extension_module_filename_str = Nuitka_String_AsString(extension_module_filename);
493
484
  #endif
494
485
 
495
- return callIntoExtensionModule(tstate, Nuitka_String_AsString(module_name), extension_module_filename_str);
486
+ // TODO: The value of "is_package" is guessed, maybe infer from filename being
487
+ // a "__init__.so" and the like.
488
+ return callIntoExtensionModule(tstate, Nuitka_String_AsString(module_name), extension_module_filename_str, false);
496
489
  }
497
490
 
498
491
  #endif
@@ -573,7 +566,7 @@ static PyObject *_nuitka_loader_find_module(PyObject *self, PyObject *args, PyOb
573
566
  PySys_WriteStderr("import %s # denied responsibility\n", name);
574
567
  }
575
568
 
576
- Py_INCREF(Py_None);
569
+ Py_INCREF_IMMORTAL(Py_None);
577
570
  return Py_None;
578
571
  }
579
572
 
@@ -593,37 +586,18 @@ static PyObject *_nuitka_loader_get_data(PyObject *self, PyObject *args, PyObjec
593
586
  return GET_FILE_BYTES(tstate, filename);
594
587
  }
595
588
 
596
- #ifdef _WIN32
597
- static void setModuleFileValue(PyThreadState *tstate, PyObject *module, wchar_t const *filename) {
598
- #else
599
- static void setModuleFileValue(PyThreadState *tstate, PyObject *module, char const *filename) {
600
- #endif
601
- bool needs_update = false;
602
-
603
- PyObject *existing_file_value = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___file__);
589
+ static void setModuleFileValue(PyThreadState *tstate, PyObject *module, filename_char_t const *filename) {
590
+ CHECK_OBJECT(module);
591
+ assert(filename != NULL);
604
592
 
605
- if (existing_file_value == NULL) {
606
- CLEAR_ERROR_OCCURRED(tstate);
607
- needs_update = true;
608
- } else {
609
- if (existing_file_value == Py_None) {
610
- needs_update = true;
611
- }
593
+ assert(PyModule_Check(module));
612
594
 
613
- Py_DECREF(existing_file_value);
614
- }
595
+ PyObject *dict = PyModule_GetDict(module);
615
596
 
616
- if (needs_update) {
617
- #ifdef _WIN32
618
- int res = SET_ATTRIBUTE(tstate, module, const_str_plain___file__, NuitkaUnicode_FromWideChar(filename, -1));
619
- #else
620
- int res = SET_ATTRIBUTE(tstate, module, const_str_plain___file__, PyUnicode_FromString(filename));
621
- #endif
622
- if (unlikely(res < 0)) {
623
- // Might be refuted, which wouldn't be harmful.
624
- CLEAR_ERROR_OCCURRED(tstate);
625
- }
626
- }
597
+ // TODO: We should have DICT_SET_ITEM0/1 for these things.
598
+ PyObject *new_file_value = Nuitka_String_FromFilename(filename);
599
+ DICT_SET_ITEM(dict, const_str_plain___file__, new_file_value);
600
+ Py_DECREF(new_file_value);
627
601
  }
628
602
 
629
603
  #if PYTHON_VERSION < 0x300
@@ -641,11 +615,99 @@ typedef PyObject *(*entrypoint_t)(void);
641
615
  static PyObject *createModuleSpec(PyThreadState *tstate, PyObject *module_name, PyObject *origin, bool is_package);
642
616
  #endif
643
617
 
618
+ static void _fillExtensionModuleDllEntryFunctionName(PyThreadState *tstate, char *buffer, size_t buffer_size,
619
+ char const *name) {
620
+
621
+ #if PYTHON_VERSION >= 0x350
622
+ PyObject *name_bytes_obj = PyBytes_FromString(name);
623
+ PyObject *name_obj = BYTES_DECODE2(tstate, name_bytes_obj, Nuitka_String_FromString("utf8"));
624
+ Py_DECREF(name_bytes_obj);
625
+
626
+ PyObject *name_ascii = UNICODE_ENCODE2(tstate, name_obj, const_str_plain_ascii);
627
+
628
+ if (name_ascii == NULL) {
629
+ DROP_ERROR_OCCURRED(tstate);
630
+
631
+ PyObject *name_punycode = UNICODE_ENCODE2(tstate, name_obj, const_str_plain_punycode);
632
+
633
+ CHECK_OBJECT(name_punycode);
634
+
635
+ snprintf(buffer, buffer_size, "PyInitU_%s", PyBytes_AsString(name_punycode));
636
+
637
+ Py_DECREF(name_punycode);
638
+ } else {
639
+ Py_DECREF(name_ascii);
640
+
641
+ snprintf(buffer, buffer_size, "PyInit_%s", name);
642
+ }
643
+ Py_DECREF(name_obj);
644
+ #else
645
+
646
+ snprintf(buffer, buffer_size,
647
+ #if PYTHON_VERSION < 0x300
648
+ "init%s",
649
+ #else
650
+ "PyInit_%s",
651
+ #endif
652
+ name);
653
+ #endif
654
+ }
655
+
656
+ #ifdef _NUITKA_STANDALONE
657
+ // Append the the entry name from full path module name with dots,
658
+ // and translate these into directory separators.
659
+ static void _makeModuleCFilenameValue(filename_char_t *filename, size_t filename_size, char const *module_name_cstr,
660
+ PyObject *module_name, bool is_package) {
644
661
  #ifdef _WIN32
645
- static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full_name, const wchar_t *filename) {
662
+ appendWStringSafeW(filename, getBinaryDirectoryWideChars(true), filename_size);
663
+ appendWCharSafeW(filename, SEP_L, filename_size);
664
+ appendModuleNameAsPathW(filename, module_name, filename_size);
665
+ if (is_package) {
666
+ appendWCharSafeW(filename, SEP_L, filename_size);
667
+ appendStringSafeW(filename, "__init__", filename_size);
668
+ }
669
+ appendStringSafeW(filename, ".pyd", filename_size);
646
670
  #else
647
- static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full_name, const char *filename) {
671
+ appendStringSafe(filename, getBinaryDirectoryHostEncoded(true), filename_size);
672
+ appendCharSafe(filename, SEP, filename_size);
673
+ appendModuleNameAsPath(filename, module_name_cstr, filename_size);
674
+ if (is_package) {
675
+ appendCharSafe(filename, SEP, filename_size);
676
+ appendStringSafe(filename, "__init__", filename_size);
677
+ }
678
+ appendStringSafe(filename, ".so", filename_size);
648
679
  #endif
680
+ }
681
+ #endif
682
+
683
+ #if PYTHON_VERSION >= 0x3c0 && defined(_NUITKA_USE_UNEXPOSED_API)
684
+ extern _Thread_local const char *pkgcontext;
685
+ #endif
686
+
687
+ static const char *NuitkaImport_SwapPackageContext(const char *new_context) {
688
+ // TODO: The locking APIs for 3.13 give errors here that are not explained
689
+ // yet.
690
+ #if PYTHON_VERSION >= 0x3c0 && PYTHON_VERSION < 0x3d0
691
+ // spell-checker: ignore pkgcontext
692
+ const char *old_context = _PyRuntime.imports.pkgcontext;
693
+ _PyRuntime.imports.pkgcontext = new_context;
694
+ #if PYTHON_VERSION >= 0x3c0 && defined(_NUITKA_USE_UNEXPOSED_API)
695
+ pkgcontext = new_context;
696
+ #endif
697
+ return old_context;
698
+ #elif PYTHON_VERSION >= 0x370
699
+ char const *old_context = _Py_PackageContext;
700
+ _Py_PackageContext = (char *)new_context;
701
+ return old_context;
702
+ #else
703
+ char *old_context = _Py_PackageContext;
704
+ _Py_PackageContext = (char *)new_context;
705
+ return (char const *)old_context;
706
+ #endif
707
+ }
708
+
709
+ static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full_name, const filename_char_t *filename,
710
+ bool is_package) {
649
711
  // Determine the package name and basename of the module to load.
650
712
  char const *dot = strrchr(full_name, '.');
651
713
  char const *name;
@@ -661,13 +723,7 @@ static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full
661
723
  }
662
724
 
663
725
  char entry_function_name[1024];
664
- snprintf(entry_function_name, sizeof(entry_function_name),
665
- #if PYTHON_VERSION < 0x300
666
- "init%s",
667
- #else
668
- "PyInit_%s",
669
- #endif
670
- name);
726
+ _fillExtensionModuleDllEntryFunctionName(tstate, entry_function_name, sizeof(entry_function_name), name);
671
727
 
672
728
  #ifdef _WIN32
673
729
  if (isVerbose()) {
@@ -675,6 +731,8 @@ static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full
675
731
  }
676
732
 
677
733
  #ifndef _NUITKA_EXPERIMENTAL_DEBUG_STANDALONE
734
+ // Disable all but critical errors, prevents dialogs from showing.
735
+ // spell-checker: ignore SEM_FAILCRITICALERRORS
678
736
  unsigned int old_mode = SetErrorMode(SEM_FAILCRITICALERRORS);
679
737
  #endif
680
738
 
@@ -704,15 +762,18 @@ static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full
704
762
 
705
763
  // Report either way even if failed to get error message.
706
764
  if (size == 0) {
707
- PyOS_snprintf(buffer, sizeof(buffer), "LoadLibraryExW '%S' failed with error code %d", filename,
708
- error_code);
765
+ int ret = PyOS_snprintf(buffer, sizeof(buffer), "LoadLibraryExW '%S' failed with error code %d", filename,
766
+ error_code);
767
+
768
+ assert(ret >= 0);
709
769
  } else {
710
770
  // Strip trailing newline.
711
771
  if (size >= 2 && error_message[size - 2] == '\r' && error_message[size - 1] == '\n') {
712
772
  size -= 2;
713
773
  error_message[size] = '\0';
714
774
  }
715
- PyOS_snprintf(buffer, sizeof(buffer), "LoadLibraryExW '%S' failed: %s", filename, error_message);
775
+ int ret = PyOS_snprintf(buffer, sizeof(buffer), "LoadLibraryExW '%S' failed: %s", filename, error_message);
776
+ assert(ret >= 0);
716
777
  }
717
778
 
718
779
  SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ImportError, buffer);
@@ -723,6 +784,15 @@ static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full
723
784
  #else
724
785
  // This code would work for all versions, we are avoiding access to interpreter
725
786
  // structure internals of 3.8 or higher.
787
+ // spell-checker: ignore getdlopenflags,dlopenflags
788
+
789
+ #ifdef __wasi__
790
+ const char *error = "dynamic libraries are not implemented in wasi";
791
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ImportError, error);
792
+ return NULL;
793
+
794
+ entrypoint_t entrypoint = NULL;
795
+ #else
726
796
  static PyObject *dlopenflags_object = NULL;
727
797
  if (dlopenflags_object == NULL) {
728
798
  dlopenflags_object = CALL_FUNCTION_NO_ARGS(tstate, Nuitka_SysGetObject("getdlopenflags"));
@@ -747,16 +817,11 @@ static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full
747
817
  }
748
818
 
749
819
  entrypoint_t entrypoint = (entrypoint_t)dlsym(handle, entry_function_name);
820
+ #endif // __wasi__
750
821
  #endif
751
822
  assert(entrypoint);
752
823
 
753
- #if PYTHON_VERSION < 0x370
754
- char *old_context = _Py_PackageContext;
755
- #else
756
- char const *old_context = _Py_PackageContext;
757
- #endif
758
-
759
- _Py_PackageContext = (char *)package;
824
+ char const *old_context = NuitkaImport_SwapPackageContext(package);
760
825
 
761
826
  // Finally call into the DLL.
762
827
  PGO_onModuleEntered(full_name);
@@ -777,7 +842,13 @@ static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full
777
842
  PySys_WriteStderr("import %s # return from entrypoint\n", full_name);
778
843
  }
779
844
 
780
- _Py_PackageContext = old_context;
845
+ #if 0
846
+ PRINT_STRING("FRESH");
847
+ PRINT_ITEM(module);
848
+ PRINT_NEW_LINE();
849
+ #endif
850
+
851
+ NuitkaImport_SwapPackageContext(old_context);
781
852
 
782
853
  #if PYTHON_VERSION < 0x300
783
854
  PyObject *module = Nuitka_GetModuleString(tstate, full_name);
@@ -806,7 +877,10 @@ static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full
806
877
 
807
878
  PyObject *full_name_obj = Nuitka_String_FromString(full_name);
808
879
 
809
- PyObject *spec_value = createModuleSpec(tstate, full_name_obj, NULL, false);
880
+ PyObject *origin = Nuitka_String_FromFilename(filename);
881
+
882
+ PyObject *spec_value = createModuleSpec(tstate, full_name_obj, origin, is_package);
883
+ CHECK_OBJECT(spec_value);
810
884
 
811
885
  module = PyModule_FromDefAndSpec(def, spec_value);
812
886
 
@@ -818,16 +892,25 @@ static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full
818
892
  return NULL;
819
893
  }
820
894
 
821
- setModuleFileValue(tstate, module, filename);
822
- PyObject_SetAttrString((PyObject *)spec_value, "origin",
823
- LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___file__));
824
895
  SET_ATTRIBUTE(tstate, module, const_str_plain___spec__, spec_value);
825
896
 
897
+ setModuleFileValue(tstate, module, filename);
898
+
899
+ /* Set __path__ properly, unlike frozen module importer does. */
900
+ PyObject *path_list = _makeDunderPathObject(tstate, origin);
901
+
902
+ int res = PyObject_SetAttr(module, const_str_plain___path__, path_list);
903
+ if (unlikely(res != 0)) {
904
+ return NULL;
905
+ }
906
+
907
+ Py_DECREF(path_list);
908
+
826
909
  Nuitka_SetModule(full_name_obj, module);
827
910
  Py_DECREF(full_name_obj);
828
911
 
829
912
  SET_ATTRIBUTE(tstate, spec_value, const_str_plain__initializing, Py_True);
830
- int res = PyModule_ExecDef(module, def);
913
+ res = PyModule_ExecDef(module, def);
831
914
  SET_ATTRIBUTE(tstate, spec_value, const_str_plain__initializing, Py_False);
832
915
 
833
916
  Py_DECREF(spec_value);
@@ -847,6 +930,8 @@ static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full
847
930
  } else {
848
931
  def = PyModule_GetDef(module);
849
932
 
933
+ def->m_base.m_init = entrypoint;
934
+
850
935
  // Set "__spec__" and "__file__" after load.
851
936
  setModuleFileValue(tstate, module, filename);
852
937
  PyObject *full_name_obj = Nuitka_String_FromString(full_name);
@@ -905,27 +990,27 @@ static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full
905
990
  #else
906
991
  PyObject *full_name_obj = PyUnicode_FromString(full_name);
907
992
  CHECK_OBJECT(full_name_obj);
908
- #ifdef _WIN32
909
- PyObject *filename_obj = NuitkaUnicode_FromWideChar(filename, -1);
910
- #else
911
- PyObject *filename_obj = PyUnicode_FromString(filename);
912
- #endif
993
+ PyObject *filename_obj = Nuitka_String_FromFilename(filename);
994
+
913
995
  CHECK_OBJECT(filename_obj);
914
996
 
997
+ #if PYTHON_VERSION < 0x3d0
915
998
  int res = _PyImport_FixupExtensionObject(module, full_name_obj, filename_obj
916
999
  #if PYTHON_VERSION >= 0x370
917
1000
  ,
918
1001
  Nuitka_GetSysModules()
919
1002
  #endif
920
-
921
1003
  );
1004
+ #endif
922
1005
 
923
1006
  Py_DECREF(full_name_obj);
924
1007
  Py_DECREF(filename_obj);
925
1008
 
1009
+ #if PYTHON_VERSION < 0x3d0
926
1010
  if (unlikely(res == -1)) {
927
1011
  return NULL;
928
1012
  }
1013
+ #endif
929
1014
  #endif
930
1015
 
931
1016
  return module;
@@ -978,35 +1063,13 @@ static PyObject *loadModule(PyThreadState *tstate, PyObject *module, PyObject *m
978
1063
  struct Nuitka_MetaPathBasedLoaderEntry const *entry) {
979
1064
  #ifdef _NUITKA_STANDALONE
980
1065
  if ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0) {
981
- // Append the the entry name from full path module name with dots,
982
- // and translate these into directory separators.
983
- #ifdef _WIN32
984
- wchar_t filename[MAXPATHLEN + 1] = {0};
985
-
986
- appendWStringSafeW(filename, getBinaryDirectoryWideChars(true), sizeof(filename) / sizeof(wchar_t));
987
- appendCharSafeW(filename, SEP, sizeof(filename) / sizeof(wchar_t));
988
- appendModulenameAsPathW(filename, entry->name, sizeof(filename) / sizeof(wchar_t));
989
- appendStringSafeW(filename, ".pyd", sizeof(filename) / sizeof(wchar_t));
990
- #else
991
- char filename[MAXPATHLEN + 1] = {0};
1066
+ bool is_package = (entry->flags & NUITKA_PACKAGE_FLAG) != 0;
992
1067
 
993
- appendStringSafe(filename, getBinaryDirectoryHostEncoded(true), sizeof(filename));
994
- appendCharSafe(filename, SEP, sizeof(filename));
995
- appendModulenameAsPath(filename, entry->name, sizeof(filename));
996
- appendStringSafe(filename, ".so", sizeof(filename));
1068
+ filename_char_t filename[MAXPATHLEN + 1] = {0};
1069
+ _makeModuleCFilenameValue(filename, sizeof(filename) / sizeof(filename_char_t), entry->name, module_name,
1070
+ is_package);
997
1071
 
998
- #endif
999
-
1000
- // Set "__spec__" and "__file__", some modules expect it early.
1001
- setModuleFileValue(tstate, module, filename);
1002
- #if PYTHON_VERSION >= 0x350
1003
- PyObject *spec_value =
1004
- createModuleSpec(tstate, module_name, LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___file__), false);
1005
-
1006
- SET_ATTRIBUTE(tstate, module, const_str_plain___spec__, spec_value);
1007
- #endif
1008
-
1009
- callIntoExtensionModule(tstate, entry->name, filename);
1072
+ callIntoExtensionModule(tstate, entry->name, filename, is_package);
1010
1073
  } else
1011
1074
  #endif
1012
1075
  if ((entry->flags & NUITKA_BYTECODE_FLAG) != 0) {
@@ -1022,20 +1085,26 @@ static PyObject *loadModule(PyThreadState *tstate, PyObject *module, PyObject *m
1022
1085
  abort();
1023
1086
  }
1024
1087
 
1025
- return loadModuleFromCodeObject(module, code_object, entry->name, (entry->flags & NUITKA_PACKAGE_FLAG) != 0);
1088
+ return loadModuleFromCodeObject(tstate, module, code_object, entry->name,
1089
+ (entry->flags & NUITKA_PACKAGE_FLAG) != 0);
1026
1090
  } else {
1027
1091
  assert((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) == 0);
1028
- assert(entry->python_initfunc);
1092
+ assert(entry->python_init_func);
1029
1093
 
1030
- bool res = Nuitka_SetModule(module_name, module);
1031
- assert(res != false);
1094
+ {
1095
+ NUITKA_MAY_BE_UNUSED bool res = Nuitka_SetModule(module_name, module);
1096
+ assert(res != false);
1097
+ }
1032
1098
 
1033
1099
  // Run the compiled module code, we get the module returned.
1034
- PyObject *result = entry->python_initfunc(tstate, module, entry);
1100
+ #if PYTHON_VERSION < 0x300
1101
+ NUITKA_MAY_BE_UNUSED
1102
+ #endif
1103
+ PyObject *result = entry->python_init_func(tstate, module, entry);
1035
1104
  CHECK_OBJECT_X(result);
1036
1105
 
1037
- #if PYTHON_VERSION >= 0x340
1038
- if (result != NULL) {
1106
+ #if PYTHON_VERSION >= 0x300
1107
+ if (likely(result != NULL)) {
1039
1108
  _fixupSpecAttribute(tstate, result);
1040
1109
  }
1041
1110
  #endif
@@ -1071,8 +1140,16 @@ static PyObject *_EXECUTE_EMBEDDED_MODULE(PyThreadState *tstate, PyObject *modul
1071
1140
  PyObject *result = NULL;
1072
1141
 
1073
1142
  if (entry != NULL) {
1143
+ #ifdef _NUITKA_EXPERIMENTAL_FORCE_GC_COLLECT_ON_IMPORT
1144
+ PyGC_Collect();
1145
+ #endif
1146
+
1074
1147
  result = loadModule(tstate, module, module_name, entry);
1075
1148
 
1149
+ #ifdef _NUITKA_EXPERIMENTAL_FORCE_GC_COLLECT_ON_IMPORT
1150
+ PyGC_Collect();
1151
+ #endif
1152
+
1076
1153
  if (unlikely(result == NULL)) {
1077
1154
  return NULL;
1078
1155
  }
@@ -1102,7 +1179,7 @@ static PyObject *_EXECUTE_EMBEDDED_MODULE(PyThreadState *tstate, PyObject *modul
1102
1179
  return result;
1103
1180
  }
1104
1181
 
1105
- Py_INCREF(Py_None);
1182
+ Py_INCREF_IMMORTAL(Py_None);
1106
1183
  return Py_None;
1107
1184
  }
1108
1185
 
@@ -1210,7 +1287,7 @@ static PyObject *_nuitka_loader_is_package(PyObject *self, PyObject *args, PyObj
1210
1287
  result = Py_None;
1211
1288
  }
1212
1289
 
1213
- Py_INCREF(result);
1290
+ Py_INCREF_IMMORTAL(result);
1214
1291
  return result;
1215
1292
  }
1216
1293
 
@@ -1225,7 +1302,9 @@ static PyObject *_nuitka_loader_iter_modules(struct Nuitka_LoaderObject *self, P
1225
1302
  return NULL;
1226
1303
  }
1227
1304
 
1228
- PyObject *result = MAKE_LIST_EMPTY(0);
1305
+ NUITKA_MAY_BE_UNUSED PyThreadState *tstate = PyThreadState_GET();
1306
+
1307
+ PyObject *result = MAKE_LIST_EMPTY(tstate, 0);
1229
1308
 
1230
1309
  struct Nuitka_MetaPathBasedLoaderEntry *current = loader_entries;
1231
1310
  assert(current);
@@ -1240,7 +1319,7 @@ static PyObject *_nuitka_loader_iter_modules(struct Nuitka_LoaderObject *self, P
1240
1319
 
1241
1320
  while (current->name != NULL) {
1242
1321
  if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
1243
- current->name = UNTRANSLATE(current->name);
1322
+ current->name = UN_TRANSLATE(current->name);
1244
1323
  current->flags -= NUITKA_TRANSLATED_FLAG;
1245
1324
  }
1246
1325
 
@@ -1281,9 +1360,9 @@ static PyObject *_nuitka_loader_iter_modules(struct Nuitka_LoaderObject *self, P
1281
1360
  Py_DECREF(old);
1282
1361
  }
1283
1362
 
1284
- PyObject *r = MAKE_TUPLE_EMPTY(2);
1363
+ PyObject *r = MAKE_TUPLE_EMPTY(tstate, 2);
1285
1364
  PyTuple_SET_ITEM(r, 0, name);
1286
- PyTuple_SET_ITEM0(r, 1, BOOL_FROM((current->flags & NUITKA_PACKAGE_FLAG) != 0));
1365
+ PyTuple_SET_ITEM_IMMORTAL(r, 1, BOOL_FROM((current->flags & NUITKA_PACKAGE_FLAG) != 0));
1287
1366
 
1288
1367
  LIST_APPEND1(result, r);
1289
1368
 
@@ -1354,35 +1433,6 @@ PyObject *getImportLibBootstrapModule(void) {
1354
1433
  }
1355
1434
  #endif
1356
1435
 
1357
- #if PYTHON_VERSION >= 0x340
1358
-
1359
- static PyObject *_nuitka_loader_repr_module(PyObject *self, PyObject *args, PyObject *kwds) {
1360
- PyObject *module;
1361
- PyObject *unused;
1362
-
1363
- int res =
1364
- PyArg_ParseTupleAndKeywords(args, kwds, "O|O:module_repr", (char **)_kw_list_find_module, &module, &unused);
1365
-
1366
- if (unlikely(res == 0)) {
1367
- return NULL;
1368
- }
1369
-
1370
- PyThreadState *tstate = PyThreadState_GET();
1371
-
1372
- return PyUnicode_FromFormat("<module '%s' from %R>", PyModule_GetName(module),
1373
- Nuitka_GetFilenameObject(tstate, module));
1374
- }
1375
-
1376
- static PyObject *getModuleSpecClass(PyObject *importlib_module) {
1377
- static PyObject *module_spec_class = NULL;
1378
-
1379
- if (module_spec_class == NULL) {
1380
- module_spec_class = PyObject_GetAttrString(importlib_module, "ModuleSpec");
1381
- }
1382
-
1383
- return module_spec_class;
1384
- }
1385
-
1386
1436
  static PyObject *getModuleFileValue(PyThreadState *tstate, struct Nuitka_MetaPathBasedLoaderEntry const *entry) {
1387
1437
  PyObject *dir_name = getModuleDirectory(tstate, entry);
1388
1438
 
@@ -1419,6 +1469,35 @@ static PyObject *getModuleFileValue(PyThreadState *tstate, struct Nuitka_MetaPat
1419
1469
  return result;
1420
1470
  }
1421
1471
 
1472
+ #if PYTHON_VERSION >= 0x340
1473
+
1474
+ static PyObject *_nuitka_loader_repr_module(PyObject *self, PyObject *args, PyObject *kwds) {
1475
+ PyObject *module;
1476
+ PyObject *unused;
1477
+
1478
+ int res =
1479
+ PyArg_ParseTupleAndKeywords(args, kwds, "O|O:module_repr", (char **)_kw_list_find_module, &module, &unused);
1480
+
1481
+ if (unlikely(res == 0)) {
1482
+ return NULL;
1483
+ }
1484
+
1485
+ PyThreadState *tstate = PyThreadState_GET();
1486
+
1487
+ return PyUnicode_FromFormat("<module '%s' from %R>", PyModule_GetName(module),
1488
+ Nuitka_GetFilenameObject(tstate, module));
1489
+ }
1490
+
1491
+ static PyObject *getModuleSpecClass(PyObject *importlib_module) {
1492
+ static PyObject *module_spec_class = NULL;
1493
+
1494
+ if (module_spec_class == NULL) {
1495
+ module_spec_class = PyObject_GetAttrString(importlib_module, "ModuleSpec");
1496
+ }
1497
+
1498
+ return module_spec_class;
1499
+ }
1500
+
1422
1501
  static PyObject *createModuleSpec(PyThreadState *tstate, PyObject *module_name, PyObject *origin, bool is_package) {
1423
1502
  CHECK_OBJECT(module_name);
1424
1503
  assert(Nuitka_String_Check(module_name));
@@ -1436,7 +1515,7 @@ static PyObject *createModuleSpec(PyThreadState *tstate, PyObject *module_name,
1436
1515
  return NULL;
1437
1516
  }
1438
1517
 
1439
- PyObject *args = MAKE_TUPLE2(module_name, (PyObject *)&Nuitka_Loader_Type);
1518
+ PyObject *args = MAKE_TUPLE2(tstate, module_name, (PyObject *)&Nuitka_Loader_Type);
1440
1519
 
1441
1520
  PyObject *kw_values[] = {is_package ? Py_True : Py_False, origin};
1442
1521
 
@@ -1522,7 +1601,7 @@ static PyObject *_nuitka_loader_find_spec(PyObject *self, PyObject *args, PyObje
1522
1601
  PySys_WriteStderr("import %s # denied responsibility\n", full_name);
1523
1602
  }
1524
1603
 
1525
- Py_INCREF(Py_None);
1604
+ Py_INCREF_IMMORTAL(Py_None);
1526
1605
  return Py_None;
1527
1606
  }
1528
1607
 
@@ -1592,9 +1671,9 @@ static PyObject *_nuitka_loader_exec_module(PyObject *self, PyObject *args, PyOb
1592
1671
 
1593
1672
  if (extension_module_filename != NULL) {
1594
1673
  // Set filename attribute
1595
- res = SET_ATTRIBUTE(tstate, module, const_str_plain___file__, extension_module_filename);
1674
+ bool b_res = SET_ATTRIBUTE(tstate, module, const_str_plain___file__, extension_module_filename);
1596
1675
 
1597
- if (unlikely(res < 0)) {
1676
+ if (unlikely(b_res == false)) {
1598
1677
  // Might be refuted, which wouldn't be harmful.
1599
1678
  CLEAR_ERROR_OCCURRED(tstate);
1600
1679
  }
@@ -1662,13 +1741,13 @@ static PyObject *_nuitka_loader_find_distributions(PyObject *self, PyObject *arg
1662
1741
  return NULL;
1663
1742
  }
1664
1743
 
1665
- PyObject *temp = MAKE_LIST_EMPTY(0);
1744
+ PyThreadState *tstate = PyThreadState_GET();
1745
+
1746
+ PyObject *temp = MAKE_LIST_EMPTY(tstate, 0);
1666
1747
 
1667
1748
  Py_ssize_t pos = 0;
1668
1749
  PyObject *distribution_name;
1669
1750
 
1670
- PyThreadState *tstate = PyThreadState_GET();
1671
-
1672
1751
  while (Nuitka_DistributionNext(&pos, &distribution_name)) {
1673
1752
  bool include = false;
1674
1753
  if (name == Py_None) {
@@ -1687,6 +1766,12 @@ static PyObject *_nuitka_loader_find_distributions(PyObject *self, PyObject *arg
1687
1766
  if (include) {
1688
1767
  // Create a distribution object from our data.
1689
1768
  PyObject *distribution = Nuitka_Distribution_New(tstate, distribution_name);
1769
+
1770
+ if (distribution == NULL) {
1771
+ Py_DECREF(temp);
1772
+ return NULL;
1773
+ }
1774
+
1690
1775
  LIST_APPEND1(temp, distribution);
1691
1776
  }
1692
1777
  }
@@ -1698,7 +1783,7 @@ static PyObject *_nuitka_loader_find_distributions(PyObject *self, PyObject *arg
1698
1783
  return result;
1699
1784
  }
1700
1785
 
1701
- static char const *_kw_list_sys_path_hook[] = {"context", NULL};
1786
+ static char const *_kw_list_sys_path_hook[] = {"path", NULL};
1702
1787
 
1703
1788
  static PyObject *_nuitka_loader_sys_path_hook(PyObject *self, PyObject *args, PyObject *kwds) {
1704
1789
  PyObject *path;
@@ -1722,7 +1807,7 @@ static PyObject *_nuitka_loader_sys_path_hook(PyObject *self, PyObject *args, Py
1722
1807
 
1723
1808
  while (entry->name != NULL) {
1724
1809
  if ((entry->flags & NUITKA_TRANSLATED_FLAG) != 0) {
1725
- entry->name = UNTRANSLATE(entry->name);
1810
+ entry->name = UN_TRANSLATE(entry->name);
1726
1811
  entry->flags -= NUITKA_TRANSLATED_FLAG;
1727
1812
  }
1728
1813
 
@@ -1779,7 +1864,7 @@ static PyMethodDef Nuitka_Loader_methods[] = {
1779
1864
 
1780
1865
  {"sys_path_hook", (PyCFunction)_nuitka_loader_sys_path_hook, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
1781
1866
 
1782
- {NULL, NULL}
1867
+ {NULL, NULL} // terminator
1783
1868
  };
1784
1869
 
1785
1870
  static PyObject *Nuitka_Loader_tp_repr(struct Nuitka_LoaderObject *loader) {
@@ -1809,15 +1894,29 @@ static void Nuitka_Loader_tp_dealloc(struct Nuitka_LoaderObject *loader) {
1809
1894
 
1810
1895
  static int Nuitka_Loader_tp_traverse(struct Nuitka_LoaderObject *loader, visitproc visit, void *arg) { return 0; }
1811
1896
 
1897
+ static PyObject *Nuitka_Loader_get_name(struct Nuitka_LoaderObject *loader, void *closure) {
1898
+ PyObject *result = Nuitka_String_FromString(loader->m_loader_entry->name);
1899
+
1900
+ return result;
1901
+ }
1902
+ static PyObject *Nuitka_Loader_get_path(struct Nuitka_LoaderObject *loader, void *closure) {
1903
+ PyThreadState *tstate = PyThreadState_GET();
1904
+ PyObject *result = getModuleFileValue(tstate, loader->m_loader_entry);
1905
+
1906
+ return result;
1907
+ }
1908
+
1812
1909
  static PyObject *Nuitka_Loader_get__module__(struct Nuitka_LoaderObject *loader, void *closure) {
1813
1910
  PyObject *result = const_str_plain___nuitka__;
1814
1911
 
1815
- Py_INCREF(result);
1912
+ Py_INCREF_IMMORTAL(result);
1816
1913
  return result;
1817
1914
  }
1818
1915
 
1819
- static PyGetSetDef Nuitka_Loader_getsets[] = {{(char *)"__module__", (getter)Nuitka_Loader_get__module__, NULL, NULL},
1820
- {NULL}};
1916
+ static PyGetSetDef Nuitka_Loader_tp_getset[] = {{(char *)"__module__", (getter)Nuitka_Loader_get__module__, NULL, NULL},
1917
+ {(char *)"name", (getter)Nuitka_Loader_get_name, NULL, NULL},
1918
+ {(char *)"path", (getter)Nuitka_Loader_get_path, NULL, NULL},
1919
+ {NULL}};
1821
1920
 
1822
1921
  PyTypeObject Nuitka_Loader_Type = {
1823
1922
  PyVarObject_HEAD_INIT(NULL, 0) "nuitka_module_loader",
@@ -1848,7 +1947,7 @@ PyTypeObject Nuitka_Loader_Type = {
1848
1947
  0, // tp_iternext
1849
1948
  Nuitka_Loader_methods, // tp_methods
1850
1949
  0, // tp_members
1851
- Nuitka_Loader_getsets, // tp_getset
1950
+ Nuitka_Loader_tp_getset, // tp_getset
1852
1951
  };
1853
1952
 
1854
1953
  /* Used by modules to register child loaders for packages. */
@@ -1863,8 +1962,44 @@ PyObject *Nuitka_Loader_New(struct Nuitka_MetaPathBasedLoaderEntry const *entry)
1863
1962
  return (PyObject *)result;
1864
1963
  }
1865
1964
 
1866
- void registerMetaPathBasedUnfreezer(struct Nuitka_MetaPathBasedLoaderEntry *_loader_entries,
1867
- unsigned char **bytecode_data) {
1965
+ #ifdef _NUITKA_MODULE
1966
+ void updateMetaPathBasedLoaderModuleRoot(char const *module_root_name) {
1967
+ assert(module_root_name != NULL);
1968
+ char const *last_dot = strrchr(module_root_name, '.');
1969
+
1970
+ if (last_dot != NULL) {
1971
+ struct Nuitka_MetaPathBasedLoaderEntry *current = loader_entries;
1972
+ assert(current);
1973
+
1974
+ while (current->name != NULL) {
1975
+ if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
1976
+ current->name = UN_TRANSLATE(current->name);
1977
+ current->flags -= NUITKA_TRANSLATED_FLAG;
1978
+ }
1979
+
1980
+ char name[2048];
1981
+
1982
+ if (strcmp(last_dot + 1, current->name) == 0) {
1983
+ copyStringSafeN(name, module_root_name, last_dot - module_root_name + 1, sizeof(name));
1984
+ appendStringSafe(name, current->name, sizeof(name));
1985
+
1986
+ current->name = strdup(name);
1987
+ } else if (strncmp(last_dot + 1, current->name, strlen(last_dot + 1)) == 0 &&
1988
+ current->name[strlen(last_dot + 1)] == '.') {
1989
+ copyStringSafeN(name, module_root_name, last_dot - module_root_name + 1, sizeof(name));
1990
+ appendStringSafe(name, current->name, sizeof(name));
1991
+
1992
+ current->name = strdup(name);
1993
+ }
1994
+
1995
+ current++;
1996
+ }
1997
+ }
1998
+ }
1999
+ #endif
2000
+
2001
+ void registerMetaPathBasedLoader(struct Nuitka_MetaPathBasedLoaderEntry *_loader_entries,
2002
+ unsigned char **bytecode_data) {
1868
2003
  // Do it only once.
1869
2004
  if (loader_entries) {
1870
2005
  assert(_loader_entries == loader_entries);
@@ -1878,48 +2013,22 @@ void registerMetaPathBasedUnfreezer(struct Nuitka_MetaPathBasedLoaderEntry *_loa
1878
2013
  PySys_WriteStderr("Setup nuitka compiled module/bytecode/extension importer.\n");
1879
2014
  }
1880
2015
 
1881
- #ifdef _NUITKA_MODULE
1882
- if (_Py_PackageContext != NULL) {
1883
- char const *last_dot = strrchr(_Py_PackageContext, '.');
1884
-
1885
- if (last_dot != NULL) {
1886
- struct Nuitka_MetaPathBasedLoaderEntry *current = _loader_entries;
1887
- assert(current);
1888
-
1889
- while (current->name != NULL) {
1890
- if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
1891
- current->name = UNTRANSLATE(current->name);
1892
- current->flags -= NUITKA_TRANSLATED_FLAG;
1893
- }
1894
-
1895
- char name[2048];
1896
-
1897
- if (strcmp(last_dot + 1, current->name) == 0) {
1898
- copyStringSafeN(name, _Py_PackageContext, last_dot - _Py_PackageContext + 1, sizeof(name));
1899
- appendStringSafe(name, current->name, sizeof(name));
1900
-
1901
- current->name = strdup(name);
1902
- } else if (strncmp(last_dot + 1, current->name, strlen(last_dot + 1)) == 0 &&
1903
- current->name[strlen(last_dot + 1)] == '.') {
1904
- copyStringSafeN(name, _Py_PackageContext, last_dot - _Py_PackageContext + 1, sizeof(name));
1905
- appendStringSafe(name, current->name, sizeof(name));
1906
-
1907
- current->name = strdup(name);
1908
- }
2016
+ loader_entries = _loader_entries;
1909
2017
 
1910
- current++;
1911
- }
1912
- }
2018
+ #if defined(_NUITKA_MODULE) && PYTHON_VERSION < 0x3c0
2019
+ if (_Py_PackageContext != NULL) {
2020
+ updateMetaPathBasedLoaderModuleRoot(_Py_PackageContext);
1913
2021
  }
1914
2022
  #endif
1915
2023
 
1916
- loader_entries = _loader_entries;
1917
-
1918
2024
  Nuitka_PyType_Ready(&Nuitka_Loader_Type, NULL, true, false, false, false, false);
1919
2025
 
1920
2026
  #ifdef _NUITKA_EXE
1921
- int res = PyDict_SetItemString((PyObject *)dict_builtin, "__nuitka_loader_type", (PyObject *)&Nuitka_Loader_Type);
1922
- assert(res == 0);
2027
+ {
2028
+ NUITKA_MAY_BE_UNUSED int res =
2029
+ PyDict_SetItemString((PyObject *)dict_builtin, "__nuitka_loader_type", (PyObject *)&Nuitka_Loader_Type);
2030
+ assert(res == 0);
2031
+ }
1923
2032
  #endif
1924
2033
 
1925
2034
  #if PYTHON_VERSION >= 0x370
@@ -1961,6 +2070,7 @@ void setEarlyFrozenModulesFileAttribute(PyThreadState *tstate) {
1961
2070
  PyObject *file_value = MAKE_RELATIVE_PATH_FROM_NAME(Nuitka_String_AsString(key), is_package, false);
1962
2071
  PyObject_SetAttr(value, const_str_plain___file__, file_value);
1963
2072
  Py_DECREF(file_value);
2073
+ CHECK_OBJECT(file_value);
1964
2074
  }
1965
2075
  }
1966
2076
  }
@@ -1972,3 +2082,18 @@ void setEarlyFrozenModulesFileAttribute(PyThreadState *tstate) {
1972
2082
 
1973
2083
  // The importlib distribution class is implemented in a separate file.
1974
2084
  #include "MetaPathBasedLoaderImportlibMetadataDistribution.c"
2085
+
2086
+ // Part of "Nuitka", an optimizing Python compiler that is compatible and
2087
+ // integrates with CPython, but also works on its own.
2088
+ //
2089
+ // Licensed under the Apache License, Version 2.0 (the "License");
2090
+ // you may not use this file except in compliance with the License.
2091
+ // You may obtain a copy of the License at
2092
+ //
2093
+ // http://www.apache.org/licenses/LICENSE-2.0
2094
+ //
2095
+ // Unless required by applicable law or agreed to in writing, software
2096
+ // distributed under the License is distributed on an "AS IS" BASIS,
2097
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2098
+ // See the License for the specific language governing permissions and
2099
+ // limitations under the License.