Nuitka-winsvc 2.7.7__cp313-cp313-win_amd64.whl

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

Potentially problematic release.


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

Files changed (995) hide show
  1. nuitka/Builtins.py +259 -0
  2. nuitka/BytecodeCaching.py +184 -0
  3. nuitka/Bytecodes.py +109 -0
  4. nuitka/CacheCleanup.py +54 -0
  5. nuitka/Constants.py +425 -0
  6. nuitka/Errors.py +93 -0
  7. nuitka/HardImportRegistry.py +408 -0
  8. nuitka/MainControl.py +1201 -0
  9. nuitka/ModuleRegistry.py +364 -0
  10. nuitka/OptionParsing.py +2473 -0
  11. nuitka/Options.py +2948 -0
  12. nuitka/OutputDirectories.py +201 -0
  13. nuitka/PostProcessing.py +551 -0
  14. nuitka/Progress.py +252 -0
  15. nuitka/PythonFlavors.py +426 -0
  16. nuitka/PythonOperators.py +146 -0
  17. nuitka/PythonVersions.py +513 -0
  18. nuitka/Serialization.py +291 -0
  19. nuitka/SourceCodeReferences.py +176 -0
  20. nuitka/Tracing.py +579 -0
  21. nuitka/TreeXML.py +141 -0
  22. nuitka/Variables.py +515 -0
  23. nuitka/Version.py +88 -0
  24. nuitka/__init__.py +19 -0
  25. nuitka/__main__.py +224 -0
  26. nuitka/__past__.py +217 -0
  27. nuitka/build/Backend.scons +1111 -0
  28. nuitka/build/CCompilerVersion.scons +281 -0
  29. nuitka/build/DataComposerInterface.py +116 -0
  30. nuitka/build/Offsets.scons +626 -0
  31. nuitka/build/Onefile.scons +564 -0
  32. nuitka/build/SconsCaching.py +451 -0
  33. nuitka/build/SconsCompilerSettings.py +1133 -0
  34. nuitka/build/SconsHacks.py +215 -0
  35. nuitka/build/SconsInterface.py +664 -0
  36. nuitka/build/SconsProgress.py +100 -0
  37. nuitka/build/SconsSpawn.py +436 -0
  38. nuitka/build/SconsUtils.py +939 -0
  39. nuitka/build/__init__.py +19 -0
  40. nuitka/build/include/nuitka/allocator.h +450 -0
  41. nuitka/build/include/nuitka/builtins.h +97 -0
  42. nuitka/build/include/nuitka/calling.h +123 -0
  43. nuitka/build/include/nuitka/checkers.h +39 -0
  44. nuitka/build/include/nuitka/checksum_tools.h +28 -0
  45. nuitka/build/include/nuitka/compiled_asyncgen.h +281 -0
  46. nuitka/build/include/nuitka/compiled_cell.h +64 -0
  47. nuitka/build/include/nuitka/compiled_coroutine.h +271 -0
  48. nuitka/build/include/nuitka/compiled_frame.h +502 -0
  49. nuitka/build/include/nuitka/compiled_function.h +170 -0
  50. nuitka/build/include/nuitka/compiled_generator.h +287 -0
  51. nuitka/build/include/nuitka/compiled_method.h +54 -0
  52. nuitka/build/include/nuitka/constants.h +251 -0
  53. nuitka/build/include/nuitka/constants_blob.h +34 -0
  54. nuitka/build/include/nuitka/debug_settings.h +60 -0
  55. nuitka/build/include/nuitka/environment_variables.h +30 -0
  56. nuitka/build/include/nuitka/environment_variables_system.h +51 -0
  57. nuitka/build/include/nuitka/exception_groups.h +167 -0
  58. nuitka/build/include/nuitka/exceptions.h +1458 -0
  59. nuitka/build/include/nuitka/filesystem_paths.h +117 -0
  60. nuitka/build/include/nuitka/freelists.h +92 -0
  61. nuitka/build/include/nuitka/hedley.h +1774 -0
  62. nuitka/build/include/nuitka/helper/attributes.h +90 -0
  63. nuitka/build/include/nuitka/helper/boolean.h +86 -0
  64. nuitka/build/include/nuitka/helper/bytearrays.h +34 -0
  65. nuitka/build/include/nuitka/helper/bytes.h +28 -0
  66. nuitka/build/include/nuitka/helper/calling_generated.h +132 -0
  67. nuitka/build/include/nuitka/helper/comparisons_dual_eq.h +47 -0
  68. nuitka/build/include/nuitka/helper/comparisons_dual_ge.h +39 -0
  69. nuitka/build/include/nuitka/helper/comparisons_dual_gt.h +39 -0
  70. nuitka/build/include/nuitka/helper/comparisons_dual_le.h +47 -0
  71. nuitka/build/include/nuitka/helper/comparisons_dual_lt.h +47 -0
  72. nuitka/build/include/nuitka/helper/comparisons_dual_ne.h +39 -0
  73. nuitka/build/include/nuitka/helper/comparisons_eq.h +247 -0
  74. nuitka/build/include/nuitka/helper/comparisons_ge.h +197 -0
  75. nuitka/build/include/nuitka/helper/comparisons_gt.h +197 -0
  76. nuitka/build/include/nuitka/helper/comparisons_le.h +247 -0
  77. nuitka/build/include/nuitka/helper/comparisons_lt.h +247 -0
  78. nuitka/build/include/nuitka/helper/comparisons_ne.h +197 -0
  79. nuitka/build/include/nuitka/helper/complex.h +46 -0
  80. nuitka/build/include/nuitka/helper/dictionaries.h +481 -0
  81. nuitka/build/include/nuitka/helper/floats.h +32 -0
  82. nuitka/build/include/nuitka/helper/import_hard.h +121 -0
  83. nuitka/build/include/nuitka/helper/indexes.h +47 -0
  84. nuitka/build/include/nuitka/helper/ints.h +165 -0
  85. nuitka/build/include/nuitka/helper/iterators.h +376 -0
  86. nuitka/build/include/nuitka/helper/lists.h +94 -0
  87. nuitka/build/include/nuitka/helper/lists_generated.h +36 -0
  88. nuitka/build/include/nuitka/helper/mappings.h +39 -0
  89. nuitka/build/include/nuitka/helper/operations.h +114 -0
  90. nuitka/build/include/nuitka/helper/operations_binary_add.h +240 -0
  91. nuitka/build/include/nuitka/helper/operations_binary_bitand.h +108 -0
  92. nuitka/build/include/nuitka/helper/operations_binary_bitor.h +108 -0
  93. nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +108 -0
  94. nuitka/build/include/nuitka/helper/operations_binary_divmod.h +103 -0
  95. nuitka/build/include/nuitka/helper/operations_binary_dual_add.h +34 -0
  96. nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +103 -0
  97. nuitka/build/include/nuitka/helper/operations_binary_lshift.h +99 -0
  98. nuitka/build/include/nuitka/helper/operations_binary_matmult.h +60 -0
  99. nuitka/build/include/nuitka/helper/operations_binary_mod.h +304 -0
  100. nuitka/build/include/nuitka/helper/operations_binary_mult.h +247 -0
  101. nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +125 -0
  102. nuitka/build/include/nuitka/helper/operations_binary_pow.h +90 -0
  103. nuitka/build/include/nuitka/helper/operations_binary_rshift.h +99 -0
  104. nuitka/build/include/nuitka/helper/operations_binary_sub.h +117 -0
  105. nuitka/build/include/nuitka/helper/operations_binary_truediv.h +103 -0
  106. nuitka/build/include/nuitka/helper/operations_builtin_types.h +247 -0
  107. nuitka/build/include/nuitka/helper/operations_inplace_add.h +173 -0
  108. nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +76 -0
  109. nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +76 -0
  110. nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +76 -0
  111. nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +95 -0
  112. nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +62 -0
  113. nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +60 -0
  114. nuitka/build/include/nuitka/helper/operations_inplace_mod.h +218 -0
  115. nuitka/build/include/nuitka/helper/operations_inplace_mult.h +184 -0
  116. nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +115 -0
  117. nuitka/build/include/nuitka/helper/operations_inplace_pow.h +87 -0
  118. nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +62 -0
  119. nuitka/build/include/nuitka/helper/operations_inplace_sub.h +102 -0
  120. nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +95 -0
  121. nuitka/build/include/nuitka/helper/raising.h +114 -0
  122. nuitka/build/include/nuitka/helper/rangeobjects.h +66 -0
  123. nuitka/build/include/nuitka/helper/richcomparisons.h +35 -0
  124. nuitka/build/include/nuitka/helper/sequences.h +33 -0
  125. nuitka/build/include/nuitka/helper/sets.h +25 -0
  126. nuitka/build/include/nuitka/helper/slices.h +314 -0
  127. nuitka/build/include/nuitka/helper/strings.h +30 -0
  128. nuitka/build/include/nuitka/helper/subscripts.h +390 -0
  129. nuitka/build/include/nuitka/helper/tuples.h +187 -0
  130. nuitka/build/include/nuitka/helpers.h +417 -0
  131. nuitka/build/include/nuitka/importing.h +149 -0
  132. nuitka/build/include/nuitka/incbin.h +402 -0
  133. nuitka/build/include/nuitka/jit_sources.h +25 -0
  134. nuitka/build/include/nuitka/prelude.h +626 -0
  135. nuitka/build/include/nuitka/printing.h +84 -0
  136. nuitka/build/include/nuitka/python_pgo.h +57 -0
  137. nuitka/build/include/nuitka/safe_string_ops.h +57 -0
  138. nuitka/build/include/nuitka/threading.h +142 -0
  139. nuitka/build/include/nuitka/tracing.h +82 -0
  140. nuitka/build/include/nuitka/type_aliases.h +30 -0
  141. nuitka/build/include/nuitka/unfreezing.h +91 -0
  142. nuitka/build/inline_copy/appdirs/LICENSE.txt +23 -0
  143. nuitka/build/inline_copy/appdirs/appdirs.py +611 -0
  144. nuitka/build/inline_copy/atomicwrites/LICENSE +19 -0
  145. nuitka/build/inline_copy/atomicwrites/atomicwrites.py +226 -0
  146. nuitka/build/inline_copy/bin/scons.py +58 -0
  147. nuitka/build/inline_copy/clcache/clcache/LICENSE +30 -0
  148. nuitka/build/inline_copy/clcache/clcache/__init__.py +4 -0
  149. nuitka/build/inline_copy/clcache/clcache/caching.py +2008 -0
  150. nuitka/build/inline_copy/colorama/LICENSE.txt +27 -0
  151. nuitka/build/inline_copy/colorama/colorama/__init__.py +6 -0
  152. nuitka/build/inline_copy/colorama/colorama/ansi.py +102 -0
  153. nuitka/build/inline_copy/colorama/colorama/ansitowin32.py +258 -0
  154. nuitka/build/inline_copy/colorama/colorama/initialise.py +80 -0
  155. nuitka/build/inline_copy/colorama/colorama/win32.py +152 -0
  156. nuitka/build/inline_copy/colorama/colorama/winterm.py +169 -0
  157. nuitka/build/inline_copy/glob2/LICENSE +27 -0
  158. nuitka/build/inline_copy/glob2/glob2/__init__.py +5 -0
  159. nuitka/build/inline_copy/glob2/glob2/compat.py +167 -0
  160. nuitka/build/inline_copy/glob2/glob2/fnmatch.py +141 -0
  161. nuitka/build/inline_copy/glob2/glob2/impl.py +216 -0
  162. nuitka/build/inline_copy/jinja2/LICENSE.rst +28 -0
  163. nuitka/build/inline_copy/jinja2/README.rst +2 -0
  164. nuitka/build/inline_copy/jinja2/jinja2/__init__.py +72 -0
  165. nuitka/build/inline_copy/jinja2/jinja2/_compat.py +105 -0
  166. nuitka/build/inline_copy/jinja2/jinja2/_identifier.py +2 -0
  167. nuitka/build/inline_copy/jinja2/jinja2/bccache.py +361 -0
  168. nuitka/build/inline_copy/jinja2/jinja2/compiler.py +1721 -0
  169. nuitka/build/inline_copy/jinja2/jinja2/constants.py +32 -0
  170. nuitka/build/inline_copy/jinja2/jinja2/debug.py +378 -0
  171. nuitka/build/inline_copy/jinja2/jinja2/defaults.py +56 -0
  172. nuitka/build/inline_copy/jinja2/jinja2/environment.py +1276 -0
  173. nuitka/build/inline_copy/jinja2/jinja2/exceptions.py +146 -0
  174. nuitka/build/inline_copy/jinja2/jinja2/ext.py +627 -0
  175. nuitka/build/inline_copy/jinja2/jinja2/filters.py +1190 -0
  176. nuitka/build/inline_copy/jinja2/jinja2/idtracking.py +286 -0
  177. nuitka/build/inline_copy/jinja2/jinja2/lexer.py +739 -0
  178. nuitka/build/inline_copy/jinja2/jinja2/loaders.py +483 -0
  179. nuitka/build/inline_copy/jinja2/jinja2/meta.py +106 -0
  180. nuitka/build/inline_copy/jinja2/jinja2/nativetypes.py +220 -0
  181. nuitka/build/inline_copy/jinja2/jinja2/nodes.py +999 -0
  182. nuitka/build/inline_copy/jinja2/jinja2/optimizer.py +49 -0
  183. nuitka/build/inline_copy/jinja2/jinja2/parser.py +903 -0
  184. nuitka/build/inline_copy/jinja2/jinja2/runtime.py +808 -0
  185. nuitka/build/inline_copy/jinja2/jinja2/sandbox.py +488 -0
  186. nuitka/build/inline_copy/jinja2/jinja2/tests.py +174 -0
  187. nuitka/build/inline_copy/jinja2/jinja2/utils.py +642 -0
  188. nuitka/build/inline_copy/jinja2/jinja2/visitor.py +87 -0
  189. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Action.py +1475 -0
  190. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Builder.py +905 -0
  191. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/CacheDir.py +314 -0
  192. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Conftest.py +805 -0
  193. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Debug.py +251 -0
  194. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Defaults.py +646 -0
  195. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Environment.py +2561 -0
  196. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/EnvironmentValues.py +119 -0
  197. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Errors.py +222 -0
  198. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Executor.py +660 -0
  199. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Job.py +439 -0
  200. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Memoize.py +242 -0
  201. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/Alias.py +176 -0
  202. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/FS.py +3861 -0
  203. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/Python.py +195 -0
  204. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/__init__.py +1784 -0
  205. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/PathList.py +224 -0
  206. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/__init__.py +341 -0
  207. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/aix.py +81 -0
  208. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/cygwin.py +61 -0
  209. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/darwin.py +70 -0
  210. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/hpux.py +45 -0
  211. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/irix.py +41 -0
  212. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/mingw.py +33 -0
  213. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/os2.py +55 -0
  214. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/posix.py +124 -0
  215. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/sunos.py +47 -0
  216. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/virtualenv.py +115 -0
  217. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/win32.py +429 -0
  218. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/SConf.py +1119 -0
  219. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/SConsign.py +453 -0
  220. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/C.py +226 -0
  221. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/Dir.py +131 -0
  222. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/Prog.py +114 -0
  223. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/RC.py +57 -0
  224. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/__init__.py +436 -0
  225. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/Interactive.py +372 -0
  226. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/Main.py +1469 -0
  227. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/SConsOptions.py +1071 -0
  228. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/SConscript.py +686 -0
  229. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/__init__.py +425 -0
  230. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Subst.py +979 -0
  231. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Taskmaster.py +1062 -0
  232. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/386asm.py +61 -0
  233. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/GettextCommon.py +429 -0
  234. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/__init__.py +52 -0
  235. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/arch.py +66 -0
  236. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/common.py +371 -0
  237. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/netframework.py +83 -0
  238. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/sdk.py +411 -0
  239. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/vc.py +994 -0
  240. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/vs.py +608 -0
  241. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/PharLapCommon.py +116 -0
  242. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/__init__.py +882 -0
  243. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixc++.py +43 -0
  244. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixcc.py +74 -0
  245. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixcxx.py +77 -0
  246. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixlink.py +78 -0
  247. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/applelink.py +209 -0
  248. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ar.py +63 -0
  249. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/as.py +49 -0
  250. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/asm.py +78 -0
  251. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/bcc32.py +81 -0
  252. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/c++.py +44 -0
  253. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cc.py +105 -0
  254. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clang.py +91 -0
  255. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clangCommon/__init__.py +18 -0
  256. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clangxx.py +99 -0
  257. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cxx.py +95 -0
  258. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cyglink.py +212 -0
  259. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/default.py +50 -0
  260. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/filesystem.py +98 -0
  261. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/g++.py +45 -0
  262. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gas.py +56 -0
  263. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gcc.py +110 -0
  264. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gettext_tool.py +69 -0
  265. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gnulink.py +70 -0
  266. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gxx.py +78 -0
  267. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpc++.py +45 -0
  268. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpcc.py +53 -0
  269. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpcxx.py +88 -0
  270. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hplink.py +72 -0
  271. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/icc.py +59 -0
  272. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/icl.py +52 -0
  273. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ilink.py +55 -0
  274. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ilink32.py +60 -0
  275. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/install.py +510 -0
  276. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/intelc.py +617 -0
  277. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/link.py +72 -0
  278. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/LoadableModule.py +131 -0
  279. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/SharedLibrary.py +218 -0
  280. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/__init__.py +171 -0
  281. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkloc.py +112 -0
  282. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/m4.py +63 -0
  283. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/masm.py +77 -0
  284. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mingw.py +232 -0
  285. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msgfmt.py +132 -0
  286. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msginit.py +137 -0
  287. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msgmerge.py +125 -0
  288. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mslib.py +73 -0
  289. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mslink.py +339 -0
  290. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mssdk.py +50 -0
  291. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msvc.py +325 -0
  292. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msvs.py +2116 -0
  293. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mwcc.py +207 -0
  294. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mwld.py +108 -0
  295. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/nasm.py +72 -0
  296. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/rmic.py +139 -0
  297. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/rpcgen.py +70 -0
  298. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgiar.py +68 -0
  299. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgic++.py +43 -0
  300. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgicc.py +53 -0
  301. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgicxx.py +61 -0
  302. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgilink.py +59 -0
  303. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunar.py +64 -0
  304. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunc++.py +45 -0
  305. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/suncc.py +58 -0
  306. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/suncxx.py +153 -0
  307. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunlink.py +79 -0
  308. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/tar.py +73 -0
  309. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/textfile.py +198 -0
  310. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/tlib.py +53 -0
  311. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/wix.py +104 -0
  312. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/xgettext.py +337 -0
  313. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/zip.py +120 -0
  314. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Util.py +2134 -0
  315. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/ConfigureCache.py +171 -0
  316. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/__init__.py +0 -0
  317. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/sconsign.py +494 -0
  318. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/BoolVariable.py +96 -0
  319. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/EnumVariable.py +110 -0
  320. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +152 -0
  321. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/PackageVariable.py +107 -0
  322. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/PathVariable.py +158 -0
  323. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/__init__.py +334 -0
  324. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Warnings.py +238 -0
  325. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/__init__.py +9 -0
  326. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/__init__.py +104 -0
  327. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/_scons_dbm.py +42 -0
  328. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/win32.py +101 -0
  329. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/cpp.py +640 -0
  330. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/dblite.py +295 -0
  331. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/exitfuncs.py +59 -0
  332. nuitka/build/inline_copy/markupsafe/LICENSE.rst +28 -0
  333. nuitka/build/inline_copy/markupsafe/markupsafe/__init__.py +327 -0
  334. nuitka/build/inline_copy/markupsafe/markupsafe/_compat.py +33 -0
  335. nuitka/build/inline_copy/markupsafe/markupsafe/_constants.py +264 -0
  336. nuitka/build/inline_copy/markupsafe/markupsafe/_native.py +69 -0
  337. nuitka/build/inline_copy/pefile/LICENSE.txt +21 -0
  338. nuitka/build/inline_copy/pefile/ordlookup/__init__.py +41 -0
  339. nuitka/build/inline_copy/pefile/ordlookup/oleaut32.py +400 -0
  340. nuitka/build/inline_copy/pefile/ordlookup/ws2_32.py +120 -0
  341. nuitka/build/inline_copy/pefile/pefile.py +8034 -0
  342. nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +3272 -0
  343. nuitka/build/inline_copy/pkg_resources/pkg_resources/py31compat.py +21 -0
  344. nuitka/build/inline_copy/python_hacl/LICENSE.txt +201 -0
  345. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.c +1430 -0
  346. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.h +66 -0
  347. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.c +463 -0
  348. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.h +66 -0
  349. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.c +1273 -0
  350. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.h +204 -0
  351. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.c +734 -0
  352. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.h +131 -0
  353. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Streaming_Types.h +83 -0
  354. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt128_Verified.h +346 -0
  355. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt_8_16_32_64.h +107 -0
  356. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/fstar_uint128_struct_endianness.h +68 -0
  357. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/internal/target.h +293 -0
  358. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/lowstar_endianness.h +231 -0
  359. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/types.h +14 -0
  360. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_MD5.h +56 -0
  361. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA1.h +56 -0
  362. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA2.h +164 -0
  363. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA3.h +65 -0
  364. nuitka/build/inline_copy/python_hacl/hacl_312/python_hacl_namespaces.h +89 -0
  365. nuitka/build/inline_copy/stubgen/astunparse.py +938 -0
  366. nuitka/build/inline_copy/stubgen/six.py +998 -0
  367. nuitka/build/inline_copy/stubgen/stubgen.py +484 -0
  368. nuitka/build/inline_copy/tqdm/tqdm/__init__.py +40 -0
  369. nuitka/build/inline_copy/tqdm/tqdm/_main.py +9 -0
  370. nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +97 -0
  371. nuitka/build/inline_copy/tqdm/tqdm/_tqdm.py +9 -0
  372. nuitka/build/inline_copy/tqdm/tqdm/_tqdm_notebook.py +9 -0
  373. nuitka/build/inline_copy/tqdm/tqdm/_tqdm_pandas.py +24 -0
  374. nuitka/build/inline_copy/tqdm/tqdm/_utils.py +12 -0
  375. nuitka/build/inline_copy/tqdm/tqdm/auto.py +44 -0
  376. nuitka/build/inline_copy/tqdm/tqdm/autonotebook.py +28 -0
  377. nuitka/build/inline_copy/tqdm/tqdm/dask.py +46 -0
  378. nuitka/build/inline_copy/tqdm/tqdm/notebook.py +316 -0
  379. nuitka/build/inline_copy/tqdm/tqdm/std.py +1524 -0
  380. nuitka/build/inline_copy/tqdm/tqdm/tk.py +207 -0
  381. nuitka/build/inline_copy/tqdm/tqdm/utils.py +351 -0
  382. nuitka/build/inline_copy/tqdm/tqdm/version.py +2 -0
  383. nuitka/build/inline_copy/yaml/LICENSE +20 -0
  384. nuitka/build/inline_copy/yaml/yaml/__init__.py +427 -0
  385. nuitka/build/inline_copy/yaml/yaml/composer.py +139 -0
  386. nuitka/build/inline_copy/yaml/yaml/constructor.py +748 -0
  387. nuitka/build/inline_copy/yaml/yaml/cyaml.py +101 -0
  388. nuitka/build/inline_copy/yaml/yaml/dumper.py +62 -0
  389. nuitka/build/inline_copy/yaml/yaml/emitter.py +1137 -0
  390. nuitka/build/inline_copy/yaml/yaml/error.py +75 -0
  391. nuitka/build/inline_copy/yaml/yaml/events.py +86 -0
  392. nuitka/build/inline_copy/yaml/yaml/loader.py +63 -0
  393. nuitka/build/inline_copy/yaml/yaml/nodes.py +49 -0
  394. nuitka/build/inline_copy/yaml/yaml/parser.py +589 -0
  395. nuitka/build/inline_copy/yaml/yaml/reader.py +185 -0
  396. nuitka/build/inline_copy/yaml/yaml/representer.py +389 -0
  397. nuitka/build/inline_copy/yaml/yaml/resolver.py +227 -0
  398. nuitka/build/inline_copy/yaml/yaml/scanner.py +1435 -0
  399. nuitka/build/inline_copy/yaml/yaml/serializer.py +111 -0
  400. nuitka/build/inline_copy/yaml/yaml/tokens.py +104 -0
  401. nuitka/build/inline_copy/zlib/LICENSE +22 -0
  402. nuitka/build/inline_copy/zlib/crc32.c +1049 -0
  403. nuitka/build/inline_copy/zlib/crc32.h +9446 -0
  404. nuitka/build/inline_copy/zlib/zconf.h +551 -0
  405. nuitka/build/inline_copy/zlib/zlib.h +1938 -0
  406. nuitka/build/inline_copy/zlib/zutil.h +275 -0
  407. nuitka/build/inline_copy/zstd/LICENSE.txt +30 -0
  408. nuitka/build/inline_copy/zstd/common/bitstream.h +463 -0
  409. nuitka/build/inline_copy/zstd/common/compiler.h +288 -0
  410. nuitka/build/inline_copy/zstd/common/cpu.h +213 -0
  411. nuitka/build/inline_copy/zstd/common/debug.h +107 -0
  412. nuitka/build/inline_copy/zstd/common/entropy_common.c +360 -0
  413. nuitka/build/inline_copy/zstd/common/error_private.c +56 -0
  414. nuitka/build/inline_copy/zstd/common/error_private.h +80 -0
  415. nuitka/build/inline_copy/zstd/common/fse.h +715 -0
  416. nuitka/build/inline_copy/zstd/common/fse_decompress.c +393 -0
  417. nuitka/build/inline_copy/zstd/common/huf.h +361 -0
  418. nuitka/build/inline_copy/zstd/common/mem.h +426 -0
  419. nuitka/build/inline_copy/zstd/common/xxhash.c +826 -0
  420. nuitka/build/inline_copy/zstd/common/xxhash.h +285 -0
  421. nuitka/build/inline_copy/zstd/common/zstd_common.c +83 -0
  422. nuitka/build/inline_copy/zstd/common/zstd_deps.h +111 -0
  423. nuitka/build/inline_copy/zstd/common/zstd_errors.h +95 -0
  424. nuitka/build/inline_copy/zstd/common/zstd_internal.h +478 -0
  425. nuitka/build/inline_copy/zstd/decompress/huf_decompress.c +1350 -0
  426. nuitka/build/inline_copy/zstd/decompress/zstd_ddict.c +244 -0
  427. nuitka/build/inline_copy/zstd/decompress/zstd_ddict.h +44 -0
  428. nuitka/build/inline_copy/zstd/decompress/zstd_decompress.c +1930 -0
  429. nuitka/build/inline_copy/zstd/decompress/zstd_decompress_block.c +1540 -0
  430. nuitka/build/inline_copy/zstd/decompress/zstd_decompress_block.h +62 -0
  431. nuitka/build/inline_copy/zstd/decompress/zstd_decompress_internal.h +190 -0
  432. nuitka/build/inline_copy/zstd/zstd.h +2391 -0
  433. nuitka/build/static_src/CompiledAsyncgenType.c +2211 -0
  434. nuitka/build/static_src/CompiledCellType.c +300 -0
  435. nuitka/build/static_src/CompiledCodeHelpers.c +2160 -0
  436. nuitka/build/static_src/CompiledCoroutineType.c +1946 -0
  437. nuitka/build/static_src/CompiledFrameType.c +1337 -0
  438. nuitka/build/static_src/CompiledFunctionType.c +3320 -0
  439. nuitka/build/static_src/CompiledGeneratorType.c +1997 -0
  440. nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +2117 -0
  441. nuitka/build/static_src/CompiledMethodType.c +614 -0
  442. nuitka/build/static_src/GenerateHeadersMain.c +30 -0
  443. nuitka/build/static_src/HelpersAllocator.c +939 -0
  444. nuitka/build/static_src/HelpersAttributes.c +1241 -0
  445. nuitka/build/static_src/HelpersBuiltin.c +901 -0
  446. nuitka/build/static_src/HelpersBuiltinTypeMethods.c +3594 -0
  447. nuitka/build/static_src/HelpersBytes.c +107 -0
  448. nuitka/build/static_src/HelpersCalling.c +397 -0
  449. nuitka/build/static_src/HelpersCallingGenerated.c +14361 -0
  450. nuitka/build/static_src/HelpersChecksumTools.c +59 -0
  451. nuitka/build/static_src/HelpersClasses.c +91 -0
  452. nuitka/build/static_src/HelpersComparisonDualEq.c +183 -0
  453. nuitka/build/static_src/HelpersComparisonDualGe.c +121 -0
  454. nuitka/build/static_src/HelpersComparisonDualGt.c +121 -0
  455. nuitka/build/static_src/HelpersComparisonDualLe.c +183 -0
  456. nuitka/build/static_src/HelpersComparisonDualLt.c +183 -0
  457. nuitka/build/static_src/HelpersComparisonDualNe.c +121 -0
  458. nuitka/build/static_src/HelpersComparisonEq.c +12070 -0
  459. nuitka/build/static_src/HelpersComparisonEqUtils.c +169 -0
  460. nuitka/build/static_src/HelpersComparisonGe.c +11871 -0
  461. nuitka/build/static_src/HelpersComparisonGt.c +11855 -0
  462. nuitka/build/static_src/HelpersComparisonLe.c +11957 -0
  463. nuitka/build/static_src/HelpersComparisonLt.c +11941 -0
  464. nuitka/build/static_src/HelpersComparisonNe.c +11979 -0
  465. nuitka/build/static_src/HelpersConsole.c +124 -0
  466. nuitka/build/static_src/HelpersConstantsBlob.c +1487 -0
  467. nuitka/build/static_src/HelpersDeepcopy.c +636 -0
  468. nuitka/build/static_src/HelpersDictionaries.c +1739 -0
  469. nuitka/build/static_src/HelpersDictionariesGenerated.c +738 -0
  470. nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
  471. nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
  472. nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +97 -0
  473. nuitka/build/static_src/HelpersExceptions.c +298 -0
  474. nuitka/build/static_src/HelpersFiles.c +353 -0
  475. nuitka/build/static_src/HelpersFilesystemPaths.c +1322 -0
  476. nuitka/build/static_src/HelpersFloats.c +92 -0
  477. nuitka/build/static_src/HelpersHeapStorage.c +68 -0
  478. nuitka/build/static_src/HelpersImport.c +506 -0
  479. nuitka/build/static_src/HelpersImportHard.c +526 -0
  480. nuitka/build/static_src/HelpersJitSources.c +48 -0
  481. nuitka/build/static_src/HelpersLists.c +899 -0
  482. nuitka/build/static_src/HelpersListsGenerated.c +564 -0
  483. nuitka/build/static_src/HelpersMappings.c +46 -0
  484. nuitka/build/static_src/HelpersMatching.c +192 -0
  485. nuitka/build/static_src/HelpersOperationBinaryAdd.c +6477 -0
  486. nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +703 -0
  487. nuitka/build/static_src/HelpersOperationBinaryBitand.c +2738 -0
  488. nuitka/build/static_src/HelpersOperationBinaryBitor.c +2738 -0
  489. nuitka/build/static_src/HelpersOperationBinaryBitxor.c +2738 -0
  490. nuitka/build/static_src/HelpersOperationBinaryDivmod.c +2406 -0
  491. nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +33 -0
  492. nuitka/build/static_src/HelpersOperationBinaryDualAdd.c +172 -0
  493. nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +2422 -0
  494. nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +220 -0
  495. nuitka/build/static_src/HelpersOperationBinaryLshift.c +2846 -0
  496. nuitka/build/static_src/HelpersOperationBinaryMatmult.c +453 -0
  497. nuitka/build/static_src/HelpersOperationBinaryMod.c +6549 -0
  498. nuitka/build/static_src/HelpersOperationBinaryMult.c +6438 -0
  499. nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +125 -0
  500. nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +2355 -0
  501. nuitka/build/static_src/HelpersOperationBinaryPow.c +2743 -0
  502. nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +26 -0
  503. nuitka/build/static_src/HelpersOperationBinaryRshift.c +2706 -0
  504. nuitka/build/static_src/HelpersOperationBinarySub.c +2649 -0
  505. nuitka/build/static_src/HelpersOperationBinaryTruediv.c +2415 -0
  506. nuitka/build/static_src/HelpersOperationInplaceAdd.c +5211 -0
  507. nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +144 -0
  508. nuitka/build/static_src/HelpersOperationInplaceBitand.c +1826 -0
  509. nuitka/build/static_src/HelpersOperationInplaceBitor.c +1826 -0
  510. nuitka/build/static_src/HelpersOperationInplaceBitxor.c +1826 -0
  511. nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +2605 -0
  512. nuitka/build/static_src/HelpersOperationInplaceLshift.c +1594 -0
  513. nuitka/build/static_src/HelpersOperationInplaceMatmult.c +603 -0
  514. nuitka/build/static_src/HelpersOperationInplaceMod.c +4762 -0
  515. nuitka/build/static_src/HelpersOperationInplaceMult.c +4689 -0
  516. nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +2553 -0
  517. nuitka/build/static_src/HelpersOperationInplacePow.c +2807 -0
  518. nuitka/build/static_src/HelpersOperationInplaceRshift.c +1534 -0
  519. nuitka/build/static_src/HelpersOperationInplaceSub.c +2894 -0
  520. nuitka/build/static_src/HelpersOperationInplaceTruediv.c +2612 -0
  521. nuitka/build/static_src/HelpersProfiling.c +104 -0
  522. nuitka/build/static_src/HelpersPythonPgo.c +113 -0
  523. nuitka/build/static_src/HelpersRaising.c +447 -0
  524. nuitka/build/static_src/HelpersSafeStrings.c +185 -0
  525. nuitka/build/static_src/HelpersSequences.c +134 -0
  526. nuitka/build/static_src/HelpersSlices.c +73 -0
  527. nuitka/build/static_src/HelpersStrings.c +998 -0
  528. nuitka/build/static_src/HelpersTuples.c +148 -0
  529. nuitka/build/static_src/HelpersTypes.c +329 -0
  530. nuitka/build/static_src/InspectPatcher.c +439 -0
  531. nuitka/build/static_src/MainProgram.c +2060 -0
  532. nuitka/build/static_src/MetaPathBasedLoader.c +2290 -0
  533. nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +125 -0
  534. nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +158 -0
  535. nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +785 -0
  536. nuitka/build/static_src/OnefileBootstrap.c +1580 -0
  537. nuitka/build/static_src/OnefileSplashScreen.cpp +275 -0
  538. nuitka/code_generation/AsyncgenCodes.py +186 -0
  539. nuitka/code_generation/AttributeCodes.py +357 -0
  540. nuitka/code_generation/BinaryOperationHelperDefinitions.py +720 -0
  541. nuitka/code_generation/BranchCodes.py +67 -0
  542. nuitka/code_generation/BuiltinCodes.py +529 -0
  543. nuitka/code_generation/CallCodes.py +1186 -0
  544. nuitka/code_generation/ClassCodes.py +156 -0
  545. nuitka/code_generation/CodeGeneration.py +1078 -0
  546. nuitka/code_generation/CodeHelperSelection.py +81 -0
  547. nuitka/code_generation/CodeHelpers.py +455 -0
  548. nuitka/code_generation/CodeObjectCodes.py +165 -0
  549. nuitka/code_generation/ComparisonCodes.py +569 -0
  550. nuitka/code_generation/ComparisonHelperDefinitions.py +146 -0
  551. nuitka/code_generation/ConditionalCodes.py +236 -0
  552. nuitka/code_generation/ConstantCodes.py +243 -0
  553. nuitka/code_generation/Contexts.py +1248 -0
  554. nuitka/code_generation/CoroutineCodes.py +253 -0
  555. nuitka/code_generation/CtypesCodes.py +46 -0
  556. nuitka/code_generation/DictCodes.py +918 -0
  557. nuitka/code_generation/Emission.py +75 -0
  558. nuitka/code_generation/ErrorCodes.py +281 -0
  559. nuitka/code_generation/EvalCodes.py +444 -0
  560. nuitka/code_generation/ExceptionCodes.py +337 -0
  561. nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +227 -0
  562. nuitka/code_generation/ExpressionCodes.py +61 -0
  563. nuitka/code_generation/FrameCodes.py +518 -0
  564. nuitka/code_generation/FunctionCodes.py +858 -0
  565. nuitka/code_generation/GeneratorCodes.py +218 -0
  566. nuitka/code_generation/GlobalConstants.py +249 -0
  567. nuitka/code_generation/GlobalsLocalsCodes.py +211 -0
  568. nuitka/code_generation/IdCodes.py +53 -0
  569. nuitka/code_generation/ImportCodes.py +468 -0
  570. nuitka/code_generation/Indentation.py +45 -0
  571. nuitka/code_generation/IndexCodes.py +50 -0
  572. nuitka/code_generation/InjectCCodes.py +28 -0
  573. nuitka/code_generation/IntegerCodes.py +110 -0
  574. nuitka/code_generation/IteratorCodes.py +378 -0
  575. nuitka/code_generation/JitCodes.py +44 -0
  576. nuitka/code_generation/LabelCodes.py +68 -0
  577. nuitka/code_generation/LineNumberCodes.py +91 -0
  578. nuitka/code_generation/ListCodes.py +502 -0
  579. nuitka/code_generation/LoaderCodes.py +193 -0
  580. nuitka/code_generation/LocalsDictCodes.py +359 -0
  581. nuitka/code_generation/LoopCodes.py +88 -0
  582. nuitka/code_generation/MatchCodes.py +67 -0
  583. nuitka/code_generation/ModuleCodes.py +247 -0
  584. nuitka/code_generation/Namify.py +260 -0
  585. nuitka/code_generation/NetworkxCodes.py +51 -0
  586. nuitka/code_generation/OperationCodes.py +398 -0
  587. nuitka/code_generation/PackageResourceCodes.py +986 -0
  588. nuitka/code_generation/PrintCodes.py +93 -0
  589. nuitka/code_generation/PythonAPICodes.py +215 -0
  590. nuitka/code_generation/RaisingCodes.py +481 -0
  591. nuitka/code_generation/Reports.py +115 -0
  592. nuitka/code_generation/ReturnCodes.py +143 -0
  593. nuitka/code_generation/SetCodes.py +196 -0
  594. nuitka/code_generation/SliceCodes.py +465 -0
  595. nuitka/code_generation/StringCodes.py +303 -0
  596. nuitka/code_generation/SubscriptCodes.py +263 -0
  597. nuitka/code_generation/TensorflowCodes.py +54 -0
  598. nuitka/code_generation/TryCodes.py +326 -0
  599. nuitka/code_generation/TupleCodes.py +115 -0
  600. nuitka/code_generation/TypeAliasCodes.py +120 -0
  601. nuitka/code_generation/VariableCodes.py +519 -0
  602. nuitka/code_generation/VariableDeclarations.py +279 -0
  603. nuitka/code_generation/YieldCodes.py +253 -0
  604. nuitka/code_generation/__init__.py +19 -0
  605. nuitka/code_generation/c_types/CTypeBases.py +177 -0
  606. nuitka/code_generation/c_types/CTypeBooleans.py +104 -0
  607. nuitka/code_generation/c_types/CTypeCFloats.py +57 -0
  608. nuitka/code_generation/c_types/CTypeCLongs.py +45 -0
  609. nuitka/code_generation/c_types/CTypeModuleDictVariables.py +109 -0
  610. nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +150 -0
  611. nuitka/code_generation/c_types/CTypeNuitkaInts.py +200 -0
  612. nuitka/code_generation/c_types/CTypeNuitkaVoids.py +107 -0
  613. nuitka/code_generation/c_types/CTypePyObjectPointers.py +572 -0
  614. nuitka/code_generation/c_types/CTypeVoids.py +92 -0
  615. nuitka/code_generation/c_types/__init__.py +19 -0
  616. nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +106 -0
  617. nuitka/code_generation/templates/CodeTemplatesConstants.py +296 -0
  618. nuitka/code_generation/templates/CodeTemplatesCoroutines.py +109 -0
  619. nuitka/code_generation/templates/CodeTemplatesExceptions.py +84 -0
  620. nuitka/code_generation/templates/CodeTemplatesFrames.py +235 -0
  621. nuitka/code_generation/templates/CodeTemplatesFunction.py +117 -0
  622. nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +130 -0
  623. nuitka/code_generation/templates/CodeTemplatesIterators.py +40 -0
  624. nuitka/code_generation/templates/CodeTemplatesLoader.py +180 -0
  625. nuitka/code_generation/templates/CodeTemplatesModules.py +710 -0
  626. nuitka/code_generation/templates/CodeTemplatesVariables.py +388 -0
  627. nuitka/code_generation/templates/TemplateDebugWrapper.py +80 -0
  628. nuitka/code_generation/templates/__init__.py +19 -0
  629. nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +321 -0
  630. nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +143 -0
  631. nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +677 -0
  632. nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +165 -0
  633. nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +38 -0
  634. nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +41 -0
  635. nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +53 -0
  636. nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +364 -0
  637. nuitka/code_generation/templates_c/HelperImportHard.c.j2 +37 -0
  638. nuitka/code_generation/templates_c/HelperLongTools.c.j2 +53 -0
  639. nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +20 -0
  640. nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +148 -0
  641. nuitka/code_generation/templates_c/HelperOperationBinaryDual.c.j2 +115 -0
  642. nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +352 -0
  643. nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +115 -0
  644. nuitka/code_generation/templates_c/HelperOperationComparisonDual.c.j2 +86 -0
  645. nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +31 -0
  646. nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +32 -0
  647. nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +112 -0
  648. nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +157 -0
  649. nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +115 -0
  650. nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +99 -0
  651. nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +115 -0
  652. nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +281 -0
  653. nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +420 -0
  654. nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +51 -0
  655. nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +71 -0
  656. nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +327 -0
  657. nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +411 -0
  658. nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +59 -0
  659. nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +229 -0
  660. nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +47 -0
  661. nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +55 -0
  662. nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +58 -0
  663. nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +62 -0
  664. nuitka/containers/Namedtuples.py +51 -0
  665. nuitka/containers/OrderedDicts.py +191 -0
  666. nuitka/containers/OrderedSets.py +123 -0
  667. nuitka/containers/OrderedSetsFallback.py +139 -0
  668. nuitka/containers/__init__.py +19 -0
  669. nuitka/distutils/Build.py +76 -0
  670. nuitka/distutils/DistutilCommands.py +438 -0
  671. nuitka/distutils/__init__.py +19 -0
  672. nuitka/finalizations/Finalization.py +35 -0
  673. nuitka/finalizations/FinalizeMarkups.py +136 -0
  674. nuitka/finalizations/__init__.py +19 -0
  675. nuitka/freezer/DependsExe.py +257 -0
  676. nuitka/freezer/DllDependenciesCommon.py +97 -0
  677. nuitka/freezer/DllDependenciesMacOS.py +444 -0
  678. nuitka/freezer/DllDependenciesPosix.py +242 -0
  679. nuitka/freezer/DllDependenciesWin32.py +315 -0
  680. nuitka/freezer/ImportDetection.py +359 -0
  681. nuitka/freezer/IncludedDataFiles.py +689 -0
  682. nuitka/freezer/IncludedEntryPoints.py +376 -0
  683. nuitka/freezer/Onefile.py +296 -0
  684. nuitka/freezer/Standalone.py +520 -0
  685. nuitka/freezer/__init__.py +19 -0
  686. nuitka/importing/IgnoreListing.py +449 -0
  687. nuitka/importing/ImportCache.py +95 -0
  688. nuitka/importing/ImportResolving.py +186 -0
  689. nuitka/importing/Importing.py +1200 -0
  690. nuitka/importing/PreloadedPackages.py +164 -0
  691. nuitka/importing/Recursion.py +611 -0
  692. nuitka/importing/StandardLibrary.py +429 -0
  693. nuitka/importing/__init__.py +19 -0
  694. nuitka/nodes/AsyncgenNodes.py +107 -0
  695. nuitka/nodes/AttributeLookupNodes.py +124 -0
  696. nuitka/nodes/AttributeNodes.py +386 -0
  697. nuitka/nodes/AttributeNodesGenerated.py +10734 -0
  698. nuitka/nodes/BuiltinAllNodes.py +115 -0
  699. nuitka/nodes/BuiltinAnyNodes.py +124 -0
  700. nuitka/nodes/BuiltinComplexNodes.py +83 -0
  701. nuitka/nodes/BuiltinDecodingNodes.py +52 -0
  702. nuitka/nodes/BuiltinDecoratorNodes.py +85 -0
  703. nuitka/nodes/BuiltinDictNodes.py +140 -0
  704. nuitka/nodes/BuiltinFormatNodes.py +159 -0
  705. nuitka/nodes/BuiltinHashNodes.py +63 -0
  706. nuitka/nodes/BuiltinInputNodes.py +39 -0
  707. nuitka/nodes/BuiltinIntegerNodes.py +170 -0
  708. nuitka/nodes/BuiltinIteratorNodes.py +391 -0
  709. nuitka/nodes/BuiltinLenNodes.py +61 -0
  710. nuitka/nodes/BuiltinNextNodes.py +111 -0
  711. nuitka/nodes/BuiltinOpenNodes.py +148 -0
  712. nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +7367 -0
  713. nuitka/nodes/BuiltinRangeNodes.py +690 -0
  714. nuitka/nodes/BuiltinRefNodes.py +314 -0
  715. nuitka/nodes/BuiltinSumNodes.py +104 -0
  716. nuitka/nodes/BuiltinTypeNodes.py +454 -0
  717. nuitka/nodes/BuiltinVarsNodes.py +44 -0
  718. nuitka/nodes/BytesNodes.py +829 -0
  719. nuitka/nodes/CallNodes.py +217 -0
  720. nuitka/nodes/Checkers.py +55 -0
  721. nuitka/nodes/ChildrenHavingMixins.py +21576 -0
  722. nuitka/nodes/ClassNodes.py +286 -0
  723. nuitka/nodes/CodeObjectSpecs.py +230 -0
  724. nuitka/nodes/ComparisonNodes.py +687 -0
  725. nuitka/nodes/ConditionalNodes.py +884 -0
  726. nuitka/nodes/ConstantRefNodes.py +1717 -0
  727. nuitka/nodes/ContainerMakingNodes.py +408 -0
  728. nuitka/nodes/ContainerOperationNodes.py +87 -0
  729. nuitka/nodes/CoroutineNodes.py +144 -0
  730. nuitka/nodes/CtypesNodes.py +51 -0
  731. nuitka/nodes/DictionaryNodes.py +1513 -0
  732. nuitka/nodes/ExceptionNodes.py +393 -0
  733. nuitka/nodes/ExecEvalNodes.py +229 -0
  734. nuitka/nodes/ExpressionBases.py +1301 -0
  735. nuitka/nodes/ExpressionBasesGenerated.py +2103 -0
  736. nuitka/nodes/ExpressionShapeMixins.py +886 -0
  737. nuitka/nodes/FrameNodes.py +413 -0
  738. nuitka/nodes/FunctionAttributeNodes.py +102 -0
  739. nuitka/nodes/FunctionNodes.py +1303 -0
  740. nuitka/nodes/FutureSpecs.py +224 -0
  741. nuitka/nodes/GeneratorNodes.py +201 -0
  742. nuitka/nodes/GlobalsLocalsNodes.py +209 -0
  743. nuitka/nodes/HardImportNodesGenerated.py +3599 -0
  744. nuitka/nodes/ImportHardNodes.py +185 -0
  745. nuitka/nodes/ImportNodes.py +1366 -0
  746. nuitka/nodes/IndicatorMixins.py +79 -0
  747. nuitka/nodes/InjectCNodes.py +51 -0
  748. nuitka/nodes/IterationHandles.py +407 -0
  749. nuitka/nodes/KeyValuePairNodes.py +378 -0
  750. nuitka/nodes/ListOperationNodes.py +525 -0
  751. nuitka/nodes/LocalsDictNodes.py +717 -0
  752. nuitka/nodes/LocalsScopes.py +505 -0
  753. nuitka/nodes/LoopNodes.py +445 -0
  754. nuitka/nodes/MatchNodes.py +60 -0
  755. nuitka/nodes/ModuleAttributeNodes.py +180 -0
  756. nuitka/nodes/ModuleNodes.py +1137 -0
  757. nuitka/nodes/NetworkxNodes.py +45 -0
  758. nuitka/nodes/NodeBases.py +890 -0
  759. nuitka/nodes/NodeMakingHelpers.py +481 -0
  760. nuitka/nodes/NodeMetaClasses.py +172 -0
  761. nuitka/nodes/OperatorNodes.py +944 -0
  762. nuitka/nodes/OperatorNodesUnary.py +403 -0
  763. nuitka/nodes/OsSysNodes.py +215 -0
  764. nuitka/nodes/OutlineNodes.py +372 -0
  765. nuitka/nodes/PackageMetadataNodes.py +982 -0
  766. nuitka/nodes/PackageResourceNodes.py +424 -0
  767. nuitka/nodes/PrintNodes.py +105 -0
  768. nuitka/nodes/ReturnNodes.py +255 -0
  769. nuitka/nodes/SideEffectNodes.py +139 -0
  770. nuitka/nodes/SliceNodes.py +386 -0
  771. nuitka/nodes/StatementBasesGenerated.py +3419 -0
  772. nuitka/nodes/StatementNodes.py +316 -0
  773. nuitka/nodes/StrNodes.py +919 -0
  774. nuitka/nodes/StringConcatenationNodes.py +103 -0
  775. nuitka/nodes/SubscriptNodes.py +245 -0
  776. nuitka/nodes/TensorflowNodes.py +38 -0
  777. nuitka/nodes/TryNodes.py +519 -0
  778. nuitka/nodes/TypeMatchNodes.py +65 -0
  779. nuitka/nodes/TypeNodes.py +390 -0
  780. nuitka/nodes/VariableAssignNodes.py +1177 -0
  781. nuitka/nodes/VariableDelNodes.py +320 -0
  782. nuitka/nodes/VariableNameNodes.py +153 -0
  783. nuitka/nodes/VariableRefNodes.py +895 -0
  784. nuitka/nodes/VariableReleaseNodes.py +153 -0
  785. nuitka/nodes/YieldNodes.py +121 -0
  786. nuitka/nodes/__init__.py +19 -0
  787. nuitka/nodes/shapes/BuiltinTypeShapes.py +4290 -0
  788. nuitka/nodes/shapes/ControlFlowDescriptions.py +199 -0
  789. nuitka/nodes/shapes/IteratorShapes.py +71 -0
  790. nuitka/nodes/shapes/ShapeMixins.py +255 -0
  791. nuitka/nodes/shapes/StandardShapes.py +1384 -0
  792. nuitka/nodes/shapes/__init__.py +19 -0
  793. nuitka/optimizations/BytecodeDemotion.py +105 -0
  794. nuitka/optimizations/FunctionInlining.py +110 -0
  795. nuitka/optimizations/Graphs.py +70 -0
  796. nuitka/optimizations/Optimization.py +363 -0
  797. nuitka/optimizations/OptimizeBuiltinCalls.py +1582 -0
  798. nuitka/optimizations/Tags.py +76 -0
  799. nuitka/optimizations/TraceCollections.py +1257 -0
  800. nuitka/optimizations/ValueTraces.py +980 -0
  801. nuitka/optimizations/__init__.py +19 -0
  802. nuitka/pgo/PGO.py +160 -0
  803. nuitka/pgo/__init__.py +19 -0
  804. nuitka/plugins/PluginBase.py +1924 -0
  805. nuitka/plugins/Plugins.py +2007 -0
  806. nuitka/plugins/YamlPluginBase.py +121 -0
  807. nuitka/plugins/__init__.py +19 -0
  808. nuitka/plugins/standard/AntiBloatPlugin.py +1024 -0
  809. nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +95 -0
  810. nuitka/plugins/standard/DataFilesPlugin.py +311 -0
  811. nuitka/plugins/standard/DelvewheelPlugin.py +150 -0
  812. nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
  813. nuitka/plugins/standard/DillPlugin/cloudpickle-postLoad.py +67 -0
  814. nuitka/plugins/standard/DillPlugin/dill-postLoad.py +223 -0
  815. nuitka/plugins/standard/DillPlugin.py +137 -0
  816. nuitka/plugins/standard/DllFilesPlugin.py +527 -0
  817. nuitka/plugins/standard/EnumPlugin.py +64 -0
  818. nuitka/plugins/standard/EventletPlugin.py +57 -0
  819. nuitka/plugins/standard/GeventPlugin.py +64 -0
  820. nuitka/plugins/standard/GiPlugin.py +118 -0
  821. nuitka/plugins/standard/GlfwPlugin.py +138 -0
  822. nuitka/plugins/standard/ImplicitImports.py +845 -0
  823. nuitka/plugins/standard/KivyPlugin.py +141 -0
  824. nuitka/plugins/standard/MatplotlibPlugin.py +256 -0
  825. nuitka/plugins/standard/MultiprocessingPlugin.py +199 -0
  826. nuitka/plugins/standard/NumpyPlugin.py +35 -0
  827. nuitka/plugins/standard/OptionsNannyPlugin.py +158 -0
  828. nuitka/plugins/standard/PbrPlugin.py +62 -0
  829. nuitka/plugins/standard/PkgResourcesPlugin.py +162 -0
  830. nuitka/plugins/standard/PlaywrightPlugin.py +179 -0
  831. nuitka/plugins/standard/PmwPlugin.py +248 -0
  832. nuitka/plugins/standard/PySidePyQtPlugin.py +1666 -0
  833. nuitka/plugins/standard/PywebViewPlugin.py +81 -0
  834. nuitka/plugins/standard/SpacyPlugin.py +137 -0
  835. nuitka/plugins/standard/TensorflowPlugin.py +35 -0
  836. nuitka/plugins/standard/TkinterPlugin.py +416 -0
  837. nuitka/plugins/standard/TorchPlugin.py +35 -0
  838. nuitka/plugins/standard/TransformersPlugin.py +121 -0
  839. nuitka/plugins/standard/TrioPlugin.py +33 -0
  840. nuitka/plugins/standard/UpxPlugin.py +174 -0
  841. nuitka/plugins/standard/__init__.py +19 -0
  842. nuitka/plugins/standard/standard.nuitka-package.config.yml +9313 -0
  843. nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +78 -0
  844. nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +468 -0
  845. nuitka/reports/CompilationReportReader.py +83 -0
  846. nuitka/reports/LicenseReport.rst.j2 +41 -0
  847. nuitka/reports/Reports.py +961 -0
  848. nuitka/reports/__init__.py +19 -0
  849. nuitka/specs/BuiltinBytesOperationSpecs.py +180 -0
  850. nuitka/specs/BuiltinDictOperationSpecs.py +82 -0
  851. nuitka/specs/BuiltinListOperationSpecs.py +80 -0
  852. nuitka/specs/BuiltinParameterSpecs.py +831 -0
  853. nuitka/specs/BuiltinStrOperationSpecs.py +181 -0
  854. nuitka/specs/BuiltinTypeOperationSpecs.py +34 -0
  855. nuitka/specs/BuiltinUnicodeOperationSpecs.py +123 -0
  856. nuitka/specs/HardImportSpecs.py +236 -0
  857. nuitka/specs/ParameterSpecs.py +630 -0
  858. nuitka/specs/__init__.py +19 -0
  859. nuitka/tools/Basics.py +55 -0
  860. nuitka/tools/__init__.py +19 -0
  861. nuitka/tools/commercial/__init__.py +21 -0
  862. nuitka/tools/data_composer/DataComposer.py +593 -0
  863. nuitka/tools/data_composer/__init__.py +19 -0
  864. nuitka/tools/data_composer/__main__.py +41 -0
  865. nuitka/tools/environments/CreateEnvironment.py +69 -0
  866. nuitka/tools/environments/Virtualenv.py +158 -0
  867. nuitka/tools/environments/__init__.py +19 -0
  868. nuitka/tools/general/__init__.py +19 -0
  869. nuitka/tools/general/dll_report/__init__.py +19 -0
  870. nuitka/tools/general/dll_report/__main__.py +83 -0
  871. nuitka/tools/general/find_module/FindModuleCode.py +127 -0
  872. nuitka/tools/general/find_module/__init__.py +19 -0
  873. nuitka/tools/general/generate_header/GenerateHeader.py +73 -0
  874. nuitka/tools/general/generate_header/__init__.py +19 -0
  875. nuitka/tools/onefile_compressor/OnefileCompressor.py +390 -0
  876. nuitka/tools/onefile_compressor/__init__.py +19 -0
  877. nuitka/tools/onefile_compressor/__main__.py +41 -0
  878. nuitka/tools/podman/Podman.py +55 -0
  879. nuitka/tools/podman/__init__.py +19 -0
  880. nuitka/tools/podman/__main__.py +425 -0
  881. nuitka/tools/profiler/__init__.py +19 -0
  882. nuitka/tools/profiler/__main__.py +93 -0
  883. nuitka/tools/scanning/DisplayDistributions.py +39 -0
  884. nuitka/tools/scanning/DisplayPackageDLLs.py +151 -0
  885. nuitka/tools/scanning/DisplayPackageData.py +73 -0
  886. nuitka/tools/scanning/__init__.py +19 -0
  887. nuitka/tools/specialize/CTypeDescriptions.py +1928 -0
  888. nuitka/tools/specialize/Common.py +380 -0
  889. nuitka/tools/specialize/SpecializeC.py +1483 -0
  890. nuitka/tools/specialize/SpecializePython.py +1151 -0
  891. nuitka/tools/specialize/__init__.py +19 -0
  892. nuitka/tools/testing/Common.py +2007 -0
  893. nuitka/tools/testing/Constructs.py +53 -0
  894. nuitka/tools/testing/DocTests.py +156 -0
  895. nuitka/tools/testing/OutputComparison.py +313 -0
  896. nuitka/tools/testing/Pythons.py +34 -0
  897. nuitka/tools/testing/RuntimeTracing.py +260 -0
  898. nuitka/tools/testing/SearchModes.py +208 -0
  899. nuitka/tools/testing/Valgrind.py +103 -0
  900. nuitka/tools/testing/__init__.py +19 -0
  901. nuitka/tools/testing/check_reference_counts/__init__.py +19 -0
  902. nuitka/tools/testing/check_reference_counts/__main__.py +107 -0
  903. nuitka/tools/testing/compare_with_cpython/__init__.py +19 -0
  904. nuitka/tools/testing/compare_with_cpython/__main__.py +942 -0
  905. nuitka/tools/testing/find_sxs_modules/__init__.py +19 -0
  906. nuitka/tools/testing/find_sxs_modules/__main__.py +73 -0
  907. nuitka/tools/testing/measure_construct_performance/__init__.py +19 -0
  908. nuitka/tools/testing/measure_construct_performance/__main__.py +288 -0
  909. nuitka/tools/testing/run_nuitka_tests/__init__.py +19 -0
  910. nuitka/tools/testing/run_nuitka_tests/__main__.py +1091 -0
  911. nuitka/tools/watch/AutoStage.py +145 -0
  912. nuitka/tools/watch/Common.py +55 -0
  913. nuitka/tools/watch/Conda.py +125 -0
  914. nuitka/tools/watch/GitHub.py +113 -0
  915. nuitka/tools/watch/Pacman.py +73 -0
  916. nuitka/tools/watch/Pipenv.py +145 -0
  917. nuitka/tools/watch/__init__.py +19 -0
  918. nuitka/tools/watch/__main__.py +615 -0
  919. nuitka/tree/Building.py +1459 -0
  920. nuitka/tree/ComplexCallHelperFunctions.py +2150 -0
  921. nuitka/tree/Extractions.py +48 -0
  922. nuitka/tree/FutureSpecState.py +71 -0
  923. nuitka/tree/InternalModule.py +96 -0
  924. nuitka/tree/Operations.py +45 -0
  925. nuitka/tree/ReformulationAssertStatements.py +97 -0
  926. nuitka/tree/ReformulationAssignmentStatements.py +1260 -0
  927. nuitka/tree/ReformulationBooleanExpressions.py +97 -0
  928. nuitka/tree/ReformulationCallExpressions.py +314 -0
  929. nuitka/tree/ReformulationClasses.py +407 -0
  930. nuitka/tree/ReformulationClasses3.py +1149 -0
  931. nuitka/tree/ReformulationComparisonExpressions.py +174 -0
  932. nuitka/tree/ReformulationContractionExpressions.py +676 -0
  933. nuitka/tree/ReformulationDictionaryCreation.py +304 -0
  934. nuitka/tree/ReformulationExecStatements.py +386 -0
  935. nuitka/tree/ReformulationForLoopStatements.py +215 -0
  936. nuitka/tree/ReformulationFunctionStatements.py +931 -0
  937. nuitka/tree/ReformulationImportStatements.py +333 -0
  938. nuitka/tree/ReformulationLambdaExpressions.py +185 -0
  939. nuitka/tree/ReformulationMatchStatements.py +797 -0
  940. nuitka/tree/ReformulationMultidist.py +80 -0
  941. nuitka/tree/ReformulationNamespacePackages.py +239 -0
  942. nuitka/tree/ReformulationPrintStatements.py +127 -0
  943. nuitka/tree/ReformulationSequenceCreation.py +438 -0
  944. nuitka/tree/ReformulationSubscriptExpressions.py +123 -0
  945. nuitka/tree/ReformulationTryExceptStatements.py +418 -0
  946. nuitka/tree/ReformulationTryFinallyStatements.py +239 -0
  947. nuitka/tree/ReformulationWhileLoopStatements.py +160 -0
  948. nuitka/tree/ReformulationWithStatements.py +382 -0
  949. nuitka/tree/ReformulationYieldExpressions.py +133 -0
  950. nuitka/tree/SourceHandling.py +476 -0
  951. nuitka/tree/SyntaxErrors.py +143 -0
  952. nuitka/tree/TreeHelpers.py +720 -0
  953. nuitka/tree/VariableClosure.py +483 -0
  954. nuitka/tree/__init__.py +19 -0
  955. nuitka/utils/AppDirs.py +104 -0
  956. nuitka/utils/CStrings.py +208 -0
  957. nuitka/utils/CommandLineOptions.py +207 -0
  958. nuitka/utils/Distributions.py +728 -0
  959. nuitka/utils/Download.py +217 -0
  960. nuitka/utils/Execution.py +517 -0
  961. nuitka/utils/FileOperations.py +1587 -0
  962. nuitka/utils/Hashing.py +137 -0
  963. nuitka/utils/Images.py +79 -0
  964. nuitka/utils/Importing.py +335 -0
  965. nuitka/utils/InlineCopies.py +52 -0
  966. nuitka/utils/InstalledPythons.py +254 -0
  967. nuitka/utils/InstanceCounters.py +86 -0
  968. nuitka/utils/Jinja2.py +158 -0
  969. nuitka/utils/Json.py +40 -0
  970. nuitka/utils/MacOSApp.py +134 -0
  971. nuitka/utils/MemoryUsage.py +165 -0
  972. nuitka/utils/ModuleNames.py +317 -0
  973. nuitka/utils/PackageResources.py +44 -0
  974. nuitka/utils/ReExecute.py +152 -0
  975. nuitka/utils/Rest.py +60 -0
  976. nuitka/utils/SharedLibraries.py +1014 -0
  977. nuitka/utils/Shebang.py +113 -0
  978. nuitka/utils/Signing.py +144 -0
  979. nuitka/utils/SlotMetaClasses.py +57 -0
  980. nuitka/utils/StaticLibraries.py +260 -0
  981. nuitka/utils/ThreadedExecutor.py +87 -0
  982. nuitka/utils/Timing.py +102 -0
  983. nuitka/utils/Utils.py +483 -0
  984. nuitka/utils/WindowsFileUsage.py +337 -0
  985. nuitka/utils/WindowsResources.py +652 -0
  986. nuitka/utils/Yaml.py +247 -0
  987. nuitka/utils/__init__.py +19 -0
  988. nuitka_winsvc-2.7.7.data/scripts/nuitka-run.cmd +24 -0
  989. nuitka_winsvc-2.7.7.data/scripts/nuitka.cmd +30 -0
  990. nuitka_winsvc-2.7.7.dist-info/METADATA +115 -0
  991. nuitka_winsvc-2.7.7.dist-info/RECORD +995 -0
  992. nuitka_winsvc-2.7.7.dist-info/WHEEL +5 -0
  993. nuitka_winsvc-2.7.7.dist-info/entry_points.txt +7 -0
  994. nuitka_winsvc-2.7.7.dist-info/licenses/LICENSE.txt +202 -0
  995. nuitka_winsvc-2.7.7.dist-info/top_level.txt +1 -0
