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.
- nuitka/Builtins.py +259 -0
- nuitka/BytecodeCaching.py +184 -0
- nuitka/Bytecodes.py +109 -0
- nuitka/CacheCleanup.py +54 -0
- nuitka/Constants.py +425 -0
- nuitka/Errors.py +93 -0
- nuitka/HardImportRegistry.py +408 -0
- nuitka/MainControl.py +1201 -0
- nuitka/ModuleRegistry.py +364 -0
- nuitka/OptionParsing.py +2473 -0
- nuitka/Options.py +2948 -0
- nuitka/OutputDirectories.py +201 -0
- nuitka/PostProcessing.py +551 -0
- nuitka/Progress.py +252 -0
- nuitka/PythonFlavors.py +426 -0
- nuitka/PythonOperators.py +146 -0
- nuitka/PythonVersions.py +513 -0
- nuitka/Serialization.py +291 -0
- nuitka/SourceCodeReferences.py +176 -0
- nuitka/Tracing.py +579 -0
- nuitka/TreeXML.py +141 -0
- nuitka/Variables.py +515 -0
- nuitka/Version.py +88 -0
- nuitka/__init__.py +19 -0
- nuitka/__main__.py +224 -0
- nuitka/__past__.py +217 -0
- nuitka/build/Backend.scons +1111 -0
- nuitka/build/CCompilerVersion.scons +281 -0
- nuitka/build/DataComposerInterface.py +116 -0
- nuitka/build/Offsets.scons +626 -0
- nuitka/build/Onefile.scons +564 -0
- nuitka/build/SconsCaching.py +451 -0
- nuitka/build/SconsCompilerSettings.py +1133 -0
- nuitka/build/SconsHacks.py +215 -0
- nuitka/build/SconsInterface.py +664 -0
- nuitka/build/SconsProgress.py +100 -0
- nuitka/build/SconsSpawn.py +436 -0
- nuitka/build/SconsUtils.py +939 -0
- nuitka/build/__init__.py +19 -0
- nuitka/build/include/nuitka/allocator.h +450 -0
- nuitka/build/include/nuitka/builtins.h +97 -0
- nuitka/build/include/nuitka/calling.h +123 -0
- nuitka/build/include/nuitka/checkers.h +39 -0
- nuitka/build/include/nuitka/checksum_tools.h +28 -0
- nuitka/build/include/nuitka/compiled_asyncgen.h +281 -0
- nuitka/build/include/nuitka/compiled_cell.h +64 -0
- nuitka/build/include/nuitka/compiled_coroutine.h +271 -0
- nuitka/build/include/nuitka/compiled_frame.h +502 -0
- nuitka/build/include/nuitka/compiled_function.h +170 -0
- nuitka/build/include/nuitka/compiled_generator.h +287 -0
- nuitka/build/include/nuitka/compiled_method.h +54 -0
- nuitka/build/include/nuitka/constants.h +251 -0
- nuitka/build/include/nuitka/constants_blob.h +34 -0
- nuitka/build/include/nuitka/debug_settings.h +60 -0
- nuitka/build/include/nuitka/environment_variables.h +30 -0
- nuitka/build/include/nuitka/environment_variables_system.h +51 -0
- nuitka/build/include/nuitka/exception_groups.h +167 -0
- nuitka/build/include/nuitka/exceptions.h +1458 -0
- nuitka/build/include/nuitka/filesystem_paths.h +117 -0
- nuitka/build/include/nuitka/freelists.h +92 -0
- nuitka/build/include/nuitka/hedley.h +1774 -0
- nuitka/build/include/nuitka/helper/attributes.h +90 -0
- nuitka/build/include/nuitka/helper/boolean.h +86 -0
- nuitka/build/include/nuitka/helper/bytearrays.h +34 -0
- nuitka/build/include/nuitka/helper/bytes.h +28 -0
- nuitka/build/include/nuitka/helper/calling_generated.h +132 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_eq.h +47 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_ge.h +39 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_gt.h +39 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_le.h +47 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_lt.h +47 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_ne.h +39 -0
- nuitka/build/include/nuitka/helper/comparisons_eq.h +247 -0
- nuitka/build/include/nuitka/helper/comparisons_ge.h +197 -0
- nuitka/build/include/nuitka/helper/comparisons_gt.h +197 -0
- nuitka/build/include/nuitka/helper/comparisons_le.h +247 -0
- nuitka/build/include/nuitka/helper/comparisons_lt.h +247 -0
- nuitka/build/include/nuitka/helper/comparisons_ne.h +197 -0
- nuitka/build/include/nuitka/helper/complex.h +46 -0
- nuitka/build/include/nuitka/helper/dictionaries.h +481 -0
- nuitka/build/include/nuitka/helper/floats.h +32 -0
- nuitka/build/include/nuitka/helper/import_hard.h +121 -0
- nuitka/build/include/nuitka/helper/indexes.h +47 -0
- nuitka/build/include/nuitka/helper/ints.h +165 -0
- nuitka/build/include/nuitka/helper/iterators.h +376 -0
- nuitka/build/include/nuitka/helper/lists.h +94 -0
- nuitka/build/include/nuitka/helper/lists_generated.h +36 -0
- nuitka/build/include/nuitka/helper/mappings.h +39 -0
- nuitka/build/include/nuitka/helper/operations.h +114 -0
- nuitka/build/include/nuitka/helper/operations_binary_add.h +240 -0
- nuitka/build/include/nuitka/helper/operations_binary_bitand.h +108 -0
- nuitka/build/include/nuitka/helper/operations_binary_bitor.h +108 -0
- nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +108 -0
- nuitka/build/include/nuitka/helper/operations_binary_divmod.h +103 -0
- nuitka/build/include/nuitka/helper/operations_binary_dual_add.h +34 -0
- nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +103 -0
- nuitka/build/include/nuitka/helper/operations_binary_lshift.h +99 -0
- nuitka/build/include/nuitka/helper/operations_binary_matmult.h +60 -0
- nuitka/build/include/nuitka/helper/operations_binary_mod.h +304 -0
- nuitka/build/include/nuitka/helper/operations_binary_mult.h +247 -0
- nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +125 -0
- nuitka/build/include/nuitka/helper/operations_binary_pow.h +90 -0
- nuitka/build/include/nuitka/helper/operations_binary_rshift.h +99 -0
- nuitka/build/include/nuitka/helper/operations_binary_sub.h +117 -0
- nuitka/build/include/nuitka/helper/operations_binary_truediv.h +103 -0
- nuitka/build/include/nuitka/helper/operations_builtin_types.h +247 -0
- nuitka/build/include/nuitka/helper/operations_inplace_add.h +173 -0
- nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +76 -0
- nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +76 -0
- nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +76 -0
- nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +95 -0
- nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +62 -0
- nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +60 -0
- nuitka/build/include/nuitka/helper/operations_inplace_mod.h +218 -0
- nuitka/build/include/nuitka/helper/operations_inplace_mult.h +184 -0
- nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +115 -0
- nuitka/build/include/nuitka/helper/operations_inplace_pow.h +87 -0
- nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +62 -0
- nuitka/build/include/nuitka/helper/operations_inplace_sub.h +102 -0
- nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +95 -0
- nuitka/build/include/nuitka/helper/raising.h +114 -0
- nuitka/build/include/nuitka/helper/rangeobjects.h +66 -0
- nuitka/build/include/nuitka/helper/richcomparisons.h +35 -0
- nuitka/build/include/nuitka/helper/sequences.h +33 -0
- nuitka/build/include/nuitka/helper/sets.h +25 -0
- nuitka/build/include/nuitka/helper/slices.h +314 -0
- nuitka/build/include/nuitka/helper/strings.h +30 -0
- nuitka/build/include/nuitka/helper/subscripts.h +390 -0
- nuitka/build/include/nuitka/helper/tuples.h +187 -0
- nuitka/build/include/nuitka/helpers.h +417 -0
- nuitka/build/include/nuitka/importing.h +149 -0
- nuitka/build/include/nuitka/incbin.h +402 -0
- nuitka/build/include/nuitka/jit_sources.h +25 -0
- nuitka/build/include/nuitka/prelude.h +626 -0
- nuitka/build/include/nuitka/printing.h +84 -0
- nuitka/build/include/nuitka/python_pgo.h +57 -0
- nuitka/build/include/nuitka/safe_string_ops.h +57 -0
- nuitka/build/include/nuitka/threading.h +142 -0
- nuitka/build/include/nuitka/tracing.h +82 -0
- nuitka/build/include/nuitka/type_aliases.h +30 -0
- nuitka/build/include/nuitka/unfreezing.h +91 -0
- nuitka/build/inline_copy/appdirs/LICENSE.txt +23 -0
- nuitka/build/inline_copy/appdirs/appdirs.py +611 -0
- nuitka/build/inline_copy/atomicwrites/LICENSE +19 -0
- nuitka/build/inline_copy/atomicwrites/atomicwrites.py +226 -0
- nuitka/build/inline_copy/bin/scons.py +58 -0
- nuitka/build/inline_copy/clcache/clcache/LICENSE +30 -0
- nuitka/build/inline_copy/clcache/clcache/__init__.py +4 -0
- nuitka/build/inline_copy/clcache/clcache/caching.py +2008 -0
- nuitka/build/inline_copy/colorama/LICENSE.txt +27 -0
- nuitka/build/inline_copy/colorama/colorama/__init__.py +6 -0
- nuitka/build/inline_copy/colorama/colorama/ansi.py +102 -0
- nuitka/build/inline_copy/colorama/colorama/ansitowin32.py +258 -0
- nuitka/build/inline_copy/colorama/colorama/initialise.py +80 -0
- nuitka/build/inline_copy/colorama/colorama/win32.py +152 -0
- nuitka/build/inline_copy/colorama/colorama/winterm.py +169 -0
- nuitka/build/inline_copy/glob2/LICENSE +27 -0
- nuitka/build/inline_copy/glob2/glob2/__init__.py +5 -0
- nuitka/build/inline_copy/glob2/glob2/compat.py +167 -0
- nuitka/build/inline_copy/glob2/glob2/fnmatch.py +141 -0
- nuitka/build/inline_copy/glob2/glob2/impl.py +216 -0
- nuitka/build/inline_copy/jinja2/LICENSE.rst +28 -0
- nuitka/build/inline_copy/jinja2/README.rst +2 -0
- nuitka/build/inline_copy/jinja2/jinja2/__init__.py +72 -0
- nuitka/build/inline_copy/jinja2/jinja2/_compat.py +105 -0
- nuitka/build/inline_copy/jinja2/jinja2/_identifier.py +2 -0
- nuitka/build/inline_copy/jinja2/jinja2/bccache.py +361 -0
- nuitka/build/inline_copy/jinja2/jinja2/compiler.py +1721 -0
- nuitka/build/inline_copy/jinja2/jinja2/constants.py +32 -0
- nuitka/build/inline_copy/jinja2/jinja2/debug.py +378 -0
- nuitka/build/inline_copy/jinja2/jinja2/defaults.py +56 -0
- nuitka/build/inline_copy/jinja2/jinja2/environment.py +1276 -0
- nuitka/build/inline_copy/jinja2/jinja2/exceptions.py +146 -0
- nuitka/build/inline_copy/jinja2/jinja2/ext.py +627 -0
- nuitka/build/inline_copy/jinja2/jinja2/filters.py +1190 -0
- nuitka/build/inline_copy/jinja2/jinja2/idtracking.py +286 -0
- nuitka/build/inline_copy/jinja2/jinja2/lexer.py +739 -0
- nuitka/build/inline_copy/jinja2/jinja2/loaders.py +483 -0
- nuitka/build/inline_copy/jinja2/jinja2/meta.py +106 -0
- nuitka/build/inline_copy/jinja2/jinja2/nativetypes.py +220 -0
- nuitka/build/inline_copy/jinja2/jinja2/nodes.py +999 -0
- nuitka/build/inline_copy/jinja2/jinja2/optimizer.py +49 -0
- nuitka/build/inline_copy/jinja2/jinja2/parser.py +903 -0
- nuitka/build/inline_copy/jinja2/jinja2/runtime.py +808 -0
- nuitka/build/inline_copy/jinja2/jinja2/sandbox.py +488 -0
- nuitka/build/inline_copy/jinja2/jinja2/tests.py +174 -0
- nuitka/build/inline_copy/jinja2/jinja2/utils.py +642 -0
- nuitka/build/inline_copy/jinja2/jinja2/visitor.py +87 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Action.py +1475 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Builder.py +905 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/CacheDir.py +314 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Conftest.py +805 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Debug.py +251 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Defaults.py +646 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Environment.py +2561 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/EnvironmentValues.py +119 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Errors.py +222 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Executor.py +660 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Job.py +439 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Memoize.py +242 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/Alias.py +176 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/FS.py +3861 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/Python.py +195 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/__init__.py +1784 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/PathList.py +224 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/__init__.py +341 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/aix.py +81 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/cygwin.py +61 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/darwin.py +70 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/hpux.py +45 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/irix.py +41 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/mingw.py +33 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/os2.py +55 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/posix.py +124 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/sunos.py +47 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/virtualenv.py +115 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/win32.py +429 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/SConf.py +1119 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/SConsign.py +453 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/C.py +226 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/Dir.py +131 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/Prog.py +114 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/RC.py +57 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/__init__.py +436 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/Interactive.py +372 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/Main.py +1469 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/SConsOptions.py +1071 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/SConscript.py +686 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/__init__.py +425 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Subst.py +979 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Taskmaster.py +1062 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/386asm.py +61 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/GettextCommon.py +429 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/__init__.py +52 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/arch.py +66 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/common.py +371 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/netframework.py +83 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/sdk.py +411 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/vc.py +994 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/vs.py +608 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/PharLapCommon.py +116 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/__init__.py +882 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixc++.py +43 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixcc.py +74 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixcxx.py +77 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixlink.py +78 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/applelink.py +209 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ar.py +63 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/as.py +49 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/asm.py +78 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/bcc32.py +81 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/c++.py +44 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cc.py +105 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clang.py +91 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clangCommon/__init__.py +18 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clangxx.py +99 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cxx.py +95 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cyglink.py +212 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/default.py +50 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/filesystem.py +98 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/g++.py +45 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gas.py +56 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gcc.py +110 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gettext_tool.py +69 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gnulink.py +70 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gxx.py +78 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpc++.py +45 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpcc.py +53 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpcxx.py +88 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hplink.py +72 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/icc.py +59 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/icl.py +52 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ilink.py +55 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ilink32.py +60 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/install.py +510 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/intelc.py +617 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/link.py +72 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/LoadableModule.py +131 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/SharedLibrary.py +218 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/__init__.py +171 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkloc.py +112 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/m4.py +63 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/masm.py +77 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mingw.py +232 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msgfmt.py +132 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msginit.py +137 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msgmerge.py +125 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mslib.py +73 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mslink.py +339 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mssdk.py +50 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msvc.py +325 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msvs.py +2116 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mwcc.py +207 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mwld.py +108 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/nasm.py +72 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/rmic.py +139 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/rpcgen.py +70 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgiar.py +68 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgic++.py +43 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgicc.py +53 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgicxx.py +61 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgilink.py +59 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunar.py +64 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunc++.py +45 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/suncc.py +58 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/suncxx.py +153 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunlink.py +79 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/tar.py +73 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/textfile.py +198 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/tlib.py +53 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/wix.py +104 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/xgettext.py +337 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/zip.py +120 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Util.py +2134 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/ConfigureCache.py +171 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/__init__.py +0 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/sconsign.py +494 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/BoolVariable.py +96 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/EnumVariable.py +110 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +152 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/PackageVariable.py +107 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/PathVariable.py +158 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/__init__.py +334 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Warnings.py +238 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/__init__.py +9 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/__init__.py +104 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/_scons_dbm.py +42 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/win32.py +101 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/cpp.py +640 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/dblite.py +295 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/exitfuncs.py +59 -0
- nuitka/build/inline_copy/markupsafe/LICENSE.rst +28 -0
- nuitka/build/inline_copy/markupsafe/markupsafe/__init__.py +327 -0
- nuitka/build/inline_copy/markupsafe/markupsafe/_compat.py +33 -0
- nuitka/build/inline_copy/markupsafe/markupsafe/_constants.py +264 -0
- nuitka/build/inline_copy/markupsafe/markupsafe/_native.py +69 -0
- nuitka/build/inline_copy/pefile/LICENSE.txt +21 -0
- nuitka/build/inline_copy/pefile/ordlookup/__init__.py +41 -0
- nuitka/build/inline_copy/pefile/ordlookup/oleaut32.py +400 -0
- nuitka/build/inline_copy/pefile/ordlookup/ws2_32.py +120 -0
- nuitka/build/inline_copy/pefile/pefile.py +8034 -0
- nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +3272 -0
- nuitka/build/inline_copy/pkg_resources/pkg_resources/py31compat.py +21 -0
- nuitka/build/inline_copy/python_hacl/LICENSE.txt +201 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.c +1430 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.h +66 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.c +463 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.h +66 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.c +1273 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.h +204 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.c +734 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.h +131 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Streaming_Types.h +83 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt128_Verified.h +346 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt_8_16_32_64.h +107 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/fstar_uint128_struct_endianness.h +68 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/internal/target.h +293 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/lowstar_endianness.h +231 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/types.h +14 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_MD5.h +56 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA1.h +56 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA2.h +164 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA3.h +65 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/python_hacl_namespaces.h +89 -0
- nuitka/build/inline_copy/stubgen/astunparse.py +938 -0
- nuitka/build/inline_copy/stubgen/six.py +998 -0
- nuitka/build/inline_copy/stubgen/stubgen.py +484 -0
- nuitka/build/inline_copy/tqdm/tqdm/__init__.py +40 -0
- nuitka/build/inline_copy/tqdm/tqdm/_main.py +9 -0
- nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +97 -0
- nuitka/build/inline_copy/tqdm/tqdm/_tqdm.py +9 -0
- nuitka/build/inline_copy/tqdm/tqdm/_tqdm_notebook.py +9 -0
- nuitka/build/inline_copy/tqdm/tqdm/_tqdm_pandas.py +24 -0
- nuitka/build/inline_copy/tqdm/tqdm/_utils.py +12 -0
- nuitka/build/inline_copy/tqdm/tqdm/auto.py +44 -0
- nuitka/build/inline_copy/tqdm/tqdm/autonotebook.py +28 -0
- nuitka/build/inline_copy/tqdm/tqdm/dask.py +46 -0
- nuitka/build/inline_copy/tqdm/tqdm/notebook.py +316 -0
- nuitka/build/inline_copy/tqdm/tqdm/std.py +1524 -0
- nuitka/build/inline_copy/tqdm/tqdm/tk.py +207 -0
- nuitka/build/inline_copy/tqdm/tqdm/utils.py +351 -0
- nuitka/build/inline_copy/tqdm/tqdm/version.py +2 -0
- nuitka/build/inline_copy/yaml/LICENSE +20 -0
- nuitka/build/inline_copy/yaml/yaml/__init__.py +427 -0
- nuitka/build/inline_copy/yaml/yaml/composer.py +139 -0
- nuitka/build/inline_copy/yaml/yaml/constructor.py +748 -0
- nuitka/build/inline_copy/yaml/yaml/cyaml.py +101 -0
- nuitka/build/inline_copy/yaml/yaml/dumper.py +62 -0
- nuitka/build/inline_copy/yaml/yaml/emitter.py +1137 -0
- nuitka/build/inline_copy/yaml/yaml/error.py +75 -0
- nuitka/build/inline_copy/yaml/yaml/events.py +86 -0
- nuitka/build/inline_copy/yaml/yaml/loader.py +63 -0
- nuitka/build/inline_copy/yaml/yaml/nodes.py +49 -0
- nuitka/build/inline_copy/yaml/yaml/parser.py +589 -0
- nuitka/build/inline_copy/yaml/yaml/reader.py +185 -0
- nuitka/build/inline_copy/yaml/yaml/representer.py +389 -0
- nuitka/build/inline_copy/yaml/yaml/resolver.py +227 -0
- nuitka/build/inline_copy/yaml/yaml/scanner.py +1435 -0
- nuitka/build/inline_copy/yaml/yaml/serializer.py +111 -0
- nuitka/build/inline_copy/yaml/yaml/tokens.py +104 -0
- nuitka/build/inline_copy/zlib/LICENSE +22 -0
- nuitka/build/inline_copy/zlib/crc32.c +1049 -0
- nuitka/build/inline_copy/zlib/crc32.h +9446 -0
- nuitka/build/inline_copy/zlib/zconf.h +551 -0
- nuitka/build/inline_copy/zlib/zlib.h +1938 -0
- nuitka/build/inline_copy/zlib/zutil.h +275 -0
- nuitka/build/inline_copy/zstd/LICENSE.txt +30 -0
- nuitka/build/inline_copy/zstd/common/bitstream.h +463 -0
- nuitka/build/inline_copy/zstd/common/compiler.h +288 -0
- nuitka/build/inline_copy/zstd/common/cpu.h +213 -0
- nuitka/build/inline_copy/zstd/common/debug.h +107 -0
- nuitka/build/inline_copy/zstd/common/entropy_common.c +360 -0
- nuitka/build/inline_copy/zstd/common/error_private.c +56 -0
- nuitka/build/inline_copy/zstd/common/error_private.h +80 -0
- nuitka/build/inline_copy/zstd/common/fse.h +715 -0
- nuitka/build/inline_copy/zstd/common/fse_decompress.c +393 -0
- nuitka/build/inline_copy/zstd/common/huf.h +361 -0
- nuitka/build/inline_copy/zstd/common/mem.h +426 -0
- nuitka/build/inline_copy/zstd/common/xxhash.c +826 -0
- nuitka/build/inline_copy/zstd/common/xxhash.h +285 -0
- nuitka/build/inline_copy/zstd/common/zstd_common.c +83 -0
- nuitka/build/inline_copy/zstd/common/zstd_deps.h +111 -0
- nuitka/build/inline_copy/zstd/common/zstd_errors.h +95 -0
- nuitka/build/inline_copy/zstd/common/zstd_internal.h +478 -0
- nuitka/build/inline_copy/zstd/decompress/huf_decompress.c +1350 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_ddict.c +244 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_ddict.h +44 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_decompress.c +1930 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_decompress_block.c +1540 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_decompress_block.h +62 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_decompress_internal.h +190 -0
- nuitka/build/inline_copy/zstd/zstd.h +2391 -0
- nuitka/build/static_src/CompiledAsyncgenType.c +2211 -0
- nuitka/build/static_src/CompiledCellType.c +300 -0
- nuitka/build/static_src/CompiledCodeHelpers.c +2160 -0
- nuitka/build/static_src/CompiledCoroutineType.c +1946 -0
- nuitka/build/static_src/CompiledFrameType.c +1337 -0
- nuitka/build/static_src/CompiledFunctionType.c +3320 -0
- nuitka/build/static_src/CompiledGeneratorType.c +1997 -0
- nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +2117 -0
- nuitka/build/static_src/CompiledMethodType.c +614 -0
- nuitka/build/static_src/GenerateHeadersMain.c +30 -0
- nuitka/build/static_src/HelpersAllocator.c +939 -0
- nuitka/build/static_src/HelpersAttributes.c +1241 -0
- nuitka/build/static_src/HelpersBuiltin.c +901 -0
- nuitka/build/static_src/HelpersBuiltinTypeMethods.c +3594 -0
- nuitka/build/static_src/HelpersBytes.c +107 -0
- nuitka/build/static_src/HelpersCalling.c +397 -0
- nuitka/build/static_src/HelpersCallingGenerated.c +14361 -0
- nuitka/build/static_src/HelpersChecksumTools.c +59 -0
- nuitka/build/static_src/HelpersClasses.c +91 -0
- nuitka/build/static_src/HelpersComparisonDualEq.c +183 -0
- nuitka/build/static_src/HelpersComparisonDualGe.c +121 -0
- nuitka/build/static_src/HelpersComparisonDualGt.c +121 -0
- nuitka/build/static_src/HelpersComparisonDualLe.c +183 -0
- nuitka/build/static_src/HelpersComparisonDualLt.c +183 -0
- nuitka/build/static_src/HelpersComparisonDualNe.c +121 -0
- nuitka/build/static_src/HelpersComparisonEq.c +12070 -0
- nuitka/build/static_src/HelpersComparisonEqUtils.c +169 -0
- nuitka/build/static_src/HelpersComparisonGe.c +11871 -0
- nuitka/build/static_src/HelpersComparisonGt.c +11855 -0
- nuitka/build/static_src/HelpersComparisonLe.c +11957 -0
- nuitka/build/static_src/HelpersComparisonLt.c +11941 -0
- nuitka/build/static_src/HelpersComparisonNe.c +11979 -0
- nuitka/build/static_src/HelpersConsole.c +124 -0
- nuitka/build/static_src/HelpersConstantsBlob.c +1487 -0
- nuitka/build/static_src/HelpersDeepcopy.c +636 -0
- nuitka/build/static_src/HelpersDictionaries.c +1739 -0
- nuitka/build/static_src/HelpersDictionariesGenerated.c +738 -0
- nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
- nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
- nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +97 -0
- nuitka/build/static_src/HelpersExceptions.c +298 -0
- nuitka/build/static_src/HelpersFiles.c +353 -0
- nuitka/build/static_src/HelpersFilesystemPaths.c +1322 -0
- nuitka/build/static_src/HelpersFloats.c +92 -0
- nuitka/build/static_src/HelpersHeapStorage.c +68 -0
- nuitka/build/static_src/HelpersImport.c +506 -0
- nuitka/build/static_src/HelpersImportHard.c +526 -0
- nuitka/build/static_src/HelpersJitSources.c +48 -0
- nuitka/build/static_src/HelpersLists.c +899 -0
- nuitka/build/static_src/HelpersListsGenerated.c +564 -0
- nuitka/build/static_src/HelpersMappings.c +46 -0
- nuitka/build/static_src/HelpersMatching.c +192 -0
- nuitka/build/static_src/HelpersOperationBinaryAdd.c +6477 -0
- nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +703 -0
- nuitka/build/static_src/HelpersOperationBinaryBitand.c +2738 -0
- nuitka/build/static_src/HelpersOperationBinaryBitor.c +2738 -0
- nuitka/build/static_src/HelpersOperationBinaryBitxor.c +2738 -0
- nuitka/build/static_src/HelpersOperationBinaryDivmod.c +2406 -0
- nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +33 -0
- nuitka/build/static_src/HelpersOperationBinaryDualAdd.c +172 -0
- nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +2422 -0
- nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +220 -0
- nuitka/build/static_src/HelpersOperationBinaryLshift.c +2846 -0
- nuitka/build/static_src/HelpersOperationBinaryMatmult.c +453 -0
- nuitka/build/static_src/HelpersOperationBinaryMod.c +6549 -0
- nuitka/build/static_src/HelpersOperationBinaryMult.c +6438 -0
- nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +125 -0
- nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +2355 -0
- nuitka/build/static_src/HelpersOperationBinaryPow.c +2743 -0
- nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +26 -0
- nuitka/build/static_src/HelpersOperationBinaryRshift.c +2706 -0
- nuitka/build/static_src/HelpersOperationBinarySub.c +2649 -0
- nuitka/build/static_src/HelpersOperationBinaryTruediv.c +2415 -0
- nuitka/build/static_src/HelpersOperationInplaceAdd.c +5211 -0
- nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +144 -0
- nuitka/build/static_src/HelpersOperationInplaceBitand.c +1826 -0
- nuitka/build/static_src/HelpersOperationInplaceBitor.c +1826 -0
- nuitka/build/static_src/HelpersOperationInplaceBitxor.c +1826 -0
- nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +2605 -0
- nuitka/build/static_src/HelpersOperationInplaceLshift.c +1594 -0
- nuitka/build/static_src/HelpersOperationInplaceMatmult.c +603 -0
- nuitka/build/static_src/HelpersOperationInplaceMod.c +4762 -0
- nuitka/build/static_src/HelpersOperationInplaceMult.c +4689 -0
- nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +2553 -0
- nuitka/build/static_src/HelpersOperationInplacePow.c +2807 -0
- nuitka/build/static_src/HelpersOperationInplaceRshift.c +1534 -0
- nuitka/build/static_src/HelpersOperationInplaceSub.c +2894 -0
- nuitka/build/static_src/HelpersOperationInplaceTruediv.c +2612 -0
- nuitka/build/static_src/HelpersProfiling.c +104 -0
- nuitka/build/static_src/HelpersPythonPgo.c +113 -0
- nuitka/build/static_src/HelpersRaising.c +447 -0
- nuitka/build/static_src/HelpersSafeStrings.c +185 -0
- nuitka/build/static_src/HelpersSequences.c +134 -0
- nuitka/build/static_src/HelpersSlices.c +73 -0
- nuitka/build/static_src/HelpersStrings.c +998 -0
- nuitka/build/static_src/HelpersTuples.c +148 -0
- nuitka/build/static_src/HelpersTypes.c +329 -0
- nuitka/build/static_src/InspectPatcher.c +439 -0
- nuitka/build/static_src/MainProgram.c +2060 -0
- nuitka/build/static_src/MetaPathBasedLoader.c +2290 -0
- nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +125 -0
- nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +158 -0
- nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +785 -0
- nuitka/build/static_src/OnefileBootstrap.c +1580 -0
- nuitka/build/static_src/OnefileSplashScreen.cpp +275 -0
- nuitka/code_generation/AsyncgenCodes.py +186 -0
- nuitka/code_generation/AttributeCodes.py +357 -0
- nuitka/code_generation/BinaryOperationHelperDefinitions.py +720 -0
- nuitka/code_generation/BranchCodes.py +67 -0
- nuitka/code_generation/BuiltinCodes.py +529 -0
- nuitka/code_generation/CallCodes.py +1186 -0
- nuitka/code_generation/ClassCodes.py +156 -0
- nuitka/code_generation/CodeGeneration.py +1078 -0
- nuitka/code_generation/CodeHelperSelection.py +81 -0
- nuitka/code_generation/CodeHelpers.py +455 -0
- nuitka/code_generation/CodeObjectCodes.py +165 -0
- nuitka/code_generation/ComparisonCodes.py +569 -0
- nuitka/code_generation/ComparisonHelperDefinitions.py +146 -0
- nuitka/code_generation/ConditionalCodes.py +236 -0
- nuitka/code_generation/ConstantCodes.py +243 -0
- nuitka/code_generation/Contexts.py +1248 -0
- nuitka/code_generation/CoroutineCodes.py +253 -0
- nuitka/code_generation/CtypesCodes.py +46 -0
- nuitka/code_generation/DictCodes.py +918 -0
- nuitka/code_generation/Emission.py +75 -0
- nuitka/code_generation/ErrorCodes.py +281 -0
- nuitka/code_generation/EvalCodes.py +444 -0
- nuitka/code_generation/ExceptionCodes.py +337 -0
- nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +227 -0
- nuitka/code_generation/ExpressionCodes.py +61 -0
- nuitka/code_generation/FrameCodes.py +518 -0
- nuitka/code_generation/FunctionCodes.py +858 -0
- nuitka/code_generation/GeneratorCodes.py +218 -0
- nuitka/code_generation/GlobalConstants.py +249 -0
- nuitka/code_generation/GlobalsLocalsCodes.py +211 -0
- nuitka/code_generation/IdCodes.py +53 -0
- nuitka/code_generation/ImportCodes.py +468 -0
- nuitka/code_generation/Indentation.py +45 -0
- nuitka/code_generation/IndexCodes.py +50 -0
- nuitka/code_generation/InjectCCodes.py +28 -0
- nuitka/code_generation/IntegerCodes.py +110 -0
- nuitka/code_generation/IteratorCodes.py +378 -0
- nuitka/code_generation/JitCodes.py +44 -0
- nuitka/code_generation/LabelCodes.py +68 -0
- nuitka/code_generation/LineNumberCodes.py +91 -0
- nuitka/code_generation/ListCodes.py +502 -0
- nuitka/code_generation/LoaderCodes.py +193 -0
- nuitka/code_generation/LocalsDictCodes.py +359 -0
- nuitka/code_generation/LoopCodes.py +88 -0
- nuitka/code_generation/MatchCodes.py +67 -0
- nuitka/code_generation/ModuleCodes.py +247 -0
- nuitka/code_generation/Namify.py +260 -0
- nuitka/code_generation/NetworkxCodes.py +51 -0
- nuitka/code_generation/OperationCodes.py +398 -0
- nuitka/code_generation/PackageResourceCodes.py +986 -0
- nuitka/code_generation/PrintCodes.py +93 -0
- nuitka/code_generation/PythonAPICodes.py +215 -0
- nuitka/code_generation/RaisingCodes.py +481 -0
- nuitka/code_generation/Reports.py +115 -0
- nuitka/code_generation/ReturnCodes.py +143 -0
- nuitka/code_generation/SetCodes.py +196 -0
- nuitka/code_generation/SliceCodes.py +465 -0
- nuitka/code_generation/StringCodes.py +303 -0
- nuitka/code_generation/SubscriptCodes.py +263 -0
- nuitka/code_generation/TensorflowCodes.py +54 -0
- nuitka/code_generation/TryCodes.py +326 -0
- nuitka/code_generation/TupleCodes.py +115 -0
- nuitka/code_generation/TypeAliasCodes.py +120 -0
- nuitka/code_generation/VariableCodes.py +519 -0
- nuitka/code_generation/VariableDeclarations.py +279 -0
- nuitka/code_generation/YieldCodes.py +253 -0
- nuitka/code_generation/__init__.py +19 -0
- nuitka/code_generation/c_types/CTypeBases.py +177 -0
- nuitka/code_generation/c_types/CTypeBooleans.py +104 -0
- nuitka/code_generation/c_types/CTypeCFloats.py +57 -0
- nuitka/code_generation/c_types/CTypeCLongs.py +45 -0
- nuitka/code_generation/c_types/CTypeModuleDictVariables.py +109 -0
- nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +150 -0
- nuitka/code_generation/c_types/CTypeNuitkaInts.py +200 -0
- nuitka/code_generation/c_types/CTypeNuitkaVoids.py +107 -0
- nuitka/code_generation/c_types/CTypePyObjectPointers.py +572 -0
- nuitka/code_generation/c_types/CTypeVoids.py +92 -0
- nuitka/code_generation/c_types/__init__.py +19 -0
- nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +106 -0
- nuitka/code_generation/templates/CodeTemplatesConstants.py +296 -0
- nuitka/code_generation/templates/CodeTemplatesCoroutines.py +109 -0
- nuitka/code_generation/templates/CodeTemplatesExceptions.py +84 -0
- nuitka/code_generation/templates/CodeTemplatesFrames.py +235 -0
- nuitka/code_generation/templates/CodeTemplatesFunction.py +117 -0
- nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +130 -0
- nuitka/code_generation/templates/CodeTemplatesIterators.py +40 -0
- nuitka/code_generation/templates/CodeTemplatesLoader.py +180 -0
- nuitka/code_generation/templates/CodeTemplatesModules.py +710 -0
- nuitka/code_generation/templates/CodeTemplatesVariables.py +388 -0
- nuitka/code_generation/templates/TemplateDebugWrapper.py +80 -0
- nuitka/code_generation/templates/__init__.py +19 -0
- nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +321 -0
- nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +143 -0
- nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +677 -0
- nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +165 -0
- nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +38 -0
- nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +41 -0
- nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +53 -0
- nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +364 -0
- nuitka/code_generation/templates_c/HelperImportHard.c.j2 +37 -0
- nuitka/code_generation/templates_c/HelperLongTools.c.j2 +53 -0
- nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +20 -0
- nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +148 -0
- nuitka/code_generation/templates_c/HelperOperationBinaryDual.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +352 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonDual.c.j2 +86 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +31 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +32 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +112 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +157 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +99 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +281 -0
- nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +420 -0
- nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +51 -0
- nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +71 -0
- nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +327 -0
- nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +411 -0
- nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +59 -0
- nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +229 -0
- nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +47 -0
- nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +55 -0
- nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +58 -0
- nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +62 -0
- nuitka/containers/Namedtuples.py +51 -0
- nuitka/containers/OrderedDicts.py +191 -0
- nuitka/containers/OrderedSets.py +123 -0
- nuitka/containers/OrderedSetsFallback.py +139 -0
- nuitka/containers/__init__.py +19 -0
- nuitka/distutils/Build.py +76 -0
- nuitka/distutils/DistutilCommands.py +438 -0
- nuitka/distutils/__init__.py +19 -0
- nuitka/finalizations/Finalization.py +35 -0
- nuitka/finalizations/FinalizeMarkups.py +136 -0
- nuitka/finalizations/__init__.py +19 -0
- nuitka/freezer/DependsExe.py +257 -0
- nuitka/freezer/DllDependenciesCommon.py +97 -0
- nuitka/freezer/DllDependenciesMacOS.py +444 -0
- nuitka/freezer/DllDependenciesPosix.py +242 -0
- nuitka/freezer/DllDependenciesWin32.py +315 -0
- nuitka/freezer/ImportDetection.py +359 -0
- nuitka/freezer/IncludedDataFiles.py +689 -0
- nuitka/freezer/IncludedEntryPoints.py +376 -0
- nuitka/freezer/Onefile.py +296 -0
- nuitka/freezer/Standalone.py +520 -0
- nuitka/freezer/__init__.py +19 -0
- nuitka/importing/IgnoreListing.py +449 -0
- nuitka/importing/ImportCache.py +95 -0
- nuitka/importing/ImportResolving.py +186 -0
- nuitka/importing/Importing.py +1200 -0
- nuitka/importing/PreloadedPackages.py +164 -0
- nuitka/importing/Recursion.py +611 -0
- nuitka/importing/StandardLibrary.py +429 -0
- nuitka/importing/__init__.py +19 -0
- nuitka/nodes/AsyncgenNodes.py +107 -0
- nuitka/nodes/AttributeLookupNodes.py +124 -0
- nuitka/nodes/AttributeNodes.py +386 -0
- nuitka/nodes/AttributeNodesGenerated.py +10734 -0
- nuitka/nodes/BuiltinAllNodes.py +115 -0
- nuitka/nodes/BuiltinAnyNodes.py +124 -0
- nuitka/nodes/BuiltinComplexNodes.py +83 -0
- nuitka/nodes/BuiltinDecodingNodes.py +52 -0
- nuitka/nodes/BuiltinDecoratorNodes.py +85 -0
- nuitka/nodes/BuiltinDictNodes.py +140 -0
- nuitka/nodes/BuiltinFormatNodes.py +159 -0
- nuitka/nodes/BuiltinHashNodes.py +63 -0
- nuitka/nodes/BuiltinInputNodes.py +39 -0
- nuitka/nodes/BuiltinIntegerNodes.py +170 -0
- nuitka/nodes/BuiltinIteratorNodes.py +391 -0
- nuitka/nodes/BuiltinLenNodes.py +61 -0
- nuitka/nodes/BuiltinNextNodes.py +111 -0
- nuitka/nodes/BuiltinOpenNodes.py +148 -0
- nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +7367 -0
- nuitka/nodes/BuiltinRangeNodes.py +690 -0
- nuitka/nodes/BuiltinRefNodes.py +314 -0
- nuitka/nodes/BuiltinSumNodes.py +104 -0
- nuitka/nodes/BuiltinTypeNodes.py +454 -0
- nuitka/nodes/BuiltinVarsNodes.py +44 -0
- nuitka/nodes/BytesNodes.py +829 -0
- nuitka/nodes/CallNodes.py +217 -0
- nuitka/nodes/Checkers.py +55 -0
- nuitka/nodes/ChildrenHavingMixins.py +21576 -0
- nuitka/nodes/ClassNodes.py +286 -0
- nuitka/nodes/CodeObjectSpecs.py +230 -0
- nuitka/nodes/ComparisonNodes.py +687 -0
- nuitka/nodes/ConditionalNodes.py +884 -0
- nuitka/nodes/ConstantRefNodes.py +1717 -0
- nuitka/nodes/ContainerMakingNodes.py +408 -0
- nuitka/nodes/ContainerOperationNodes.py +87 -0
- nuitka/nodes/CoroutineNodes.py +144 -0
- nuitka/nodes/CtypesNodes.py +51 -0
- nuitka/nodes/DictionaryNodes.py +1513 -0
- nuitka/nodes/ExceptionNodes.py +393 -0
- nuitka/nodes/ExecEvalNodes.py +229 -0
- nuitka/nodes/ExpressionBases.py +1301 -0
- nuitka/nodes/ExpressionBasesGenerated.py +2103 -0
- nuitka/nodes/ExpressionShapeMixins.py +886 -0
- nuitka/nodes/FrameNodes.py +413 -0
- nuitka/nodes/FunctionAttributeNodes.py +102 -0
- nuitka/nodes/FunctionNodes.py +1303 -0
- nuitka/nodes/FutureSpecs.py +224 -0
- nuitka/nodes/GeneratorNodes.py +201 -0
- nuitka/nodes/GlobalsLocalsNodes.py +209 -0
- nuitka/nodes/HardImportNodesGenerated.py +3599 -0
- nuitka/nodes/ImportHardNodes.py +185 -0
- nuitka/nodes/ImportNodes.py +1366 -0
- nuitka/nodes/IndicatorMixins.py +79 -0
- nuitka/nodes/InjectCNodes.py +51 -0
- nuitka/nodes/IterationHandles.py +407 -0
- nuitka/nodes/KeyValuePairNodes.py +378 -0
- nuitka/nodes/ListOperationNodes.py +525 -0
- nuitka/nodes/LocalsDictNodes.py +717 -0
- nuitka/nodes/LocalsScopes.py +505 -0
- nuitka/nodes/LoopNodes.py +445 -0
- nuitka/nodes/MatchNodes.py +60 -0
- nuitka/nodes/ModuleAttributeNodes.py +180 -0
- nuitka/nodes/ModuleNodes.py +1137 -0
- nuitka/nodes/NetworkxNodes.py +45 -0
- nuitka/nodes/NodeBases.py +890 -0
- nuitka/nodes/NodeMakingHelpers.py +481 -0
- nuitka/nodes/NodeMetaClasses.py +172 -0
- nuitka/nodes/OperatorNodes.py +944 -0
- nuitka/nodes/OperatorNodesUnary.py +403 -0
- nuitka/nodes/OsSysNodes.py +215 -0
- nuitka/nodes/OutlineNodes.py +372 -0
- nuitka/nodes/PackageMetadataNodes.py +982 -0
- nuitka/nodes/PackageResourceNodes.py +424 -0
- nuitka/nodes/PrintNodes.py +105 -0
- nuitka/nodes/ReturnNodes.py +255 -0
- nuitka/nodes/SideEffectNodes.py +139 -0
- nuitka/nodes/SliceNodes.py +386 -0
- nuitka/nodes/StatementBasesGenerated.py +3419 -0
- nuitka/nodes/StatementNodes.py +316 -0
- nuitka/nodes/StrNodes.py +919 -0
- nuitka/nodes/StringConcatenationNodes.py +103 -0
- nuitka/nodes/SubscriptNodes.py +245 -0
- nuitka/nodes/TensorflowNodes.py +38 -0
- nuitka/nodes/TryNodes.py +519 -0
- nuitka/nodes/TypeMatchNodes.py +65 -0
- nuitka/nodes/TypeNodes.py +390 -0
- nuitka/nodes/VariableAssignNodes.py +1177 -0
- nuitka/nodes/VariableDelNodes.py +320 -0
- nuitka/nodes/VariableNameNodes.py +153 -0
- nuitka/nodes/VariableRefNodes.py +895 -0
- nuitka/nodes/VariableReleaseNodes.py +153 -0
- nuitka/nodes/YieldNodes.py +121 -0
- nuitka/nodes/__init__.py +19 -0
- nuitka/nodes/shapes/BuiltinTypeShapes.py +4290 -0
- nuitka/nodes/shapes/ControlFlowDescriptions.py +199 -0
- nuitka/nodes/shapes/IteratorShapes.py +71 -0
- nuitka/nodes/shapes/ShapeMixins.py +255 -0
- nuitka/nodes/shapes/StandardShapes.py +1384 -0
- nuitka/nodes/shapes/__init__.py +19 -0
- nuitka/optimizations/BytecodeDemotion.py +105 -0
- nuitka/optimizations/FunctionInlining.py +110 -0
- nuitka/optimizations/Graphs.py +70 -0
- nuitka/optimizations/Optimization.py +363 -0
- nuitka/optimizations/OptimizeBuiltinCalls.py +1582 -0
- nuitka/optimizations/Tags.py +76 -0
- nuitka/optimizations/TraceCollections.py +1257 -0
- nuitka/optimizations/ValueTraces.py +980 -0
- nuitka/optimizations/__init__.py +19 -0
- nuitka/pgo/PGO.py +160 -0
- nuitka/pgo/__init__.py +19 -0
- nuitka/plugins/PluginBase.py +1924 -0
- nuitka/plugins/Plugins.py +2007 -0
- nuitka/plugins/YamlPluginBase.py +121 -0
- nuitka/plugins/__init__.py +19 -0
- nuitka/plugins/standard/AntiBloatPlugin.py +1024 -0
- nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +95 -0
- nuitka/plugins/standard/DataFilesPlugin.py +311 -0
- nuitka/plugins/standard/DelvewheelPlugin.py +150 -0
- nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
- nuitka/plugins/standard/DillPlugin/cloudpickle-postLoad.py +67 -0
- nuitka/plugins/standard/DillPlugin/dill-postLoad.py +223 -0
- nuitka/plugins/standard/DillPlugin.py +137 -0
- nuitka/plugins/standard/DllFilesPlugin.py +527 -0
- nuitka/plugins/standard/EnumPlugin.py +64 -0
- nuitka/plugins/standard/EventletPlugin.py +57 -0
- nuitka/plugins/standard/GeventPlugin.py +64 -0
- nuitka/plugins/standard/GiPlugin.py +118 -0
- nuitka/plugins/standard/GlfwPlugin.py +138 -0
- nuitka/plugins/standard/ImplicitImports.py +845 -0
- nuitka/plugins/standard/KivyPlugin.py +141 -0
- nuitka/plugins/standard/MatplotlibPlugin.py +256 -0
- nuitka/plugins/standard/MultiprocessingPlugin.py +199 -0
- nuitka/plugins/standard/NumpyPlugin.py +35 -0
- nuitka/plugins/standard/OptionsNannyPlugin.py +158 -0
- nuitka/plugins/standard/PbrPlugin.py +62 -0
- nuitka/plugins/standard/PkgResourcesPlugin.py +162 -0
- nuitka/plugins/standard/PlaywrightPlugin.py +179 -0
- nuitka/plugins/standard/PmwPlugin.py +248 -0
- nuitka/plugins/standard/PySidePyQtPlugin.py +1666 -0
- nuitka/plugins/standard/PywebViewPlugin.py +81 -0
- nuitka/plugins/standard/SpacyPlugin.py +137 -0
- nuitka/plugins/standard/TensorflowPlugin.py +35 -0
- nuitka/plugins/standard/TkinterPlugin.py +416 -0
- nuitka/plugins/standard/TorchPlugin.py +35 -0
- nuitka/plugins/standard/TransformersPlugin.py +121 -0
- nuitka/plugins/standard/TrioPlugin.py +33 -0
- nuitka/plugins/standard/UpxPlugin.py +174 -0
- nuitka/plugins/standard/__init__.py +19 -0
- nuitka/plugins/standard/standard.nuitka-package.config.yml +9313 -0
- nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +78 -0
- nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +468 -0
- nuitka/reports/CompilationReportReader.py +83 -0
- nuitka/reports/LicenseReport.rst.j2 +41 -0
- nuitka/reports/Reports.py +961 -0
- nuitka/reports/__init__.py +19 -0
- nuitka/specs/BuiltinBytesOperationSpecs.py +180 -0
- nuitka/specs/BuiltinDictOperationSpecs.py +82 -0
- nuitka/specs/BuiltinListOperationSpecs.py +80 -0
- nuitka/specs/BuiltinParameterSpecs.py +831 -0
- nuitka/specs/BuiltinStrOperationSpecs.py +181 -0
- nuitka/specs/BuiltinTypeOperationSpecs.py +34 -0
- nuitka/specs/BuiltinUnicodeOperationSpecs.py +123 -0
- nuitka/specs/HardImportSpecs.py +236 -0
- nuitka/specs/ParameterSpecs.py +630 -0
- nuitka/specs/__init__.py +19 -0
- nuitka/tools/Basics.py +55 -0
- nuitka/tools/__init__.py +19 -0
- nuitka/tools/commercial/__init__.py +21 -0
- nuitka/tools/data_composer/DataComposer.py +593 -0
- nuitka/tools/data_composer/__init__.py +19 -0
- nuitka/tools/data_composer/__main__.py +41 -0
- nuitka/tools/environments/CreateEnvironment.py +69 -0
- nuitka/tools/environments/Virtualenv.py +158 -0
- nuitka/tools/environments/__init__.py +19 -0
- nuitka/tools/general/__init__.py +19 -0
- nuitka/tools/general/dll_report/__init__.py +19 -0
- nuitka/tools/general/dll_report/__main__.py +83 -0
- nuitka/tools/general/find_module/FindModuleCode.py +127 -0
- nuitka/tools/general/find_module/__init__.py +19 -0
- nuitka/tools/general/generate_header/GenerateHeader.py +73 -0
- nuitka/tools/general/generate_header/__init__.py +19 -0
- nuitka/tools/onefile_compressor/OnefileCompressor.py +390 -0
- nuitka/tools/onefile_compressor/__init__.py +19 -0
- nuitka/tools/onefile_compressor/__main__.py +41 -0
- nuitka/tools/podman/Podman.py +55 -0
- nuitka/tools/podman/__init__.py +19 -0
- nuitka/tools/podman/__main__.py +425 -0
- nuitka/tools/profiler/__init__.py +19 -0
- nuitka/tools/profiler/__main__.py +93 -0
- nuitka/tools/scanning/DisplayDistributions.py +39 -0
- nuitka/tools/scanning/DisplayPackageDLLs.py +151 -0
- nuitka/tools/scanning/DisplayPackageData.py +73 -0
- nuitka/tools/scanning/__init__.py +19 -0
- nuitka/tools/specialize/CTypeDescriptions.py +1928 -0
- nuitka/tools/specialize/Common.py +380 -0
- nuitka/tools/specialize/SpecializeC.py +1483 -0
- nuitka/tools/specialize/SpecializePython.py +1151 -0
- nuitka/tools/specialize/__init__.py +19 -0
- nuitka/tools/testing/Common.py +2007 -0
- nuitka/tools/testing/Constructs.py +53 -0
- nuitka/tools/testing/DocTests.py +156 -0
- nuitka/tools/testing/OutputComparison.py +313 -0
- nuitka/tools/testing/Pythons.py +34 -0
- nuitka/tools/testing/RuntimeTracing.py +260 -0
- nuitka/tools/testing/SearchModes.py +208 -0
- nuitka/tools/testing/Valgrind.py +103 -0
- nuitka/tools/testing/__init__.py +19 -0
- nuitka/tools/testing/check_reference_counts/__init__.py +19 -0
- nuitka/tools/testing/check_reference_counts/__main__.py +107 -0
- nuitka/tools/testing/compare_with_cpython/__init__.py +19 -0
- nuitka/tools/testing/compare_with_cpython/__main__.py +942 -0
- nuitka/tools/testing/find_sxs_modules/__init__.py +19 -0
- nuitka/tools/testing/find_sxs_modules/__main__.py +73 -0
- nuitka/tools/testing/measure_construct_performance/__init__.py +19 -0
- nuitka/tools/testing/measure_construct_performance/__main__.py +288 -0
- nuitka/tools/testing/run_nuitka_tests/__init__.py +19 -0
- nuitka/tools/testing/run_nuitka_tests/__main__.py +1091 -0
- nuitka/tools/watch/AutoStage.py +145 -0
- nuitka/tools/watch/Common.py +55 -0
- nuitka/tools/watch/Conda.py +125 -0
- nuitka/tools/watch/GitHub.py +113 -0
- nuitka/tools/watch/Pacman.py +73 -0
- nuitka/tools/watch/Pipenv.py +145 -0
- nuitka/tools/watch/__init__.py +19 -0
- nuitka/tools/watch/__main__.py +615 -0
- nuitka/tree/Building.py +1459 -0
- nuitka/tree/ComplexCallHelperFunctions.py +2150 -0
- nuitka/tree/Extractions.py +48 -0
- nuitka/tree/FutureSpecState.py +71 -0
- nuitka/tree/InternalModule.py +96 -0
- nuitka/tree/Operations.py +45 -0
- nuitka/tree/ReformulationAssertStatements.py +97 -0
- nuitka/tree/ReformulationAssignmentStatements.py +1260 -0
- nuitka/tree/ReformulationBooleanExpressions.py +97 -0
- nuitka/tree/ReformulationCallExpressions.py +314 -0
- nuitka/tree/ReformulationClasses.py +407 -0
- nuitka/tree/ReformulationClasses3.py +1149 -0
- nuitka/tree/ReformulationComparisonExpressions.py +174 -0
- nuitka/tree/ReformulationContractionExpressions.py +676 -0
- nuitka/tree/ReformulationDictionaryCreation.py +304 -0
- nuitka/tree/ReformulationExecStatements.py +386 -0
- nuitka/tree/ReformulationForLoopStatements.py +215 -0
- nuitka/tree/ReformulationFunctionStatements.py +931 -0
- nuitka/tree/ReformulationImportStatements.py +333 -0
- nuitka/tree/ReformulationLambdaExpressions.py +185 -0
- nuitka/tree/ReformulationMatchStatements.py +797 -0
- nuitka/tree/ReformulationMultidist.py +80 -0
- nuitka/tree/ReformulationNamespacePackages.py +239 -0
- nuitka/tree/ReformulationPrintStatements.py +127 -0
- nuitka/tree/ReformulationSequenceCreation.py +438 -0
- nuitka/tree/ReformulationSubscriptExpressions.py +123 -0
- nuitka/tree/ReformulationTryExceptStatements.py +418 -0
- nuitka/tree/ReformulationTryFinallyStatements.py +239 -0
- nuitka/tree/ReformulationWhileLoopStatements.py +160 -0
- nuitka/tree/ReformulationWithStatements.py +382 -0
- nuitka/tree/ReformulationYieldExpressions.py +133 -0
- nuitka/tree/SourceHandling.py +476 -0
- nuitka/tree/SyntaxErrors.py +143 -0
- nuitka/tree/TreeHelpers.py +720 -0
- nuitka/tree/VariableClosure.py +483 -0
- nuitka/tree/__init__.py +19 -0
- nuitka/utils/AppDirs.py +104 -0
- nuitka/utils/CStrings.py +208 -0
- nuitka/utils/CommandLineOptions.py +207 -0
- nuitka/utils/Distributions.py +728 -0
- nuitka/utils/Download.py +217 -0
- nuitka/utils/Execution.py +517 -0
- nuitka/utils/FileOperations.py +1587 -0
- nuitka/utils/Hashing.py +137 -0
- nuitka/utils/Images.py +79 -0
- nuitka/utils/Importing.py +335 -0
- nuitka/utils/InlineCopies.py +52 -0
- nuitka/utils/InstalledPythons.py +254 -0
- nuitka/utils/InstanceCounters.py +86 -0
- nuitka/utils/Jinja2.py +158 -0
- nuitka/utils/Json.py +40 -0
- nuitka/utils/MacOSApp.py +134 -0
- nuitka/utils/MemoryUsage.py +165 -0
- nuitka/utils/ModuleNames.py +317 -0
- nuitka/utils/PackageResources.py +44 -0
- nuitka/utils/ReExecute.py +152 -0
- nuitka/utils/Rest.py +60 -0
- nuitka/utils/SharedLibraries.py +1014 -0
- nuitka/utils/Shebang.py +113 -0
- nuitka/utils/Signing.py +144 -0
- nuitka/utils/SlotMetaClasses.py +57 -0
- nuitka/utils/StaticLibraries.py +260 -0
- nuitka/utils/ThreadedExecutor.py +87 -0
- nuitka/utils/Timing.py +102 -0
- nuitka/utils/Utils.py +483 -0
- nuitka/utils/WindowsFileUsage.py +337 -0
- nuitka/utils/WindowsResources.py +652 -0
- nuitka/utils/Yaml.py +247 -0
- nuitka/utils/__init__.py +19 -0
- nuitka_winsvc-2.7.7.data/scripts/nuitka-run.cmd +24 -0
- nuitka_winsvc-2.7.7.data/scripts/nuitka.cmd +30 -0
- nuitka_winsvc-2.7.7.dist-info/METADATA +115 -0
- nuitka_winsvc-2.7.7.dist-info/RECORD +995 -0
- nuitka_winsvc-2.7.7.dist-info/WHEEL +5 -0
- nuitka_winsvc-2.7.7.dist-info/entry_points.txt +7 -0
- nuitka_winsvc-2.7.7.dist-info/licenses/LICENSE.txt +202 -0
- nuitka_winsvc-2.7.7.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,2211 @@
|
|
|
1
|
+
// Copyright 2025, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
|
|
2
|
+
|
|
3
|
+
/** Compiled Asyncgen.
|
|
4
|
+
*
|
|
5
|
+
* Unlike in CPython, we have one type for just asyncgen, this doesn't do
|
|
6
|
+
* generators nor coroutines.
|
|
7
|
+
*
|
|
8
|
+
* It strives to be full replacement for normal asyncgen.
|
|
9
|
+
*
|
|
10
|
+
* spellchecker: ignore Asend,Athrow
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
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/freelists.h"
|
|
18
|
+
#include "nuitka/prelude.h"
|
|
19
|
+
#include <structmember.h>
|
|
20
|
+
#endif
|
|
21
|
+
|
|
22
|
+
// For reporting about reference counts per type.
|
|
23
|
+
#if _DEBUG_REFCOUNTS
|
|
24
|
+
int count_active_Nuitka_Asyncgen_Type = 0;
|
|
25
|
+
int count_allocated_Nuitka_Asyncgen_Type = 0;
|
|
26
|
+
int count_released_Nuitka_Asyncgen_Type = 0;
|
|
27
|
+
int count_active_Nuitka_AsyncgenValueWrapper_Type = 0;
|
|
28
|
+
int count_allocated_Nuitka_AsyncgenValueWrapper_Type = 0;
|
|
29
|
+
int count_released_Nuitka_AsyncgenValueWrapper_Type = 0;
|
|
30
|
+
int count_active_Nuitka_AsyncgenAsend_Type = 0;
|
|
31
|
+
int count_allocated_Nuitka_AsyncgenAsend_Type = 0;
|
|
32
|
+
int count_released_Nuitka_AsyncgenAsend_Type = 0;
|
|
33
|
+
int count_active_Nuitka_AsyncgenAthrow_Type = 0;
|
|
34
|
+
int count_allocated_Nuitka_AsyncgenAthrow_Type = 0;
|
|
35
|
+
int count_released_Nuitka_AsyncgenAthrow_Type = 0;
|
|
36
|
+
#endif
|
|
37
|
+
|
|
38
|
+
static void Nuitka_MarkAsyncgenAsFinished(struct Nuitka_AsyncgenObject *asyncgen) {
|
|
39
|
+
asyncgen->m_status = status_Finished;
|
|
40
|
+
|
|
41
|
+
#if PYTHON_VERSION >= 0x3b0
|
|
42
|
+
if (asyncgen->m_frame) {
|
|
43
|
+
asyncgen->m_frame->m_frame_state = FRAME_COMPLETED;
|
|
44
|
+
}
|
|
45
|
+
#endif
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
static void Nuitka_MarkAsyncgenAsRunning(struct Nuitka_AsyncgenObject *asyncgen) {
|
|
49
|
+
asyncgen->m_running = 1;
|
|
50
|
+
|
|
51
|
+
if (asyncgen->m_frame) {
|
|
52
|
+
Nuitka_Frame_MarkAsExecuting(asyncgen->m_frame);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
static void Nuitka_MarkAsyncgenAsNotRunning(struct Nuitka_AsyncgenObject *asyncgen) {
|
|
57
|
+
asyncgen->m_running = 0;
|
|
58
|
+
|
|
59
|
+
if (asyncgen->m_frame) {
|
|
60
|
+
Nuitka_Frame_MarkAsNotExecuting(asyncgen->m_frame);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
static long Nuitka_Asyncgen_tp_hash(struct Nuitka_AsyncgenObject *asyncgen) { return asyncgen->m_counter; }
|
|
65
|
+
|
|
66
|
+
static PyObject *Nuitka_Asyncgen_get_name(PyObject *self, void *data) {
|
|
67
|
+
CHECK_OBJECT(self);
|
|
68
|
+
|
|
69
|
+
struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
|
|
70
|
+
Py_INCREF(asyncgen->m_name);
|
|
71
|
+
return asyncgen->m_name;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
static int Nuitka_Asyncgen_set_name(PyObject *self, PyObject *value, void *data) {
|
|
75
|
+
CHECK_OBJECT(self);
|
|
76
|
+
CHECK_OBJECT_X(value);
|
|
77
|
+
|
|
78
|
+
// Cannot be deleted, not be non-unicode value.
|
|
79
|
+
if (unlikely((value == NULL) || !PyUnicode_Check(value))) {
|
|
80
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
81
|
+
|
|
82
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "__name__ must be set to a string object");
|
|
83
|
+
return -1;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
|
|
87
|
+
PyObject *tmp = asyncgen->m_name;
|
|
88
|
+
Py_INCREF(value);
|
|
89
|
+
asyncgen->m_name = value;
|
|
90
|
+
Py_DECREF(tmp);
|
|
91
|
+
|
|
92
|
+
return 0;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
static PyObject *Nuitka_Asyncgen_get_qualname(PyObject *self, void *data) {
|
|
96
|
+
CHECK_OBJECT(self);
|
|
97
|
+
|
|
98
|
+
struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
|
|
99
|
+
Py_INCREF(asyncgen->m_qualname);
|
|
100
|
+
return asyncgen->m_qualname;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
static int Nuitka_Asyncgen_set_qualname(PyObject *self, PyObject *value, void *data) {
|
|
104
|
+
CHECK_OBJECT(self);
|
|
105
|
+
CHECK_OBJECT_X(value);
|
|
106
|
+
|
|
107
|
+
// Cannot be deleted, not be non-unicode value.
|
|
108
|
+
if (unlikely((value == NULL) || !PyUnicode_Check(value))) {
|
|
109
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
110
|
+
|
|
111
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "__qualname__ must be set to a string object");
|
|
112
|
+
return -1;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
|
|
116
|
+
PyObject *tmp = asyncgen->m_qualname;
|
|
117
|
+
Py_INCREF(value);
|
|
118
|
+
asyncgen->m_qualname = value;
|
|
119
|
+
Py_DECREF(tmp);
|
|
120
|
+
|
|
121
|
+
return 0;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
static PyObject *Nuitka_Asyncgen_get_ag_await(PyObject *self, void *data) {
|
|
125
|
+
CHECK_OBJECT(self);
|
|
126
|
+
|
|
127
|
+
struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
|
|
128
|
+
if (asyncgen->m_yield_from) {
|
|
129
|
+
Py_INCREF(asyncgen->m_yield_from);
|
|
130
|
+
return asyncgen->m_yield_from;
|
|
131
|
+
} else {
|
|
132
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
133
|
+
return Py_None;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
static PyObject *Nuitka_Asyncgen_get_code(PyObject *self, void *data) {
|
|
138
|
+
struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
|
|
139
|
+
CHECK_OBJECT(asyncgen);
|
|
140
|
+
CHECK_OBJECT(asyncgen->m_code_object);
|
|
141
|
+
|
|
142
|
+
Py_INCREF(asyncgen->m_code_object);
|
|
143
|
+
return (PyObject *)asyncgen->m_code_object;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
static int Nuitka_Asyncgen_set_code(PyObject *self, PyObject *value, void *data) {
|
|
147
|
+
CHECK_OBJECT(self);
|
|
148
|
+
|
|
149
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
150
|
+
|
|
151
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "ag_code is not writable in Nuitka");
|
|
152
|
+
return -1;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
static PyObject *Nuitka_Asyncgen_get_frame(PyObject *self, void *data) {
|
|
156
|
+
struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
|
|
157
|
+
CHECK_OBJECT(asyncgen);
|
|
158
|
+
CHECK_OBJECT_X(asyncgen->m_frame);
|
|
159
|
+
|
|
160
|
+
if (asyncgen->m_frame) {
|
|
161
|
+
Py_INCREF(asyncgen->m_frame);
|
|
162
|
+
return (PyObject *)asyncgen->m_frame;
|
|
163
|
+
} else {
|
|
164
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
165
|
+
return Py_None;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
static int Nuitka_Asyncgen_set_frame(PyObject *self, PyObject *value, void *data) {
|
|
170
|
+
CHECK_OBJECT(self);
|
|
171
|
+
CHECK_OBJECT_X(value);
|
|
172
|
+
|
|
173
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
174
|
+
|
|
175
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "ag_frame is not writable in Nuitka");
|
|
176
|
+
return -1;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
static void Nuitka_Asyncgen_release_closure(struct Nuitka_AsyncgenObject *asyncgen) {
|
|
180
|
+
for (Py_ssize_t i = 0; i < asyncgen->m_closure_given; i++) {
|
|
181
|
+
CHECK_OBJECT(asyncgen->m_closure[i]);
|
|
182
|
+
Py_DECREF(asyncgen->m_closure[i]);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// This can be ran multiple times, set the count to zero,
|
|
186
|
+
// after first run, which deactivates the above loop.
|
|
187
|
+
asyncgen->m_closure_given = 0;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
static PyObject *Nuitka_YieldFromAsyncgenCore(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen,
|
|
191
|
+
PyObject *send_value, bool mode) {
|
|
192
|
+
CHECK_OBJECT(asyncgen);
|
|
193
|
+
CHECK_OBJECT_X(send_value);
|
|
194
|
+
|
|
195
|
+
PyObject *yield_from = asyncgen->m_yield_from;
|
|
196
|
+
CHECK_OBJECT(yield_from);
|
|
197
|
+
|
|
198
|
+
// Need to make it unaccessible while using it.
|
|
199
|
+
asyncgen->m_yield_from = NULL;
|
|
200
|
+
|
|
201
|
+
PyObject *returned_value;
|
|
202
|
+
PyObject *yielded = _Nuitka_YieldFromCore(tstate, yield_from, send_value, &returned_value, mode);
|
|
203
|
+
|
|
204
|
+
if (yielded == NULL) {
|
|
205
|
+
assert(asyncgen->m_yield_from == NULL);
|
|
206
|
+
Py_DECREF(yield_from);
|
|
207
|
+
|
|
208
|
+
yielded = ((asyncgen_code)asyncgen->m_code)(tstate, asyncgen, returned_value);
|
|
209
|
+
} else {
|
|
210
|
+
assert(asyncgen->m_yield_from == NULL);
|
|
211
|
+
asyncgen->m_yield_from = yield_from;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return yielded;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
#if _DEBUG_ASYNCGEN
|
|
218
|
+
NUITKA_MAY_BE_UNUSED static void _PRINT_ASYNCGEN_STATUS(char const *descriptor, char const *context,
|
|
219
|
+
struct Nuitka_AsyncgenObject *asyncgen) {
|
|
220
|
+
char const *status;
|
|
221
|
+
|
|
222
|
+
switch (asyncgen->m_status) {
|
|
223
|
+
case status_Finished:
|
|
224
|
+
status = "(finished)";
|
|
225
|
+
break;
|
|
226
|
+
case status_Running:
|
|
227
|
+
status = "(running)";
|
|
228
|
+
break;
|
|
229
|
+
case status_Unused:
|
|
230
|
+
status = "(unused)";
|
|
231
|
+
break;
|
|
232
|
+
default:
|
|
233
|
+
status = "(ILLEGAL)";
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
PRINT_STRING(descriptor);
|
|
238
|
+
PRINT_STRING(" : ");
|
|
239
|
+
PRINT_STRING(context);
|
|
240
|
+
PRINT_STRING(" ");
|
|
241
|
+
PRINT_ITEM((PyObject *)asyncgen);
|
|
242
|
+
PRINT_STRING(" ");
|
|
243
|
+
PRINT_STRING(status);
|
|
244
|
+
PRINT_NEW_LINE();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
#define PRINT_ASYNCGEN_STATUS(context, asyncgen) _PRINT_ASYNCGEN_STATUS(__FUNCTION__, context, asyncgen)
|
|
248
|
+
|
|
249
|
+
#endif
|
|
250
|
+
|
|
251
|
+
static PyObject *Nuitka_YieldFromAsyncgenNext(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen) {
|
|
252
|
+
CHECK_OBJECT(asyncgen);
|
|
253
|
+
|
|
254
|
+
#if _DEBUG_ASYNCGEN
|
|
255
|
+
PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
|
|
256
|
+
PRINT_NEW_LINE();
|
|
257
|
+
#endif
|
|
258
|
+
PyObject *result = Nuitka_YieldFromAsyncgenCore(tstate, asyncgen, Py_None, true);
|
|
259
|
+
#if _DEBUG_ASYNCGEN
|
|
260
|
+
PRINT_ASYNCGEN_STATUS("Leave", asyncgen);
|
|
261
|
+
PRINT_CURRENT_EXCEPTION();
|
|
262
|
+
PRINT_NEW_LINE();
|
|
263
|
+
#endif
|
|
264
|
+
|
|
265
|
+
return result;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
static PyObject *Nuitka_YieldFromAsyncgenInitial(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen,
|
|
269
|
+
PyObject *send_value) {
|
|
270
|
+
CHECK_OBJECT(asyncgen);
|
|
271
|
+
CHECK_OBJECT_X(send_value);
|
|
272
|
+
|
|
273
|
+
#if _DEBUG_ASYNCGEN
|
|
274
|
+
PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
|
|
275
|
+
PRINT_NEW_LINE();
|
|
276
|
+
#endif
|
|
277
|
+
PyObject *result = Nuitka_YieldFromAsyncgenCore(tstate, asyncgen, send_value, false);
|
|
278
|
+
#if _DEBUG_ASYNCGEN
|
|
279
|
+
PRINT_ASYNCGEN_STATUS("Leave", asyncgen);
|
|
280
|
+
PRINT_CURRENT_EXCEPTION();
|
|
281
|
+
PRINT_NEW_LINE();
|
|
282
|
+
#endif
|
|
283
|
+
|
|
284
|
+
return result;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
static PyObject *Nuitka_AsyncgenValueWrapper_New(PyObject *value);
|
|
288
|
+
|
|
289
|
+
static PySendResult _Nuitka_Asyncgen_sendR(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen,
|
|
290
|
+
PyObject *value, bool closing,
|
|
291
|
+
struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
292
|
+
PyObject **result) {
|
|
293
|
+
CHECK_OBJECT(asyncgen);
|
|
294
|
+
assert(Nuitka_Asyncgen_Check((PyObject *)asyncgen));
|
|
295
|
+
CHECK_OBJECT_X(value);
|
|
296
|
+
CHECK_EXCEPTION_STATE_X(exception_state);
|
|
297
|
+
|
|
298
|
+
#if _DEBUG_ASYNCGEN
|
|
299
|
+
PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
|
|
300
|
+
PRINT_COROUTINE_VALUE("value", value);
|
|
301
|
+
PRINT_EXCEPTION_STATE(exception_state);
|
|
302
|
+
PRINT_CURRENT_EXCEPTION();
|
|
303
|
+
PRINT_NEW_LINE();
|
|
304
|
+
#endif
|
|
305
|
+
|
|
306
|
+
if (value != NULL) {
|
|
307
|
+
ASSERT_EMPTY_EXCEPTION_STATE(exception_state);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
if (asyncgen->m_status == status_Unused && value != NULL && value != Py_None) {
|
|
311
|
+
// No exception if value is given.
|
|
312
|
+
Py_XDECREF(value);
|
|
313
|
+
|
|
314
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
|
|
315
|
+
"can't send non-None value to a just-started async generator");
|
|
316
|
+
return PYGEN_ERROR;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
if (asyncgen->m_status != status_Finished) {
|
|
320
|
+
if (asyncgen->m_running) {
|
|
321
|
+
Py_XDECREF(value);
|
|
322
|
+
|
|
323
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ValueError, "async generator already executing");
|
|
324
|
+
return PYGEN_ERROR;
|
|
325
|
+
}
|
|
326
|
+
// Put the asyncgen back on the frame stack.
|
|
327
|
+
Nuitka_ThreadStateFrameType *return_frame = _Nuitka_GetThreadStateFrame(tstate);
|
|
328
|
+
|
|
329
|
+
// Consider it as running.
|
|
330
|
+
if (asyncgen->m_status == status_Unused) {
|
|
331
|
+
asyncgen->m_status = status_Running;
|
|
332
|
+
assert(asyncgen->m_resume_frame == NULL);
|
|
333
|
+
|
|
334
|
+
// Value will not be used, can only be Py_None or NULL.
|
|
335
|
+
Py_XDECREF(value);
|
|
336
|
+
value = NULL;
|
|
337
|
+
} else {
|
|
338
|
+
assert(asyncgen->m_resume_frame);
|
|
339
|
+
pushFrameStackGenerator(tstate, asyncgen->m_resume_frame);
|
|
340
|
+
|
|
341
|
+
asyncgen->m_resume_frame = NULL;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// Continue the yielder function while preventing recursion.
|
|
345
|
+
asyncgen->m_running = true;
|
|
346
|
+
|
|
347
|
+
// Check for thrown exception, and publish it.
|
|
348
|
+
if (unlikely(HAS_EXCEPTION_STATE(exception_state))) {
|
|
349
|
+
assert(value == NULL);
|
|
350
|
+
|
|
351
|
+
// Transfer exception ownership to published.
|
|
352
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
if (asyncgen->m_frame) {
|
|
356
|
+
Nuitka_Frame_MarkAsExecuting(asyncgen->m_frame);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
#if _DEBUG_ASYNCGEN
|
|
360
|
+
PRINT_ASYNCGEN_STATUS("Switching to asyncgen", asyncgen);
|
|
361
|
+
PRINT_COROUTINE_VALUE("value", value);
|
|
362
|
+
PRINT_CURRENT_EXCEPTION();
|
|
363
|
+
PRINT_NEW_LINE();
|
|
364
|
+
// dumpFrameStack();
|
|
365
|
+
#endif
|
|
366
|
+
|
|
367
|
+
PyObject *yielded;
|
|
368
|
+
|
|
369
|
+
if (asyncgen->m_yield_from == NULL) {
|
|
370
|
+
// This consumes a reference to the value.
|
|
371
|
+
yielded = ((asyncgen_code)asyncgen->m_code)(tstate, asyncgen, value);
|
|
372
|
+
} else {
|
|
373
|
+
// This does not release the value if any, so we need to do it afterwards.
|
|
374
|
+
yielded = Nuitka_YieldFromAsyncgenInitial(tstate, asyncgen, value);
|
|
375
|
+
Py_XDECREF(value);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// If the asyncgen returns with m_yield_from set, it wants us to yield
|
|
379
|
+
// from that value from now on.
|
|
380
|
+
while (yielded == NULL && asyncgen->m_yield_from != NULL) {
|
|
381
|
+
yielded = Nuitka_YieldFromAsyncgenNext(tstate, asyncgen);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
385
|
+
|
|
386
|
+
// Remove the back frame from asyncgen if it's there.
|
|
387
|
+
if (asyncgen->m_frame) {
|
|
388
|
+
// assert(tstate->frame == &asyncgen->m_frame->m_frame);
|
|
389
|
+
assertFrameObject(asyncgen->m_frame);
|
|
390
|
+
|
|
391
|
+
Py_CLEAR(asyncgen->m_frame->m_frame.f_back);
|
|
392
|
+
|
|
393
|
+
// Remember where to resume from.
|
|
394
|
+
asyncgen->m_resume_frame = _Nuitka_GetThreadStateFrame(tstate);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// Return back to the frame that called us.
|
|
398
|
+
_Nuitka_GeneratorPopFrame(tstate, return_frame);
|
|
399
|
+
|
|
400
|
+
#if _DEBUG_ASYNCGEN
|
|
401
|
+
PRINT_ASYNCGEN_STATUS("Returned from asyncgen", asyncgen);
|
|
402
|
+
// dumpFrameStack();
|
|
403
|
+
#endif
|
|
404
|
+
|
|
405
|
+
#ifndef __NUITKA_NO_ASSERT__
|
|
406
|
+
if (return_frame) {
|
|
407
|
+
assertThreadFrameObject(return_frame);
|
|
408
|
+
}
|
|
409
|
+
#endif
|
|
410
|
+
|
|
411
|
+
if (yielded == NULL) {
|
|
412
|
+
#if _DEBUG_ASYNCGEN
|
|
413
|
+
PRINT_ASYNCGEN_STATUS("finishing from yield", asyncgen);
|
|
414
|
+
PRINT_CURRENT_EXCEPTION();
|
|
415
|
+
PRINT_STRING("-> finishing asyncgen with exception sets status_Finished\n");
|
|
416
|
+
PRINT_NEW_LINE();
|
|
417
|
+
#endif
|
|
418
|
+
Nuitka_MarkAsyncgenAsFinished(asyncgen);
|
|
419
|
+
|
|
420
|
+
if (asyncgen->m_frame != NULL) {
|
|
421
|
+
Nuitka_SetFrameGenerator(asyncgen->m_frame, NULL);
|
|
422
|
+
Py_DECREF(asyncgen->m_frame);
|
|
423
|
+
asyncgen->m_frame = NULL;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
Nuitka_Asyncgen_release_closure(asyncgen);
|
|
427
|
+
|
|
428
|
+
PyObject *error_occurred = GET_ERROR_OCCURRED(tstate);
|
|
429
|
+
|
|
430
|
+
if (error_occurred == PyExc_StopIteration || error_occurred == PyExc_StopAsyncIteration) {
|
|
431
|
+
char const *message;
|
|
432
|
+
if (error_occurred == PyExc_StopIteration) {
|
|
433
|
+
message = "async generator raised StopIteration";
|
|
434
|
+
} else {
|
|
435
|
+
message = "async generator raised StopAsyncIteration";
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
RAISE_RUNTIME_ERROR_RAISED_STOP_ITERATION(tstate, message);
|
|
439
|
+
return PYGEN_ERROR;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
return PYGEN_ERROR;
|
|
443
|
+
} else {
|
|
444
|
+
// For normal yield, wrap the result value before returning.
|
|
445
|
+
if (asyncgen->m_yield_from == NULL) {
|
|
446
|
+
// Transferred ownership to constructor of Nuitka_AsyncgenValueWrapper
|
|
447
|
+
PyObject *wrapped = Nuitka_AsyncgenValueWrapper_New(yielded);
|
|
448
|
+
yielded = wrapped;
|
|
449
|
+
|
|
450
|
+
assert(yielded != NULL);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
*result = yielded;
|
|
454
|
+
return PYGEN_NEXT;
|
|
455
|
+
}
|
|
456
|
+
} else {
|
|
457
|
+
Py_XDECREF(value);
|
|
458
|
+
|
|
459
|
+
// Release exception if any, we are finished with it and will raise another.
|
|
460
|
+
RELEASE_ERROR_OCCURRED_STATE_X(exception_state);
|
|
461
|
+
|
|
462
|
+
return PYGEN_RETURN;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
static PyObject *_Nuitka_Asyncgen_send(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen, PyObject *value,
|
|
467
|
+
bool closing, struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
468
|
+
|
|
469
|
+
PyObject *result;
|
|
470
|
+
PySendResult res = _Nuitka_Asyncgen_sendR(tstate, asyncgen, value, closing, exception_state, &result);
|
|
471
|
+
|
|
472
|
+
switch (res) {
|
|
473
|
+
case PYGEN_RETURN:
|
|
474
|
+
SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
|
|
475
|
+
return NULL;
|
|
476
|
+
case PYGEN_NEXT:
|
|
477
|
+
return result;
|
|
478
|
+
case PYGEN_ERROR:
|
|
479
|
+
return NULL;
|
|
480
|
+
default:
|
|
481
|
+
NUITKA_CANNOT_GET_HERE("invalid PYGEN_ result");
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Note: Used by compiled frames.
|
|
486
|
+
static bool _Nuitka_Asyncgen_close(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen) {
|
|
487
|
+
#if _DEBUG_ASYNCGEN
|
|
488
|
+
PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
|
|
489
|
+
#endif
|
|
490
|
+
CHECK_OBJECT(asyncgen);
|
|
491
|
+
|
|
492
|
+
if (asyncgen->m_status == status_Running) {
|
|
493
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
494
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, &exception_state, PyExc_GeneratorExit, NULL, NULL);
|
|
495
|
+
|
|
496
|
+
PyObject *result = _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, true, &exception_state);
|
|
497
|
+
|
|
498
|
+
if (unlikely(result)) {
|
|
499
|
+
Py_DECREF(result);
|
|
500
|
+
|
|
501
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "async generator ignored GeneratorExit");
|
|
502
|
+
return false;
|
|
503
|
+
} else {
|
|
504
|
+
return DROP_ERROR_OCCURRED_GENERATOR_EXIT_OR_STOP_ITERATION(tstate);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
return true;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
static bool _Nuitka_Generator_check_throw(PyThreadState *tstate,
|
|
512
|
+
struct Nuitka_ExceptionPreservationItem *exception_state);
|
|
513
|
+
|
|
514
|
+
// This function is called when yielding to a asyncgen through "_Nuitka_YieldFromPassExceptionTo"
|
|
515
|
+
// and potentially wrapper objects used by generators, or by the throw method itself.
|
|
516
|
+
// Note:
|
|
517
|
+
// Exception arguments are passed for ownership and must be released before returning. The
|
|
518
|
+
// value of exception_type will not be NULL, but the actual exception will not necessarily
|
|
519
|
+
// be normalized.
|
|
520
|
+
static PyObject *_Nuitka_Asyncgen_throw2(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen,
|
|
521
|
+
bool close_on_genexit,
|
|
522
|
+
struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
523
|
+
CHECK_OBJECT(asyncgen);
|
|
524
|
+
assert(Nuitka_Asyncgen_Check((PyObject *)asyncgen));
|
|
525
|
+
CHECK_EXCEPTION_STATE(exception_state);
|
|
526
|
+
|
|
527
|
+
#if _DEBUG_ASYNCGEN
|
|
528
|
+
PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
|
|
529
|
+
PRINT_COROUTINE_VALUE("yield_from", asyncgen->m_yield_from);
|
|
530
|
+
PRINT_EXCEPTION_STATE(exception_state);
|
|
531
|
+
PRINT_NEW_LINE();
|
|
532
|
+
#endif
|
|
533
|
+
|
|
534
|
+
if (asyncgen->m_yield_from != NULL) {
|
|
535
|
+
// TODO: This check is not done for coroutines, correct?
|
|
536
|
+
if (close_on_genexit) {
|
|
537
|
+
if (EXCEPTION_STATE_MATCH_BOOL_SINGLE(tstate, exception_state, PyExc_GeneratorExit)) {
|
|
538
|
+
// Asynchronous generators need to close the yield_from.
|
|
539
|
+
Nuitka_MarkAsyncgenAsRunning(asyncgen);
|
|
540
|
+
bool res = Nuitka_gen_close_iter(tstate, asyncgen->m_yield_from);
|
|
541
|
+
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
542
|
+
|
|
543
|
+
if (res == false) {
|
|
544
|
+
// Release exception, we are done with it now and pick up the new one.
|
|
545
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
546
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
return _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, false, exception_state);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
PyObject *ret;
|
|
554
|
+
|
|
555
|
+
#if _DEBUG_ASYNCGEN
|
|
556
|
+
PRINT_ASYNCGEN_STATUS("Passing to yielded from", asyncgen);
|
|
557
|
+
PRINT_COROUTINE_VALUE("m_yield_from", asyncgen->m_yield_from);
|
|
558
|
+
PRINT_NEW_LINE();
|
|
559
|
+
#endif
|
|
560
|
+
|
|
561
|
+
#if NUITKA_UNCOMPILED_THROW_INTEGRATION
|
|
562
|
+
if (PyGen_CheckExact(asyncgen->m_yield_from) || PyCoro_CheckExact(asyncgen->m_yield_from)) {
|
|
563
|
+
PyGenObject *gen = (PyGenObject *)asyncgen->m_yield_from;
|
|
564
|
+
|
|
565
|
+
// Transferred exception ownership to "Nuitka_UncompiledGenerator_throw".
|
|
566
|
+
Nuitka_MarkAsyncgenAsRunning(asyncgen);
|
|
567
|
+
ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
|
|
568
|
+
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
569
|
+
} else
|
|
570
|
+
#endif
|
|
571
|
+
if (Nuitka_Generator_Check(asyncgen->m_yield_from)) {
|
|
572
|
+
struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)asyncgen->m_yield_from);
|
|
573
|
+
// Transferred exception ownership to "_Nuitka_Generator_throw2".
|
|
574
|
+
Nuitka_MarkAsyncgenAsRunning(asyncgen);
|
|
575
|
+
ret = _Nuitka_Generator_throw2(tstate, gen, exception_state);
|
|
576
|
+
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
577
|
+
} else if (Nuitka_Coroutine_Check(asyncgen->m_yield_from)) {
|
|
578
|
+
struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)asyncgen->m_yield_from);
|
|
579
|
+
// Transferred exception ownership to "_Nuitka_Coroutine_throw2".
|
|
580
|
+
Nuitka_MarkAsyncgenAsRunning(asyncgen);
|
|
581
|
+
ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
|
|
582
|
+
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
583
|
+
} else if (Nuitka_CoroutineWrapper_Check(asyncgen->m_yield_from)) {
|
|
584
|
+
struct Nuitka_CoroutineObject *coro =
|
|
585
|
+
((struct Nuitka_CoroutineWrapperObject *)asyncgen->m_yield_from)->m_coroutine;
|
|
586
|
+
|
|
587
|
+
// Transferred exception ownership to "_Nuitka_Coroutine_throw2".
|
|
588
|
+
Nuitka_MarkAsyncgenAsRunning(asyncgen);
|
|
589
|
+
ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
|
|
590
|
+
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
591
|
+
} else if (Nuitka_AsyncgenAsend_Check(asyncgen->m_yield_from)) {
|
|
592
|
+
struct Nuitka_AsyncgenAsendObject *asyncgen_asend =
|
|
593
|
+
((struct Nuitka_AsyncgenAsendObject *)asyncgen->m_yield_from);
|
|
594
|
+
|
|
595
|
+
// Transferred exception ownership to "_Nuitka_AsyncgenAsend_throw2".
|
|
596
|
+
Nuitka_MarkAsyncgenAsRunning(asyncgen);
|
|
597
|
+
ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend, exception_state);
|
|
598
|
+
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
599
|
+
} else {
|
|
600
|
+
PyObject *meth = PyObject_GetAttr(asyncgen->m_yield_from, const_str_plain_throw);
|
|
601
|
+
|
|
602
|
+
if (unlikely(meth == NULL)) {
|
|
603
|
+
if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
|
|
604
|
+
// Release exception, we are done with it now.
|
|
605
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
606
|
+
|
|
607
|
+
return NULL;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
CLEAR_ERROR_OCCURRED(tstate);
|
|
611
|
+
|
|
612
|
+
// Passing exception ownership to that code.
|
|
613
|
+
goto throw_here;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
CHECK_EXCEPTION_STATE(exception_state);
|
|
617
|
+
|
|
618
|
+
#if 0
|
|
619
|
+
// TODO: Add slow mode traces.
|
|
620
|
+
PRINT_ITEM(coroutine->m_yield_from);
|
|
621
|
+
PRINT_NEW_LINE();
|
|
622
|
+
#endif
|
|
623
|
+
|
|
624
|
+
Nuitka_MarkAsyncgenAsRunning(asyncgen);
|
|
625
|
+
ret = Nuitka_CallGeneratorThrowMethod(meth, exception_state);
|
|
626
|
+
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
627
|
+
|
|
628
|
+
Py_DECREF(meth);
|
|
629
|
+
|
|
630
|
+
// Release exception, we are done with it now.
|
|
631
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
if (unlikely(ret == NULL)) {
|
|
635
|
+
PyObject *val;
|
|
636
|
+
|
|
637
|
+
if (Nuitka_PyGen_FetchStopIterationValue(tstate, &val)) {
|
|
638
|
+
CHECK_OBJECT(val);
|
|
639
|
+
|
|
640
|
+
asyncgen->m_yield_from = NULL;
|
|
641
|
+
|
|
642
|
+
// Return value, not to continue with yielding from.
|
|
643
|
+
if (asyncgen->m_yield_from != NULL) {
|
|
644
|
+
CHECK_OBJECT(asyncgen->m_yield_from);
|
|
645
|
+
#if _DEBUG_ASYNCGEN
|
|
646
|
+
PRINT_ASYNCGEN_STATUS("Yield from removal:", asyncgen);
|
|
647
|
+
PRINT_COROUTINE_VALUE("yield_from", asyncgen->m_yield_from);
|
|
648
|
+
#endif
|
|
649
|
+
Py_DECREF(asyncgen->m_yield_from);
|
|
650
|
+
asyncgen->m_yield_from = NULL;
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
#if _DEBUG_ASYNCGEN
|
|
654
|
+
PRINT_ASYNCGEN_STATUS("Sending return value into ourselves", asyncgen);
|
|
655
|
+
PRINT_COROUTINE_VALUE("value", val);
|
|
656
|
+
PRINT_NEW_LINE();
|
|
657
|
+
#endif
|
|
658
|
+
|
|
659
|
+
struct Nuitka_ExceptionPreservationItem no_exception_state;
|
|
660
|
+
INIT_ERROR_OCCURRED_STATE(&no_exception_state);
|
|
661
|
+
|
|
662
|
+
ret = _Nuitka_Asyncgen_send(tstate, asyncgen, val, false, &no_exception_state);
|
|
663
|
+
} else {
|
|
664
|
+
#if _DEBUG_ASYNCGEN
|
|
665
|
+
PRINT_ASYNCGEN_STATUS("Sending exception value into ourselves", asyncgen);
|
|
666
|
+
PRINT_COROUTINE_VALUE("yield_from", asyncgen->m_yield_from);
|
|
667
|
+
PRINT_CURRENT_EXCEPTION();
|
|
668
|
+
PRINT_NEW_LINE();
|
|
669
|
+
#endif
|
|
670
|
+
|
|
671
|
+
struct Nuitka_ExceptionPreservationItem no_exception_state;
|
|
672
|
+
INIT_ERROR_OCCURRED_STATE(&no_exception_state);
|
|
673
|
+
|
|
674
|
+
ret = _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, false, &no_exception_state);
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
#if _DEBUG_ASYNCGEN
|
|
678
|
+
PRINT_ASYNCGEN_STATUS("Leave with value/exception from sending into ourselves:", asyncgen);
|
|
679
|
+
PRINT_COROUTINE_VALUE("return_value", ret);
|
|
680
|
+
PRINT_CURRENT_EXCEPTION();
|
|
681
|
+
PRINT_NEW_LINE();
|
|
682
|
+
#endif
|
|
683
|
+
} else {
|
|
684
|
+
#if _DEBUG_ASYNCGEN
|
|
685
|
+
PRINT_ASYNCGEN_STATUS("Leave with return value:", asyncgen);
|
|
686
|
+
PRINT_COROUTINE_VALUE("return_value", ret);
|
|
687
|
+
PRINT_CURRENT_EXCEPTION();
|
|
688
|
+
PRINT_NEW_LINE();
|
|
689
|
+
#endif
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
return ret;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
throw_here:
|
|
696
|
+
// We continue to have exception ownership here.
|
|
697
|
+
#if _DEBUG_ASYNCGEN
|
|
698
|
+
PRINT_ASYNCGEN_STATUS("Need to throw into itself", asyncgen);
|
|
699
|
+
#endif
|
|
700
|
+
|
|
701
|
+
if (unlikely(_Nuitka_Generator_check_throw(tstate, exception_state) == false)) {
|
|
702
|
+
// Exception was released by _Nuitka_Generator_check_throw already.
|
|
703
|
+
return NULL;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
PyObject *result;
|
|
707
|
+
|
|
708
|
+
if (asyncgen->m_status == status_Running) {
|
|
709
|
+
result = _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, false, exception_state);
|
|
710
|
+
} else if (asyncgen->m_status == status_Finished) {
|
|
711
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
712
|
+
result = NULL;
|
|
713
|
+
} else {
|
|
714
|
+
PyTracebackObject *exception_tb = GET_EXCEPTION_STATE_TRACEBACK(exception_state);
|
|
715
|
+
|
|
716
|
+
if (exception_tb == NULL) {
|
|
717
|
+
// TODO: Our compiled objects really need a way to store common
|
|
718
|
+
// stuff in a "shared" part across all instances, and outside of
|
|
719
|
+
// run time, so we could reuse this.
|
|
720
|
+
struct Nuitka_FrameObject *frame =
|
|
721
|
+
MAKE_FUNCTION_FRAME(tstate, asyncgen->m_code_object, asyncgen->m_module, 0);
|
|
722
|
+
SET_EXCEPTION_STATE_TRACEBACK(exception_state,
|
|
723
|
+
MAKE_TRACEBACK(frame, asyncgen->m_code_object->co_firstlineno));
|
|
724
|
+
Py_DECREF(frame);
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
728
|
+
|
|
729
|
+
#if _DEBUG_ASYNCGEN
|
|
730
|
+
PRINT_ASYNCGEN_STATUS("Finishing from exception", asyncgen);
|
|
731
|
+
PRINT_NEW_LINE();
|
|
732
|
+
#endif
|
|
733
|
+
|
|
734
|
+
Nuitka_MarkAsyncgenAsFinished(asyncgen);
|
|
735
|
+
|
|
736
|
+
result = NULL;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
#if _DEBUG_ASYNCGEN
|
|
740
|
+
PRINT_ASYNCGEN_STATUS("Leave", asyncgen);
|
|
741
|
+
PRINT_COROUTINE_VALUE("yield_from", asyncgen->m_yield_from);
|
|
742
|
+
PRINT_CURRENT_EXCEPTION();
|
|
743
|
+
PRINT_NEW_LINE();
|
|
744
|
+
#endif
|
|
745
|
+
|
|
746
|
+
return result;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
static PyObject *Nuitka_Asyncgen_throw(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen, PyObject *args) {
|
|
750
|
+
CHECK_OBJECT(asyncgen);
|
|
751
|
+
CHECK_OBJECT_DEEP(args);
|
|
752
|
+
|
|
753
|
+
PyObject *exception_type;
|
|
754
|
+
PyObject *exception_value = NULL;
|
|
755
|
+
PyTracebackObject *exception_tb = NULL;
|
|
756
|
+
|
|
757
|
+
// This takes no references, that is for us to do.
|
|
758
|
+
int res = PyArg_UnpackTuple(args, "throw", 1, 3, &exception_type, &exception_value, &exception_tb);
|
|
759
|
+
|
|
760
|
+
if (unlikely(res == 0)) {
|
|
761
|
+
return NULL;
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
#if _DEBUG_ASYNCGEN
|
|
765
|
+
PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
|
|
766
|
+
PRINT_EXCEPTION(exception_type, exception_value, exception_tb);
|
|
767
|
+
PRINT_NEW_LINE();
|
|
768
|
+
#endif
|
|
769
|
+
|
|
770
|
+
// Handing ownership of exception over, we need not release it ourselves
|
|
771
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
772
|
+
if (_Nuitka_Generator_make_throw_exception_state(tstate, &exception_state, exception_type, exception_value,
|
|
773
|
+
exception_tb) == false) {
|
|
774
|
+
return NULL;
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
PyObject *result = _Nuitka_Asyncgen_throw2(tstate, asyncgen, false, &exception_state);
|
|
778
|
+
|
|
779
|
+
if (result == NULL) {
|
|
780
|
+
if (HAS_ERROR_OCCURRED(tstate) == false) {
|
|
781
|
+
SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
#if _DEBUG_ASYNCGEN
|
|
786
|
+
PRINT_ASYNCGEN_STATUS("Leave", asyncgen);
|
|
787
|
+
PRINT_COROUTINE_VALUE("return value", result);
|
|
788
|
+
PRINT_CURRENT_EXCEPTION();
|
|
789
|
+
#endif
|
|
790
|
+
|
|
791
|
+
CHECK_EXCEPTION_STATE(&exception_state);
|
|
792
|
+
|
|
793
|
+
return result;
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
static bool _Nuitka_Asyncgen_init_hooks(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen) {
|
|
797
|
+
/* Just do this once per async generator object. */
|
|
798
|
+
if (asyncgen->m_hooks_init_done) {
|
|
799
|
+
return 0;
|
|
800
|
+
}
|
|
801
|
+
asyncgen->m_hooks_init_done = 1;
|
|
802
|
+
|
|
803
|
+
/* Attach the finalizer if any. */
|
|
804
|
+
PyObject *finalizer = tstate->async_gen_finalizer;
|
|
805
|
+
if (finalizer != NULL) {
|
|
806
|
+
Py_INCREF(finalizer);
|
|
807
|
+
asyncgen->m_finalizer = finalizer;
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
/* Call the "firstiter" hook for async generator. */
|
|
811
|
+
PyObject *firstiter = tstate->async_gen_firstiter;
|
|
812
|
+
if (firstiter != NULL) {
|
|
813
|
+
Py_INCREF(firstiter);
|
|
814
|
+
|
|
815
|
+
PyObject *res = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, firstiter, (PyObject *)asyncgen);
|
|
816
|
+
|
|
817
|
+
Py_DECREF(firstiter);
|
|
818
|
+
|
|
819
|
+
if (unlikely(res == NULL)) {
|
|
820
|
+
return true;
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
Py_DECREF(res);
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
return false;
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
static PyObject *Nuitka_AsyncgenAsend_New(struct Nuitka_AsyncgenObject *asyncgen, PyObject *sendval);
|
|
830
|
+
static PyObject *Nuitka_AsyncgenAthrow_New(struct Nuitka_AsyncgenObject *asyncgen, PyObject *args);
|
|
831
|
+
|
|
832
|
+
static PyObject *Nuitka_Asyncgen_anext(struct Nuitka_AsyncgenObject *asyncgen) {
|
|
833
|
+
CHECK_OBJECT(asyncgen);
|
|
834
|
+
|
|
835
|
+
#if _DEBUG_ASYNCGEN
|
|
836
|
+
PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
|
|
837
|
+
PRINT_NEW_LINE();
|
|
838
|
+
#endif
|
|
839
|
+
|
|
840
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
841
|
+
|
|
842
|
+
if (_Nuitka_Asyncgen_init_hooks(tstate, asyncgen)) {
|
|
843
|
+
return NULL;
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
PyObject *result = Nuitka_AsyncgenAsend_New(asyncgen, Py_None);
|
|
847
|
+
|
|
848
|
+
#if _DEBUG_ASYNCGEN
|
|
849
|
+
PRINT_ASYNCGEN_STATUS("Leave", asyncgen);
|
|
850
|
+
PRINT_COROUTINE_VALUE("result", result);
|
|
851
|
+
PRINT_NEW_LINE();
|
|
852
|
+
#endif
|
|
853
|
+
|
|
854
|
+
return result;
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
static PyObject *Nuitka_Asyncgen_asend(struct Nuitka_AsyncgenObject *asyncgen, PyObject *value) {
|
|
858
|
+
CHECK_OBJECT(asyncgen);
|
|
859
|
+
|
|
860
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
861
|
+
|
|
862
|
+
if (_Nuitka_Asyncgen_init_hooks(tstate, asyncgen)) {
|
|
863
|
+
return NULL;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
return Nuitka_AsyncgenAsend_New(asyncgen, value);
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
static PyObject *Nuitka_Asyncgen_aclose(struct Nuitka_AsyncgenObject *asyncgen) {
|
|
870
|
+
CHECK_OBJECT(asyncgen);
|
|
871
|
+
|
|
872
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
873
|
+
|
|
874
|
+
if (_Nuitka_Asyncgen_init_hooks(tstate, asyncgen)) {
|
|
875
|
+
return NULL;
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
return Nuitka_AsyncgenAthrow_New(asyncgen, NULL);
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
static PyObject *Nuitka_Asyncgen_athrow(struct Nuitka_AsyncgenObject *asyncgen, PyObject *args) {
|
|
882
|
+
CHECK_OBJECT(asyncgen);
|
|
883
|
+
|
|
884
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
885
|
+
|
|
886
|
+
if (_Nuitka_Asyncgen_init_hooks(tstate, asyncgen)) {
|
|
887
|
+
return NULL;
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
return Nuitka_AsyncgenAthrow_New(asyncgen, args);
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
#if PYTHON_VERSION >= 0x3a0
|
|
894
|
+
static PySendResult _Nuitka_Asyncgen_am_send(struct Nuitka_AsyncgenObject *asyncgen, PyObject *arg, PyObject **result) {
|
|
895
|
+
#if _DEBUG_ASYNCGEN
|
|
896
|
+
PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
|
|
897
|
+
#endif
|
|
898
|
+
|
|
899
|
+
*result = NULL;
|
|
900
|
+
|
|
901
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
902
|
+
|
|
903
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
904
|
+
INIT_ERROR_OCCURRED_STATE(&exception_state);
|
|
905
|
+
|
|
906
|
+
Py_INCREF(arg);
|
|
907
|
+
PySendResult res = _Nuitka_Asyncgen_sendR(tstate, asyncgen, arg, false, &exception_state, result);
|
|
908
|
+
|
|
909
|
+
#if _DEBUG_ASYNCGEN
|
|
910
|
+
PRINT_ASYNCGEN_STATUS("Leave", asyncgen);
|
|
911
|
+
PRINT_COROUTINE_VALUE("result", *result);
|
|
912
|
+
PRINT_NEW_LINE();
|
|
913
|
+
#endif
|
|
914
|
+
return res;
|
|
915
|
+
}
|
|
916
|
+
#endif
|
|
917
|
+
|
|
918
|
+
static void Nuitka_Asyncgen_tp_finalize(struct Nuitka_AsyncgenObject *asyncgen) {
|
|
919
|
+
if (asyncgen->m_status != status_Running) {
|
|
920
|
+
return;
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
924
|
+
|
|
925
|
+
struct Nuitka_ExceptionPreservationItem saved_exception_state;
|
|
926
|
+
|
|
927
|
+
// Need to call registered finalizer if provided, "asyncio" seems to do
|
|
928
|
+
// that.
|
|
929
|
+
PyObject *finalizer = asyncgen->m_finalizer;
|
|
930
|
+
if (finalizer != NULL && asyncgen->m_closed == false) {
|
|
931
|
+
// Save the current exception, if any.
|
|
932
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
933
|
+
|
|
934
|
+
PyObject *res = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, finalizer, (PyObject *)asyncgen);
|
|
935
|
+
|
|
936
|
+
if (unlikely(res == NULL)) {
|
|
937
|
+
PyErr_WriteUnraisable((PyObject *)asyncgen);
|
|
938
|
+
} else {
|
|
939
|
+
Py_DECREF(res);
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
943
|
+
return;
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
947
|
+
|
|
948
|
+
bool close_result = _Nuitka_Asyncgen_close(tstate, asyncgen);
|
|
949
|
+
|
|
950
|
+
if (unlikely(close_result == false)) {
|
|
951
|
+
PyErr_WriteUnraisable((PyObject *)asyncgen);
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
/* Restore the saved exception if any. */
|
|
955
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
#define MAX_ASYNCGEN_FREE_LIST_COUNT 100
|
|
959
|
+
static struct Nuitka_AsyncgenObject *free_list_asyncgens = NULL;
|
|
960
|
+
static int free_list_asyncgens_count = 0;
|
|
961
|
+
|
|
962
|
+
// TODO: This might have to be finalize actually.
|
|
963
|
+
static void Nuitka_Asyncgen_tp_dealloc(struct Nuitka_AsyncgenObject *asyncgen) {
|
|
964
|
+
#if _DEBUG_REFCOUNTS
|
|
965
|
+
count_active_Nuitka_Asyncgen_Type -= 1;
|
|
966
|
+
count_released_Nuitka_Asyncgen_Type += 1;
|
|
967
|
+
#endif
|
|
968
|
+
if (asyncgen->m_weakrefs != NULL) {
|
|
969
|
+
Nuitka_GC_UnTrack(asyncgen);
|
|
970
|
+
|
|
971
|
+
// TODO: Avoid API call and make this our own function to reuse the
|
|
972
|
+
// pattern of temporarily untracking the value or maybe even to avoid
|
|
973
|
+
// the need to do it. It may also be a lot of work to do that though
|
|
974
|
+
// and maybe having weakrefs is uncommon.
|
|
975
|
+
PyObject_ClearWeakRefs((PyObject *)asyncgen);
|
|
976
|
+
|
|
977
|
+
Nuitka_GC_Track(asyncgen);
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
if (Nuitka_CallFinalizerFromDealloc((PyObject *)asyncgen) == false) {
|
|
981
|
+
return;
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
Nuitka_GC_UnTrack(asyncgen);
|
|
985
|
+
|
|
986
|
+
Py_XDECREF(asyncgen->m_finalizer);
|
|
987
|
+
asyncgen->m_finalizer = NULL;
|
|
988
|
+
|
|
989
|
+
Nuitka_Asyncgen_release_closure(asyncgen);
|
|
990
|
+
|
|
991
|
+
if (asyncgen->m_frame) {
|
|
992
|
+
Nuitka_SetFrameGenerator(asyncgen->m_frame, NULL);
|
|
993
|
+
Py_DECREF(asyncgen->m_frame);
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
// Now it is safe to release references and memory for it.
|
|
997
|
+
Py_DECREF(asyncgen->m_name);
|
|
998
|
+
Py_DECREF(asyncgen->m_qualname);
|
|
999
|
+
|
|
1000
|
+
// TODO: Maybe push this into the freelist code and do
|
|
1001
|
+
// it on allocation.
|
|
1002
|
+
_PyGC_CLEAR_FINALIZED((PyObject *)asyncgen);
|
|
1003
|
+
|
|
1004
|
+
/* Put the object into free list or release to GC */
|
|
1005
|
+
releaseToFreeList(free_list_asyncgens, asyncgen, MAX_ASYNCGEN_FREE_LIST_COUNT);
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
static PyObject *Nuitka_Asyncgen_tp_repr(struct Nuitka_AsyncgenObject *asyncgen) {
|
|
1009
|
+
CHECK_OBJECT(asyncgen);
|
|
1010
|
+
|
|
1011
|
+
return PyUnicode_FromFormat("<compiled_async_generator object %s at %p>",
|
|
1012
|
+
Nuitka_String_AsString(asyncgen->m_qualname), asyncgen);
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
static int Nuitka_Asyncgen_tp_traverse(struct Nuitka_AsyncgenObject *asyncgen, visitproc visit, void *arg) {
|
|
1016
|
+
CHECK_OBJECT(asyncgen);
|
|
1017
|
+
|
|
1018
|
+
Py_VISIT(asyncgen->m_yield_from);
|
|
1019
|
+
|
|
1020
|
+
for (Py_ssize_t i = 0; i < asyncgen->m_closure_given; i++) {
|
|
1021
|
+
Py_VISIT(asyncgen->m_closure[i]);
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
Py_VISIT(asyncgen->m_frame);
|
|
1025
|
+
|
|
1026
|
+
Py_VISIT(asyncgen->m_finalizer);
|
|
1027
|
+
|
|
1028
|
+
return 0;
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
// TODO: Set "__doc__" automatically for method clones of compiled types from
|
|
1032
|
+
// the documentation of built-in original type.
|
|
1033
|
+
static PyMethodDef Nuitka_Asyncgen_methods[] = {{"asend", (PyCFunction)Nuitka_Asyncgen_asend, METH_O, NULL},
|
|
1034
|
+
{"athrow", (PyCFunction)Nuitka_Asyncgen_athrow, METH_VARARGS, NULL},
|
|
1035
|
+
{"aclose", (PyCFunction)Nuitka_Asyncgen_aclose, METH_NOARGS, NULL},
|
|
1036
|
+
{NULL}};
|
|
1037
|
+
|
|
1038
|
+
static PyAsyncMethods Nuitka_Asyncgen_as_async = {
|
|
1039
|
+
0, // am_await
|
|
1040
|
+
0, // am_aiter (PyObject_SelfIter)
|
|
1041
|
+
(unaryfunc)Nuitka_Asyncgen_anext // am_anext
|
|
1042
|
+
#if PYTHON_VERSION >= 0x3a0
|
|
1043
|
+
,
|
|
1044
|
+
(sendfunc)_Nuitka_Asyncgen_am_send // am_send
|
|
1045
|
+
#endif
|
|
1046
|
+
};
|
|
1047
|
+
|
|
1048
|
+
// TODO: Set "__doc__" automatically for method clones of compiled types from
|
|
1049
|
+
// the documentation of built-in original type.
|
|
1050
|
+
static PyGetSetDef Nuitka_Asyncgen_tp_getset[] = {
|
|
1051
|
+
{(char *)"__name__", Nuitka_Asyncgen_get_name, Nuitka_Asyncgen_set_name, NULL},
|
|
1052
|
+
{(char *)"__qualname__", Nuitka_Asyncgen_get_qualname, Nuitka_Asyncgen_set_qualname, NULL},
|
|
1053
|
+
{(char *)"ag_await", Nuitka_Asyncgen_get_ag_await, NULL, NULL},
|
|
1054
|
+
{(char *)"ag_code", Nuitka_Asyncgen_get_code, Nuitka_Asyncgen_set_code, NULL},
|
|
1055
|
+
{(char *)"ag_frame", Nuitka_Asyncgen_get_frame, Nuitka_Asyncgen_set_frame, NULL},
|
|
1056
|
+
|
|
1057
|
+
{NULL}};
|
|
1058
|
+
|
|
1059
|
+
static PyMemberDef Nuitka_Asyncgen_members[] = {
|
|
1060
|
+
{(char *)"ag_running", T_BOOL, offsetof(struct Nuitka_AsyncgenObject, m_running), READONLY},
|
|
1061
|
+
#if PYTHON_VERSION >= 0x380
|
|
1062
|
+
{(char *)"ag_running", T_BOOL, offsetof(struct Nuitka_AsyncgenObject, m_running_async), READONLY},
|
|
1063
|
+
#endif
|
|
1064
|
+
{NULL}};
|
|
1065
|
+
|
|
1066
|
+
PyTypeObject Nuitka_Asyncgen_Type = {
|
|
1067
|
+
PyVarObject_HEAD_INIT(NULL, 0) "compiled_async_generator", // tp_name
|
|
1068
|
+
sizeof(struct Nuitka_AsyncgenObject), // tp_basicsize
|
|
1069
|
+
sizeof(struct Nuitka_CellObject *), // tp_itemsize
|
|
1070
|
+
(destructor)Nuitka_Asyncgen_tp_dealloc, // tp_dealloc
|
|
1071
|
+
0, // tp_print
|
|
1072
|
+
0, // tp_getattr
|
|
1073
|
+
0, // tp_setattr
|
|
1074
|
+
&Nuitka_Asyncgen_as_async, // tp_as_async
|
|
1075
|
+
(reprfunc)Nuitka_Asyncgen_tp_repr, // tp_repr
|
|
1076
|
+
0, // tp_as_number
|
|
1077
|
+
0, // tp_as_sequence
|
|
1078
|
+
0, // tp_as_mapping
|
|
1079
|
+
(hashfunc)Nuitka_Asyncgen_tp_hash, // tp_hash
|
|
1080
|
+
0, // tp_call
|
|
1081
|
+
0, // tp_str
|
|
1082
|
+
0, // tp_getattro (PyObject_GenericGetAttr)
|
|
1083
|
+
0, // tp_setattro
|
|
1084
|
+
0, // tp_as_buffer
|
|
1085
|
+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, // tp_flags
|
|
1086
|
+
0, // tp_doc
|
|
1087
|
+
(traverseproc)Nuitka_Asyncgen_tp_traverse, // tp_traverse
|
|
1088
|
+
0, // tp_clear
|
|
1089
|
+
0, // tp_richcompare
|
|
1090
|
+
offsetof(struct Nuitka_AsyncgenObject, m_weakrefs), // tp_weaklistoffset
|
|
1091
|
+
0, // tp_iter
|
|
1092
|
+
0, // tp_iternext
|
|
1093
|
+
Nuitka_Asyncgen_methods, // tp_methods
|
|
1094
|
+
Nuitka_Asyncgen_members, // tp_members
|
|
1095
|
+
Nuitka_Asyncgen_tp_getset, // tp_getset
|
|
1096
|
+
0, // tp_base
|
|
1097
|
+
0, // tp_dict
|
|
1098
|
+
0, // tp_descr_get
|
|
1099
|
+
0, // tp_descr_set
|
|
1100
|
+
0, // tp_dictoffset
|
|
1101
|
+
0, // tp_init
|
|
1102
|
+
0, // tp_alloc
|
|
1103
|
+
0, // tp_new
|
|
1104
|
+
0, // tp_free
|
|
1105
|
+
0, // tp_is_gc
|
|
1106
|
+
0, // tp_bases
|
|
1107
|
+
0, // tp_mro
|
|
1108
|
+
0, // tp_cache
|
|
1109
|
+
0, // tp_subclasses
|
|
1110
|
+
0, // tp_weaklist
|
|
1111
|
+
0, // tp_del
|
|
1112
|
+
0, // tp_version_tag
|
|
1113
|
+
(destructor)Nuitka_Asyncgen_tp_finalize, // tp_finalize
|
|
1114
|
+
|
|
1115
|
+
};
|
|
1116
|
+
|
|
1117
|
+
PyObject *Nuitka_Asyncgen_New(asyncgen_code code, PyObject *module, PyObject *name, PyObject *qualname,
|
|
1118
|
+
PyCodeObject *code_object, struct Nuitka_CellObject **closure, Py_ssize_t closure_given,
|
|
1119
|
+
Py_ssize_t heap_storage_size) {
|
|
1120
|
+
#if _DEBUG_REFCOUNTS
|
|
1121
|
+
count_active_Nuitka_Asyncgen_Type += 1;
|
|
1122
|
+
count_allocated_Nuitka_Asyncgen_Type += 1;
|
|
1123
|
+
#endif
|
|
1124
|
+
|
|
1125
|
+
struct Nuitka_AsyncgenObject *result;
|
|
1126
|
+
|
|
1127
|
+
// TODO: Change the var part of the type to 1 maybe
|
|
1128
|
+
Py_ssize_t full_size = closure_given + (heap_storage_size + sizeof(void *) - 1) / sizeof(void *);
|
|
1129
|
+
|
|
1130
|
+
// Macro to assign result memory from GC or free list.
|
|
1131
|
+
allocateFromFreeList(free_list_asyncgens, struct Nuitka_AsyncgenObject, Nuitka_Asyncgen_Type, full_size);
|
|
1132
|
+
|
|
1133
|
+
// For quicker access of generator heap.
|
|
1134
|
+
result->m_heap_storage = &result->m_closure[closure_given];
|
|
1135
|
+
|
|
1136
|
+
result->m_code = (void *)code;
|
|
1137
|
+
|
|
1138
|
+
CHECK_OBJECT(module);
|
|
1139
|
+
result->m_module = module;
|
|
1140
|
+
|
|
1141
|
+
CHECK_OBJECT(name);
|
|
1142
|
+
result->m_name = name;
|
|
1143
|
+
Py_INCREF(name);
|
|
1144
|
+
|
|
1145
|
+
// The "qualname" defaults to NULL for most compact C code.
|
|
1146
|
+
if (qualname == NULL) {
|
|
1147
|
+
qualname = name;
|
|
1148
|
+
}
|
|
1149
|
+
CHECK_OBJECT(qualname);
|
|
1150
|
+
|
|
1151
|
+
result->m_qualname = qualname;
|
|
1152
|
+
Py_INCREF(qualname);
|
|
1153
|
+
|
|
1154
|
+
result->m_yield_from = NULL;
|
|
1155
|
+
|
|
1156
|
+
memcpy(&result->m_closure[0], closure, closure_given * sizeof(struct Nuitka_CellObject *));
|
|
1157
|
+
result->m_closure_given = closure_given;
|
|
1158
|
+
|
|
1159
|
+
result->m_weakrefs = NULL;
|
|
1160
|
+
|
|
1161
|
+
result->m_status = status_Unused;
|
|
1162
|
+
result->m_running = false;
|
|
1163
|
+
result->m_awaiting = false;
|
|
1164
|
+
#if PYTHON_VERSION >= 0x380
|
|
1165
|
+
result->m_running_async = false;
|
|
1166
|
+
#endif
|
|
1167
|
+
|
|
1168
|
+
result->m_yield_return_index = 0;
|
|
1169
|
+
|
|
1170
|
+
result->m_frame = NULL;
|
|
1171
|
+
result->m_code_object = code_object;
|
|
1172
|
+
|
|
1173
|
+
result->m_resume_frame = NULL;
|
|
1174
|
+
|
|
1175
|
+
result->m_finalizer = NULL;
|
|
1176
|
+
result->m_hooks_init_done = false;
|
|
1177
|
+
result->m_closed = false;
|
|
1178
|
+
|
|
1179
|
+
#if PYTHON_VERSION >= 0x370
|
|
1180
|
+
result->m_exc_state = Nuitka_ExceptionStackItem_Empty;
|
|
1181
|
+
#endif
|
|
1182
|
+
|
|
1183
|
+
static long Nuitka_Asyncgen_counter = 0;
|
|
1184
|
+
result->m_counter = Nuitka_Asyncgen_counter++;
|
|
1185
|
+
|
|
1186
|
+
Nuitka_GC_Track(result);
|
|
1187
|
+
return (PyObject *)result;
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
struct Nuitka_AsyncgenWrappedValueObject {
|
|
1191
|
+
/* Python object folklore: */
|
|
1192
|
+
PyObject_HEAD
|
|
1193
|
+
|
|
1194
|
+
PyObject *m_value;
|
|
1195
|
+
};
|
|
1196
|
+
|
|
1197
|
+
static struct Nuitka_AsyncgenWrappedValueObject *free_list_asyncgen_value_wrappers = NULL;
|
|
1198
|
+
static int free_list_asyncgen_value_wrappers_count = 0;
|
|
1199
|
+
|
|
1200
|
+
static void Nuitka_AsyncgenValueWrapper_tp_dealloc(struct Nuitka_AsyncgenWrappedValueObject *asyncgen_value_wrapper) {
|
|
1201
|
+
#if _DEBUG_REFCOUNTS
|
|
1202
|
+
count_active_Nuitka_AsyncgenValueWrapper_Type -= 1;
|
|
1203
|
+
count_released_Nuitka_AsyncgenValueWrapper_Type += 1;
|
|
1204
|
+
#endif
|
|
1205
|
+
|
|
1206
|
+
Nuitka_GC_UnTrack((PyObject *)asyncgen_value_wrapper);
|
|
1207
|
+
|
|
1208
|
+
CHECK_OBJECT(asyncgen_value_wrapper->m_value);
|
|
1209
|
+
Py_DECREF(asyncgen_value_wrapper->m_value);
|
|
1210
|
+
|
|
1211
|
+
/* Put the object into free list or release to GC */
|
|
1212
|
+
releaseToFreeList(free_list_asyncgen_value_wrappers, asyncgen_value_wrapper, MAX_ASYNCGEN_FREE_LIST_COUNT);
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
static int Nuitka_AsyncgenValueWrapper_tp_traverse(struct Nuitka_AsyncgenWrappedValueObject *asyncgen_value_wrapper,
|
|
1216
|
+
visitproc visit, void *arg) {
|
|
1217
|
+
CHECK_OBJECT(asyncgen_value_wrapper);
|
|
1218
|
+
|
|
1219
|
+
Py_VISIT(asyncgen_value_wrapper->m_value);
|
|
1220
|
+
|
|
1221
|
+
return 0;
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1224
|
+
static PyTypeObject Nuitka_AsyncgenValueWrapper_Type = {
|
|
1225
|
+
PyVarObject_HEAD_INIT(NULL, 0) "compiled_async_generator_wrapped_value", // tp_name
|
|
1226
|
+
sizeof(struct Nuitka_AsyncgenWrappedValueObject), // tp_basicsize
|
|
1227
|
+
0, // tp_itemsize
|
|
1228
|
+
(destructor)Nuitka_AsyncgenValueWrapper_tp_dealloc, // tp_dealloc
|
|
1229
|
+
0, // tp_print
|
|
1230
|
+
0, // tp_getattr
|
|
1231
|
+
0, // tp_setattr
|
|
1232
|
+
0, // tp_as_async
|
|
1233
|
+
0, // tp_repr
|
|
1234
|
+
0, // tp_as_number
|
|
1235
|
+
0, // tp_as_sequence
|
|
1236
|
+
0, // tp_as_mapping
|
|
1237
|
+
0, // tp_hash
|
|
1238
|
+
0, // tp_call
|
|
1239
|
+
0, // tp_str
|
|
1240
|
+
0, // tp_getattro (PyObject_GenericGetAttr)
|
|
1241
|
+
0, // tp_setattro
|
|
1242
|
+
0, // tp_as_buffer
|
|
1243
|
+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, // tp_flags
|
|
1244
|
+
0, // tp_doc
|
|
1245
|
+
(traverseproc)Nuitka_AsyncgenValueWrapper_tp_traverse, // tp_traverse
|
|
1246
|
+
0, // tp_clear
|
|
1247
|
+
0, // tp_richcompare
|
|
1248
|
+
0, // tp_weaklistoffset
|
|
1249
|
+
0, // tp_iter
|
|
1250
|
+
0, // tp_iternext
|
|
1251
|
+
0, // tp_methods
|
|
1252
|
+
0, // tp_members
|
|
1253
|
+
0, // tp_getset
|
|
1254
|
+
0, // tp_base
|
|
1255
|
+
0, // tp_dict
|
|
1256
|
+
0, // tp_descr_get
|
|
1257
|
+
0, // tp_descr_set
|
|
1258
|
+
0, // tp_dictoffset
|
|
1259
|
+
0, // tp_init
|
|
1260
|
+
0, // tp_alloc
|
|
1261
|
+
0, // tp_new
|
|
1262
|
+
};
|
|
1263
|
+
|
|
1264
|
+
// Note: This expects a reference given in value, because that is the
|
|
1265
|
+
// only way we use it.
|
|
1266
|
+
static PyObject *Nuitka_AsyncgenValueWrapper_New(PyObject *value) {
|
|
1267
|
+
CHECK_OBJECT(value);
|
|
1268
|
+
|
|
1269
|
+
#if _DEBUG_REFCOUNTS
|
|
1270
|
+
count_active_Nuitka_AsyncgenValueWrapper_Type += 1;
|
|
1271
|
+
#endif
|
|
1272
|
+
|
|
1273
|
+
struct Nuitka_AsyncgenWrappedValueObject *result;
|
|
1274
|
+
|
|
1275
|
+
allocateFromFreeListFixed(free_list_asyncgen_value_wrappers, struct Nuitka_AsyncgenWrappedValueObject,
|
|
1276
|
+
Nuitka_AsyncgenValueWrapper_Type);
|
|
1277
|
+
|
|
1278
|
+
result->m_value = value;
|
|
1279
|
+
|
|
1280
|
+
Nuitka_GC_Track(result);
|
|
1281
|
+
|
|
1282
|
+
return (PyObject *)result;
|
|
1283
|
+
}
|
|
1284
|
+
|
|
1285
|
+
#define Nuitka_AsyncgenWrappedValue_CheckExact(o) (Py_TYPE(o) == &Nuitka_AsyncgenValueWrapper_Type)
|
|
1286
|
+
|
|
1287
|
+
typedef enum {
|
|
1288
|
+
AWAITABLE_STATE_INIT = 0, /* Has not yet been iterated. */
|
|
1289
|
+
AWAITABLE_STATE_ITER = 1, /* Being iterated currently. */
|
|
1290
|
+
AWAITABLE_STATE_CLOSED = 2, /* Closed, no more. */
|
|
1291
|
+
} AwaitableState;
|
|
1292
|
+
|
|
1293
|
+
struct Nuitka_AsyncgenAsendObject {
|
|
1294
|
+
/* Python object folklore: */
|
|
1295
|
+
PyObject_HEAD
|
|
1296
|
+
|
|
1297
|
+
struct Nuitka_AsyncgenObject *m_gen;
|
|
1298
|
+
PyObject *m_sendval;
|
|
1299
|
+
|
|
1300
|
+
AwaitableState m_state;
|
|
1301
|
+
};
|
|
1302
|
+
|
|
1303
|
+
#if _DEBUG_ASYNCGEN
|
|
1304
|
+
|
|
1305
|
+
NUITKA_MAY_BE_UNUSED static void _PRINT_ASYNCGEN_ASEND_STATUS(char const *descriptor, char const *context,
|
|
1306
|
+
struct Nuitka_AsyncgenAsendObject *asyncgen_asend) {
|
|
1307
|
+
char const *status;
|
|
1308
|
+
|
|
1309
|
+
switch (asyncgen_asend->m_state) {
|
|
1310
|
+
case AWAITABLE_STATE_INIT:
|
|
1311
|
+
status = "(init)";
|
|
1312
|
+
break;
|
|
1313
|
+
case AWAITABLE_STATE_ITER:
|
|
1314
|
+
status = "(iter)";
|
|
1315
|
+
break;
|
|
1316
|
+
case AWAITABLE_STATE_CLOSED:
|
|
1317
|
+
status = "(closed)";
|
|
1318
|
+
break;
|
|
1319
|
+
default:
|
|
1320
|
+
status = "(ILLEGAL)";
|
|
1321
|
+
break;
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
PRINT_STRING(descriptor);
|
|
1325
|
+
PRINT_STRING(" : ");
|
|
1326
|
+
PRINT_STRING(context);
|
|
1327
|
+
PRINT_STRING(" ");
|
|
1328
|
+
PRINT_ITEM((PyObject *)asyncgen_asend);
|
|
1329
|
+
PRINT_STRING(" ");
|
|
1330
|
+
PRINT_STRING(status);
|
|
1331
|
+
PRINT_NEW_LINE();
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
#define PRINT_ASYNCGEN_ASEND_STATUS(context, asyncgen_asend) \
|
|
1335
|
+
_PRINT_ASYNCGEN_ASEND_STATUS(__FUNCTION__, context, asyncgen_asend)
|
|
1336
|
+
|
|
1337
|
+
#endif
|
|
1338
|
+
|
|
1339
|
+
/**
|
|
1340
|
+
* These can be created by byte code loop, and we don't now its internals,
|
|
1341
|
+
* yet we have to unwrap ourselves too. These could break in future updates,
|
|
1342
|
+
* and ideally we would have checks to cover those.
|
|
1343
|
+
*/
|
|
1344
|
+
|
|
1345
|
+
struct _PyAsyncGenWrappedValue {
|
|
1346
|
+
/* Python object folklore: */
|
|
1347
|
+
PyObject_HEAD
|
|
1348
|
+
|
|
1349
|
+
PyObject *agw_val;
|
|
1350
|
+
};
|
|
1351
|
+
|
|
1352
|
+
#if PYTHON_VERSION < 0x3d0
|
|
1353
|
+
#define _PyAsyncGenWrappedValue_CheckExact(o) (Py_TYPE(o) == &_PyAsyncGenWrappedValue_Type)
|
|
1354
|
+
#else
|
|
1355
|
+
static PyTypeObject *Nuitka_PyAsyncGenWrappedValue_Type = NULL;
|
|
1356
|
+
|
|
1357
|
+
#define _PyAsyncGenWrappedValue_CheckExact(o) (Py_TYPE(o) == Nuitka_PyAsyncGenWrappedValue_Type)
|
|
1358
|
+
#endif
|
|
1359
|
+
|
|
1360
|
+
static PyObject *_Nuitka_Asyncgen_unwrap_value(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen,
|
|
1361
|
+
PyObject *result) {
|
|
1362
|
+
CHECK_OBJECT(asyncgen);
|
|
1363
|
+
CHECK_OBJECT_X(result);
|
|
1364
|
+
|
|
1365
|
+
if (result == NULL) {
|
|
1366
|
+
PyObject *error = GET_ERROR_OCCURRED(tstate);
|
|
1367
|
+
|
|
1368
|
+
if (error == NULL) {
|
|
1369
|
+
SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
|
|
1370
|
+
asyncgen->m_closed = true;
|
|
1371
|
+
} else if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, error, PyExc_StopAsyncIteration) ||
|
|
1372
|
+
EXCEPTION_MATCH_BOOL_SINGLE(tstate, error, PyExc_GeneratorExit)) {
|
|
1373
|
+
asyncgen->m_closed = true;
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1376
|
+
#if PYTHON_VERSION >= 0x380
|
|
1377
|
+
asyncgen->m_running_async = false;
|
|
1378
|
+
#endif
|
|
1379
|
+
return NULL;
|
|
1380
|
+
}
|
|
1381
|
+
|
|
1382
|
+
if (_PyAsyncGenWrappedValue_CheckExact(result)) {
|
|
1383
|
+
/* async yield */
|
|
1384
|
+
Nuitka_SetStopIterationValue(tstate, ((struct _PyAsyncGenWrappedValue *)result)->agw_val);
|
|
1385
|
+
|
|
1386
|
+
Py_DECREF(result);
|
|
1387
|
+
|
|
1388
|
+
#if PYTHON_VERSION >= 0x380
|
|
1389
|
+
asyncgen->m_running_async = false;
|
|
1390
|
+
#endif
|
|
1391
|
+
return NULL;
|
|
1392
|
+
} else if (Nuitka_AsyncgenWrappedValue_CheckExact(result)) {
|
|
1393
|
+
/* async yield */
|
|
1394
|
+
Nuitka_SetStopIterationValue(tstate, ((struct Nuitka_AsyncgenWrappedValueObject *)result)->m_value);
|
|
1395
|
+
|
|
1396
|
+
Py_DECREF(result);
|
|
1397
|
+
|
|
1398
|
+
#if PYTHON_VERSION >= 0x380
|
|
1399
|
+
asyncgen->m_running_async = false;
|
|
1400
|
+
#endif
|
|
1401
|
+
return NULL;
|
|
1402
|
+
}
|
|
1403
|
+
|
|
1404
|
+
return result;
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
static struct Nuitka_AsyncgenAsendObject *free_list_asyncgen_asends = NULL;
|
|
1408
|
+
static int free_list_asyncgen_asends_count = 0;
|
|
1409
|
+
|
|
1410
|
+
static void Nuitka_AsyncgenAsend_tp_dealloc(struct Nuitka_AsyncgenAsendObject *asyncgen_asend) {
|
|
1411
|
+
#if _DEBUG_REFCOUNTS
|
|
1412
|
+
count_active_Nuitka_AsyncgenAsend_Type -= 1;
|
|
1413
|
+
count_released_Nuitka_AsyncgenAsend_Type += 1;
|
|
1414
|
+
#endif
|
|
1415
|
+
|
|
1416
|
+
Nuitka_GC_UnTrack(asyncgen_asend);
|
|
1417
|
+
|
|
1418
|
+
CHECK_OBJECT(asyncgen_asend->m_gen);
|
|
1419
|
+
Py_DECREF(asyncgen_asend->m_gen);
|
|
1420
|
+
|
|
1421
|
+
CHECK_OBJECT(asyncgen_asend->m_sendval);
|
|
1422
|
+
Py_DECREF(asyncgen_asend->m_sendval);
|
|
1423
|
+
|
|
1424
|
+
releaseToFreeList(free_list_asyncgen_asends, asyncgen_asend, MAX_ASYNCGEN_FREE_LIST_COUNT);
|
|
1425
|
+
}
|
|
1426
|
+
|
|
1427
|
+
static int Nuitka_AsyncgenAsend_tp_traverse(struct Nuitka_AsyncgenAsendObject *asyncgen_asend, visitproc visit,
|
|
1428
|
+
void *arg) {
|
|
1429
|
+
CHECK_OBJECT(asyncgen_asend);
|
|
1430
|
+
|
|
1431
|
+
CHECK_OBJECT(asyncgen_asend->m_gen);
|
|
1432
|
+
CHECK_OBJECT(asyncgen_asend->m_sendval);
|
|
1433
|
+
|
|
1434
|
+
Py_VISIT(asyncgen_asend->m_gen);
|
|
1435
|
+
Py_VISIT(asyncgen_asend->m_sendval);
|
|
1436
|
+
|
|
1437
|
+
return 0;
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
static PyObject *Nuitka_AsyncgenAsend_send(struct Nuitka_AsyncgenAsendObject *asyncgen_asend, PyObject *arg) {
|
|
1441
|
+
#if _DEBUG_ASYNCGEN
|
|
1442
|
+
PRINT_ASYNCGEN_ASEND_STATUS("Enter", asyncgen_asend);
|
|
1443
|
+
PRINT_COROUTINE_VALUE("arg", arg);
|
|
1444
|
+
PRINT_NEW_LINE();
|
|
1445
|
+
#endif
|
|
1446
|
+
|
|
1447
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
1448
|
+
|
|
1449
|
+
if (asyncgen_asend->m_state == AWAITABLE_STATE_CLOSED) {
|
|
1450
|
+
#if PYTHON_VERSION < 0x390
|
|
1451
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1452
|
+
#else
|
|
1453
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "cannot reuse already awaited __anext__()/asend()");
|
|
1454
|
+
#endif
|
|
1455
|
+
|
|
1456
|
+
#if _DEBUG_ASYNCGEN
|
|
1457
|
+
PRINT_ASYNCGEN_ASEND_STATUS("Leave", asyncgen_asend);
|
|
1458
|
+
PRINT_STRING("Closed -> StopIteration\n");
|
|
1459
|
+
PRINT_CURRENT_EXCEPTION();
|
|
1460
|
+
PRINT_NEW_LINE();
|
|
1461
|
+
#endif
|
|
1462
|
+
|
|
1463
|
+
return NULL;
|
|
1464
|
+
} else if (asyncgen_asend->m_state == AWAITABLE_STATE_INIT) {
|
|
1465
|
+
#if PYTHON_VERSION >= 0x380
|
|
1466
|
+
if (asyncgen_asend->m_gen->m_running_async) {
|
|
1467
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
|
|
1468
|
+
"anext(): asynchronous generator is already running");
|
|
1469
|
+
return NULL;
|
|
1470
|
+
}
|
|
1471
|
+
#endif
|
|
1472
|
+
if (arg == NULL || arg == Py_None) {
|
|
1473
|
+
arg = asyncgen_asend->m_sendval;
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1476
|
+
asyncgen_asend->m_state = AWAITABLE_STATE_ITER;
|
|
1477
|
+
|
|
1478
|
+
#if _DEBUG_ASYNCGEN
|
|
1479
|
+
PRINT_STRING("Init -> begin iteration\n");
|
|
1480
|
+
PRINT_COROUTINE_VALUE("computed arg from sendval", arg);
|
|
1481
|
+
PRINT_NEW_LINE();
|
|
1482
|
+
#endif
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
#if PYTHON_VERSION >= 0x380
|
|
1486
|
+
asyncgen_asend->m_gen->m_running_async = true;
|
|
1487
|
+
#endif
|
|
1488
|
+
|
|
1489
|
+
#if _DEBUG_ASYNCGEN
|
|
1490
|
+
PRINT_STRING("Deferring to _Nuitka_Asyncgen_send\n");
|
|
1491
|
+
PRINT_NEW_LINE();
|
|
1492
|
+
#endif
|
|
1493
|
+
|
|
1494
|
+
Py_INCREF(arg);
|
|
1495
|
+
|
|
1496
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
1497
|
+
INIT_ERROR_OCCURRED_STATE(&exception_state);
|
|
1498
|
+
|
|
1499
|
+
PyObject *result = _Nuitka_Asyncgen_send(tstate, asyncgen_asend->m_gen, arg, false, &exception_state);
|
|
1500
|
+
|
|
1501
|
+
#if _DEBUG_ASYNCGEN
|
|
1502
|
+
PRINT_ASYNCGEN_ASEND_STATUS("Returned from _Nuitka_Asyncgen_send", asyncgen_asend);
|
|
1503
|
+
PRINT_COROUTINE_VALUE("result", result);
|
|
1504
|
+
PRINT_CURRENT_EXCEPTION();
|
|
1505
|
+
#endif
|
|
1506
|
+
|
|
1507
|
+
result = _Nuitka_Asyncgen_unwrap_value(tstate, asyncgen_asend->m_gen, result);
|
|
1508
|
+
#if _DEBUG_ASYNCGEN
|
|
1509
|
+
PRINT_ASYNCGEN_ASEND_STATUS("Returned from _Nuitka_Asyncgen_unwrap_value", asyncgen_asend);
|
|
1510
|
+
PRINT_COROUTINE_VALUE("result", result);
|
|
1511
|
+
PRINT_CURRENT_EXCEPTION();
|
|
1512
|
+
#endif
|
|
1513
|
+
|
|
1514
|
+
#if _DEBUG_ASYNCGEN
|
|
1515
|
+
PRINT_COROUTINE_VALUE("result", result);
|
|
1516
|
+
PRINT_CURRENT_EXCEPTION();
|
|
1517
|
+
PRINT_NEW_LINE();
|
|
1518
|
+
#endif
|
|
1519
|
+
|
|
1520
|
+
if (result == NULL) {
|
|
1521
|
+
asyncgen_asend->m_state = AWAITABLE_STATE_CLOSED;
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1524
|
+
#if _DEBUG_ASYNCGEN
|
|
1525
|
+
PRINT_ASYNCGEN_ASEND_STATUS("Leave", asyncgen_asend);
|
|
1526
|
+
PRINT_COROUTINE_VALUE("result", result);
|
|
1527
|
+
PRINT_NEW_LINE();
|
|
1528
|
+
#endif
|
|
1529
|
+
|
|
1530
|
+
return result;
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
static PyObject *Nuitka_AsyncgenAsend_tp_iternext(struct Nuitka_AsyncgenAsendObject *asyncgen_asend) {
|
|
1534
|
+
#if _DEBUG_ASYNCGEN
|
|
1535
|
+
PRINT_ASYNCGEN_ASEND_STATUS("Enter", asyncgen_asend);
|
|
1536
|
+
PRINT_STRING("Deferring to Nuitka_AsyncgenAsend_send(Py_None)\n");
|
|
1537
|
+
PRINT_NEW_LINE();
|
|
1538
|
+
#endif
|
|
1539
|
+
|
|
1540
|
+
PyObject *result = Nuitka_AsyncgenAsend_send(asyncgen_asend, Py_None);
|
|
1541
|
+
|
|
1542
|
+
#if _DEBUG_ASYNCGEN
|
|
1543
|
+
PRINT_ASYNCGEN_ASEND_STATUS("Leave", asyncgen_asend);
|
|
1544
|
+
PRINT_COROUTINE_VALUE("result", result);
|
|
1545
|
+
PRINT_NEW_LINE();
|
|
1546
|
+
#endif
|
|
1547
|
+
|
|
1548
|
+
return result;
|
|
1549
|
+
}
|
|
1550
|
+
|
|
1551
|
+
static PyObject *Nuitka_AsyncgenAsend_throw(struct Nuitka_AsyncgenAsendObject *asyncgen_asend, PyObject *args) {
|
|
1552
|
+
#if _DEBUG_ASYNCGEN
|
|
1553
|
+
PRINT_ASYNCGEN_ASEND_STATUS("Enter", asyncgen_asend);
|
|
1554
|
+
PRINT_STRING("Nuitka_AsyncgenAsend_throw: args:");
|
|
1555
|
+
PRINT_ITEM(args);
|
|
1556
|
+
PRINT_NEW_LINE();
|
|
1557
|
+
PRINT_STRING("Nuitka_AsyncgenAsend_throw: On entry: ");
|
|
1558
|
+
PRINT_CURRENT_EXCEPTION();
|
|
1559
|
+
#endif
|
|
1560
|
+
|
|
1561
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
1562
|
+
|
|
1563
|
+
if (asyncgen_asend->m_state == AWAITABLE_STATE_CLOSED) {
|
|
1564
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1565
|
+
return NULL;
|
|
1566
|
+
}
|
|
1567
|
+
|
|
1568
|
+
PyObject *result = Nuitka_Asyncgen_throw(tstate, asyncgen_asend->m_gen, args);
|
|
1569
|
+
|
|
1570
|
+
#if _DEBUG_ASYNCGEN
|
|
1571
|
+
PRINT_STRING("Nuitka_AsyncgenAsend_throw: Async throw result:");
|
|
1572
|
+
PRINT_ITEM(result);
|
|
1573
|
+
PRINT_STRING(" exception: ");
|
|
1574
|
+
PRINT_CURRENT_EXCEPTION();
|
|
1575
|
+
#endif
|
|
1576
|
+
|
|
1577
|
+
result = _Nuitka_Asyncgen_unwrap_value(tstate, asyncgen_asend->m_gen, result);
|
|
1578
|
+
|
|
1579
|
+
if (result == NULL) {
|
|
1580
|
+
asyncgen_asend->m_state = AWAITABLE_STATE_CLOSED;
|
|
1581
|
+
}
|
|
1582
|
+
|
|
1583
|
+
#if _DEBUG_ASYNCGEN
|
|
1584
|
+
PRINT_STRING("Nuitka_AsyncgenAsend_throw: Leave with result: ");
|
|
1585
|
+
PRINT_ITEM(result);
|
|
1586
|
+
PRINT_NEW_LINE();
|
|
1587
|
+
PRINT_STRING("Nuitka_AsyncgenAsend_throw: Leave with exception: ");
|
|
1588
|
+
PRINT_CURRENT_EXCEPTION();
|
|
1589
|
+
PRINT_STRING("Nuitka_AsyncgenAsend_throw: Leave with exception: ");
|
|
1590
|
+
PRINT_PUBLISHED_EXCEPTION();
|
|
1591
|
+
PRINT_NEW_LINE();
|
|
1592
|
+
#endif
|
|
1593
|
+
CHECK_OBJECT_DEEP(args);
|
|
1594
|
+
|
|
1595
|
+
return result;
|
|
1596
|
+
}
|
|
1597
|
+
|
|
1598
|
+
static PyObject *_Nuitka_AsyncgenAsend_throw2(PyThreadState *tstate, struct Nuitka_AsyncgenAsendObject *asyncgen_asend,
|
|
1599
|
+
struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
1600
|
+
#if _DEBUG_ASYNCGEN
|
|
1601
|
+
PRINT_ASYNCGEN_ASEND_STATUS("Enter", asyncgen_asend);
|
|
1602
|
+
PRINT_EXCEPTION_STATE(exception_state);
|
|
1603
|
+
PRINT_CURRENT_EXCEPTION();
|
|
1604
|
+
PRINT_NEW_LINE();
|
|
1605
|
+
#endif
|
|
1606
|
+
|
|
1607
|
+
if (asyncgen_asend->m_state == AWAITABLE_STATE_CLOSED) {
|
|
1608
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1609
|
+
return NULL;
|
|
1610
|
+
}
|
|
1611
|
+
|
|
1612
|
+
PyObject *result = _Nuitka_Asyncgen_throw2(tstate, asyncgen_asend->m_gen, false, exception_state);
|
|
1613
|
+
|
|
1614
|
+
// TODO: This might not be all that necessary as this is not directly outside facing,
|
|
1615
|
+
// but there were tests failing when this was not the specific value.
|
|
1616
|
+
if (result == NULL) {
|
|
1617
|
+
if (HAS_ERROR_OCCURRED(tstate) == false) {
|
|
1618
|
+
SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
1621
|
+
|
|
1622
|
+
#if _DEBUG_ASYNCGEN
|
|
1623
|
+
PRINT_ASYNCGEN_ASEND_STATUS("Got result", asyncgen_asend);
|
|
1624
|
+
PRINT_COROUTINE_VALUE("result", result);
|
|
1625
|
+
PRINT_CURRENT_EXCEPTION();
|
|
1626
|
+
#endif
|
|
1627
|
+
|
|
1628
|
+
result = _Nuitka_Asyncgen_unwrap_value(tstate, asyncgen_asend->m_gen, result);
|
|
1629
|
+
|
|
1630
|
+
#if _DEBUG_ASYNCGEN
|
|
1631
|
+
PRINT_COROUTINE_VALUE("unwrapped", result);
|
|
1632
|
+
PRINT_NEW_LINE();
|
|
1633
|
+
#endif
|
|
1634
|
+
|
|
1635
|
+
if (result == NULL) {
|
|
1636
|
+
asyncgen_asend->m_state = AWAITABLE_STATE_CLOSED;
|
|
1637
|
+
}
|
|
1638
|
+
|
|
1639
|
+
#if _DEBUG_ASYNCGEN
|
|
1640
|
+
PRINT_ASYNCGEN_ASEND_STATUS("Leave", asyncgen_asend);
|
|
1641
|
+
PRINT_COROUTINE_VALUE("result", result);
|
|
1642
|
+
PRINT_CURRENT_EXCEPTION();
|
|
1643
|
+
PRINT_NEW_LINE();
|
|
1644
|
+
#endif
|
|
1645
|
+
return result;
|
|
1646
|
+
}
|
|
1647
|
+
|
|
1648
|
+
static PyObject *Nuitka_AsyncgenAsend_close(struct Nuitka_AsyncgenAsendObject *asyncgen_asend, PyObject *args) {
|
|
1649
|
+
asyncgen_asend->m_state = AWAITABLE_STATE_CLOSED;
|
|
1650
|
+
|
|
1651
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
1652
|
+
return Py_None;
|
|
1653
|
+
}
|
|
1654
|
+
|
|
1655
|
+
static PyObject *Nuitka_AsyncgenAsend_tp_repr(struct Nuitka_AsyncgenAsendObject *asyncgen_asend) {
|
|
1656
|
+
return PyUnicode_FromFormat("<compiled_async_generator_asend of %s at %p>",
|
|
1657
|
+
Nuitka_String_AsString(asyncgen_asend->m_gen->m_qualname), asyncgen_asend);
|
|
1658
|
+
}
|
|
1659
|
+
|
|
1660
|
+
static PyMethodDef Nuitka_AsyncgenAsend_methods[] = {
|
|
1661
|
+
{"send", (PyCFunction)Nuitka_AsyncgenAsend_send, METH_O, NULL},
|
|
1662
|
+
{"throw", (PyCFunction)Nuitka_AsyncgenAsend_throw, METH_VARARGS, NULL},
|
|
1663
|
+
{"close", (PyCFunction)Nuitka_AsyncgenAsend_close, METH_NOARGS, NULL},
|
|
1664
|
+
{NULL}};
|
|
1665
|
+
|
|
1666
|
+
static PyAsyncMethods Nuitka_AsyncgenAsend_as_async = {
|
|
1667
|
+
0, // am_await (PyObject_SelfIter)
|
|
1668
|
+
0, // am_aiter
|
|
1669
|
+
0 // am_anext
|
|
1670
|
+
};
|
|
1671
|
+
|
|
1672
|
+
static PyTypeObject Nuitka_AsyncgenAsend_Type = {
|
|
1673
|
+
PyVarObject_HEAD_INIT(NULL, 0) "compiled_async_generator_asend", // tp_name
|
|
1674
|
+
sizeof(struct Nuitka_AsyncgenAsendObject), // tp_basicsize
|
|
1675
|
+
0, // tp_itemsize
|
|
1676
|
+
(destructor)Nuitka_AsyncgenAsend_tp_dealloc, // tp_dealloc
|
|
1677
|
+
0, // tp_print
|
|
1678
|
+
0, // tp_getattr
|
|
1679
|
+
0, // tp_setattr
|
|
1680
|
+
&Nuitka_AsyncgenAsend_as_async, // tp_as_async
|
|
1681
|
+
(reprfunc)Nuitka_AsyncgenAsend_tp_repr, // tp_repr
|
|
1682
|
+
0, // tp_as_number
|
|
1683
|
+
0, // tp_as_sequence
|
|
1684
|
+
0, // tp_as_mapping
|
|
1685
|
+
0, // tp_hash
|
|
1686
|
+
0, // tp_call
|
|
1687
|
+
0, // tp_str
|
|
1688
|
+
0, // tp_getattro (PyObject_GenericGetAttr)
|
|
1689
|
+
0, // tp_setattro
|
|
1690
|
+
0, // tp_as_buffer
|
|
1691
|
+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, // tp_flags
|
|
1692
|
+
0, // tp_doc
|
|
1693
|
+
(traverseproc)Nuitka_AsyncgenAsend_tp_traverse, // tp_traverse
|
|
1694
|
+
0, // tp_clear
|
|
1695
|
+
0, // tp_richcompare
|
|
1696
|
+
0, // tp_weaklistoffset
|
|
1697
|
+
0, // tp_iter (PyObject_SelfIter)
|
|
1698
|
+
(iternextfunc)Nuitka_AsyncgenAsend_tp_iternext, // tp_iternext
|
|
1699
|
+
Nuitka_AsyncgenAsend_methods, // tp_methods
|
|
1700
|
+
0, // tp_members
|
|
1701
|
+
0, // tp_getset
|
|
1702
|
+
0, // tp_base
|
|
1703
|
+
0, // tp_dict
|
|
1704
|
+
0, // tp_descr_get
|
|
1705
|
+
0, // tp_descr_set
|
|
1706
|
+
0, // tp_dictoffset
|
|
1707
|
+
0, // tp_init
|
|
1708
|
+
0, // tp_alloc
|
|
1709
|
+
0, // tp_new
|
|
1710
|
+
};
|
|
1711
|
+
|
|
1712
|
+
static bool Nuitka_AsyncgenAsend_Check(PyObject *object) { return Py_TYPE(object) == &Nuitka_AsyncgenAsend_Type; }
|
|
1713
|
+
|
|
1714
|
+
static PyObject *Nuitka_AsyncgenAsend_New(struct Nuitka_AsyncgenObject *asyncgen, PyObject *send_value) {
|
|
1715
|
+
CHECK_OBJECT(asyncgen);
|
|
1716
|
+
CHECK_OBJECT(send_value);
|
|
1717
|
+
|
|
1718
|
+
#if _DEBUG_REFCOUNTS
|
|
1719
|
+
count_active_Nuitka_AsyncgenAsend_Type += 1;
|
|
1720
|
+
count_allocated_Nuitka_AsyncgenAsend_Type += 1;
|
|
1721
|
+
#endif
|
|
1722
|
+
|
|
1723
|
+
struct Nuitka_AsyncgenAsendObject *result;
|
|
1724
|
+
|
|
1725
|
+
allocateFromFreeListFixed(free_list_asyncgen_asends, struct Nuitka_AsyncgenAsendObject, Nuitka_AsyncgenAsend_Type);
|
|
1726
|
+
|
|
1727
|
+
Py_INCREF(asyncgen);
|
|
1728
|
+
result->m_gen = asyncgen;
|
|
1729
|
+
|
|
1730
|
+
Py_INCREF(send_value);
|
|
1731
|
+
result->m_sendval = send_value;
|
|
1732
|
+
|
|
1733
|
+
result->m_state = AWAITABLE_STATE_INIT;
|
|
1734
|
+
|
|
1735
|
+
Nuitka_GC_Track(result);
|
|
1736
|
+
return (PyObject *)result;
|
|
1737
|
+
}
|
|
1738
|
+
|
|
1739
|
+
struct Nuitka_AsyncgenAthrowObject {
|
|
1740
|
+
/* Python object folklore: */
|
|
1741
|
+
PyObject_HEAD
|
|
1742
|
+
|
|
1743
|
+
// The asyncgen we are working for.
|
|
1744
|
+
struct Nuitka_AsyncgenObject *m_gen;
|
|
1745
|
+
// Arguments, NULL in case of close, otherwise throw arguments.
|
|
1746
|
+
PyObject *m_args;
|
|
1747
|
+
|
|
1748
|
+
AwaitableState m_state;
|
|
1749
|
+
};
|
|
1750
|
+
|
|
1751
|
+
#if _DEBUG_ASYNCGEN
|
|
1752
|
+
|
|
1753
|
+
NUITKA_MAY_BE_UNUSED static void _PRINT_ASYNCGEN_ATHROW_STATUS(char const *descriptor, char const *context,
|
|
1754
|
+
struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow) {
|
|
1755
|
+
char const *status;
|
|
1756
|
+
|
|
1757
|
+
switch (asyncgen_athrow->m_state) {
|
|
1758
|
+
case AWAITABLE_STATE_INIT:
|
|
1759
|
+
status = "(init)";
|
|
1760
|
+
break;
|
|
1761
|
+
case AWAITABLE_STATE_ITER:
|
|
1762
|
+
status = "(iter)";
|
|
1763
|
+
break;
|
|
1764
|
+
case AWAITABLE_STATE_CLOSED:
|
|
1765
|
+
status = "(closed)";
|
|
1766
|
+
break;
|
|
1767
|
+
default:
|
|
1768
|
+
status = "(ILLEGAL)";
|
|
1769
|
+
break;
|
|
1770
|
+
}
|
|
1771
|
+
|
|
1772
|
+
PRINT_STRING(descriptor);
|
|
1773
|
+
PRINT_STRING(" : ");
|
|
1774
|
+
PRINT_STRING(context);
|
|
1775
|
+
PRINT_STRING(" ");
|
|
1776
|
+
PRINT_ITEM((PyObject *)asyncgen_athrow);
|
|
1777
|
+
PRINT_STRING(" ");
|
|
1778
|
+
PRINT_STRING(status);
|
|
1779
|
+
PRINT_NEW_LINE();
|
|
1780
|
+
}
|
|
1781
|
+
|
|
1782
|
+
#define PRINT_ASYNCGEN_ATHROW_STATUS(context, coroutine) \
|
|
1783
|
+
_PRINT_ASYNCGEN_ATHROW_STATUS(__FUNCTION__, context, asyncgen_athrow)
|
|
1784
|
+
|
|
1785
|
+
#endif
|
|
1786
|
+
|
|
1787
|
+
static struct Nuitka_AsyncgenAthrowObject *free_list_asyncgen_athrows = NULL;
|
|
1788
|
+
static int free_list_asyncgen_athrows_count = 0;
|
|
1789
|
+
|
|
1790
|
+
static void Nuitka_AsyncgenAthrow_dealloc(struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow) {
|
|
1791
|
+
#if _DEBUG_REFCOUNTS
|
|
1792
|
+
count_active_Nuitka_AsyncgenAthrow_Type -= 1;
|
|
1793
|
+
count_released_Nuitka_AsyncgenAthrow_Type += 1;
|
|
1794
|
+
#endif
|
|
1795
|
+
|
|
1796
|
+
Nuitka_GC_UnTrack(asyncgen_athrow);
|
|
1797
|
+
|
|
1798
|
+
CHECK_OBJECT(asyncgen_athrow->m_gen);
|
|
1799
|
+
Py_DECREF(asyncgen_athrow->m_gen);
|
|
1800
|
+
|
|
1801
|
+
CHECK_OBJECT_X(asyncgen_athrow->m_args);
|
|
1802
|
+
Py_XDECREF(asyncgen_athrow->m_args);
|
|
1803
|
+
|
|
1804
|
+
/* Put the object into free list or release to GC */
|
|
1805
|
+
releaseToFreeList(free_list_asyncgen_athrows, asyncgen_athrow, MAX_ASYNCGEN_FREE_LIST_COUNT);
|
|
1806
|
+
}
|
|
1807
|
+
|
|
1808
|
+
static int Nuitka_AsyncgenAthrow_traverse(struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow, visitproc visit,
|
|
1809
|
+
void *arg) {
|
|
1810
|
+
Py_VISIT(asyncgen_athrow->m_gen);
|
|
1811
|
+
Py_VISIT(asyncgen_athrow->m_args);
|
|
1812
|
+
|
|
1813
|
+
return 0;
|
|
1814
|
+
}
|
|
1815
|
+
|
|
1816
|
+
static PyObject *Nuitka_AsyncgenAthrow_send(struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow, PyObject *arg) {
|
|
1817
|
+
#if _DEBUG_ASYNCGEN
|
|
1818
|
+
PRINT_ASYNCGEN_ATHROW_STATUS("Enter", asyncgen_athrow);
|
|
1819
|
+
PRINT_COROUTINE_VALUE("arg", arg);
|
|
1820
|
+
PRINT_NEW_LINE();
|
|
1821
|
+
#endif
|
|
1822
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
1823
|
+
|
|
1824
|
+
struct Nuitka_AsyncgenObject *asyncgen = asyncgen_athrow->m_gen;
|
|
1825
|
+
|
|
1826
|
+
// Closing twice is not allowed with 3.9 or higher.
|
|
1827
|
+
if (asyncgen_athrow->m_state == AWAITABLE_STATE_CLOSED) {
|
|
1828
|
+
#if PYTHON_VERSION < 0x390
|
|
1829
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1830
|
+
#else
|
|
1831
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "cannot reuse already awaited aclose()/athrow()");
|
|
1832
|
+
#endif
|
|
1833
|
+
|
|
1834
|
+
return NULL;
|
|
1835
|
+
}
|
|
1836
|
+
|
|
1837
|
+
// If finished, just report StopIteration.
|
|
1838
|
+
if (asyncgen->m_status == status_Finished) {
|
|
1839
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1840
|
+
return NULL;
|
|
1841
|
+
}
|
|
1842
|
+
|
|
1843
|
+
PyObject *retval;
|
|
1844
|
+
|
|
1845
|
+
if (asyncgen_athrow->m_state == AWAITABLE_STATE_INIT) {
|
|
1846
|
+
#if PYTHON_VERSION >= 0x380
|
|
1847
|
+
if (asyncgen_athrow->m_gen->m_running_async) {
|
|
1848
|
+
if (asyncgen_athrow->m_args == NULL) {
|
|
1849
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
|
|
1850
|
+
"aclose(): asynchronous generator is already running");
|
|
1851
|
+
} else {
|
|
1852
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
|
|
1853
|
+
"athrow(): asynchronous generator is already running");
|
|
1854
|
+
}
|
|
1855
|
+
return NULL;
|
|
1856
|
+
}
|
|
1857
|
+
#endif
|
|
1858
|
+
|
|
1859
|
+
// Can also close only once.
|
|
1860
|
+
if (asyncgen->m_closed) {
|
|
1861
|
+
#if PYTHON_VERSION >= 0x380
|
|
1862
|
+
asyncgen_athrow->m_state = AWAITABLE_STATE_CLOSED;
|
|
1863
|
+
SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
|
|
1864
|
+
#else
|
|
1865
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1866
|
+
#endif
|
|
1867
|
+
return NULL;
|
|
1868
|
+
}
|
|
1869
|
+
|
|
1870
|
+
// Starting accepts only "None" as input value.
|
|
1871
|
+
if (arg != Py_None) {
|
|
1872
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
|
|
1873
|
+
"can't send non-None value to a just-started coroutine");
|
|
1874
|
+
|
|
1875
|
+
return NULL;
|
|
1876
|
+
}
|
|
1877
|
+
|
|
1878
|
+
#if PYTHON_VERSION >= 0x380
|
|
1879
|
+
asyncgen_athrow->m_gen->m_running_async = true;
|
|
1880
|
+
#endif
|
|
1881
|
+
asyncgen_athrow->m_state = AWAITABLE_STATE_ITER;
|
|
1882
|
+
|
|
1883
|
+
if (asyncgen_athrow->m_args == NULL) {
|
|
1884
|
+
asyncgen->m_closed = true;
|
|
1885
|
+
|
|
1886
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
1887
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, &exception_state, PyExc_GeneratorExit, NULL, NULL);
|
|
1888
|
+
|
|
1889
|
+
retval = _Nuitka_Asyncgen_throw2(tstate, asyncgen,
|
|
1890
|
+
1, /* Do not close generator when PyExc_GeneratorExit is passed */
|
|
1891
|
+
&exception_state);
|
|
1892
|
+
|
|
1893
|
+
if (retval != NULL) {
|
|
1894
|
+
if (_PyAsyncGenWrappedValue_CheckExact(retval) || Nuitka_AsyncgenWrappedValue_CheckExact(retval)) {
|
|
1895
|
+
#if PYTHON_VERSION >= 0x380
|
|
1896
|
+
asyncgen_athrow->m_gen->m_running_async = false;
|
|
1897
|
+
#endif
|
|
1898
|
+
|
|
1899
|
+
Py_DECREF(retval);
|
|
1900
|
+
|
|
1901
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
|
|
1902
|
+
"async generator ignored GeneratorExit");
|
|
1903
|
+
|
|
1904
|
+
return NULL;
|
|
1905
|
+
}
|
|
1906
|
+
}
|
|
1907
|
+
} else {
|
|
1908
|
+
PyObject *exception_type;
|
|
1909
|
+
PyObject *exception_value = NULL;
|
|
1910
|
+
PyTracebackObject *exception_tb = NULL;
|
|
1911
|
+
|
|
1912
|
+
if (unlikely(!PyArg_UnpackTuple(asyncgen_athrow->m_args, "athrow", 1, 3, &exception_type, &exception_value,
|
|
1913
|
+
&exception_tb))) {
|
|
1914
|
+
return NULL;
|
|
1915
|
+
}
|
|
1916
|
+
|
|
1917
|
+
// Handing ownership of exception over, we need not release it ourselves
|
|
1918
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
1919
|
+
if (_Nuitka_Generator_make_throw_exception_state(tstate, &exception_state, exception_type, exception_value,
|
|
1920
|
+
exception_tb) == false) {
|
|
1921
|
+
return NULL;
|
|
1922
|
+
}
|
|
1923
|
+
|
|
1924
|
+
retval = _Nuitka_Asyncgen_throw2(tstate, asyncgen,
|
|
1925
|
+
0, /* Do not close generator when PyExc_GeneratorExit is passed */
|
|
1926
|
+
&exception_state);
|
|
1927
|
+
|
|
1928
|
+
retval = _Nuitka_Asyncgen_unwrap_value(tstate, asyncgen, retval);
|
|
1929
|
+
}
|
|
1930
|
+
|
|
1931
|
+
if (retval == NULL) {
|
|
1932
|
+
goto check_error;
|
|
1933
|
+
}
|
|
1934
|
+
|
|
1935
|
+
return retval;
|
|
1936
|
+
}
|
|
1937
|
+
|
|
1938
|
+
assert(asyncgen_athrow->m_state == AWAITABLE_STATE_ITER);
|
|
1939
|
+
|
|
1940
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
1941
|
+
INIT_ERROR_OCCURRED_STATE(&exception_state);
|
|
1942
|
+
|
|
1943
|
+
Py_INCREF(arg);
|
|
1944
|
+
retval = _Nuitka_Asyncgen_send(tstate, asyncgen, arg, false, &exception_state);
|
|
1945
|
+
|
|
1946
|
+
if (asyncgen_athrow->m_args) {
|
|
1947
|
+
return _Nuitka_Asyncgen_unwrap_value(tstate, asyncgen, retval);
|
|
1948
|
+
} else {
|
|
1949
|
+
/* We are here to close if no args. */
|
|
1950
|
+
if (retval != NULL) {
|
|
1951
|
+
if (_PyAsyncGenWrappedValue_CheckExact(retval) || Nuitka_AsyncgenWrappedValue_CheckExact(retval)) {
|
|
1952
|
+
#if PYTHON_VERSION >= 0x380
|
|
1953
|
+
asyncgen_athrow->m_gen->m_running_async = false;
|
|
1954
|
+
#endif
|
|
1955
|
+
Py_DECREF(retval);
|
|
1956
|
+
|
|
1957
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "async generator ignored GeneratorExit");
|
|
1958
|
+
|
|
1959
|
+
return NULL;
|
|
1960
|
+
}
|
|
1961
|
+
|
|
1962
|
+
return retval;
|
|
1963
|
+
}
|
|
1964
|
+
}
|
|
1965
|
+
|
|
1966
|
+
check_error:
|
|
1967
|
+
#if PYTHON_VERSION >= 0x380
|
|
1968
|
+
asyncgen_athrow->m_gen->m_running_async = false;
|
|
1969
|
+
#endif
|
|
1970
|
+
|
|
1971
|
+
if (PyErr_ExceptionMatches(PyExc_StopAsyncIteration)) {
|
|
1972
|
+
asyncgen_athrow->m_state = AWAITABLE_STATE_CLOSED;
|
|
1973
|
+
|
|
1974
|
+
if (asyncgen_athrow->m_args == NULL) {
|
|
1975
|
+
CLEAR_ERROR_OCCURRED(tstate);
|
|
1976
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1977
|
+
}
|
|
1978
|
+
} else if (PyErr_ExceptionMatches(PyExc_GeneratorExit)) {
|
|
1979
|
+
asyncgen_athrow->m_state = AWAITABLE_STATE_CLOSED;
|
|
1980
|
+
|
|
1981
|
+
#if PYTHON_VERSION >= 0x380
|
|
1982
|
+
if (asyncgen_athrow->m_args == NULL) {
|
|
1983
|
+
#endif
|
|
1984
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1985
|
+
#if PYTHON_VERSION >= 0x380
|
|
1986
|
+
}
|
|
1987
|
+
#endif
|
|
1988
|
+
}
|
|
1989
|
+
|
|
1990
|
+
return NULL;
|
|
1991
|
+
}
|
|
1992
|
+
|
|
1993
|
+
static PyObject *Nuitka_AsyncgenAthrow_throw(struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow, PyObject *args) {
|
|
1994
|
+
#if _DEBUG_ASYNCGEN
|
|
1995
|
+
PRINT_ASYNCGEN_ATHROW_STATUS("Enter", asyncgen_athrow);
|
|
1996
|
+
PRINT_COROUTINE_VALUE("args", args);
|
|
1997
|
+
PRINT_NEW_LINE();
|
|
1998
|
+
#endif
|
|
1999
|
+
|
|
2000
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
2001
|
+
|
|
2002
|
+
PyObject *retval;
|
|
2003
|
+
|
|
2004
|
+
#if PYTHON_VERSION < 0x375
|
|
2005
|
+
if (asyncgen_athrow->m_state == AWAITABLE_STATE_INIT) {
|
|
2006
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError,
|
|
2007
|
+
"can't send non-None value to a just-started coroutine");
|
|
2008
|
+
|
|
2009
|
+
return NULL;
|
|
2010
|
+
}
|
|
2011
|
+
#endif
|
|
2012
|
+
|
|
2013
|
+
if (asyncgen_athrow->m_state == AWAITABLE_STATE_CLOSED) {
|
|
2014
|
+
#if PYTHON_VERSION < 0x390
|
|
2015
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
2016
|
+
#else
|
|
2017
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "cannot reuse already awaited aclose()/athrow()");
|
|
2018
|
+
#endif
|
|
2019
|
+
|
|
2020
|
+
return NULL;
|
|
2021
|
+
}
|
|
2022
|
+
|
|
2023
|
+
retval = Nuitka_Asyncgen_throw(tstate, asyncgen_athrow->m_gen, args);
|
|
2024
|
+
|
|
2025
|
+
if (asyncgen_athrow->m_args) {
|
|
2026
|
+
return _Nuitka_Asyncgen_unwrap_value(tstate, asyncgen_athrow->m_gen, retval);
|
|
2027
|
+
} else {
|
|
2028
|
+
if (retval != NULL) {
|
|
2029
|
+
if (_PyAsyncGenWrappedValue_CheckExact(retval) || Nuitka_AsyncgenWrappedValue_CheckExact(retval)) {
|
|
2030
|
+
#if PYTHON_VERSION >= 0x380
|
|
2031
|
+
asyncgen_athrow->m_gen->m_running_async = false;
|
|
2032
|
+
#endif
|
|
2033
|
+
Py_DECREF(retval);
|
|
2034
|
+
|
|
2035
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "async generator ignored GeneratorExit");
|
|
2036
|
+
|
|
2037
|
+
return NULL;
|
|
2038
|
+
}
|
|
2039
|
+
}
|
|
2040
|
+
|
|
2041
|
+
#if PYTHON_VERSION >= 0x390
|
|
2042
|
+
if (PyErr_ExceptionMatches(PyExc_StopAsyncIteration) || PyErr_ExceptionMatches(PyExc_GeneratorExit)) {
|
|
2043
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
2044
|
+
}
|
|
2045
|
+
#endif
|
|
2046
|
+
|
|
2047
|
+
return retval;
|
|
2048
|
+
}
|
|
2049
|
+
}
|
|
2050
|
+
|
|
2051
|
+
static PyObject *Nuitka_AsyncgenAthrow_tp_iternext(struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow) {
|
|
2052
|
+
return Nuitka_AsyncgenAthrow_send(asyncgen_athrow, Py_None);
|
|
2053
|
+
}
|
|
2054
|
+
|
|
2055
|
+
static PyObject *Nuitka_AsyncgenAthrow_close(struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow) {
|
|
2056
|
+
asyncgen_athrow->m_state = AWAITABLE_STATE_CLOSED;
|
|
2057
|
+
|
|
2058
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
2059
|
+
return Py_None;
|
|
2060
|
+
}
|
|
2061
|
+
|
|
2062
|
+
static PyMethodDef Nuitka_AsyncgenAthrow_methods[] = {
|
|
2063
|
+
{"send", (PyCFunction)Nuitka_AsyncgenAthrow_send, METH_O, NULL},
|
|
2064
|
+
{"throw", (PyCFunction)Nuitka_AsyncgenAthrow_throw, METH_VARARGS, NULL},
|
|
2065
|
+
{"close", (PyCFunction)Nuitka_AsyncgenAthrow_close, METH_NOARGS, NULL},
|
|
2066
|
+
{NULL}};
|
|
2067
|
+
|
|
2068
|
+
static PyAsyncMethods Nuitka_AsyncgenAthrow_as_async = {
|
|
2069
|
+
0, // am_await (PyObject_SelfIter)
|
|
2070
|
+
0, // am_aiter
|
|
2071
|
+
0 // am_anext
|
|
2072
|
+
};
|
|
2073
|
+
|
|
2074
|
+
static PyTypeObject Nuitka_AsyncgenAthrow_Type = {
|
|
2075
|
+
PyVarObject_HEAD_INIT(NULL, 0) "compiled_async_generator_athrow", // tp_name
|
|
2076
|
+
sizeof(struct Nuitka_AsyncgenAthrowObject), // tp_basicsize
|
|
2077
|
+
0, // tp_itemsize
|
|
2078
|
+
(destructor)Nuitka_AsyncgenAthrow_dealloc, // tp_dealloc
|
|
2079
|
+
0, // tp_print
|
|
2080
|
+
0, // tp_getattr
|
|
2081
|
+
0, // tp_setattr
|
|
2082
|
+
&Nuitka_AsyncgenAthrow_as_async, // tp_as_async
|
|
2083
|
+
0, // tp_repr
|
|
2084
|
+
0, // tp_as_number
|
|
2085
|
+
0, // tp_as_sequence
|
|
2086
|
+
0, // tp_as_mapping
|
|
2087
|
+
0, // tp_hash
|
|
2088
|
+
0, // tp_call
|
|
2089
|
+
0, // tp_str
|
|
2090
|
+
0, // tp_getattro (PyObject_GenericGetAttr)
|
|
2091
|
+
0, // tp_setattro
|
|
2092
|
+
0, // tp_as_buffer
|
|
2093
|
+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, // tp_flags
|
|
2094
|
+
0, // tp_doc
|
|
2095
|
+
(traverseproc)Nuitka_AsyncgenAthrow_traverse, // tp_traverse
|
|
2096
|
+
0, // tp_clear
|
|
2097
|
+
0, // tp_richcompare
|
|
2098
|
+
0, // tp_weaklistoffset
|
|
2099
|
+
0, // tp_iter (PyObject_SelfIter)
|
|
2100
|
+
(iternextfunc)Nuitka_AsyncgenAthrow_tp_iternext, // tp_iternext
|
|
2101
|
+
Nuitka_AsyncgenAthrow_methods, // tp_methods
|
|
2102
|
+
0, // tp_members
|
|
2103
|
+
0, // tp_getset
|
|
2104
|
+
0, // tp_base
|
|
2105
|
+
0, // tp_dict
|
|
2106
|
+
0, // tp_descr_get
|
|
2107
|
+
0, // tp_descr_set
|
|
2108
|
+
0, // tp_dictoffset
|
|
2109
|
+
0, // tp_init
|
|
2110
|
+
0, // tp_alloc
|
|
2111
|
+
0, // tp_new
|
|
2112
|
+
0, // tp_free
|
|
2113
|
+
0, // tp_is_gc
|
|
2114
|
+
0, // tp_bases
|
|
2115
|
+
0, // tp_mro
|
|
2116
|
+
0, // tp_cache
|
|
2117
|
+
0, // tp_subclasses
|
|
2118
|
+
0, // tp_weaklist
|
|
2119
|
+
0, // tp_del
|
|
2120
|
+
0, // tp_version_tag
|
|
2121
|
+
0, // tp_finalize
|
|
2122
|
+
};
|
|
2123
|
+
|
|
2124
|
+
static PyObject *Nuitka_AsyncgenAthrow_New(struct Nuitka_AsyncgenObject *asyncgen, PyObject *args) {
|
|
2125
|
+
CHECK_OBJECT(asyncgen);
|
|
2126
|
+
CHECK_OBJECT_X(args);
|
|
2127
|
+
|
|
2128
|
+
#if _DEBUG_REFCOUNTS
|
|
2129
|
+
count_active_Nuitka_AsyncgenAthrow_Type += 1;
|
|
2130
|
+
count_allocated_Nuitka_AsyncgenAthrow_Type += 1;
|
|
2131
|
+
#endif
|
|
2132
|
+
|
|
2133
|
+
struct Nuitka_AsyncgenAthrowObject *result;
|
|
2134
|
+
|
|
2135
|
+
allocateFromFreeListFixed(free_list_asyncgen_athrows, struct Nuitka_AsyncgenAthrowObject,
|
|
2136
|
+
Nuitka_AsyncgenAthrow_Type);
|
|
2137
|
+
|
|
2138
|
+
Py_INCREF(asyncgen);
|
|
2139
|
+
result->m_gen = asyncgen;
|
|
2140
|
+
|
|
2141
|
+
Py_XINCREF(args);
|
|
2142
|
+
result->m_args = args;
|
|
2143
|
+
|
|
2144
|
+
result->m_state = AWAITABLE_STATE_INIT;
|
|
2145
|
+
|
|
2146
|
+
Nuitka_GC_Track(result);
|
|
2147
|
+
return (PyObject *)result;
|
|
2148
|
+
}
|
|
2149
|
+
|
|
2150
|
+
static void _initCompiledAsyncgenTypes(void) {
|
|
2151
|
+
|
|
2152
|
+
Nuitka_PyType_Ready(&Nuitka_Asyncgen_Type, &PyAsyncGen_Type, true, false, false, false, true);
|
|
2153
|
+
|
|
2154
|
+
// Be a paranoid subtype of uncompiled function, we want nothing shared.
|
|
2155
|
+
assert(Nuitka_Asyncgen_Type.tp_doc != PyAsyncGen_Type.tp_doc || PyAsyncGen_Type.tp_doc == NULL);
|
|
2156
|
+
assert(Nuitka_Asyncgen_Type.tp_traverse != PyAsyncGen_Type.tp_traverse);
|
|
2157
|
+
assert(Nuitka_Asyncgen_Type.tp_clear != PyAsyncGen_Type.tp_clear || PyAsyncGen_Type.tp_clear == NULL);
|
|
2158
|
+
assert(Nuitka_Asyncgen_Type.tp_richcompare != PyAsyncGen_Type.tp_richcompare ||
|
|
2159
|
+
PyAsyncGen_Type.tp_richcompare == NULL);
|
|
2160
|
+
assert(Nuitka_Asyncgen_Type.tp_weaklistoffset != PyAsyncGen_Type.tp_weaklistoffset);
|
|
2161
|
+
assert(Nuitka_Asyncgen_Type.tp_iter != PyAsyncGen_Type.tp_iter || PyAsyncGen_Type.tp_iter == NULL);
|
|
2162
|
+
assert(Nuitka_Asyncgen_Type.tp_iternext != PyAsyncGen_Type.tp_iternext || PyAsyncGen_Type.tp_iternext == NULL);
|
|
2163
|
+
assert(Nuitka_Asyncgen_Type.tp_as_async != PyAsyncGen_Type.tp_as_async || PyAsyncGen_Type.tp_as_async == NULL);
|
|
2164
|
+
assert(Nuitka_Asyncgen_Type.tp_methods != PyAsyncGen_Type.tp_methods);
|
|
2165
|
+
assert(Nuitka_Asyncgen_Type.tp_members != PyAsyncGen_Type.tp_members);
|
|
2166
|
+
assert(Nuitka_Asyncgen_Type.tp_getset != PyAsyncGen_Type.tp_getset);
|
|
2167
|
+
assert(Nuitka_Asyncgen_Type.tp_base != PyAsyncGen_Type.tp_base);
|
|
2168
|
+
assert(Nuitka_Asyncgen_Type.tp_dict != PyAsyncGen_Type.tp_dict);
|
|
2169
|
+
assert(Nuitka_Asyncgen_Type.tp_descr_get != PyAsyncGen_Type.tp_descr_get || PyAsyncGen_Type.tp_descr_get == NULL);
|
|
2170
|
+
|
|
2171
|
+
assert(Nuitka_Asyncgen_Type.tp_descr_set != PyAsyncGen_Type.tp_descr_set || PyAsyncGen_Type.tp_descr_set == NULL);
|
|
2172
|
+
assert(Nuitka_Asyncgen_Type.tp_dictoffset != PyAsyncGen_Type.tp_dictoffset || PyAsyncGen_Type.tp_dictoffset == 0);
|
|
2173
|
+
// TODO: These get changed and into the same thing, not sure what to compare against, project something
|
|
2174
|
+
// assert(Nuitka_Asyncgen_Type.tp_init != PyAsyncGen_Type.tp_init || PyAsyncGen_Type.tp_init == NULL);
|
|
2175
|
+
// assert(Nuitka_Asyncgen_Type.tp_alloc != PyAsyncGen_Type.tp_alloc || PyAsyncGen_Type.tp_alloc == NULL);
|
|
2176
|
+
// assert(Nuitka_Asyncgen_Type.tp_new != PyAsyncGen_Type.tp_new || PyAsyncGen_Type.tp_new == NULL);
|
|
2177
|
+
// assert(Nuitka_Asyncgen_Type.tp_free != PyAsyncGen_Type.tp_free || PyAsyncGen_Type.tp_free == NULL);
|
|
2178
|
+
assert(Nuitka_Asyncgen_Type.tp_bases != PyAsyncGen_Type.tp_bases);
|
|
2179
|
+
assert(Nuitka_Asyncgen_Type.tp_mro != PyAsyncGen_Type.tp_mro);
|
|
2180
|
+
assert(Nuitka_Asyncgen_Type.tp_cache != PyAsyncGen_Type.tp_cache || PyAsyncGen_Type.tp_cache == NULL);
|
|
2181
|
+
assert(Nuitka_Asyncgen_Type.tp_subclasses != PyAsyncGen_Type.tp_subclasses || PyAsyncGen_Type.tp_cache == NULL);
|
|
2182
|
+
assert(Nuitka_Asyncgen_Type.tp_weaklist != PyAsyncGen_Type.tp_weaklist);
|
|
2183
|
+
assert(Nuitka_Asyncgen_Type.tp_del != PyAsyncGen_Type.tp_del || PyAsyncGen_Type.tp_del == NULL);
|
|
2184
|
+
assert(Nuitka_Asyncgen_Type.tp_finalize != PyAsyncGen_Type.tp_finalize || PyAsyncGen_Type.tp_finalize == NULL);
|
|
2185
|
+
|
|
2186
|
+
Nuitka_PyType_Ready(&Nuitka_AsyncgenAsend_Type, NULL, true, false, true, true, false);
|
|
2187
|
+
Nuitka_PyType_Ready(&Nuitka_AsyncgenAthrow_Type, NULL, true, false, true, true, false);
|
|
2188
|
+
Nuitka_PyType_Ready(&Nuitka_AsyncgenValueWrapper_Type, NULL, false, false, false, false, false);
|
|
2189
|
+
|
|
2190
|
+
#if PYTHON_VERSION >= 0x3d0
|
|
2191
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
2192
|
+
PyObject *asyncgen_wrapper_object = _PyIntrinsics_UnaryFunctions[INTRINSIC_ASYNC_GEN_WRAP].func(tstate, Py_None);
|
|
2193
|
+
Nuitka_PyAsyncGenWrappedValue_Type = Py_TYPE(asyncgen_wrapper_object);
|
|
2194
|
+
Py_DECREF(asyncgen_wrapper_object);
|
|
2195
|
+
#endif
|
|
2196
|
+
}
|
|
2197
|
+
|
|
2198
|
+
// Part of "Nuitka", an optimizing Python compiler that is compatible and
|
|
2199
|
+
// integrates with CPython, but also works on its own.
|
|
2200
|
+
//
|
|
2201
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
2202
|
+
// you may not use this file except in compliance with the License.
|
|
2203
|
+
// You may obtain a copy of the License at
|
|
2204
|
+
//
|
|
2205
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
2206
|
+
//
|
|
2207
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
2208
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
2209
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2210
|
+
// See the License for the specific language governing permissions and
|
|
2211
|
+
// limitations under the License.
|