@@ -0,0 +1,2290 @@
1
+ // Copyright 2025, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
2
+
3
+ // This implements the loading of C compiled modules and shared library
4
+ // extension modules bundled for standalone mode.
5
+
6
+ // This is achieved mainly by registered a "sys.meta_path" loader, that then
7
+ // gets asked for module names, and responds if knows about one. It's fed by
8
+ // a table created at compile time.
9
+
10
+ // The nature and use of these 2 loaded module kinds is very different, but
11
+ // having them as distinct loaders would only require to duplicate the search
12
+ // and registering of stuff.
13
+
14
+ // This file is included from another C file, help IDEs to still parse it on
15
+ // its own.
16
+ #ifdef __IDE_ONLY__
17
+ #include "nuitka/prelude.h"
18
+ #endif
19
+
20
+ #include "nuitka/unfreezing.h"
21
+
22
+ #ifdef _WIN32
23
+ #include <windows.h>
24
+ #endif
25
+
26
+ extern PyTypeObject Nuitka_Loader_Type;
27
+
28
+ struct Nuitka_LoaderObject {
29
+ /* Python object folklore: */
30
+ PyObject_HEAD
31
+
32
+ /* The loader entry, to know what was loaded exactly. */
33
+ struct Nuitka_MetaPathBasedLoaderEntry const *m_loader_entry;
34
+ };
35
+
36
+ #if _NUITKA_EXE_MODE
37
+ static inline bool isVerbose(void) { return Py_VerboseFlag != 0; }
38
+ #elif _NUITKA_SYSFLAG_VERBOSE
39
+ static inline bool isVerbose(void) { return true; }
40
+ #else
41
+ static inline bool isVerbose(void) { return false; }
42
+ #endif
43
+
44
+ static struct Nuitka_MetaPathBasedLoaderEntry *loader_entries = NULL;
45
+
46
+ static bool hasFrozenModule(char const *name) {
47
+ for (struct _frozen const *p = PyImport_FrozenModules; p != NULL; p++) {
48
+ if (p->name == NULL) {
49
+ return false;
50
+ }
51
+
52
+ if (strcmp(p->name, name) == 0) {
53
+ break;
54
+ }
55
+ }
56
+
57
+ return true;
58
+ }
59
+
60
+ static char *appendModuleNameAsPath(char *buffer, char const *module_name, size_t buffer_size) {
61
+ // Skip to the end
62
+ while (*buffer != 0) {
63
+ buffer++;
64
+ buffer_size -= 1;
65
+ }
66
+
67
+ while (*module_name) {
68
+ if (buffer_size < 1) {
69
+ abort();
70
+ }
71
+
72
+ if (*module_name == '.') {
73
+ *buffer++ = SEP;
74
+ module_name++;
75
+ } else {
76
+ *buffer++ = *module_name++;
77
+ }
78
+
79
+ buffer_size -= 1;
80
+ }
81
+
82
+ *buffer = 0;
83
+
84
+ return buffer;
85
+ }
86
+
87
+ #if defined(_WIN32) && _NUITKA_STANDALONE_MODE
88
+
89
+ static void appendModuleNameAsPathW(wchar_t *buffer, PyObject *module_name, size_t buffer_size) {
90
+ Py_ssize_t size;
91
+ wchar_t const *module_name_wstr = Nuitka_UnicodeAsWideString(module_name, &size);
92
+
93
+ while (size > 0) {
94
+ wchar_t c = *module_name_wstr++;
95
+ size -= 1;
96
+
97
+ if (c == L'.') {
98
+ c = FILENAME_SEP_CHAR;
99
+ }
100
+
101
+ appendWCharSafeW(buffer, c, buffer_size);
102
+ }
103
+ }
104
+ #endif
105
+
106
+ // TODO: This updates the wrong absolute path. We ought to change it to
107
+ // the "module_path_name" at the time of writing it, then we save a few
108
+ // bytes in the blob, and don't have to create that string here.
109
+ #if _NUITKA_STANDALONE_MODE
110
+ static void patchCodeObjectPaths(PyCodeObject *code_object, PyObject *module_path) {
111
+ code_object->co_filename = module_path;
112
+ Py_INCREF(module_path);
113
+
114
+ Py_ssize_t consts_count = PyTuple_GET_SIZE(code_object->co_consts);
115
+
116
+ for (Py_ssize_t i = 0; i < consts_count; i++) {
117
+ PyObject *constant = PyTuple_GET_ITEM(code_object->co_consts, i);
118
+
119
+ if (PyCode_Check(constant)) {
120
+ patchCodeObjectPaths((PyCodeObject *)constant, module_path);
121
+ }
122
+ }
123
+ }
124
+ #endif
125
+
126
+ NUITKA_MAY_BE_UNUSED static PyObject *MAKE_RELATIVE_PATH_FROM_NAME(char const *name, bool is_package, bool dir_only) {
127
+ char buffer[MAXPATHLEN + 1] = {0};
128
+
129
+ appendModuleNameAsPath(buffer, name, sizeof(buffer));
130
+
131
+ if (dir_only == false) {
132
+ if (is_package) {
133
+ appendCharSafe(buffer, SEP, sizeof(buffer));
134
+ appendStringSafe(buffer, "__init__.py", sizeof(buffer));
135
+ } else {
136
+ appendStringSafe(buffer, ".py", sizeof(buffer));
137
+ }
138
+ } else {
139
+ if (is_package == false) {
140
+ char *sep = strrchr(buffer, SEP);
141
+ if (sep) {
142
+ *sep = 0;
143
+ } else {
144
+ buffer[0] = '.';
145
+ buffer[1] = 0;
146
+ }
147
+ }
148
+ }
149
+
150
+ PyObject *module_path_entry_base = Nuitka_String_FromString(buffer);
151
+
152
+ PyObject *result = MAKE_RELATIVE_PATH(module_path_entry_base);
153
+
154
+ Py_DECREF(module_path_entry_base);
155
+
156
+ return result;
157
+ }
158
+
159
+ static PyObject *_makeDunderPathObject(PyThreadState *tstate, PyObject *module_path_entry) {
160
+ CHECK_OBJECT(module_path_entry);
161
+
162
+ PyObject *path_list = MAKE_LIST_EMPTY(tstate, 1);
163
+ if (unlikely(path_list == NULL)) {
164
+ return NULL;
165
+ }
166
+
167
+ PyList_SET_ITEM0(path_list, 0, module_path_entry);
168
+
169
+ CHECK_OBJECT(path_list);
170
+ return path_list;
171
+ }
172
+
173
+ static PyObject *loadModuleFromCodeObject(PyThreadState *tstate, PyObject *module, PyCodeObject *code_object,
174
+ char const *name, bool is_package) {
175
+ assert(code_object != NULL);
176
+
177
+ {
178
+ NUITKA_MAY_BE_UNUSED bool b_res = Nuitka_SetModuleString(name, module);
179
+ assert(b_res != false);
180
+ }
181
+
182
+ char buffer[MAXPATHLEN + 1] = {0};
183
+
184
+ PyObject *module_path_entry = NULL;
185
+
186
+ if (is_package) {
187
+ appendModuleNameAsPath(buffer, name, sizeof(buffer));
188
+ PyObject *module_path_entry_base = Nuitka_String_FromString(buffer);
189
+
190
+ module_path_entry = MAKE_RELATIVE_PATH(module_path_entry_base);
191
+ Py_DECREF(module_path_entry_base);
192
+
193
+ appendCharSafe(buffer, SEP, sizeof(buffer));
194
+ appendStringSafe(buffer, "__init__.py", sizeof(buffer));
195
+ } else {
196
+ appendModuleNameAsPath(buffer, name, sizeof(buffer));
197
+ appendStringSafe(buffer, ".py", sizeof(buffer));
198
+ }
199
+
200
+ PyObject *module_path_name = Nuitka_String_FromString(buffer);
201
+
202
+ PyObject *module_path = MAKE_RELATIVE_PATH(module_path_name);
203
+ Py_DECREF(module_path_name);
204
+
205
+ if (is_package) {
206
+ /* Set __path__ properly, unlike frozen module importer does. */
207
+ PyObject *path_list = _makeDunderPathObject(tstate, module_path_entry);
208
+
209
+ int res = PyObject_SetAttr(module, const_str_plain___path__, path_list);
210
+ if (unlikely(res != 0)) {
211
+ return NULL;
212
+ }
213
+
214
+ Py_DECREF(path_list);
215
+
216
+ PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___name__);
217
+ CHECK_OBJECT(module_name);
218
+
219
+ res = PyObject_SetAttr(module, const_str_plain___package__, module_name);
220
+
221
+ if (unlikely(res != 0)) {
222
+ return NULL;
223
+ }
224
+ }
225
+
226
+ #if _NUITKA_STANDALONE_MODE
227
+ patchCodeObjectPaths(code_object, module_path);
228
+ #endif
229
+
230
+ PGO_onModuleEntered(name);
231
+ module = PyImport_ExecCodeModuleEx((char *)name, (PyObject *)code_object, Nuitka_String_AsString(module_path));
232
+ PGO_onModuleExit(name, module == NULL);
233
+
234
+ Py_DECREF(module_path);
235
+
236
+ return module;
237
+ }
238
+
239
+ static struct Nuitka_MetaPathBasedLoaderEntry *findEntry(char const *name) {
240
+ struct Nuitka_MetaPathBasedLoaderEntry *current = loader_entries;
241
+ assert(current);
242
+
243
+ while (current->name != NULL) {
244
+ if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
245
+ current->name = UN_TRANSLATE(current->name);
246
+ current->flags -= NUITKA_TRANSLATED_FLAG;
247
+ }
248
+
249
+ if (strcmp(name, current->name) == 0) {
250
+ return current;
251
+ }
252
+
253
+ current++;
254
+ }
255
+
256
+ return NULL;
257
+ }
258
+
259
+ #if !_NUITKA_STANDALONE_MODE
260
+ static struct Nuitka_MetaPathBasedLoaderEntry *findContainingPackageEntry(char const *name) {
261
+ struct Nuitka_MetaPathBasedLoaderEntry *current = loader_entries;
262
+
263
+ // Consider the package name of the searched entry.
264
+ char const *package_name_end = strrchr(name, '.');
265
+ if (package_name_end == NULL) {
266
+ return NULL;
267
+ }
268
+
269
+ size_t length = package_name_end - name;
270
+
271
+ while (current->name != NULL) {
272
+ if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
273
+ current->name = UN_TRANSLATE(current->name);
274
+ current->flags -= NUITKA_TRANSLATED_FLAG;
275
+ }
276
+
277
+ if ((current->flags & NUITKA_PACKAGE_FLAG) != 0) {
278
+ if (strlen(current->name) == length && strncmp(name, current->name, length) == 0) {
279
+ return current;
280
+ }
281
+ }
282
+
283
+ current++;
284
+ }
285
+
286
+ return NULL;
287
+ }
288
+
289
+ static PyObject *_getFileList(PyThreadState *tstate, PyObject *dirname) {
290
+ static PyObject *listdir_func = NULL;
291
+
292
+ // TODO: Use OS_LISTDIR instead.
293
+
294
+ if (listdir_func == NULL) {
295
+ listdir_func = PyObject_GetAttrString(IMPORT_HARD_OS(), "listdir");
296
+ }
297
+
298
+ if (unlikely(listdir_func == NULL)) {
299
+ return NULL;
300
+ }
301
+
302
+ PyObject *result = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, listdir_func, dirname);
303
+
304
+ return result;
305
+ }
306
+
307
+ #if PYTHON_VERSION < 0x300
308
+ static PyObject *_getImportingSuffixesByPriority(PyThreadState *tstate, int kind) {
309
+ static PyObject *result = NULL;
310
+
311
+ if (result == NULL) {
312
+ result = MAKE_LIST_EMPTY(tstate, 0);
313
+
314
+ PyObject *imp_module = PyImport_ImportModule("imp");
315
+ PyObject *get_suffixes_func = PyObject_GetAttrString(imp_module, "get_suffixes");
316
+
317
+ PyObject *suffix_list = CALL_FUNCTION_NO_ARGS(tstate, get_suffixes_func);
318
+
319
+ for (int i = 0; i < PyList_GET_SIZE(suffix_list); i++) {
320
+ PyObject *module_kind = PyTuple_GET_ITEM(PyList_GET_ITEM(suffix_list, i), 2);
321
+
322
+ if (PyInt_AsLong(module_kind) == kind) {
323
+ LIST_APPEND0(result, PyTuple_GET_ITEM(PyList_GET_ITEM(suffix_list, i), 0));
324
+ }
325
+ }
326
+
327
+ Py_DECREF(suffix_list);
328
+ }
329
+
330
+ return result;
331
+ }
332
+ #endif
333
+
334
+ static PyObject *getExtensionModuleSuffixesByPriority(PyThreadState *tstate) {
335
+ static PyObject *result = NULL;
336
+
337
+ if (result == NULL) {
338
+ #if PYTHON_VERSION < 0x300
339
+ result = _getImportingSuffixesByPriority(tstate, 3);
340
+ #else
341
+ static PyObject *machinery_module = NULL;
342
+
343
+ if (machinery_module == NULL) {
344
+ machinery_module = PyImport_ImportModule("importlib.machinery");
345
+ }
346
+
347
+ result = PyObject_GetAttrString(machinery_module, "EXTENSION_SUFFIXES");
348
+ #endif
349
+ }
350
+
351
+ CHECK_OBJECT(result);
352
+ return result;
353
+ }
354
+
355
+ static PyObject *installed_extension_modules = NULL;
356
+
357
+ static bool scanModuleInPackagePath(PyThreadState *tstate, PyObject *module_name, char const *parent_module_name) {
358
+ PyObject *sys_modules = Nuitka_GetSysModules();
359
+
360
+ PyObject *parent_module = PyDict_GetItemString(sys_modules, parent_module_name);
361
+ CHECK_OBJECT(parent_module);
362
+
363
+ PyObject *parent_path = PyObject_GetAttr(parent_module, const_str_plain___path__);
364
+
365
+ // Accept that it might be deleted.
366
+ if (parent_path == NULL || !PyList_Check(parent_path)) {
367
+ return false;
368
+ }
369
+
370
+ PyObject *candidates = MAKE_LIST_EMPTY(tstate, 0);
371
+
372
+ // Search only relative to the parent name of course.
373
+ char const *module_relative_name_str = Nuitka_String_AsString(module_name) + strlen(parent_module_name) + 1;
374
+
375
+ Py_ssize_t parent_path_size = PyList_GET_SIZE(parent_path);
376
+
377
+ for (Py_ssize_t i = 0; i < parent_path_size; i += 1) {
378
+ PyObject *path_element = PyList_GET_ITEM(parent_path, i);
379
+
380
+ PyObject *filenames_list = _getFileList(tstate, path_element);
381
+
382
+ if (filenames_list == NULL) {
383
+ CLEAR_ERROR_OCCURRED(tstate);
384
+ continue;
385
+ }
386
+
387
+ Py_ssize_t filenames_list_size = PyList_GET_SIZE(filenames_list);
388
+
389
+ for (Py_ssize_t j = 0; j < filenames_list_size; j += 1) {
390
+ PyObject *filename = PyList_GET_ITEM(filenames_list, j);
391
+
392
+ if (Nuitka_String_CheckExact(filename)) {
393
+ char const *filename_str = Nuitka_String_AsString(filename);
394
+
395
+ if (strncmp(filename_str, module_relative_name_str, strlen(module_relative_name_str)) == 0 &&
396
+ filename_str[strlen(module_relative_name_str)] == '.') {
397
+ LIST_APPEND1(candidates, MAKE_TUPLE2(tstate, path_element, filename));
398
+ }
399
+ }
400
+ }
401
+ }
402
+
403
+ #if 0
404
+ PRINT_STRING("CANDIDATES:");
405
+ PRINT_STRING(Nuitka_String_AsString(module_name));
406
+ PRINT_STRING(module_relative_name_str);
407
+ PRINT_ITEM(candidates);
408
+ PRINT_NEW_LINE();
409
+ #endif
410
+
411
+ // Look up C-extension suffixes, these are used with highest priority.
412
+ PyObject *suffix_list = getExtensionModuleSuffixesByPriority(tstate);
413
+
414
+ bool result = false;
415
+
416
+ for (Py_ssize_t i = 0; i < PyList_GET_SIZE(suffix_list); i += 1) {
417
+ PyObject *suffix = PyList_GET_ITEM(suffix_list, i);
418
+
419
+ char const *suffix_str = Nuitka_String_AsString(suffix);
420
+
421
+ for (Py_ssize_t j = 0; j < PyList_GET_SIZE(candidates); j += 1) {
422
+ PyObject *entry = PyList_GET_ITEM(candidates, j);
423
+
424
+ PyObject *directory = PyTuple_GET_ITEM(entry, 0);
425
+ PyObject *candidate = PyTuple_GET_ITEM(entry, 1);
426
+
427
+ char const *candidate_str = Nuitka_String_AsString(candidate);
428
+
429
+ if (strcmp(suffix_str, candidate_str + strlen(module_relative_name_str)) == 0) {
430
+ PyObject *fullpath = JOIN_PATH2(directory, candidate);
431
+
432
+ if (installed_extension_modules == NULL) {
433
+ installed_extension_modules = MAKE_DICT_EMPTY(tstate);
434
+ }
435
+
436
+ // Force path to unicode, to have easier consumption, as we need a wchar_t or char *
437
+ // from it later, and we don't want to test there.
438
+ #if PYTHON_VERSION < 0x300 && defined(_WIN32)
439
+ PyObject *tmp = PyUnicode_FromObject(fullpath);
440
+ Py_DECREF(fullpath);
441
+ fullpath = tmp;
442
+ #endif
443
+
444
+ DICT_SET_ITEM(installed_extension_modules, module_name, fullpath);
445
+
446
+ result = true;
447
+ break;
448
+ }
449
+ }
450
+ }
451
+
452
+ Py_DECREF(candidates);
453
+
454
+ return result;
455
+ }
456
+
457
+ static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full_name, const filename_char_t *filename,
458
+ bool is_package);
459
+
460
+ static PyObject *callIntoInstalledExtensionModule(PyThreadState *tstate, PyObject *module_name,
461
+ PyObject *extension_module_filename) {
462
+ #if _WIN32
463
+ // We can rely on unicode object to be there in case of Windows, to have an easier time to
464
+ // create the string needed.
465
+ assert(PyUnicode_CheckExact(extension_module_filename));
466
+
467
+ wchar_t const *extension_module_filename_str = Nuitka_UnicodeAsWideString(extension_module_filename, NULL);
468
+ #else
469
+ char const *extension_module_filename_str = Nuitka_String_AsString(extension_module_filename);
470
+ #endif
471
+
472
+ // TODO: The value of "is_package" is guessed, maybe infer from filename being
473
+ // a "__init__.so" and the like.
474
+ return callIntoExtensionModule(tstate, Nuitka_String_AsString(module_name), extension_module_filename_str, false);
475
+ }
476
+
477
+ #endif
478
+
479
+ static char const *getEntryModeString(struct Nuitka_MetaPathBasedLoaderEntry const *entry) {
480
+ char const *mode = "compiled";
481
+
482
+ if ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0) {
483
+ mode = "extension";
484
+ } else if ((entry->flags & NUITKA_BYTECODE_FLAG) != 0) {
485
+ mode = "bytecode";
486
+ }
487
+
488
+ return mode;
489
+ }
490
+
491
+ static char *_kw_list_find_module[] = {(char *)"fullname", (char *)"unused", NULL};
492
+
493
+ static PyObject *_nuitka_loader_find_module(PyObject *self, PyObject *args, PyObject *kwds) {
494
+ PyObject *module_name;
495
+ PyObject *unused;
496
+
497
+ int res = PyArg_ParseTupleAndKeywords(args, kwds, "O|O:find_module", (char **)_kw_list_find_module, &module_name,
498
+ &unused);
499
+
500
+ if (unlikely(res == 0)) {
501
+ return NULL;
502
+ }
503
+
504
+ char const *name = Nuitka_String_AsString(module_name);
505
+
506
+ if (isVerbose()) {
507
+ PySys_WriteStderr("import %s # considering responsibility (find_module)\n", name);
508
+ }
509
+
510
+ struct Nuitka_MetaPathBasedLoaderEntry *entry = findEntry(name);
511
+
512
+ if (entry) {
513
+ if (isVerbose()) {
514
+ PySys_WriteStderr("import %s # claimed responsibility (%s)\n", name, getEntryModeString(entry));
515
+ }
516
+
517
+ PyObject *metapath_based_loader = (PyObject *)&Nuitka_Loader_Type;
518
+
519
+ Py_INCREF(metapath_based_loader);
520
+ return metapath_based_loader;
521
+ }
522
+
523
+ if (hasFrozenModule(name)) {
524
+ if (isVerbose()) {
525
+ PySys_WriteStderr("import %s # claimed responsibility (frozen)\n", name);
526
+ }
527
+
528
+ PyObject *metapath_based_loader = (PyObject *)&Nuitka_Loader_Type;
529
+
530
+ Py_INCREF(metapath_based_loader);
531
+ return metapath_based_loader;
532
+ }
533
+
534
+ #if !_NUITKA_STANDALONE_MODE
535
+ entry = findContainingPackageEntry(name);
536
+
537
+ if (entry != NULL) {
538
+ PyThreadState *tstate = PyThreadState_GET();
539
+
540
+ bool result = scanModuleInPackagePath(tstate, module_name, entry->name);
541
+
542
+ if (result) {
543
+ PyObject *metapath_based_loader = (PyObject *)&Nuitka_Loader_Type;
544
+
545
+ Py_INCREF(metapath_based_loader);
546
+ return metapath_based_loader;
547
+ }
548
+ }
549
+ #endif
550
+
551
+ if (isVerbose()) {
552
+ PySys_WriteStderr("import %s # denied responsibility\n", name);
553
+ }
554
+
555
+ Py_INCREF_IMMORTAL(Py_None);
556
+ return Py_None;
557
+ }
558
+
559
+ static char const *_kw_list_get_data[] = {"filename", NULL};
560
+
561
+ static PyObject *_nuitka_loader_get_data(PyObject *self, PyObject *args, PyObject *kwds) {
562
+ PyObject *filename;
563
+
564
+ int res = PyArg_ParseTupleAndKeywords(args, kwds, "O:get_data", (char **)_kw_list_get_data, &filename);
565
+
566
+ if (unlikely(res == 0)) {
567
+ return NULL;
568
+ }
569
+
570
+ PyThreadState *tstate = PyThreadState_GET();
571
+
572
+ return GET_FILE_BYTES(tstate, filename);
573
+ }
574
+
575
+ static void setModuleFileValue(PyThreadState *tstate, PyObject *module, filename_char_t const *filename) {
576
+ CHECK_OBJECT(module);
577
+ assert(filename != NULL);
578
+
579
+ assert(PyModule_Check(module));
580
+
581
+ PyObject *dict = PyModule_GetDict(module);
582
+
583
+ // TODO: We should have DICT_SET_ITEM0/1 for these things.
584
+ PyObject *new_file_value = Nuitka_String_FromFilename(filename);
585
+ DICT_SET_ITEM(dict, const_str_plain___file__, new_file_value);
586
+ Py_DECREF(new_file_value);
587
+ }
588
+
589
+ #if PYTHON_VERSION < 0x300
590
+ typedef void (*entrypoint_t)(void);
591
+ #else
592
+ typedef PyObject *(*entrypoint_t)(void);
593
+ #endif
594
+
595
+ #ifndef _WIN32
596
+ // Shared libraries loading.
597
+ #include <dlfcn.h>
598
+ #endif
599
+
600
+ #if PYTHON_VERSION >= 0x350
601
+ static PyObject *createModuleSpec(PyThreadState *tstate, PyObject *module_name, PyObject *origin, bool is_package);
602
+ #endif
603
+
604
+ static void _fillExtensionModuleDllEntryFunctionName(PyThreadState *tstate, char *buffer, size_t buffer_size,
605
+ char const *name) {
606
+
607
+ #if PYTHON_VERSION >= 0x350
608
+ PyObject *name_bytes_obj = PyBytes_FromString(name);
609
+ PyObject *name_obj = BYTES_DECODE2(tstate, name_bytes_obj, Nuitka_String_FromString("utf8"));
610
+ Py_DECREF(name_bytes_obj);
611
+
612
+ PyObject *name_ascii = UNICODE_ENCODE2(tstate, name_obj, const_str_plain_ascii);
613
+
614
+ if (name_ascii == NULL) {
615
+ DROP_ERROR_OCCURRED(tstate);
616
+
617
+ PyObject *name_punycode = UNICODE_ENCODE2(tstate, name_obj, const_str_plain_punycode);
618
+
619
+ CHECK_OBJECT(name_punycode);
620
+
621
+ snprintf(buffer, buffer_size, "PyInitU_%s", PyBytes_AsString(name_punycode));
622
+
623
+ Py_DECREF(name_punycode);
624
+ } else {
625
+ Py_DECREF(name_ascii);
626
+
627
+ snprintf(buffer, buffer_size, "PyInit_%s", name);
628
+ }
629
+ Py_DECREF(name_obj);
630
+ #else
631
+
632
+ snprintf(buffer, buffer_size,
633
+ #if PYTHON_VERSION < 0x300
634
+ "init%s",
635
+ #else
636
+ "PyInit_%s",
637
+ #endif
638
+ name);
639
+ #endif
640
+ }
641
+
642
+ #if _NUITKA_STANDALONE_MODE
643
+ // Create the filename from full path module name with dots, and translate these
644
+ // into directory separators.
645
+ static void _makeModuleCFilenameValue(filename_char_t *filename, size_t filename_size, char const *module_name_cstr,
646
+ PyObject *module_name, bool is_package) {
647
+ #ifdef _WIN32
648
+ #if _NUITKA_ONEFILE_DLL_MODE
649
+ filename_char_t const *base_directory = getDllDirectory();
650
+ #else
651
+ filename_char_t const *base_directory = getBinaryDirectoryWideChars(true);
652
+ #endif
653
+ copyStringSafeW(filename, base_directory, filename_size);
654
+ appendWCharSafeW(filename, FILENAME_SEP_CHAR, filename_size);
655
+ appendModuleNameAsPathW(filename, module_name, filename_size);
656
+ if (is_package) {
657
+ appendWCharSafeW(filename, FILENAME_SEP_CHAR, filename_size);
658
+ appendStringSafeW(filename, "__init__", filename_size);
659
+ }
660
+ appendStringSafeW(filename, ".pyd", filename_size);
661
+ #else
662
+ #if _NUITKA_ONEFILE_DLL_MODE
663
+ filename_char_t const *base_directory = getDllDirectory();
664
+ #else
665
+ filename_char_t const *base_directory = getBinaryDirectoryHostEncoded(true);
666
+ #endif
667
+ copyStringSafe(filename, base_directory, filename_size);
668
+ appendCharSafe(filename, FILENAME_SEP_CHAR, filename_size);
669
+ appendModuleNameAsPath(filename, module_name_cstr, filename_size);
670
+ if (is_package) {
671
+ appendCharSafe(filename, FILENAME_SEP_CHAR, filename_size);
672
+ appendStringSafe(filename, "__init__", filename_size);
673
+ }
674
+ appendStringSafe(filename, ".so", filename_size);
675
+ #endif
676
+ }
677
+ #endif
678
+
679
+ #if PYTHON_VERSION >= 0x3c0 && defined(_NUITKA_USE_UNEXPOSED_API)
680
+ extern _Thread_local const char *pkgcontext;
681
+ #endif
682
+
683
+ static const char *NuitkaImport_SwapPackageContext(const char *new_context) {
684
+ // TODO: The locking APIs for 3.13 give errors here that are not explained
685
+ // yet.
686
+ #if PYTHON_VERSION >= 0x3c0
687
+ // spell-checker: ignore pkgcontext
688
+ const char *old_context = _PyRuntime.imports.pkgcontext;
689
+ _PyRuntime.imports.pkgcontext = new_context;
690
+ #if PYTHON_VERSION >= 0x3c0 && defined(_NUITKA_USE_UNEXPOSED_API)
691
+ pkgcontext = new_context;
692
+ #endif
693
+ return old_context;
694
+ #elif PYTHON_VERSION >= 0x370
695
+ char const *old_context = _Py_PackageContext;
696
+ _Py_PackageContext = (char *)new_context;
697
+ return old_context;
698
+ #else
699
+ char *old_context = _Py_PackageContext;
700
+ _Py_PackageContext = (char *)new_context;
701
+ return (char const *)old_context;
702
+ #endif
703
+ }
704
+
705
+ static PyObject *callIntoExtensionModule(PyThreadState *tstate, char const *full_name, const filename_char_t *filename,
706
+ bool is_package) {
707
+ // Determine the package name and basename of the module to load.
708
+ char const *dot = strrchr(full_name, '.');
709
+ char const *name;
710
+ char const *package;
711
+
712
+ if (dot == NULL) {
713
+ package = NULL;
714
+ name = full_name;
715
+ } else {
716
+ // The extension modules do expect it to be full name in context.
717
+ package = (char *)full_name;
718
+ name = dot + 1;
719
+ }
720
+
721
+ char entry_function_name[1024];
722
+ _fillExtensionModuleDllEntryFunctionName(tstate, entry_function_name, sizeof(entry_function_name), name);
723
+
724
+ #ifdef _WIN32
725
+ if (isVerbose()) {
726
+ PySys_WriteStderr("import %s # LoadLibraryExW(\"%S\");\n", full_name, filename);
727
+ }
728
+
729
+ #ifndef _NUITKA_EXPERIMENTAL_DEBUG_STANDALONE
730
+ // Disable all but critical errors, prevents dialogs from showing.
731
+ // spell-checker: ignore SEM_FAILCRITICALERRORS
732
+ unsigned int old_mode = SetErrorMode(SEM_FAILCRITICALERRORS);
733
+ #endif
734
+
735
+ HINSTANCE hDLL;
736
+ #if PYTHON_VERSION >= 0x380
737
+ Py_BEGIN_ALLOW_THREADS;
738
+ hDLL = LoadLibraryExW(filename, NULL, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
739
+ Py_END_ALLOW_THREADS;
740
+ #else
741
+ hDLL = LoadLibraryExW(filename, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
742
+ #endif
743
+
744
+ #ifndef _NUITKA_EXPERIMENTAL_DEBUG_STANDALONE
745
+ SetErrorMode(old_mode);
746
+ #endif
747
+
748
+ if (unlikely(hDLL == NULL)) {
749
+ char buffer[1024];
750
+
751
+ char error_message[1024];
752
+ int size;
753
+
754
+ unsigned int error_code = GetLastError();
755
+
756
+ size = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error_code, 0,
757
+ (LPTSTR)error_message, sizeof(error_message), NULL);
758
+
759
+ // Report either way even if failed to get error message.
760
+ if (size == 0) {
761
+ int ret = PyOS_snprintf(buffer, sizeof(buffer), "LoadLibraryExW '%S' failed with error code %d", filename,
762
+ error_code);
763
+
764
+ assert(ret >= 0);
765
+ } else {
766
+ // Strip trailing newline.
767
+ if (size >= 2 && error_message[size - 2] == '\r' && error_message[size - 1] == '\n') {
768
+ size -= 2;
769
+ error_message[size] = '\0';
770
+ }
771
+ int ret = PyOS_snprintf(buffer, sizeof(buffer), "LoadLibraryExW '%S' failed: %s", filename, error_message);
772
+ assert(ret >= 0);
773
+ }
774
+
775
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ImportError, buffer);
776
+ return NULL;
777
+ }
778
+
779
+ entrypoint_t entrypoint = (entrypoint_t)GetProcAddress(hDLL, entry_function_name);
780
+ #else
781
+ // This code would work for all versions, we are avoiding access to interpreter
782
+ // structure internals of 3.8 or higher.
783
+ // spell-checker: ignore getdlopenflags,dlopenflags
784
+
785
+ #ifdef __wasi__
786
+ const char *error = "dynamic libraries are not implemented in wasi";
787
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ImportError, error);
788
+ return NULL;
789
+
790
+ entrypoint_t entrypoint = NULL;
791
+ #else
792
+ static PyObject *dlopenflags_object = NULL;
793
+ if (dlopenflags_object == NULL) {
794
+ dlopenflags_object = CALL_FUNCTION_NO_ARGS(tstate, Nuitka_SysGetObject("getdlopenflags"));
795
+ }
796
+ int dlopenflags = PyInt_AsLong(dlopenflags_object);
797
+
798
+ if (isVerbose()) {
799
+ PySys_WriteStderr("import %s # dlopen(\"%s\", %x);\n", full_name, filename, dlopenflags);
800
+ }
801
+
802
+ void *handle = dlopen(filename, dlopenflags);
803
+
804
+ if (unlikely(handle == NULL)) {
805
+ const char *error = dlerror();
806
+
807
+ if (unlikely(error == NULL)) {
808
+ error = "unknown dlopen() error";
809
+ }
810
+
811
+ SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ImportError, error);
812
+ return NULL;
813
+ }
814
+
815
+ entrypoint_t entrypoint = (entrypoint_t)dlsym(handle, entry_function_name);
816
+ #endif // __wasi__
817
+ #endif
818
+ assert(entrypoint);
819
+
820
+ char const *old_context = NuitkaImport_SwapPackageContext(package);
821
+
822
+ #if PYTHON_VERSION >= 0x3c0 && !defined(_NUITKA_USE_UNEXPOSED_API)
823
+ char const *base_name = strrchr(full_name, '.');
824
+ PyObject *base_name_obj = NULL;
825
+ PyObject *prefix_name_obj = NULL;
826
+ PyObject *preserved_basename_module = NULL;
827
+
828
+ if (base_name != NULL) {
829
+ base_name_obj = Nuitka_String_FromString(base_name + 1);
830
+ preserved_basename_module = Nuitka_GetModule(tstate, base_name_obj);
831
+ Py_XINCREF(preserved_basename_module);
832
+
833
+ prefix_name_obj = Nuitka_String_FromStringAndSize(full_name, base_name - full_name + 1);
834
+ }
835
+ #endif
836
+
837
+ // Finally call into the DLL.
838
+ PGO_onModuleEntered(full_name);
839
+
840
+ if (isVerbose()) {
841
+ PySys_WriteStderr("import %s # calling entrypoint\n", full_name);
842
+ }
843
+
844
+ Nuitka_DelModuleString(tstate, full_name);
845
+
846
+ #if PYTHON_VERSION < 0x300
847
+ (*entrypoint)();
848
+ #else
849
+ PyObject *module = (*entrypoint)();
850
+ #endif
851
+
852
+ if (isVerbose()) {
853
+ PySys_WriteStderr("import %s # return from entrypoint\n", full_name);
854
+ }
855
+
856
+ #if 0
857
+ PRINT_FORMAT("import %s # create module as ", full_name);
858
+ PRINT_ITEM(module);
859
+ PRINT_NEW_LINE();
860
+ #endif
861
+
862
+ NuitkaImport_SwapPackageContext(old_context);
863
+
864
+ #if PYTHON_VERSION < 0x300
865
+ PyObject *module = Nuitka_GetModuleString(tstate, full_name);
866
+ #endif
867
+
868
+ PGO_onModuleExit(name, module == NULL);
869
+
870
+ if (unlikely(module == NULL)) {
871
+ if (unlikely(!HAS_ERROR_OCCURRED(tstate))) {
872
+ PyErr_Format(PyExc_SystemError, "dynamic module '%s' not initialized properly", full_name);
873
+ }
874
+
875
+ return NULL;
876
+ }
877
+
878
+ #if PYTHON_VERSION >= 0x300
879
+ #if PYTHON_VERSION >= 0x350
880
+ PyModuleDef *def;
881
+
882
+ if (Py_TYPE(module) == &PyModuleDef_Type) {
883
+ if (isVerbose()) {
884
+ PySys_WriteStderr("import %s # entrypoint returned module def\n", full_name);
885
+ }
886
+
887
+ def = (PyModuleDef *)module;
888
+
889
+ PyObject *full_name_obj = Nuitka_String_FromString(full_name);
890
+
891
+ PyObject *origin = Nuitka_String_FromFilename(filename);
892
+
893
+ PyObject *spec_value = createModuleSpec(tstate, full_name_obj, origin, is_package);
894
+ CHECK_OBJECT(spec_value);
895
+
896
+ module = PyModule_FromDefAndSpec(def, spec_value);
897
+
898
+ if (unlikely(module == NULL)) {
899
+ Py_DECREF(spec_value);
900
+
901
+ PyErr_Format(PyExc_SystemError, "dynamic module '%s' not initialized properly from def", full_name);
902
+
903
+ return NULL;
904
+ }
905
+
906
+ SET_ATTRIBUTE(tstate, module, const_str_plain___spec__, spec_value);
907
+
908
+ setModuleFileValue(tstate, module, filename);
909
+
910
+ /* Set __path__ properly, unlike frozen module importer does. */
911
+ PyObject *path_list = _makeDunderPathObject(tstate, origin);
912
+
913
+ int res = PyObject_SetAttr(module, const_str_plain___path__, path_list);
914
+ if (unlikely(res != 0)) {
915
+ return NULL;
916
+ }
917
+
918
+ Py_DECREF(path_list);
919
+
920
+ Nuitka_SetModule(full_name_obj, module);
921
+ Py_DECREF(full_name_obj);
922
+
923
+ #if _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
924
+ SET_ATTRIBUTE(tstate, spec_value, const_str_plain__initializing, Py_True);
925
+ res = PyModule_ExecDef(module, def);
926
+ SET_ATTRIBUTE(tstate, spec_value, const_str_plain__initializing, Py_False);
927
+
928
+ Py_DECREF(spec_value);
929
+ CHECK_OBJECT(spec_value);
930
+
931
+ if (unlikely(res == -1)) {
932
+ return NULL;
933
+ }
934
+
935
+ if (isVerbose()) {
936
+ PySys_WriteStderr("import %s # executed module def\n", full_name);
937
+ }
938
+ #endif
939
+
940
+ CHECK_OBJECT(module);
941
+
942
+ return module;
943
+ } else {
944
+ if (isVerbose()) {
945
+ PySys_WriteStderr("import %s # entrypoint returned module\n", full_name);
946
+ }
947
+
948
+ def = PyModule_GetDef(module);
949
+
950
+ def->m_base.m_init = entrypoint;
951
+
952
+ // Set "__spec__" and "__file__" after load.
953
+ setModuleFileValue(tstate, module, filename);
954
+ PyObject *full_name_obj = Nuitka_String_FromString(full_name);
955
+ SET_ATTRIBUTE(tstate, module, const_str_plain___name__, full_name_obj);
956
+ PyObject *spec_value =
957
+ createModuleSpec(tstate, full_name_obj, LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___file__), false);
958
+
959
+ SET_ATTRIBUTE(tstate, module, const_str_plain___spec__, spec_value);
960
+
961
+ // Fixup "__package__" after load. It seems some modules ignore _Py_PackageContext value.
962
+ // so we patch it up here if it's None, but a package was specified.
963
+ if (package != NULL) {
964
+ PyObject *package_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___package__);
965
+
966
+ if (package_name == Py_None) {
967
+ char package2[2048];
968
+ copyStringSafeN(package2, full_name, dot - full_name, sizeof(package2));
969
+
970
+ PyObject *package_name_obj = Nuitka_String_FromString(package2);
971
+ SET_ATTRIBUTE(tstate, module, const_str_plain___package__, package_name_obj);
972
+ Py_DECREF(package_name_obj);
973
+ }
974
+
975
+ Py_DECREF(package_name);
976
+ }
977
+ }
978
+
979
+ if (likely(def != NULL)) {
980
+ def->m_base.m_init = entrypoint;
981
+ }
982
+
983
+ #else
984
+ PyModuleDef *def = PyModule_GetDef(module);
985
+
986
+ if (unlikely(def == NULL)) {
987
+ PyErr_Format(PyExc_SystemError, "initialization of %s did not return an extension module", filename);
988
+
989
+ return NULL;
990
+ }
991
+
992
+ def->m_base.m_init = entrypoint;
993
+ #endif
994
+
995
+ #endif
996
+
997
+ // Set filename attribute if not already set, in some branches we don't
998
+ // do it, esp. not for older Python.
999
+ setModuleFileValue(tstate, module, filename);
1000
+
1001
+ // Call the standard import fix-ups for extension modules. Their interface
1002
+ // changed over releases.
1003
+ #if PYTHON_VERSION < 0x300
1004
+ PyObject *res2 = _PyImport_FixupExtension((char *)full_name, (char *)filename);
1005
+
1006
+ if (unlikely(res2 == NULL)) {
1007
+ return NULL;
1008
+ }
1009
+ #else
1010
+ PyObject *full_name_obj = PyUnicode_FromString(full_name);
1011
+ CHECK_OBJECT(full_name_obj);
1012
+ PyObject *filename_obj = Nuitka_String_FromFilename(filename);
1013
+
1014
+ CHECK_OBJECT(filename_obj);
1015
+
1016
+ // See above, we need to correct modules imported if we don't successfully swap
1017
+ // the package context.
1018
+ #if PYTHON_VERSION >= 0x3c0 && !defined(_NUITKA_USE_UNEXPOSED_API)
1019
+ if (preserved_basename_module != NULL) {
1020
+ #if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1021
+ PRINT_STRING("Handling for preservation: ");
1022
+ PRINT_ITEM_LINE(full_name_obj);
1023
+ PRINT_STRING("Restoring preserved module: ");
1024
+ PRINT_ITEM(base_name_obj);
1025
+ if (Nuitka_HasModule(tstate, base_name_obj)) {
1026
+ PRINT_STRING(" changes ");
1027
+ PRINT_ITEM(Nuitka_GetModule(tstate, base_name_obj));
1028
+ }
1029
+ PRINT_STRING(" -> ");
1030
+ PRINT_ITEM_LINE(preserved_basename_module);
1031
+ #endif
1032
+ Nuitka_SetModule(base_name_obj, preserved_basename_module);
1033
+ Py_DECREF(preserved_basename_module);
1034
+ }
1035
+
1036
+ if (base_name_obj != NULL) {
1037
+ PyObject *need_correction = MAKE_LIST_EMPTY(tstate, 0);
1038
+
1039
+ {
1040
+ PyObject *modules_dict = Nuitka_GetSysModules();
1041
+
1042
+ Py_ssize_t pos = 0;
1043
+ PyObject *key, *value;
1044
+
1045
+ PyObject *base_name_prefix = BINARY_OPERATION_ADD_OBJECT_UNICODE_UNICODE(base_name_obj, const_str_dot);
1046
+ #if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1047
+ PRINT_STRING("Scanning for modules needing correction: ");
1048
+ PRINT_ITEM_LINE(base_name_prefix);
1049
+ #endif
1050
+ while (Nuitka_DictNext(modules_dict, &pos, &key, &value)) {
1051
+ // TODO: Should have nuitka_bool return values for these as well maybe.
1052
+ PyObject *starts_with_result = UNICODE_STARTSWITH2(tstate, key, base_name_prefix);
1053
+
1054
+ if (CHECK_IF_TRUE(starts_with_result) == 1) {
1055
+ LIST_APPEND0(need_correction, key);
1056
+ }
1057
+
1058
+ Py_DECREF(starts_with_result);
1059
+ }
1060
+ }
1061
+
1062
+ #if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1063
+ PRINT_STRING("Correction needed:");
1064
+ PRINT_ITEM_LINE(need_correction);
1065
+ #endif
1066
+
1067
+ Py_ssize_t n = PyList_GET_SIZE(need_correction);
1068
+
1069
+ for (Py_ssize_t i = 0; i < n; i++) {
1070
+ PyObject *module_to_correct_name = PyList_GET_ITEM(need_correction, i);
1071
+
1072
+ PyObject *correct_module_name =
1073
+ BINARY_OPERATION_ADD_OBJECT_UNICODE_UNICODE(prefix_name_obj, module_to_correct_name);
1074
+
1075
+ PyObject *module_to_correct = Nuitka_GetModule(tstate, module_to_correct_name);
1076
+
1077
+ #if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1078
+ PRINT_ITEM(module_to_correct_name);
1079
+ PRINT_STRING(" -> ");
1080
+ PRINT_ITEM(correct_module_name);
1081
+ PRINT_STRING(" changes ");
1082
+ PRINT_ITEM_LINE(module_to_correct);
1083
+ #endif
1084
+ Nuitka_SetModule(correct_module_name, module_to_correct);
1085
+
1086
+ Nuitka_DelModule(tstate, module_to_correct_name);
1087
+ }
1088
+
1089
+ Py_DECREF(base_name_obj);
1090
+ Py_DECREF(prefix_name_obj);
1091
+ }
1092
+ #endif
1093
+
1094
+ #if PYTHON_VERSION < 0x3d0
1095
+ int res = _PyImport_FixupExtensionObject(module, full_name_obj, filename_obj
1096
+ #if PYTHON_VERSION >= 0x370
1097
+ ,
1098
+ Nuitka_GetSysModules()
1099
+ #endif
1100
+ );
1101
+ #endif
1102
+
1103
+ #if PYTHON_VERSION >= 0x3d0
1104
+ Nuitka_SetModuleString(full_name, module);
1105
+ #endif
1106
+
1107
+ Py_DECREF(full_name_obj);
1108
+ Py_DECREF(filename_obj);
1109
+
1110
+ #if PYTHON_VERSION < 0x3d0
1111
+ if (unlikely(res == -1)) {
1112
+ return NULL;
1113
+ }
1114
+ #endif
1115
+ #endif
1116
+
1117
+ return module;
1118
+ }
1119
+
1120
+ static void loadTriggeredModule(PyThreadState *tstate, char const *name, char const *trigger_name) {
1121
+ char trigger_module_name[2048];
1122
+
1123
+ copyStringSafe(trigger_module_name, name, sizeof(trigger_module_name));
1124
+ appendStringSafe(trigger_module_name, trigger_name, sizeof(trigger_module_name));
1125
+
1126
+ struct Nuitka_MetaPathBasedLoaderEntry *entry = findEntry(trigger_module_name);
1127
+
1128
+ if (entry != NULL) {
1129
+ if (isVerbose()) {
1130
+ PySys_WriteStderr("Loading %s\n", trigger_module_name);
1131
+ }
1132
+
1133
+ IMPORT_EMBEDDED_MODULE(tstate, trigger_module_name);
1134
+
1135
+ if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
1136
+ if ((entry->flags & NUITKA_ABORT_MODULE_FLAG) != 0) {
1137
+ printf("Critical error loading %s.\n", trigger_module_name);
1138
+ abort();
1139
+ } else {
1140
+ PyObject *trigger_module_name_str = Nuitka_String_FromString(trigger_module_name);
1141
+ PyErr_WriteUnraisable(trigger_module_name_str);
1142
+ Py_DECREF(trigger_module_name_str);
1143
+ }
1144
+ }
1145
+ }
1146
+ }
1147
+
1148
+ #if PYTHON_VERSION >= 0x300
1149
+ static void _fixupSpecAttribute(PyThreadState *tstate, PyObject *module) {
1150
+ PyObject *spec_value = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___spec__);
1151
+
1152
+ if (spec_value && spec_value != Py_None) {
1153
+ if (HAS_ATTR_BOOL(tstate, spec_value, const_str_plain__initializing)) {
1154
+ SET_ATTRIBUTE(tstate, spec_value, const_str_plain__initializing, Py_False);
1155
+ }
1156
+ }
1157
+ }
1158
+ #endif
1159
+
1160
+ // Pointers to bytecode data.
1161
+ static char **_bytecode_data = NULL;
1162
+
1163
+ static PyObject *loadModule(PyThreadState *tstate, PyObject *module, PyObject *module_name,
1164
+ struct Nuitka_MetaPathBasedLoaderEntry const *entry) {
1165
+ #if _NUITKA_STANDALONE_MODE
1166
+ if ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0) {
1167
+ bool is_package = (entry->flags & NUITKA_PACKAGE_FLAG) != 0;
1168
+
1169
+ filename_char_t filename[MAXPATHLEN + 1];
1170
+ _makeModuleCFilenameValue(filename, sizeof(filename) / sizeof(filename_char_t), entry->name, module_name,
1171
+ is_package);
1172
+
1173
+ callIntoExtensionModule(tstate, entry->name, filename, is_package);
1174
+ } else
1175
+ #endif
1176
+ if ((entry->flags & NUITKA_BYTECODE_FLAG) != 0) {
1177
+ // TODO: Do node use marshal, but our own stuff, once we
1178
+ // can do code objects too.
1179
+
1180
+ PyCodeObject *code_object =
1181
+ (PyCodeObject *)PyMarshal_ReadObjectFromString(_bytecode_data[entry->bytecode_index], entry->bytecode_size);
1182
+
1183
+ // TODO: Probably a bit harsh reaction.
1184
+ if (unlikely(code_object == NULL)) {
1185
+ PyErr_Print();
1186
+ abort();
1187
+ }
1188
+
1189
+ return loadModuleFromCodeObject(tstate, module, code_object, entry->name,
1190
+ (entry->flags & NUITKA_PACKAGE_FLAG) != 0);
1191
+ } else {
1192
+ assert((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) == 0);
1193
+ assert(entry->python_init_func);
1194
+
1195
+ {
1196
+ NUITKA_MAY_BE_UNUSED bool res = Nuitka_SetModule(module_name, module);
1197
+ assert(res != false);
1198
+ }
1199
+
1200
+ // Run the compiled module code, we get the module returned.
1201
+ #if PYTHON_VERSION < 0x300
1202
+ NUITKA_MAY_BE_UNUSED
1203
+ #endif
1204
+ PyObject *result = entry->python_init_func(tstate, module, entry);
1205
+ CHECK_OBJECT_X(result);
1206
+
1207
+ #if PYTHON_VERSION >= 0x300
1208
+ if (likely(result != NULL)) {
1209
+ _fixupSpecAttribute(tstate, result);
1210
+ }
1211
+ #endif
1212
+ }
1213
+
1214
+ if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
1215
+ return NULL;
1216
+ }
1217
+
1218
+ if (isVerbose()) {
1219
+ PySys_WriteStderr("Loaded %s\n", entry->name);
1220
+ }
1221
+
1222
+ return Nuitka_GetModule(tstate, module_name);
1223
+ }
1224
+
1225
+ static PyObject *_EXECUTE_EMBEDDED_MODULE(PyThreadState *tstate, PyObject *module, PyObject *module_name,
1226
+ char const *name) {
1227
+ // In case of extension modules, that is fine to be NULL.
1228
+ CHECK_OBJECT_X(module);
1229
+ CHECK_OBJECT(module_name);
1230
+
1231
+ struct Nuitka_MetaPathBasedLoaderEntry *entry = findEntry(name);
1232
+ bool frozen_import = entry == NULL && hasFrozenModule(name);
1233
+
1234
+ if (entry != NULL || frozen_import) {
1235
+ // Execute the "preLoad" code produced for the module potentially. This
1236
+ // is from plugins typically, that want to modify things for the the
1237
+ // module before loading, to e.g. set a plug-in path, or do some monkey
1238
+ // patching in order to make things compatible.
1239
+ loadTriggeredModule(tstate, name, "-preLoad");
1240
+ }
1241
+
1242
+ PyObject *result = NULL;
1243
+
1244
+ if (entry != NULL) {
1245
+ #ifdef _NUITKA_EXPERIMENTAL_FORCE_GC_COLLECT_ON_IMPORT
1246
+ PyGC_Collect();
1247
+ #endif
1248
+
1249
+ result = loadModule(tstate, module, module_name, entry);
1250
+
1251
+ #ifdef _NUITKA_EXPERIMENTAL_FORCE_GC_COLLECT_ON_IMPORT
1252
+ PyGC_Collect();
1253
+ #endif
1254
+
1255
+ if (unlikely(result == NULL)) {
1256
+ return NULL;
1257
+ }
1258
+ }
1259
+
1260
+ if (frozen_import) {
1261
+ PGO_onModuleEntered(name);
1262
+ int res = PyImport_ImportFrozenModule((char *)name);
1263
+ PGO_onModuleExit(name, res == -1);
1264
+
1265
+ if (unlikely(res == -1)) {
1266
+ return NULL;
1267
+ }
1268
+
1269
+ if (res == 1) {
1270
+ result = Nuitka_GetModule(tstate, module_name);
1271
+ }
1272
+ }
1273
+
1274
+ if (result != NULL) {
1275
+ // Execute the "postLoad" code produced for the module potentially. This
1276
+ // is from plugins typically, that want to modify the module immediately
1277
+ // after loading, to e.g. set a plug-in path, or do some monkey patching
1278
+ // in order to make things compatible.
1279
+ loadTriggeredModule(tstate, name, "-postLoad");
1280
+
1281
+ return result;
1282
+ }
1283
+
1284
+ Py_INCREF_IMMORTAL(Py_None);
1285
+ return Py_None;
1286
+ }
1287
+
1288
+ // Note: This may become an entry point for hard coded imports of compiled
1289
+ // stuff.
1290
+ PyObject *IMPORT_EMBEDDED_MODULE(PyThreadState *tstate, char const *name) {
1291
+ PyObject *module_name = Nuitka_String_FromString(name);
1292
+
1293
+ // Check if it's already loaded, and don't do it again otherwise.
1294
+ PyObject *module = Nuitka_GetModule(tstate, module_name);
1295
+
1296
+ if (module != NULL) {
1297
+ Py_DECREF(module_name);
1298
+ return module;
1299
+ }
1300
+
1301
+ #if PYTHON_VERSION < 0x300
1302
+ module = PyModule_New(name);
1303
+ #else
1304
+ module = PyModule_NewObject(module_name);
1305
+ #endif
1306
+
1307
+ PyObject *result = _EXECUTE_EMBEDDED_MODULE(tstate, module, module_name, name);
1308
+
1309
+ #if PYTHON_VERSION < 0x350
1310
+ if (unlikely(result == NULL)) {
1311
+ Nuitka_DelModule(tstate, module_name);
1312
+ }
1313
+ #endif
1314
+
1315
+ Py_DECREF(module_name);
1316
+
1317
+ return result;
1318
+ }
1319
+
1320
+ PyObject *EXECUTE_EMBEDDED_MODULE(PyThreadState *tstate, PyObject *module) {
1321
+ PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___name__);
1322
+ assert(module_name);
1323
+
1324
+ char const *name = Nuitka_String_AsString(module_name);
1325
+
1326
+ return _EXECUTE_EMBEDDED_MODULE(tstate, module, module_name, name);
1327
+ }
1328
+
1329
+ static PyObject *_nuitka_loader_load_module(PyObject *self, PyObject *args, PyObject *kwds) {
1330
+ PyObject *module_name;
1331
+ PyObject *unused;
1332
+
1333
+ int res = PyArg_ParseTupleAndKeywords(args, kwds, "O|O:load_module", (char **)_kw_list_find_module, &module_name,
1334
+ &unused);
1335
+
1336
+ if (unlikely(res == 0)) {
1337
+ return NULL;
1338
+ }
1339
+
1340
+ assert(module_name);
1341
+ assert(Nuitka_String_Check(module_name));
1342
+
1343
+ char const *name = Nuitka_String_AsString(module_name);
1344
+
1345
+ if (isVerbose()) {
1346
+ PySys_WriteStderr("Loading %s\n", name);
1347
+ }
1348
+
1349
+ PyThreadState *tstate = PyThreadState_GET();
1350
+
1351
+ #if !_NUITKA_STANDALONE_MODE
1352
+ if (installed_extension_modules != NULL) {
1353
+ PyObject *extension_module_filename = DICT_GET_ITEM0(tstate, installed_extension_modules, module_name);
1354
+
1355
+ if (extension_module_filename != NULL) {
1356
+ // TODO: Should we not set __file__ for the module here, but there is no object.
1357
+ return callIntoInstalledExtensionModule(tstate, module_name, extension_module_filename);
1358
+ }
1359
+ }
1360
+ #endif
1361
+
1362
+ return IMPORT_EMBEDDED_MODULE(tstate, name);
1363
+ }
1364
+
1365
+ static char const *_kw_list_is_package[] = {"fullname", NULL};
1366
+
1367
+ static PyObject *_nuitka_loader_is_package(PyObject *self, PyObject *args, PyObject *kwds) {
1368
+ PyObject *module_name;
1369
+
1370
+ int res = PyArg_ParseTupleAndKeywords(args, kwds, "O:is_package", (char **)_kw_list_is_package, &module_name);
1371
+
1372
+ if (unlikely(res == 0)) {
1373
+ return NULL;
1374
+ }
1375
+
1376
+ assert(module_name);
1377
+ assert(Nuitka_String_Check(module_name));
1378
+
1379
+ char const *name = Nuitka_String_AsString(module_name);
1380
+
1381
+ struct Nuitka_MetaPathBasedLoaderEntry *entry = findEntry(name);
1382
+
1383
+ PyObject *result;
1384
+
1385
+ if (entry) {
1386
+ result = BOOL_FROM((entry->flags & NUITKA_PACKAGE_FLAG) != 0);
1387
+ } else {
1388
+ // TODO: Maybe needs to be an exception.
1389
+ result = Py_None;
1390
+ }
1391
+
1392
+ Py_INCREF_IMMORTAL(result);
1393
+ return result;
1394
+ }
1395
+
1396
+ static char const *_kw_list_iter_modules[] = {"package", NULL};
1397
+
1398
+ static PyObject *_nuitka_loader_iter_modules(struct Nuitka_LoaderObject *self, PyObject *args, PyObject *kwds) {
1399
+ PyObject *prefix;
1400
+
1401
+ int res = PyArg_ParseTupleAndKeywords(args, kwds, "O:iter_modules", (char **)_kw_list_iter_modules, &prefix);
1402
+
1403
+ if (unlikely(res == 0)) {
1404
+ return NULL;
1405
+ }
1406
+
1407
+ NUITKA_MAY_BE_UNUSED PyThreadState *tstate = PyThreadState_GET();
1408
+
1409
+ PyObject *result = MAKE_LIST_EMPTY(tstate, 0);
1410
+
1411
+ struct Nuitka_MetaPathBasedLoaderEntry *current = loader_entries;
1412
+ assert(current);
1413
+
1414
+ char const *s;
1415
+
1416
+ if (self->m_loader_entry) {
1417
+ s = self->m_loader_entry->name;
1418
+ } else {
1419
+ s = "";
1420
+ }
1421
+
1422
+ while (current->name != NULL) {
1423
+ if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
1424
+ current->name = UN_TRANSLATE(current->name);
1425
+ current->flags -= NUITKA_TRANSLATED_FLAG;
1426
+ }
1427
+
1428
+ int c = strncmp(s, current->name, strlen(s));
1429
+
1430
+ if (c != 0) {
1431
+ current++;
1432
+ continue;
1433
+ }
1434
+
1435
+ if (strcmp(current->name, "__main__") == 0) {
1436
+ current++;
1437
+ continue;
1438
+ }
1439
+
1440
+ if (current->name[strlen(s)] == 0) {
1441
+ current++;
1442
+ continue;
1443
+ }
1444
+
1445
+ char const *sub = strchr(current->name + strlen(s) + 1, '.');
1446
+
1447
+ if (sub != NULL) {
1448
+ current++;
1449
+ continue;
1450
+ }
1451
+
1452
+ PyObject *name;
1453
+ if (self->m_loader_entry) {
1454
+ name = Nuitka_String_FromString(current->name + strlen(s) + 1);
1455
+ } else {
1456
+ name = Nuitka_String_FromString(current->name);
1457
+ }
1458
+
1459
+ if (CHECK_IF_TRUE(prefix)) {
1460
+ PyObject *old = name;
1461
+ name = PyUnicode_Concat(prefix, name);
1462
+ Py_DECREF(old);
1463
+ }
1464
+
1465
+ PyObject *r = MAKE_TUPLE_EMPTY(tstate, 2);
1466
+ PyTuple_SET_ITEM(r, 0, name);
1467
+ PyTuple_SET_ITEM_IMMORTAL(r, 1, BOOL_FROM((current->flags & NUITKA_PACKAGE_FLAG) != 0));
1468
+
1469
+ LIST_APPEND1(result, r);
1470
+
1471
+ current++;
1472
+ }
1473
+
1474
+ return result;
1475
+ }
1476
+
1477
+ static PyObject *getModuleDirectory(PyThreadState *tstate, struct Nuitka_MetaPathBasedLoaderEntry const *entry) {
1478
+ #if defined(_NUITKA_FREEZER_HAS_FILE_PATH)
1479
+ #if defined(_WIN32)
1480
+ wchar_t buffer[1024];
1481
+ buffer[0] = 0;
1482
+
1483
+ appendWStringSafeW(buffer, entry->file_path, sizeof(buffer));
1484
+ stripFilenameW(buffer);
1485
+ PyObject *dir_name = NuitkaUnicode_FromWideChar(buffer, -1);
1486
+ #else
1487
+ char buffer[1024];
1488
+ copyStringSafe(buffer, entry->file_path, sizeof(buffer));
1489
+
1490
+ PyObject *dir_name = Nuitka_String_FromString(dirname(buffer));
1491
+ #endif
1492
+ #else
1493
+ PyObject *module_name;
1494
+ if ((entry->flags & NUITKA_PACKAGE_FLAG) != 0) {
1495
+ module_name = Nuitka_String_FromString(entry->name);
1496
+ } else {
1497
+ char buffer[1024];
1498
+ copyStringSafe(buffer, entry->name, sizeof(buffer));
1499
+
1500
+ char *dot = strrchr(buffer, '.');
1501
+ if (dot != NULL) {
1502
+ *dot = 0;
1503
+ }
1504
+
1505
+ module_name = Nuitka_String_FromString(buffer);
1506
+ }
1507
+
1508
+ #if PYTHON_VERSION < 0x300
1509
+ PyObject *module_path = STR_REPLACE3(tstate, module_name, const_str_dot, getPathSeparatorStringObject());
1510
+ #else
1511
+ PyObject *module_path = UNICODE_REPLACE3(tstate, module_name, const_str_dot, getPathSeparatorStringObject());
1512
+ #endif
1513
+ Py_DECREF(module_name);
1514
+
1515
+ if (unlikely(module_path == NULL)) {
1516
+ return NULL;
1517
+ }
1518
+
1519
+ PyObject *dir_name = MAKE_RELATIVE_PATH(module_path);
1520
+ Py_DECREF(module_path);
1521
+ #endif
1522
+
1523
+ return dir_name;
1524
+ }
1525
+
1526
+ #if PYTHON_VERSION >= 0x300
1527
+ // Used in module template too, therefore exported.
1528
+ PyObject *getImportLibBootstrapModule(void) {
1529
+ static PyObject *importlib = NULL;
1530
+ if (importlib == NULL) {
1531
+ importlib = PyImport_ImportModule("importlib._bootstrap");
1532
+ }
1533
+
1534
+ return importlib;
1535
+ }
1536
+ #endif
1537
+
1538
+ static PyObject *getModuleFileValue(PyThreadState *tstate, struct Nuitka_MetaPathBasedLoaderEntry const *entry) {
1539
+ PyObject *dir_name = getModuleDirectory(tstate, entry);
1540
+
1541
+ char filename_buffer[1024];
1542
+
1543
+ if ((entry->flags & NUITKA_PACKAGE_FLAG) != 0) {
1544
+ copyStringSafe(filename_buffer, "__init__", sizeof(filename_buffer));
1545
+ } else {
1546
+ char const *basename = strrchr(entry->name, '.');
1547
+
1548
+ if (basename == NULL) {
1549
+ basename = entry->name;
1550
+ } else {
1551
+ basename += 1;
1552
+ }
1553
+
1554
+ copyStringSafe(filename_buffer, basename, sizeof(filename_buffer));
1555
+ }
1556
+
1557
+ if ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0) {
1558
+ #if defined(_WIN32)
1559
+ appendStringSafe(filename_buffer, ".pyd", sizeof(filename_buffer));
1560
+ #else
1561
+ appendStringSafe(filename_buffer, ".so", sizeof(filename_buffer));
1562
+ #endif
1563
+ } else {
1564
+ appendStringSafe(filename_buffer, ".py", sizeof(filename_buffer));
1565
+ }
1566
+
1567
+ PyObject *module_filename = Nuitka_String_FromString(filename_buffer);
1568
+
1569
+ PyObject *result = JOIN_PATH2(dir_name, module_filename);
1570
+
1571
+ Py_DECREF(module_filename);
1572
+
1573
+ return result;
1574
+ }
1575
+
1576
+ #if PYTHON_VERSION >= 0x300
1577
+
1578
+ static PyObject *_nuitka_loader_repr_module(PyObject *self, PyObject *args, PyObject *kwds) {
1579
+ PyObject *module;
1580
+ PyObject *unused;
1581
+
1582
+ int res =
1583
+ PyArg_ParseTupleAndKeywords(args, kwds, "O|O:module_repr", (char **)_kw_list_find_module, &module, &unused);
1584
+
1585
+ if (unlikely(res == 0)) {
1586
+ return NULL;
1587
+ }
1588
+
1589
+ PyThreadState *tstate = PyThreadState_GET();
1590
+
1591
+ return PyUnicode_FromFormat("<module '%s' from %R>", PyModule_GetName(module),
1592
+ Nuitka_GetFilenameObject(tstate, module));
1593
+ }
1594
+
1595
+ static PyObject *getModuleSpecClass(PyObject *importlib_module) {
1596
+ static PyObject *module_spec_class = NULL;
1597
+
1598
+ if (module_spec_class == NULL) {
1599
+ module_spec_class = PyObject_GetAttrString(importlib_module, "ModuleSpec");
1600
+ }
1601
+
1602
+ return module_spec_class;
1603
+ }
1604
+
1605
+ static PyObject *createModuleSpec(PyThreadState *tstate, PyObject *module_name, PyObject *origin, bool is_package) {
1606
+ CHECK_OBJECT(module_name);
1607
+ assert(Nuitka_String_Check(module_name));
1608
+ CHECK_OBJECT_X(origin);
1609
+
1610
+ PyObject *importlib_module = getImportLibBootstrapModule();
1611
+
1612
+ if (unlikely(importlib_module == NULL)) {
1613
+ return NULL;
1614
+ }
1615
+
1616
+ PyObject *module_spec_class = getModuleSpecClass(importlib_module);
1617
+
1618
+ if (unlikely(module_spec_class == NULL)) {
1619
+ return NULL;
1620
+ }
1621
+
1622
+ PyObject *args = MAKE_TUPLE2(tstate, module_name, (PyObject *)&Nuitka_Loader_Type);
1623
+
1624
+ PyObject *kw_values[] = {is_package ? Py_True : Py_False, origin};
1625
+
1626
+ char const *kw_keys[] = {"is_package", "origin"};
1627
+
1628
+ PyObject *kw_args = MAKE_DICT_X_CSTR(kw_keys, kw_values, sizeof(kw_values) / sizeof(PyObject *));
1629
+
1630
+ PyObject *result = CALL_FUNCTION(tstate, module_spec_class, args, kw_args);
1631
+
1632
+ Py_DECREF(args);
1633
+ Py_DECREF(kw_args);
1634
+
1635
+ return result;
1636
+ }
1637
+
1638
+ #if !_NUITKA_STANDALONE_MODE
1639
+ // We might have to load stuff from installed modules in our package namespaces.
1640
+ static PyObject *createModuleSpecViaPathFinder(PyThreadState *tstate, PyObject *module_name,
1641
+ char const *parent_module_name) {
1642
+ if (scanModuleInPackagePath(tstate, module_name, parent_module_name)) {
1643
+ return createModuleSpec(tstate, module_name, NULL, false);
1644
+ } else {
1645
+ // Without error this means we didn't make it.
1646
+ return NULL;
1647
+ }
1648
+ }
1649
+ #endif
1650
+
1651
+ static char const *_kw_list_find_spec[] = {"fullname", "is_package", "path", NULL};
1652
+
1653
+ static PyObject *_nuitka_loader_find_spec(PyObject *self, PyObject *args, PyObject *kwds) {
1654
+ PyObject *module_name;
1655
+ PyObject *unused1; // We ignore "is_package"
1656
+ PyObject *unused2; // We ignore "path"
1657
+
1658
+ int res = PyArg_ParseTupleAndKeywords(args, kwds, "O|OO:find_spec", (char **)_kw_list_find_spec, &module_name,
1659
+ &unused1, &unused2);
1660
+
1661
+ if (unlikely(res == 0)) {
1662
+ return NULL;
1663
+ }
1664
+
1665
+ char const *full_name = Nuitka_String_AsString(module_name);
1666
+
1667
+ if (isVerbose()) {
1668
+ PySys_WriteStderr("import %s # considering responsibility (find_spec)\n", full_name);
1669
+ }
1670
+
1671
+ struct Nuitka_MetaPathBasedLoaderEntry const *entry = findEntry(full_name);
1672
+
1673
+ PyThreadState *tstate = PyThreadState_GET();
1674
+
1675
+ #if !_NUITKA_STANDALONE_MODE
1676
+ // We need to deal with things located in compiled packages, that were not included,
1677
+ // e.g. extension modules, but also other files, that were asked to not be included
1678
+ // or added later.
1679
+ if (entry == NULL) {
1680
+ entry = findContainingPackageEntry(full_name);
1681
+
1682
+ if (entry != NULL) {
1683
+ PyObject *result = createModuleSpecViaPathFinder(tstate, module_name, entry->name);
1684
+
1685
+ if (result != NULL) {
1686
+ if (isVerbose()) {
1687
+ PySys_WriteStderr("import %s # claimed responsibility (%s, contained in compiled package %s)\n",
1688
+ full_name, getEntryModeString(entry), entry->name);
1689
+ }
1690
+
1691
+ return result;
1692
+ }
1693
+
1694
+ if (HAS_ERROR_OCCURRED(tstate)) {
1695
+ return NULL;
1696
+ }
1697
+
1698
+ entry = NULL;
1699
+ }
1700
+ }
1701
+ #endif
1702
+
1703
+ if (entry == NULL) {
1704
+ if (isVerbose()) {
1705
+ PySys_WriteStderr("import %s # denied responsibility\n", full_name);
1706
+ }
1707
+
1708
+ Py_INCREF_IMMORTAL(Py_None);
1709
+ return Py_None;
1710
+ }
1711
+
1712
+ if (isVerbose()) {
1713
+ PySys_WriteStderr("import %s # claimed responsibility (%s)\n", Nuitka_String_AsString(module_name),
1714
+ getEntryModeString(entry));
1715
+ }
1716
+
1717
+ return createModuleSpec(tstate, module_name, getModuleFileValue(tstate, entry),
1718
+ (entry->flags & NUITKA_PACKAGE_FLAG) != 0);
1719
+ }
1720
+
1721
+ #if PYTHON_VERSION >= 0x350
1722
+ static char const *_kw_list_create_module[] = {"spec", NULL};
1723
+
1724
+ static PyObject *_nuitka_loader_create_module(PyObject *self, PyObject *args, PyObject *kwds) {
1725
+ PyObject *spec;
1726
+
1727
+ int res = PyArg_ParseTupleAndKeywords(args, kwds, "O:create_module", (char **)_kw_list_create_module, &spec);
1728
+
1729
+ if (unlikely(res == 0)) {
1730
+ return NULL;
1731
+ }
1732
+
1733
+ PyThreadState *tstate = PyThreadState_GET();
1734
+
1735
+ PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, spec, const_str_plain_name);
1736
+
1737
+ if (unlikely(module_name == NULL)) {
1738
+ return NULL;
1739
+ }
1740
+
1741
+ // Check if module name is a proper string.
1742
+ char const *name = Nuitka_String_AsString(module_name);
1743
+ if (unlikely(name == NULL)) {
1744
+ Py_DECREF(module_name);
1745
+ return NULL;
1746
+ }
1747
+
1748
+ if (isVerbose()) {
1749
+ PySys_WriteStderr("import %s # create module\n", name);
1750
+ }
1751
+
1752
+ // During spec creation, we have populated the dictionary with a filename to load from
1753
+ // for extension modules that were found installed in the system and below our package.
1754
+ #if !_NUITKA_STANDALONE_MODE && !_NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
1755
+ if (installed_extension_modules != NULL) {
1756
+ PyObject *extension_module_filename = DICT_GET_ITEM0(tstate, installed_extension_modules, module_name);
1757
+
1758
+ if (extension_module_filename != NULL) {
1759
+ Py_DECREF(module_name);
1760
+ return callIntoInstalledExtensionModule(tstate, module_name, extension_module_filename);
1761
+ }
1762
+ }
1763
+ #endif
1764
+
1765
+ #if _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
1766
+ struct Nuitka_MetaPathBasedLoaderEntry *entry = NULL;
1767
+ #else
1768
+ struct Nuitka_MetaPathBasedLoaderEntry *entry = findEntry(name);
1769
+ #endif
1770
+
1771
+ PyObject *result;
1772
+
1773
+ if ((entry != NULL) && ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0)) {
1774
+ result = _EXECUTE_EMBEDDED_MODULE(tstate, NULL, module_name, name);
1775
+ } else {
1776
+ result = PyModule_NewObject(module_name);
1777
+ }
1778
+
1779
+ Py_DECREF(module_name);
1780
+
1781
+ return result;
1782
+ }
1783
+
1784
+ static char const *_kw_list_exec_module[] = {"module", NULL};
1785
+
1786
+ static PyObject *_nuitka_loader_exec_module(PyObject *self, PyObject *args, PyObject *kwds) {
1787
+ PyObject *module;
1788
+
1789
+ int res = PyArg_ParseTupleAndKeywords(args, kwds, "O:exec_module", (char **)_kw_list_exec_module, &module);
1790
+
1791
+ if (unlikely(res == 0)) {
1792
+ return NULL;
1793
+ }
1794
+
1795
+ PyThreadState *tstate = PyThreadState_GET();
1796
+
1797
+ PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___name__);
1798
+
1799
+ if (unlikely(module_name == NULL)) {
1800
+ return NULL;
1801
+ }
1802
+
1803
+ // Check if module name is a proper string.
1804
+ char const *name = Nuitka_String_AsString(module_name);
1805
+ if (unlikely(name == NULL)) {
1806
+ Py_DECREF(module_name);
1807
+ return NULL;
1808
+ }
1809
+
1810
+ if (isVerbose()) {
1811
+ PySys_WriteStderr("import %s # execute module\n", name);
1812
+ }
1813
+
1814
+ // During spec creation, we have populated the dictionary with a filename to load from
1815
+ // for extension modules that were found installed in the system and below our package.
1816
+ #if !_NUITKA_STANDALONE_MODE && _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
1817
+ if (installed_extension_modules != NULL) {
1818
+ PyObject *extension_module_filename = DICT_GET_ITEM0(tstate, installed_extension_modules, module_name);
1819
+
1820
+ if (extension_module_filename != NULL) {
1821
+ // Set filename attribute
1822
+ bool b_res = SET_ATTRIBUTE(tstate, module, const_str_plain___file__, extension_module_filename);
1823
+
1824
+ if (unlikely(b_res == false)) {
1825
+ // Might be refuted, which wouldn't be harmful.
1826
+ CLEAR_ERROR_OCCURRED(tstate);
1827
+ }
1828
+
1829
+ return callIntoInstalledExtensionModule(tstate, module_name, extension_module_filename);
1830
+ }
1831
+ }
1832
+ #endif
1833
+
1834
+ #if _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
1835
+ struct Nuitka_MetaPathBasedLoaderEntry *entry = NULL;
1836
+ #else
1837
+ struct Nuitka_MetaPathBasedLoaderEntry *entry = findEntry(name);
1838
+ #endif
1839
+
1840
+ if ((entry != NULL) && ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0)) {
1841
+ Py_INCREF(module);
1842
+
1843
+ if (unlikely(!PyModule_Check(module))) {
1844
+ return module;
1845
+ }
1846
+
1847
+ PyModuleDef *def = PyModule_GetDef(module);
1848
+ if (def == NULL) {
1849
+ return module;
1850
+ }
1851
+
1852
+ void *state = PyModule_GetState(module);
1853
+ if (state != NULL) {
1854
+ return module;
1855
+ }
1856
+
1857
+ res = PyModule_ExecDef(module, def);
1858
+
1859
+ if (unlikely(res == -1)) {
1860
+ Py_DECREF(module);
1861
+
1862
+ return NULL;
1863
+ }
1864
+
1865
+ CHECK_OBJECT(module);
1866
+
1867
+ return module;
1868
+ }
1869
+
1870
+ Py_DECREF(module_name);
1871
+
1872
+ return EXECUTE_EMBEDDED_MODULE(tstate, module);
1873
+ }
1874
+
1875
+ #if PYTHON_VERSION >= 0x370
1876
+
1877
+ // The resource reader class is implemented in a separate file.
1878
+ #include "MetaPathBasedLoaderResourceReader.c"
1879
+
1880
+ static PyObject *_nuitka_loader_get_resource_reader(PyObject *self, PyObject *args, PyObject *kwds) {
1881
+ PyObject *module_name;
1882
+
1883
+ int res =
1884
+ PyArg_ParseTupleAndKeywords(args, kwds, "O:get_resource_reader", (char **)_kw_list_exec_module, &module_name);
1885
+
1886
+ if (unlikely(res == 0)) {
1887
+ return NULL;
1888
+ }
1889
+
1890
+ char const *name = Nuitka_String_AsString(module_name);
1891
+
1892
+ struct Nuitka_MetaPathBasedLoaderEntry *entry = findEntry(name);
1893
+
1894
+ if (entry) {
1895
+ if (isVerbose()) {
1896
+ PySys_WriteStderr("import %s # get_resource_reader (%s)\n", name, getEntryModeString(entry));
1897
+ }
1898
+
1899
+ return Nuitka_ResourceReader_New(entry);
1900
+ }
1901
+
1902
+ PyErr_Format(PyExc_RuntimeError, "Requested resource reader for unhandled module %s", module_name);
1903
+ return NULL;
1904
+ }
1905
+
1906
+ #endif
1907
+
1908
+ #endif
1909
+
1910
+ #endif
1911
+
1912
+ static char const *_kw_list_find_distributions[] = {"context", NULL};
1913
+
1914
+ static PyObject *_nuitka_loader_find_distributions(PyObject *self, PyObject *args, PyObject *kwds) {
1915
+ PyObject *context;
1916
+
1917
+ int res =
1918
+ PyArg_ParseTupleAndKeywords(args, kwds, "O:find_distributions", (char **)_kw_list_find_distributions, &context);
1919
+
1920
+ if (unlikely(res == 0)) {
1921
+ return NULL;
1922
+ }
1923
+
1924
+ PyObject *name = PyObject_GetAttr(context, const_str_plain_name);
1925
+
1926
+ if (unlikely(name == NULL)) {
1927
+ return NULL;
1928
+ }
1929
+
1930
+ PyThreadState *tstate = PyThreadState_GET();
1931
+
1932
+ PyObject *temp = MAKE_LIST_EMPTY(tstate, 0);
1933
+
1934
+ Py_ssize_t pos = 0;
1935
+ PyObject *distribution_name;
1936
+
1937
+ while (Nuitka_DistributionNext(&pos, &distribution_name)) {
1938
+ bool include = false;
1939
+ if (name == Py_None) {
1940
+ include = true;
1941
+ } else {
1942
+ nuitka_bool cmp_res = RICH_COMPARE_EQ_NBOOL_OBJECT_OBJECT(name, distribution_name);
1943
+
1944
+ if (unlikely(cmp_res == NUITKA_BOOL_EXCEPTION)) {
1945
+ Py_DECREF(name);
1946
+ return NULL;
1947
+ }
1948
+
1949
+ include = cmp_res == NUITKA_BOOL_TRUE;
1950
+ }
1951
+
1952
+ if (include) {
1953
+ // Create a distribution object from our data.
1954
+ PyObject *distribution = Nuitka_Distribution_New(tstate, distribution_name);
1955
+
1956
+ if (distribution == NULL) {
1957
+ Py_DECREF(temp);
1958
+ return NULL;
1959
+ }
1960
+
1961
+ LIST_APPEND1(temp, distribution);
1962
+ }
1963
+ }
1964
+
1965
+ // We are expected to return an iterator.
1966
+ PyObject *result = MAKE_ITERATOR_INFALLIBLE(temp);
1967
+
1968
+ Py_DECREF(temp);
1969
+ return result;
1970
+ }
1971
+
1972
+ static char const *_kw_list_sys_path_hook[] = {"path", NULL};
1973
+
1974
+ static PyObject *_nuitka_loader_sys_path_hook(PyObject *self, PyObject *args, PyObject *kwds) {
1975
+ PyObject *path;
1976
+
1977
+ int res = PyArg_ParseTupleAndKeywords(args, kwds, "O:sys_path_hook", (char **)_kw_list_sys_path_hook, &path);
1978
+
1979
+ if (unlikely(res == 0)) {
1980
+ return NULL;
1981
+ }
1982
+
1983
+ #if 0
1984
+ PRINT_STRING("CONSIDER PATH:");
1985
+ PRINT_ITEM(path);
1986
+ PRINT_NEW_LINE();
1987
+ #endif
1988
+
1989
+ struct Nuitka_MetaPathBasedLoaderEntry *entry = loader_entries;
1990
+ assert(entry);
1991
+
1992
+ PyThreadState *tstate = PyThreadState_GET();
1993
+
1994
+ while (entry->name != NULL) {
1995
+ if ((entry->flags & NUITKA_TRANSLATED_FLAG) != 0) {
1996
+ entry->name = UN_TRANSLATE(entry->name);
1997
+ entry->flags -= NUITKA_TRANSLATED_FLAG;
1998
+ }
1999
+
2000
+ if ((entry->flags & NUITKA_PACKAGE_FLAG) != 0) {
2001
+ PyObject *module_directory = getModuleDirectory(tstate, entry);
2002
+
2003
+ #if 0
2004
+ PRINT_STRING(entry->name);
2005
+ PRINT_STRING(" ");
2006
+ PRINT_ITEM(module_directory);
2007
+ PRINT_NEW_LINE();
2008
+ #endif
2009
+
2010
+ nuitka_bool cmp_res = compareFilePaths(tstate, module_directory, path);
2011
+
2012
+ if (unlikely(cmp_res == NUITKA_BOOL_EXCEPTION)) {
2013
+ return NULL;
2014
+ }
2015
+
2016
+ // Create the loader for the module.
2017
+ if (cmp_res == NUITKA_BOOL_TRUE) {
2018
+ return Nuitka_Loader_New(entry);
2019
+ }
2020
+ }
2021
+
2022
+ entry++;
2023
+ }
2024
+
2025
+ SET_CURRENT_EXCEPTION_TYPE0(tstate, PyExc_ImportError);
2026
+ return NULL;
2027
+ }
2028
+
2029
+ static PyMethodDef Nuitka_Loader_methods[] = {
2030
+ {"iter_modules", (PyCFunction)_nuitka_loader_iter_modules, METH_VARARGS | METH_KEYWORDS, NULL},
2031
+ {"get_data", (PyCFunction)_nuitka_loader_get_data, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2032
+ {"find_module", (PyCFunction)_nuitka_loader_find_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2033
+ {"load_module", (PyCFunction)_nuitka_loader_load_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2034
+ {"is_package", (PyCFunction)_nuitka_loader_is_package, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2035
+ #if PYTHON_VERSION >= 0x300
2036
+ {"module_repr", (PyCFunction)_nuitka_loader_repr_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2037
+ {"find_spec", (PyCFunction)_nuitka_loader_find_spec, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2038
+ #endif
2039
+ #if PYTHON_VERSION >= 0x350
2040
+ {"create_module", (PyCFunction)_nuitka_loader_create_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2041
+ {"exec_module", (PyCFunction)_nuitka_loader_exec_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2042
+ #endif
2043
+ #if PYTHON_VERSION >= 0x370
2044
+ {"get_resource_reader", (PyCFunction)_nuitka_loader_get_resource_reader, METH_STATIC | METH_VARARGS | METH_KEYWORDS,
2045
+ NULL},
2046
+ #endif
2047
+
2048
+ {"find_distributions", (PyCFunction)_nuitka_loader_find_distributions, METH_STATIC | METH_VARARGS | METH_KEYWORDS,
2049
+ NULL},
2050
+
2051
+ {"sys_path_hook", (PyCFunction)_nuitka_loader_sys_path_hook, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2052
+
2053
+ {NULL, NULL} // terminator
2054
+ };
2055
+
2056
+ static PyObject *Nuitka_Loader_tp_repr(struct Nuitka_LoaderObject *loader) {
2057
+ if (loader->m_loader_entry == NULL) {
2058
+ // TODO: Indicate in module mode, which one it is for.
2059
+ return Nuitka_String_FromString("<nuitka_module_loader>");
2060
+ } else {
2061
+ return Nuitka_String_FromFormat("<nuitka_module_loader for '%s'>", loader->m_loader_entry->name);
2062
+ }
2063
+ }
2064
+
2065
+ #include "nuitka/freelists.h"
2066
+
2067
+ // TODO: A free list is not the right thing for those, they are probably living forever, but it's
2068
+ // no big harm too, but make it small, maybe be allowing a toggle that makes a specific macro not
2069
+ // use the free list mechanism at all.
2070
+
2071
+ // Freelist setup
2072
+ #define MAX_LOADER_FREE_LIST_COUNT 10
2073
+ static struct Nuitka_LoaderObject *free_list_loaders = NULL;
2074
+ static int free_list_loaders_count = 0;
2075
+
2076
+ static void Nuitka_Loader_tp_dealloc(struct Nuitka_LoaderObject *loader) {
2077
+ Nuitka_GC_UnTrack(loader);
2078
+
2079
+ releaseToFreeList(free_list_loaders, loader, MAX_LOADER_FREE_LIST_COUNT);
2080
+ }
2081
+
2082
+ static int Nuitka_Loader_tp_traverse(struct Nuitka_LoaderObject *loader, visitproc visit, void *arg) { return 0; }
2083
+
2084
+ static PyObject *Nuitka_Loader_get_name(struct Nuitka_LoaderObject *loader, void *closure) {
2085
+ PyObject *result = Nuitka_String_FromString(loader->m_loader_entry->name);
2086
+
2087
+ return result;
2088
+ }
2089
+ static PyObject *Nuitka_Loader_get_path(struct Nuitka_LoaderObject *loader, void *closure) {
2090
+ PyThreadState *tstate = PyThreadState_GET();
2091
+ PyObject *result = getModuleFileValue(tstate, loader->m_loader_entry);
2092
+
2093
+ return result;
2094
+ }
2095
+
2096
+ static PyObject *Nuitka_Loader_get__module__(struct Nuitka_LoaderObject *loader, void *closure) {
2097
+ PyObject *result = const_str_plain___nuitka__;
2098
+
2099
+ Py_INCREF_IMMORTAL(result);
2100
+ return result;
2101
+ }
2102
+
2103
+ static PyGetSetDef Nuitka_Loader_tp_getset[] = {{(char *)"__module__", (getter)Nuitka_Loader_get__module__, NULL, NULL},
2104
+ {(char *)"name", (getter)Nuitka_Loader_get_name, NULL, NULL},
2105
+ {(char *)"path", (getter)Nuitka_Loader_get_path, NULL, NULL},
2106
+ {NULL}};
2107
+
2108
+ PyTypeObject Nuitka_Loader_Type = {
2109
+ PyVarObject_HEAD_INIT(NULL, 0) "nuitka_module_loader",
2110
+ sizeof(struct Nuitka_LoaderObject), // tp_basicsize
2111
+ 0, // tp_itemsize
2112
+ (destructor)Nuitka_Loader_tp_dealloc, // tp_dealloc
2113
+ 0, // tp_print
2114
+ 0, // tp_getattr
2115
+ 0, // tp_setattr
2116
+ 0, // tp_reserved
2117
+ (reprfunc)Nuitka_Loader_tp_repr, // tp_repr
2118
+ 0, // tp_as_number
2119
+ 0, // tp_as_sequence
2120
+ 0, // tp_as_mapping
2121
+ 0, // tp_hash
2122
+ 0, // tp_call
2123
+ 0, // tp_str
2124
+ 0, // tp_getattro (PyObject_GenericGetAttr)
2125
+ 0, // tp_setattro
2126
+ 0, // tp_as_buffer
2127
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, // tp_flags
2128
+ 0, // tp_doc
2129
+ (traverseproc)Nuitka_Loader_tp_traverse, // tp_traverse
2130
+ 0, // tp_clear
2131
+ 0, // tp_richcompare
2132
+ 0, // tp_weaklistoffset
2133
+ 0, // tp_iter
2134
+ 0, // tp_iternext
2135
+ Nuitka_Loader_methods, // tp_methods
2136
+ 0, // tp_members
2137
+ Nuitka_Loader_tp_getset, // tp_getset
2138
+ };
2139
+
2140
+ /* Used by modules to register child loaders for packages. */
2141
+ PyObject *Nuitka_Loader_New(struct Nuitka_MetaPathBasedLoaderEntry const *entry) {
2142
+ struct Nuitka_LoaderObject *result;
2143
+
2144
+ allocateFromFreeListFixed(free_list_loaders, struct Nuitka_LoaderObject, Nuitka_Loader_Type);
2145
+ Nuitka_GC_Track(result);
2146
+
2147
+ result->m_loader_entry = entry;
2148
+
2149
+ return (PyObject *)result;
2150
+ }
2151
+
2152
+ #if _NUITKA_MODULE_MODE
2153
+ void updateMetaPathBasedLoaderModuleRoot(char const *module_root_name) {
2154
+ assert(module_root_name != NULL);
2155
+ char const *last_dot = strrchr(module_root_name, '.');
2156
+
2157
+ if (last_dot != NULL) {
2158
+ struct Nuitka_MetaPathBasedLoaderEntry *current = loader_entries;
2159
+ assert(current);
2160
+
2161
+ while (current->name != NULL) {
2162
+ if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
2163
+ current->name = UN_TRANSLATE(current->name);
2164
+ current->flags -= NUITKA_TRANSLATED_FLAG;
2165
+ }
2166
+
2167
+ char name[2048];
2168
+
2169
+ if (strcmp(last_dot + 1, current->name) == 0) {
2170
+ copyStringSafeN(name, module_root_name, last_dot - module_root_name + 1, sizeof(name));
2171
+ appendStringSafe(name, current->name, sizeof(name));
2172
+
2173
+ current->name = strdup(name);
2174
+ } else if (strncmp(last_dot + 1, current->name, strlen(last_dot + 1)) == 0 &&
2175
+ current->name[strlen(last_dot + 1)] == '.') {
2176
+ copyStringSafeN(name, module_root_name, last_dot - module_root_name + 1, sizeof(name));
2177
+ appendStringSafe(name, current->name, sizeof(name));
2178
+
2179
+ current->name = strdup(name);
2180
+ }
2181
+
2182
+ current++;
2183
+ }
2184
+ }
2185
+ }
2186
+ #endif
2187
+
2188
+ void registerMetaPathBasedLoader(struct Nuitka_MetaPathBasedLoaderEntry *_loader_entries,
2189
+ unsigned char **bytecode_data) {
2190
+ // Do it only once.
2191
+ if (loader_entries) {
2192
+ assert(_loader_entries == loader_entries);
2193
+
2194
+ return;
2195
+ }
2196
+
2197
+ _bytecode_data = (char **)bytecode_data;
2198
+
2199
+ if (isVerbose()) {
2200
+ PySys_WriteStderr("Setup nuitka compiled module/bytecode/extension importer.\n");
2201
+ }
2202
+
2203
+ loader_entries = _loader_entries;
2204
+
2205
+ #if _NUITKA_MODULE_MODE && PYTHON_VERSION < 0x3c0
2206
+ if (_Py_PackageContext != NULL) {
2207
+ updateMetaPathBasedLoaderModuleRoot(_Py_PackageContext);
2208
+ }
2209
+ #endif
2210
+
2211
+ Nuitka_PyType_Ready(&Nuitka_Loader_Type, NULL, true, false, false, false, false);
2212
+
2213
+ #if PYTHON_VERSION >= 0x370
2214
+ Nuitka_PyType_Ready(&Nuitka_ResourceReader_Type, NULL, true, false, false, false, false);
2215
+ #endif
2216
+
2217
+ // Register it as a meta path loader.
2218
+ PyObject *global_loader = Nuitka_Loader_New(NULL);
2219
+
2220
+ LIST_INSERT_CONST(Nuitka_SysGetObject("meta_path"),
2221
+ #if PYTHON_VERSION < 0x300
2222
+ 0,
2223
+ #else
2224
+ 2,
2225
+ #endif
2226
+
2227
+ global_loader);
2228
+
2229
+ // Our "sys.path_hooks" entry uses "os.path" to compare filenames, so we need
2230
+ // to load it without.
2231
+ PyThreadState *tstate = PyThreadState_GET();
2232
+ IMPORT_HARD_OS_PATH(tstate);
2233
+
2234
+ // Register our loader as a "sys.path_hook" so it can provide for the paths.
2235
+ #if _NUITKA_STANDALONE_MODE
2236
+ LIST_INSERT_CONST(Nuitka_SysGetObject("path_hooks"), 0, PyObject_GetAttrString(global_loader, "sys_path_hook"));
2237
+ #else
2238
+ // TODO: For accelerated mode the loader doesn't have the ability
2239
+ // to handle "site-packages" on its own yet, and therefore we
2240
+ // cannot have it take precedence.
2241
+ LIST_APPEND1(Nuitka_SysGetObject("path_hooks"), PyObject_GetAttrString(global_loader, "sys_path_hook"));
2242
+ #endif
2243
+ }
2244
+
2245
+ #if _NUITKA_STANDALONE_MODE
2246
+ // This is called for the technical module imported early on during interpreter
2247
+ // into, to still get compatible "__file__" attributes.
2248
+ void setEarlyFrozenModulesFileAttribute(PyThreadState *tstate) {
2249
+ PyObject *sys_modules = Nuitka_GetSysModules();
2250
+ Py_ssize_t pos = 0;
2251
+ PyObject *key, *value;
2252
+
2253
+ PyObject *builtin_module_names = Nuitka_SysGetObject("builtin_module_names");
2254
+
2255
+ while (Nuitka_DictNext(sys_modules, &pos, &key, &value)) {
2256
+ if (key != NULL && value != NULL && PyModule_Check(value)) {
2257
+ bool is_package = HAS_ATTR_BOOL(tstate, value, const_str_plain___path__);
2258
+
2259
+ if (is_package || HAS_ATTR_BOOL(tstate, value, const_str_plain___file__) ||
2260
+ PySequence_Contains(builtin_module_names, key) == 0) {
2261
+ PyObject *file_value = MAKE_RELATIVE_PATH_FROM_NAME(Nuitka_String_AsString(key), is_package, false);
2262
+ PyObject_SetAttr(value, const_str_plain___file__, file_value);
2263
+ Py_DECREF(file_value);
2264
+ CHECK_OBJECT(file_value);
2265
+ }
2266
+ }
2267
+ }
2268
+
2269
+ assert(!HAS_ERROR_OCCURRED(tstate));
2270
+ }
2271
+
2272
+ #endif
2273
+
2274
+ // The importlib distribution class is implemented in a separate file.
2275
+ #include "MetaPathBasedLoaderImportlibMetadataDistribution.c"
2276
+
2277
+ // Part of "Nuitka", an optimizing Python compiler that is compatible and
2278
+ // integrates with CPython, but also works on its own.
2279
+ //
2280
+ // Licensed under the Apache License, Version 2.0 (the "License");
2281
+ // you may not use this file except in compliance with the License.
2282
+ // You may obtain a copy of the License at
2283
+ //
2284
+ // http://www.apache.org/licenses/LICENSE-2.0
2285
+ //
2286
+ // Unless required by applicable law or agreed to in writing, software
2287
+ // distributed under the License is distributed on an "AS IS" BASIS,
2288
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2289
+ // See the License for the specific language governing permissions and
2290
+ // limitations under the License.