Nuitka-winsvc 1.8__cp311-cp311-win_amd64.whl → 2.5.1__cp311-cp311-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of Nuitka-winsvc might be problematic. Click here for more details.
- Nuitka_winsvc-1.8.data/scripts/nuitka-run.bat → Nuitka_winsvc-2.5.1.data/scripts/nuitka-run.cmd +9 -9
- Nuitka_winsvc-1.8.data/scripts/nuitka.bat → Nuitka_winsvc-2.5.1.data/scripts/nuitka.cmd +15 -15
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/METADATA +5 -3
- Nuitka_winsvc-2.5.1.dist-info/RECORD +977 -0
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/WHEEL +1 -1
- nuitka/Builtins.py +49 -17
- nuitka/BytecodeCaching.py +24 -20
- nuitka/Bytecodes.py +23 -19
- nuitka/CacheCleanup.py +28 -23
- nuitka/Constants.py +19 -17
- nuitka/Errors.py +23 -17
- nuitka/HardImportRegistry.py +408 -0
- nuitka/MainControl.py +209 -116
- nuitka/ModuleRegistry.py +83 -20
- nuitka/OptionParsing.py +467 -221
- nuitka/Options.py +701 -225
- nuitka/OutputDirectories.py +47 -23
- nuitka/PostProcessing.py +133 -79
- nuitka/Progress.py +73 -24
- nuitka/PythonFlavors.py +141 -32
- nuitka/PythonOperators.py +18 -17
- nuitka/PythonVersions.py +107 -19
- nuitka/Serialization.py +70 -55
- nuitka/SourceCodeReferences.py +19 -17
- nuitka/Tracing.py +176 -70
- nuitka/TreeXML.py +31 -26
- nuitka/Variables.py +39 -41
- nuitka/Version.py +22 -8
- nuitka/__init__.py +5 -4
- nuitka/__main__.py +95 -29
- nuitka/__past__.py +44 -34
- nuitka/build/Backend.scons +243 -141
- nuitka/build/CCompilerVersion.scons +45 -31
- nuitka/build/DataComposerInterface.py +20 -17
- nuitka/build/Onefile.scons +56 -54
- nuitka/build/SconsCaching.py +105 -92
- nuitka/build/SconsCompilerSettings.py +167 -68
- nuitka/build/SconsHacks.py +25 -19
- nuitka/build/SconsInterface.py +155 -54
- nuitka/build/SconsProgress.py +19 -18
- nuitka/build/SconsSpawn.py +62 -33
- nuitka/build/SconsUtils.py +152 -55
- nuitka/build/__init__.py +5 -4
- nuitka/build/include/nuitka/allocator.h +228 -22
- nuitka/build/include/nuitka/builtins.h +17 -17
- nuitka/build/include/nuitka/calling.h +24 -24
- nuitka/build/include/nuitka/checkers.h +17 -18
- nuitka/build/include/nuitka/checksum_tools.h +14 -19
- nuitka/build/include/nuitka/compiled_asyncgen.h +28 -25
- nuitka/build/include/nuitka/compiled_cell.h +33 -18
- nuitka/build/include/nuitka/compiled_coroutine.h +18 -18
- nuitka/build/include/nuitka/compiled_frame.h +93 -54
- nuitka/build/include/nuitka/compiled_function.h +42 -20
- nuitka/build/include/nuitka/compiled_generator.h +24 -18
- nuitka/build/include/nuitka/compiled_method.h +17 -18
- nuitka/build/include/nuitka/constants.h +35 -18
- nuitka/build/include/nuitka/constants_blob.h +17 -17
- 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 +45 -0
- nuitka/build/include/nuitka/exception_groups.h +23 -26
- nuitka/build/include/nuitka/exceptions.h +717 -171
- nuitka/build/include/nuitka/filesystem_paths.h +26 -20
- nuitka/build/include/nuitka/freelists.h +38 -18
- nuitka/build/include/nuitka/helper/attributes.h +24 -22
- nuitka/build/include/nuitka/helper/boolean.h +17 -17
- nuitka/build/include/nuitka/helper/bytearrays.h +17 -17
- nuitka/build/include/nuitka/helper/bytes.h +14 -15
- nuitka/build/include/nuitka/helper/calling_generated.h +69 -69
- 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 +17 -17
- nuitka/build/include/nuitka/helper/comparisons_ge.h +17 -17
- nuitka/build/include/nuitka/helper/comparisons_gt.h +17 -17
- nuitka/build/include/nuitka/helper/comparisons_le.h +17 -17
- nuitka/build/include/nuitka/helper/comparisons_lt.h +17 -17
- nuitka/build/include/nuitka/helper/comparisons_ne.h +17 -17
- nuitka/build/include/nuitka/helper/complex.h +17 -17
- nuitka/build/include/nuitka/helper/dictionaries.h +89 -51
- nuitka/build/include/nuitka/helper/floats.h +17 -18
- nuitka/build/include/nuitka/helper/import_hard.h +25 -17
- nuitka/build/include/nuitka/helper/indexes.h +17 -18
- nuitka/build/include/nuitka/helper/ints.h +115 -54
- nuitka/build/include/nuitka/helper/iterators.h +99 -51
- nuitka/build/include/nuitka/helper/lists.h +26 -24
- nuitka/build/include/nuitka/helper/lists_generated.h +22 -22
- nuitka/build/include/nuitka/helper/mappings.h +17 -18
- nuitka/build/include/nuitka/helper/operations.h +20 -17
- nuitka/build/include/nuitka/helper/operations_binary_add.h +23 -17
- nuitka/build/include/nuitka/helper/operations_binary_bitand.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_bitor.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_divmod.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_dual_add.h +34 -0
- nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_lshift.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_matmult.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_mod.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_mult.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_pow.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_rshift.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_sub.h +23 -17
- nuitka/build/include/nuitka/helper/operations_binary_truediv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_builtin_types.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_add.h +20 -17
- nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_mod.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_mult.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_pow.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_sub.h +20 -17
- nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +17 -17
- nuitka/build/include/nuitka/helper/raising.h +68 -37
- nuitka/build/include/nuitka/helper/rangeobjects.h +17 -17
- nuitka/build/include/nuitka/helper/richcomparisons.h +21 -14
- nuitka/build/include/nuitka/helper/sequences.h +19 -13
- nuitka/build/include/nuitka/helper/sets.h +11 -12
- nuitka/build/include/nuitka/helper/slices.h +31 -25
- nuitka/build/include/nuitka/helper/strings.h +16 -17
- nuitka/build/include/nuitka/helper/subscripts.h +18 -201
- nuitka/build/include/nuitka/helper/tuples.h +64 -52
- nuitka/build/include/nuitka/helpers.h +50 -22
- nuitka/build/include/nuitka/importing.h +28 -21
- nuitka/build/include/nuitka/jit_sources.h +25 -0
- nuitka/build/include/nuitka/prelude.h +163 -71
- nuitka/build/include/nuitka/printing.h +29 -22
- nuitka/build/include/nuitka/python_pgo.h +19 -18
- nuitka/build/include/nuitka/safe_string_ops.h +20 -18
- nuitka/build/include/nuitka/threading.h +45 -32
- nuitka/build/include/nuitka/tracing.h +28 -18
- nuitka/build/include/nuitka/type_aliases.h +30 -0
- nuitka/build/include/nuitka/unfreezing.h +29 -23
- nuitka/build/inline_copy/bin/scons.py +14 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +6 -6
- nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +0 -3
- 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 +307 -0
- nuitka/build/inline_copy/tqdm/tqdm/__init__.py +2 -2
- nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +4 -1
- nuitka/build/inline_copy/tqdm/tqdm/utils.py +14 -8
- nuitka/build/inline_copy/tqdm/tqdm/version.py +1 -8
- 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/static_src/CompiledAsyncgenType.c +221 -221
- nuitka/build/static_src/CompiledCellType.c +69 -44
- nuitka/build/static_src/CompiledCodeHelpers.c +276 -159
- nuitka/build/static_src/CompiledCoroutineType.c +229 -226
- nuitka/build/static_src/CompiledFrameType.c +323 -138
- nuitka/build/static_src/CompiledFunctionType.c +547 -231
- nuitka/build/static_src/CompiledGeneratorType.c +416 -290
- nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +593 -228
- nuitka/build/static_src/CompiledMethodType.c +91 -82
- nuitka/build/static_src/HelpersAllocator.c +352 -45
- nuitka/build/static_src/HelpersAttributes.c +30 -72
- nuitka/build/static_src/HelpersBuiltin.c +65 -46
- nuitka/build/static_src/HelpersBuiltinTypeMethods.c +17 -17
- nuitka/build/static_src/HelpersBytes.c +19 -20
- nuitka/build/static_src/HelpersCalling.c +40 -37
- nuitka/build/static_src/HelpersCallingGenerated.c +1061 -242
- nuitka/build/static_src/HelpersChecksumTools.c +35 -21
- nuitka/build/static_src/HelpersClasses.c +17 -17
- 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 +536 -496
- nuitka/build/static_src/HelpersComparisonEqUtils.c +22 -19
- nuitka/build/static_src/HelpersComparisonGe.c +531 -501
- nuitka/build/static_src/HelpersComparisonGt.c +530 -500
- nuitka/build/static_src/HelpersComparisonLe.c +531 -501
- nuitka/build/static_src/HelpersComparisonLt.c +530 -500
- nuitka/build/static_src/HelpersComparisonNe.c +538 -496
- nuitka/build/static_src/HelpersConsole.c +122 -0
- nuitka/build/static_src/HelpersConstantsBlob.c +550 -521
- nuitka/build/static_src/HelpersDeepcopy.c +33 -33
- nuitka/build/static_src/HelpersDictionaries.c +232 -63
- nuitka/build/static_src/HelpersDictionariesGenerated.c +130 -127
- nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
- nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
- nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +93 -0
- nuitka/build/static_src/HelpersExceptions.c +147 -62
- nuitka/build/static_src/HelpersFiles.c +116 -22
- nuitka/build/static_src/HelpersFilesystemPaths.c +292 -181
- nuitka/build/static_src/HelpersFloats.c +37 -31
- nuitka/build/static_src/HelpersHeapStorage.c +21 -17
- nuitka/build/static_src/HelpersImport.c +61 -29
- nuitka/build/static_src/HelpersImportHard.c +74 -61
- nuitka/build/static_src/HelpersJitSources.c +46 -0
- nuitka/build/static_src/HelpersLists.c +237 -58
- nuitka/build/static_src/HelpersListsGenerated.c +41 -41
- nuitka/build/static_src/HelpersMappings.c +17 -17
- nuitka/build/static_src/HelpersMatching.c +137 -51
- nuitka/build/static_src/HelpersOperationBinaryAdd.c +397 -152
- nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +102 -52
- nuitka/build/static_src/HelpersOperationBinaryBitand.c +55 -55
- nuitka/build/static_src/HelpersOperationBinaryBitor.c +55 -55
- nuitka/build/static_src/HelpersOperationBinaryBitxor.c +55 -55
- nuitka/build/static_src/HelpersOperationBinaryDivmod.c +49 -43
- nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +17 -17
- nuitka/build/static_src/HelpersOperationBinaryDualAdd.c +172 -0
- nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +55 -49
- nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +20 -21
- nuitka/build/static_src/HelpersOperationBinaryLshift.c +83 -83
- nuitka/build/static_src/HelpersOperationBinaryMatmult.c +25 -24
- nuitka/build/static_src/HelpersOperationBinaryMod.c +129 -117
- nuitka/build/static_src/HelpersOperationBinaryMult.c +98 -82
- nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +33 -30
- nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +55 -49
- nuitka/build/static_src/HelpersOperationBinaryPow.c +68 -68
- nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +12 -12
- nuitka/build/static_src/HelpersOperationBinaryRshift.c +51 -51
- nuitka/build/static_src/HelpersOperationBinarySub.c +309 -88
- nuitka/build/static_src/HelpersOperationBinaryTruediv.c +49 -43
- nuitka/build/static_src/HelpersOperationInplaceAdd.c +333 -163
- nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +24 -22
- nuitka/build/static_src/HelpersOperationInplaceBitand.c +58 -58
- nuitka/build/static_src/HelpersOperationInplaceBitor.c +58 -58
- nuitka/build/static_src/HelpersOperationInplaceBitxor.c +58 -58
- nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +73 -68
- nuitka/build/static_src/HelpersOperationInplaceLshift.c +64 -64
- nuitka/build/static_src/HelpersOperationInplaceMatmult.c +38 -37
- nuitka/build/static_src/HelpersOperationInplaceMod.c +145 -140
- nuitka/build/static_src/HelpersOperationInplaceMult.c +89 -84
- nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +73 -68
- nuitka/build/static_src/HelpersOperationInplacePow.c +82 -82
- nuitka/build/static_src/HelpersOperationInplaceRshift.c +48 -48
- nuitka/build/static_src/HelpersOperationInplaceSub.c +275 -122
- nuitka/build/static_src/HelpersOperationInplaceTruediv.c +68 -63
- nuitka/build/static_src/HelpersProfiling.c +25 -24
- nuitka/build/static_src/HelpersPythonPgo.c +22 -22
- nuitka/build/static_src/HelpersRaising.c +296 -283
- nuitka/build/static_src/HelpersSafeStrings.c +34 -22
- nuitka/build/static_src/HelpersSequences.c +18 -19
- nuitka/build/static_src/HelpersSlices.c +29 -23
- nuitka/build/static_src/HelpersStrings.c +235 -38
- nuitka/build/static_src/HelpersTuples.c +46 -34
- nuitka/build/static_src/HelpersTypes.c +166 -25
- nuitka/build/static_src/InspectPatcher.c +108 -27
- nuitka/build/static_src/MainProgram.c +464 -280
- nuitka/build/static_src/MetaPathBasedLoader.c +381 -257
- nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +39 -26
- nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +17 -18
- nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +227 -29
- nuitka/build/static_src/OnefileBootstrap.c +281 -164
- nuitka/build/static_src/OnefileSplashScreen.cpp +51 -27
- nuitka/code_generation/AsyncgenCodes.py +21 -23
- nuitka/code_generation/AttributeCodes.py +31 -27
- nuitka/code_generation/BinaryOperationHelperDefinitions.py +290 -184
- nuitka/code_generation/BranchCodes.py +19 -17
- nuitka/code_generation/BuiltinCodes.py +29 -18
- nuitka/code_generation/CallCodes.py +35 -33
- nuitka/code_generation/ClassCodes.py +19 -17
- nuitka/code_generation/CodeGeneration.py +61 -28
- nuitka/code_generation/CodeHelperSelection.py +20 -18
- nuitka/code_generation/CodeHelpers.py +28 -21
- nuitka/code_generation/CodeObjectCodes.py +36 -26
- nuitka/code_generation/ComparisonCodes.py +51 -22
- nuitka/code_generation/ComparisonHelperDefinitions.py +42 -25
- nuitka/code_generation/ConditionalCodes.py +19 -17
- nuitka/code_generation/ConstantCodes.py +82 -28
- nuitka/code_generation/Contexts.py +180 -42
- nuitka/code_generation/CoroutineCodes.py +21 -23
- nuitka/code_generation/CtypesCodes.py +19 -17
- nuitka/code_generation/DictCodes.py +28 -26
- nuitka/code_generation/Emission.py +21 -18
- nuitka/code_generation/ErrorCodes.py +57 -79
- nuitka/code_generation/EvalCodes.py +24 -20
- nuitka/code_generation/ExceptionCodes.py +182 -104
- nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +45 -27
- nuitka/code_generation/ExpressionCodes.py +19 -17
- nuitka/code_generation/FrameCodes.py +28 -31
- nuitka/code_generation/FunctionCodes.py +26 -27
- nuitka/code_generation/GeneratorCodes.py +25 -26
- nuitka/code_generation/GlobalConstants.py +51 -25
- nuitka/code_generation/GlobalsLocalsCodes.py +23 -21
- nuitka/code_generation/IdCodes.py +19 -17
- nuitka/code_generation/ImportCodes.py +90 -50
- nuitka/code_generation/Indentation.py +23 -22
- nuitka/code_generation/IndexCodes.py +19 -17
- nuitka/code_generation/InjectCCodes.py +14 -12
- nuitka/code_generation/IntegerCodes.py +19 -17
- nuitka/code_generation/IteratorCodes.py +86 -71
- nuitka/code_generation/JitCodes.py +44 -0
- nuitka/code_generation/LabelCodes.py +19 -17
- nuitka/code_generation/LineNumberCodes.py +20 -20
- nuitka/code_generation/ListCodes.py +32 -36
- nuitka/code_generation/LoaderCodes.py +22 -17
- nuitka/code_generation/LocalsDictCodes.py +56 -32
- nuitka/code_generation/LoopCodes.py +19 -17
- nuitka/code_generation/MatchCodes.py +42 -22
- nuitka/code_generation/ModuleCodes.py +71 -29
- nuitka/code_generation/Namify.py +27 -23
- nuitka/code_generation/NetworkxCodes.py +51 -0
- nuitka/code_generation/OperationCodes.py +80 -51
- nuitka/code_generation/PackageResourceCodes.py +96 -23
- nuitka/code_generation/PrintCodes.py +19 -17
- nuitka/code_generation/PythonAPICodes.py +19 -17
- nuitka/code_generation/RaisingCodes.py +183 -107
- nuitka/code_generation/Reports.py +32 -22
- nuitka/code_generation/ReturnCodes.py +20 -32
- nuitka/code_generation/SetCodes.py +19 -17
- nuitka/code_generation/SliceCodes.py +22 -20
- nuitka/code_generation/StringCodes.py +19 -17
- nuitka/code_generation/SubscriptCodes.py +24 -30
- nuitka/code_generation/TensorflowCodes.py +54 -0
- nuitka/code_generation/TryCodes.py +31 -41
- nuitka/code_generation/TupleCodes.py +20 -18
- nuitka/code_generation/TypeAliasCodes.py +119 -0
- nuitka/code_generation/VariableCodes.py +118 -55
- nuitka/code_generation/VariableDeclarations.py +28 -25
- nuitka/code_generation/YieldCodes.py +23 -21
- nuitka/code_generation/__init__.py +5 -4
- nuitka/code_generation/c_types/CTypeBases.py +29 -19
- nuitka/code_generation/c_types/CTypeBooleans.py +19 -17
- nuitka/code_generation/c_types/CTypeCFloats.py +19 -17
- nuitka/code_generation/c_types/CTypeCLongs.py +19 -18
- nuitka/code_generation/c_types/CTypeModuleDictVariables.py +22 -17
- nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +22 -21
- nuitka/code_generation/c_types/CTypeNuitkaInts.py +89 -43
- nuitka/code_generation/c_types/CTypeNuitkaVoids.py +20 -18
- nuitka/code_generation/c_types/CTypePyObjectPointers.py +43 -31
- nuitka/code_generation/c_types/CTypeVoids.py +20 -17
- nuitka/code_generation/c_types/__init__.py +5 -4
- nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +20 -19
- nuitka/code_generation/templates/CodeTemplatesConstants.py +143 -39
- nuitka/code_generation/templates/CodeTemplatesCoroutines.py +20 -19
- nuitka/code_generation/templates/CodeTemplatesExceptions.py +33 -33
- nuitka/code_generation/templates/CodeTemplatesFrames.py +36 -27
- nuitka/code_generation/templates/CodeTemplatesFunction.py +20 -19
- nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +21 -19
- nuitka/code_generation/templates/CodeTemplatesIterators.py +19 -53
- nuitka/code_generation/templates/CodeTemplatesLoader.py +25 -19
- nuitka/code_generation/templates/CodeTemplatesModules.py +278 -169
- nuitka/code_generation/templates/CodeTemplatesVariables.py +115 -27
- nuitka/code_generation/templates/TemplateDebugWrapper.py +19 -18
- nuitka/code_generation/templates/__init__.py +5 -4
- nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +19 -19
- nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +21 -21
- nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +79 -28
- nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +22 -22
- nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +19 -19
- nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +19 -19
- nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +74 -106
- nuitka/code_generation/templates_c/HelperImportHard.c.j2 +19 -20
- nuitka/code_generation/templates_c/HelperLongTools.c.j2 +19 -19
- nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +6 -6
- nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +23 -23
- nuitka/code_generation/templates_c/HelperOperationBinaryDual.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +35 -35
- nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +37 -37
- nuitka/code_generation/templates_c/HelperOperationComparisonDual.c.j2 +86 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +18 -18
- nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +50 -38
- nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +27 -27
- nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +37 -37
- nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +31 -31
- nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +35 -31
- nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +20 -20
- nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +28 -28
- nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +48 -48
- nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +21 -18
- nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +27 -25
- nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +21 -18
- nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +17 -17
- nuitka/containers/Namedtuples.py +25 -18
- nuitka/containers/OrderedSets.py +105 -5
- nuitka/containers/OrderedSetsFallback.py +19 -17
- nuitka/containers/__init__.py +5 -4
- nuitka/distutils/Build.py +33 -18
- nuitka/distutils/DistutilCommands.py +84 -33
- nuitka/distutils/__init__.py +5 -4
- nuitka/finalizations/Finalization.py +21 -18
- nuitka/finalizations/FinalizeMarkups.py +31 -55
- nuitka/finalizations/__init__.py +5 -4
- nuitka/freezer/DependsExe.py +60 -30
- nuitka/freezer/DllDependenciesCommon.py +47 -20
- nuitka/freezer/DllDependenciesMacOS.py +165 -58
- nuitka/freezer/DllDependenciesPosix.py +29 -19
- nuitka/freezer/DllDependenciesWin32.py +55 -33
- nuitka/freezer/ImportDetection.py +23 -17
- nuitka/freezer/IncludedDataFiles.py +142 -48
- nuitka/freezer/IncludedEntryPoints.py +104 -39
- nuitka/freezer/Onefile.py +32 -22
- nuitka/freezer/Standalone.py +166 -53
- nuitka/freezer/__init__.py +5 -4
- nuitka/importing/IgnoreListing.py +19 -17
- nuitka/importing/ImportCache.py +24 -21
- nuitka/importing/ImportResolving.py +103 -95
- nuitka/importing/Importing.py +319 -98
- nuitka/importing/PreloadedPackages.py +21 -18
- nuitka/importing/Recursion.py +142 -47
- nuitka/importing/StandardLibrary.py +96 -80
- nuitka/importing/__init__.py +5 -4
- nuitka/nodes/AsyncgenNodes.py +22 -23
- nuitka/nodes/AttributeLookupNodes.py +19 -17
- nuitka/nodes/AttributeNodes.py +19 -17
- nuitka/nodes/AttributeNodesGenerated.py +49 -24
- nuitka/nodes/BuiltinAllNodes.py +19 -17
- nuitka/nodes/BuiltinAnyNodes.py +19 -17
- nuitka/nodes/BuiltinComplexNodes.py +20 -17
- nuitka/nodes/BuiltinDecodingNodes.py +19 -17
- nuitka/nodes/BuiltinDecoratorNodes.py +19 -17
- nuitka/nodes/BuiltinDictNodes.py +19 -17
- nuitka/nodes/BuiltinFormatNodes.py +20 -17
- nuitka/nodes/BuiltinHashNodes.py +19 -17
- nuitka/nodes/BuiltinInputNodes.py +19 -17
- nuitka/nodes/BuiltinIntegerNodes.py +19 -17
- nuitka/nodes/BuiltinIteratorNodes.py +25 -21
- nuitka/nodes/BuiltinLenNodes.py +19 -17
- nuitka/nodes/BuiltinNextNodes.py +19 -17
- nuitka/nodes/BuiltinOpenNodes.py +52 -18
- nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +40 -23
- nuitka/nodes/BuiltinRangeNodes.py +21 -19
- nuitka/nodes/BuiltinRefNodes.py +73 -40
- nuitka/nodes/BuiltinSumNodes.py +20 -18
- nuitka/nodes/BuiltinTypeNodes.py +19 -17
- nuitka/nodes/BuiltinVarsNodes.py +19 -18
- nuitka/nodes/BytesNodes.py +19 -17
- nuitka/nodes/CallNodes.py +19 -17
- nuitka/nodes/Checkers.py +19 -17
- nuitka/nodes/ChildrenHavingMixins.py +1624 -283
- nuitka/nodes/ClassNodes.py +49 -29
- nuitka/nodes/CodeObjectSpecs.py +29 -18
- nuitka/nodes/ComparisonNodes.py +19 -17
- nuitka/nodes/ConditionalNodes.py +24 -25
- nuitka/nodes/ConstantRefNodes.py +57 -17
- nuitka/nodes/ContainerMakingNodes.py +19 -17
- nuitka/nodes/ContainerOperationNodes.py +19 -17
- nuitka/nodes/CoroutineNodes.py +22 -23
- nuitka/nodes/CtypesNodes.py +19 -18
- nuitka/nodes/DictionaryNodes.py +19 -18
- nuitka/nodes/ExceptionNodes.py +131 -43
- nuitka/nodes/ExecEvalNodes.py +19 -17
- nuitka/nodes/ExpressionBases.py +34 -26
- nuitka/nodes/ExpressionBasesGenerated.py +341 -35
- nuitka/nodes/ExpressionShapeMixins.py +19 -17
- nuitka/nodes/FrameNodes.py +41 -28
- nuitka/nodes/FunctionAttributeNodes.py +19 -17
- nuitka/nodes/FunctionNodes.py +84 -38
- nuitka/nodes/FutureSpecs.py +35 -20
- nuitka/nodes/GeneratorNodes.py +24 -25
- nuitka/nodes/GlobalsLocalsNodes.py +22 -17
- nuitka/nodes/HardImportNodesGenerated.py +746 -148
- nuitka/nodes/ImportHardNodes.py +46 -38
- nuitka/nodes/ImportNodes.py +438 -448
- nuitka/nodes/IndicatorMixins.py +19 -17
- nuitka/nodes/InjectCNodes.py +19 -18
- nuitka/nodes/IterationHandles.py +55 -34
- nuitka/nodes/KeyValuePairNodes.py +19 -17
- nuitka/nodes/ListOperationNodes.py +33 -21
- nuitka/nodes/LocalsDictNodes.py +19 -17
- nuitka/nodes/LocalsScopes.py +41 -41
- nuitka/nodes/LoopNodes.py +28 -17
- nuitka/nodes/MatchNodes.py +37 -24
- nuitka/nodes/ModuleAttributeNodes.py +18 -35
- nuitka/nodes/ModuleNodes.py +90 -31
- nuitka/nodes/NetworkxNodes.py +45 -0
- nuitka/nodes/NodeBases.py +73 -44
- nuitka/nodes/NodeMakingHelpers.py +92 -69
- nuitka/nodes/NodeMetaClasses.py +45 -28
- nuitka/nodes/OperatorNodes.py +28 -26
- nuitka/nodes/OperatorNodesUnary.py +148 -20
- nuitka/nodes/OsSysNodes.py +97 -18
- nuitka/nodes/OutlineNodes.py +24 -22
- nuitka/nodes/PackageMetadataNodes.py +37 -27
- nuitka/nodes/PackageResourceNodes.py +29 -23
- nuitka/nodes/PrintNodes.py +19 -17
- nuitka/nodes/ReturnNodes.py +20 -18
- nuitka/nodes/SideEffectNodes.py +19 -17
- nuitka/nodes/SliceNodes.py +20 -18
- nuitka/nodes/StatementBasesGenerated.py +125 -79
- nuitka/nodes/StatementNodes.py +27 -24
- nuitka/nodes/StrNodes.py +19 -17
- nuitka/nodes/StringConcatenationNodes.py +20 -17
- nuitka/nodes/SubscriptNodes.py +27 -25
- nuitka/nodes/TensorflowNodes.py +38 -0
- nuitka/nodes/TryNodes.py +19 -17
- nuitka/nodes/TypeMatchNodes.py +19 -17
- nuitka/nodes/TypeNodes.py +68 -18
- nuitka/nodes/VariableAssignNodes.py +122 -64
- nuitka/nodes/VariableDelNodes.py +19 -17
- nuitka/nodes/VariableNameNodes.py +19 -17
- nuitka/nodes/VariableRefNodes.py +63 -26
- nuitka/nodes/VariableReleaseNodes.py +19 -17
- nuitka/nodes/YieldNodes.py +21 -19
- nuitka/nodes/__init__.py +5 -4
- nuitka/nodes/shapes/BuiltinTypeShapes.py +169 -46
- nuitka/nodes/shapes/ControlFlowDescriptions.py +19 -17
- nuitka/nodes/shapes/ShapeMixins.py +57 -17
- nuitka/nodes/shapes/StandardShapes.py +80 -21
- nuitka/nodes/shapes/__init__.py +5 -4
- nuitka/optimizations/BytecodeDemotion.py +21 -18
- nuitka/optimizations/FunctionInlining.py +22 -23
- nuitka/optimizations/Graphs.py +19 -17
- nuitka/optimizations/Optimization.py +39 -35
- nuitka/optimizations/OptimizeBuiltinCalls.py +31 -27
- nuitka/optimizations/Tags.py +19 -18
- nuitka/optimizations/TraceCollections.py +67 -24
- nuitka/optimizations/ValueTraces.py +92 -25
- nuitka/optimizations/__init__.py +5 -4
- nuitka/pgo/PGO.py +33 -23
- nuitka/pgo/__init__.py +5 -4
- nuitka/plugins/PluginBase.py +655 -112
- nuitka/plugins/Plugins.py +247 -61
- nuitka/plugins/YamlPluginBase.py +121 -0
- nuitka/plugins/__init__.py +5 -4
- nuitka/plugins/standard/AntiBloatPlugin.py +374 -135
- nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +20 -19
- nuitka/plugins/standard/DataFilesPlugin.py +65 -29
- nuitka/plugins/standard/DelvewheelPlugin.py +32 -24
- nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
- nuitka/plugins/standard/DillPlugin/dill-postLoad.py +256 -0
- nuitka/plugins/standard/DillPlugin.py +42 -134
- nuitka/plugins/standard/DllFilesPlugin.py +125 -42
- nuitka/plugins/standard/EnumPlugin.py +19 -17
- nuitka/plugins/standard/EventletPlugin.py +19 -17
- nuitka/plugins/standard/GeventPlugin.py +19 -17
- nuitka/plugins/standard/GiPlugin.py +44 -28
- nuitka/plugins/standard/GlfwPlugin.py +20 -17
- nuitka/plugins/standard/ImplicitImports.py +403 -54
- nuitka/plugins/standard/KivyPlugin.py +24 -20
- nuitka/plugins/standard/MatplotlibPlugin.py +99 -42
- nuitka/plugins/standard/MultiprocessingPlugin.py +35 -39
- nuitka/plugins/standard/NumpyPlugin.py +19 -17
- nuitka/plugins/standard/OptionsNannyPlugin.py +48 -76
- nuitka/plugins/standard/PbrPlugin.py +21 -19
- nuitka/plugins/standard/PkgResourcesPlugin.py +34 -23
- nuitka/plugins/standard/PlaywrightPlugin.py +184 -0
- nuitka/plugins/standard/PmwPlugin.py +30 -27
- nuitka/plugins/standard/PySidePyQtPlugin.py +82 -80
- nuitka/plugins/standard/PywebViewPlugin.py +19 -17
- nuitka/plugins/standard/SpacyPlugin.py +136 -0
- nuitka/plugins/standard/TensorflowPlugin.py +20 -17
- nuitka/plugins/standard/TkinterPlugin.py +102 -108
- nuitka/plugins/standard/TorchPlugin.py +20 -17
- nuitka/plugins/standard/TransformersPlugin.py +90 -231
- nuitka/plugins/standard/TrioPlugin.py +18 -15
- nuitka/plugins/standard/UpxPlugin.py +21 -19
- nuitka/plugins/standard/__init__.py +5 -4
- nuitka/plugins/standard/standard.nuitka-package.config.yml +3925 -1293
- nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +14 -14
- nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +154 -66
- nuitka/reports/CompilationReportReader.py +79 -0
- nuitka/reports/LicenseReport.rst.j2 +21 -21
- nuitka/reports/Reports.py +363 -76
- nuitka/reports/__init__.py +5 -4
- nuitka/specs/BuiltinBytesOperationSpecs.py +18 -17
- nuitka/specs/BuiltinDictOperationSpecs.py +18 -17
- nuitka/specs/BuiltinListOperationSpecs.py +18 -17
- nuitka/specs/BuiltinParameterSpecs.py +35 -21
- nuitka/specs/BuiltinStrOperationSpecs.py +19 -18
- nuitka/specs/BuiltinTypeOperationSpecs.py +18 -18
- nuitka/specs/BuiltinUnicodeOperationSpecs.py +18 -17
- nuitka/specs/HardImportSpecs.py +74 -22
- nuitka/specs/ParameterSpecs.py +60 -45
- nuitka/specs/__init__.py +5 -4
- nuitka/tools/Basics.py +20 -18
- nuitka/tools/__init__.py +5 -4
- nuitka/tools/commercial/__init__.py +7 -6
- nuitka/tools/data_composer/DataComposer.py +78 -62
- nuitka/tools/data_composer/__init__.py +5 -4
- nuitka/tools/data_composer/__main__.py +18 -17
- nuitka/tools/environments/CreateEnvironment.py +20 -17
- nuitka/tools/environments/Virtualenv.py +60 -32
- nuitka/tools/environments/__init__.py +5 -4
- nuitka/tools/general/__init__.py +5 -4
- nuitka/tools/general/dll_report/__init__.py +5 -4
- nuitka/tools/general/dll_report/__main__.py +29 -22
- nuitka/tools/general/find_module/FindModuleCode.py +35 -22
- nuitka/tools/general/find_module/__init__.py +5 -4
- nuitka/tools/onefile_compressor/OnefileCompressor.py +213 -131
- nuitka/tools/onefile_compressor/__init__.py +5 -4
- nuitka/tools/onefile_compressor/__main__.py +18 -17
- nuitka/tools/podman/Podman.py +19 -17
- nuitka/tools/podman/__init__.py +5 -4
- nuitka/tools/podman/__main__.py +35 -19
- nuitka/tools/profiler/__init__.py +5 -4
- nuitka/tools/profiler/__main__.py +18 -17
- nuitka/tools/scanning/DisplayPackageDLLs.py +47 -22
- nuitka/tools/scanning/DisplayPackageData.py +31 -19
- nuitka/tools/scanning/__init__.py +5 -4
- nuitka/tools/specialize/CTypeDescriptions.py +251 -80
- nuitka/tools/specialize/Common.py +18 -17
- nuitka/tools/specialize/SpecializeC.py +248 -82
- nuitka/tools/specialize/SpecializePython.py +108 -45
- nuitka/tools/specialize/__init__.py +5 -4
- nuitka/tools/testing/Common.py +175 -114
- nuitka/tools/testing/Constructs.py +19 -17
- nuitka/tools/testing/OutputComparison.py +54 -18
- nuitka/tools/testing/Pythons.py +19 -18
- nuitka/tools/testing/RuntimeTracing.py +20 -19
- nuitka/tools/testing/SearchModes.py +26 -20
- nuitka/tools/testing/Valgrind.py +19 -17
- nuitka/tools/testing/__init__.py +5 -4
- nuitka/tools/testing/check_reference_counts/__init__.py +5 -4
- nuitka/tools/testing/check_reference_counts/__main__.py +18 -18
- nuitka/tools/testing/compare_with_cpython/__init__.py +5 -4
- nuitka/tools/testing/compare_with_cpython/__main__.py +39 -30
- nuitka/tools/testing/find_sxs_modules/__init__.py +5 -4
- nuitka/tools/testing/find_sxs_modules/__main__.py +17 -17
- nuitka/tools/testing/measure_construct_performance/__init__.py +5 -4
- nuitka/tools/testing/measure_construct_performance/__main__.py +23 -33
- nuitka/tools/testing/run_nuitka_tests/__init__.py +5 -4
- nuitka/tools/testing/run_nuitka_tests/__main__.py +134 -51
- nuitka/tools/watch/AutoStage.py +145 -0
- nuitka/tools/watch/GitHub.py +113 -0
- nuitka/tools/watch/__init__.py +5 -4
- nuitka/tools/watch/__main__.py +322 -91
- nuitka/tree/Building.py +184 -182
- nuitka/tree/ComplexCallHelperFunctions.py +84 -58
- nuitka/tree/Extractions.py +19 -17
- nuitka/tree/InternalModule.py +29 -20
- nuitka/tree/Operations.py +19 -17
- nuitka/tree/ReformulationAssertStatements.py +51 -31
- nuitka/tree/ReformulationAssignmentStatements.py +96 -91
- nuitka/tree/ReformulationBooleanExpressions.py +19 -17
- nuitka/tree/ReformulationCallExpressions.py +20 -18
- nuitka/tree/ReformulationClasses.py +45 -39
- nuitka/tree/ReformulationClasses3.py +239 -116
- nuitka/tree/ReformulationComparisonExpressions.py +29 -35
- nuitka/tree/ReformulationContractionExpressions.py +58 -55
- nuitka/tree/ReformulationDictionaryCreation.py +41 -35
- nuitka/tree/ReformulationExecStatements.py +42 -39
- nuitka/tree/ReformulationForLoopStatements.py +30 -34
- nuitka/tree/ReformulationFunctionStatements.py +59 -55
- nuitka/tree/ReformulationImportStatements.py +34 -29
- nuitka/tree/ReformulationLambdaExpressions.py +23 -24
- nuitka/tree/ReformulationMatchStatements.py +246 -92
- nuitka/tree/ReformulationMultidist.py +22 -18
- nuitka/tree/ReformulationNamespacePackages.py +55 -46
- nuitka/tree/ReformulationPrintStatements.py +23 -24
- nuitka/tree/ReformulationSequenceCreation.py +50 -49
- nuitka/tree/ReformulationSubscriptExpressions.py +19 -17
- nuitka/tree/ReformulationTryExceptStatements.py +19 -17
- nuitka/tree/ReformulationTryFinallyStatements.py +34 -17
- nuitka/tree/ReformulationWhileLoopStatements.py +19 -17
- nuitka/tree/ReformulationWithStatements.py +39 -41
- nuitka/tree/ReformulationYieldExpressions.py +44 -24
- nuitka/tree/SourceHandling.py +76 -31
- nuitka/tree/SyntaxErrors.py +19 -17
- nuitka/tree/TreeHelpers.py +33 -20
- nuitka/tree/VariableClosure.py +35 -39
- nuitka/tree/__init__.py +5 -4
- nuitka/utils/AppDirs.py +41 -20
- nuitka/utils/CStrings.py +66 -21
- nuitka/utils/CommandLineOptions.py +111 -22
- nuitka/utils/Distributions.py +445 -54
- nuitka/utils/Download.py +89 -57
- nuitka/utils/Execution.py +102 -58
- nuitka/utils/FileOperations.py +357 -128
- nuitka/utils/Hashing.py +55 -33
- nuitka/utils/Images.py +26 -19
- nuitka/utils/Importing.py +119 -37
- nuitka/utils/InlineCopies.py +52 -0
- nuitka/utils/InstalledPythons.py +85 -75
- nuitka/utils/InstanceCounters.py +20 -17
- nuitka/utils/Jinja2.py +30 -22
- nuitka/utils/Json.py +21 -19
- nuitka/utils/MacOSApp.py +26 -18
- nuitka/utils/MemoryUsage.py +20 -18
- nuitka/utils/ModuleNames.py +42 -26
- nuitka/utils/PackageResources.py +44 -0
- nuitka/utils/ReExecute.py +50 -28
- nuitka/utils/Rest.py +20 -17
- nuitka/utils/SharedLibraries.py +161 -75
- nuitka/utils/Shebang.py +20 -17
- nuitka/utils/Signing.py +63 -18
- nuitka/utils/SlotMetaClasses.py +57 -0
- nuitka/utils/StaticLibraries.py +83 -56
- nuitka/utils/ThreadedExecutor.py +18 -17
- nuitka/utils/Timing.py +22 -20
- nuitka/utils/Utils.py +132 -25
- nuitka/utils/WindowsFileUsage.py +22 -20
- nuitka/utils/WindowsResources.py +25 -18
- nuitka/utils/Yaml.py +62 -24
- nuitka/utils/__init__.py +5 -4
- Nuitka_winsvc-1.8.dist-info/RECORD +0 -905
- nuitka/build/inline_copy/tqdm/tqdm/_tqdm_gui.py +0 -9
- nuitka/build/inline_copy/tqdm/tqdm/gui.py +0 -191
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/LICENSE.txt +0 -0
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/entry_points.txt +0 -0
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/top_level.txt +0 -0
|
@@ -1,20 +1,5 @@
|
|
|
1
|
-
// Copyright
|
|
2
|
-
|
|
3
|
-
// Part of "Nuitka", an optimizing Python compiler that is compatible and
|
|
4
|
-
// integrates with CPython, but also works on its own.
|
|
5
|
-
//
|
|
6
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
-
// you may not use this file except in compliance with the License.
|
|
8
|
-
// You may obtain a copy of the License at
|
|
9
|
-
//
|
|
10
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
-
//
|
|
12
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
13
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
-
// See the License for the specific language governing permissions and
|
|
16
|
-
// limitations under the License.
|
|
17
|
-
//
|
|
1
|
+
// Copyright 2024, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
|
|
2
|
+
|
|
18
3
|
/** Compiled Asyncgen.
|
|
19
4
|
*
|
|
20
5
|
* Unlike in CPython, we have one type for just asyncgen, this doesn't do
|
|
@@ -78,15 +63,16 @@ static void Nuitka_MarkAsyncgenAsNotRunning(struct Nuitka_AsyncgenObject *asyncg
|
|
|
78
63
|
|
|
79
64
|
static long Nuitka_Asyncgen_tp_hash(struct Nuitka_AsyncgenObject *asyncgen) { return asyncgen->m_counter; }
|
|
80
65
|
|
|
81
|
-
static PyObject *Nuitka_Asyncgen_get_name(
|
|
82
|
-
CHECK_OBJECT(
|
|
66
|
+
static PyObject *Nuitka_Asyncgen_get_name(PyObject *self, void *data) {
|
|
67
|
+
CHECK_OBJECT(self);
|
|
83
68
|
|
|
69
|
+
struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
|
|
84
70
|
Py_INCREF(asyncgen->m_name);
|
|
85
71
|
return asyncgen->m_name;
|
|
86
72
|
}
|
|
87
73
|
|
|
88
|
-
static int Nuitka_Asyncgen_set_name(
|
|
89
|
-
CHECK_OBJECT(
|
|
74
|
+
static int Nuitka_Asyncgen_set_name(PyObject *self, PyObject *value, void *data) {
|
|
75
|
+
CHECK_OBJECT(self);
|
|
90
76
|
CHECK_OBJECT_X(value);
|
|
91
77
|
|
|
92
78
|
// Cannot be deleted, not be non-unicode value.
|
|
@@ -97,6 +83,7 @@ static int Nuitka_Asyncgen_set_name(struct Nuitka_AsyncgenObject *asyncgen, PyOb
|
|
|
97
83
|
return -1;
|
|
98
84
|
}
|
|
99
85
|
|
|
86
|
+
struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
|
|
100
87
|
PyObject *tmp = asyncgen->m_name;
|
|
101
88
|
Py_INCREF(value);
|
|
102
89
|
asyncgen->m_name = value;
|
|
@@ -105,15 +92,16 @@ static int Nuitka_Asyncgen_set_name(struct Nuitka_AsyncgenObject *asyncgen, PyOb
|
|
|
105
92
|
return 0;
|
|
106
93
|
}
|
|
107
94
|
|
|
108
|
-
static PyObject *Nuitka_Asyncgen_get_qualname(
|
|
109
|
-
CHECK_OBJECT(
|
|
95
|
+
static PyObject *Nuitka_Asyncgen_get_qualname(PyObject *self, void *data) {
|
|
96
|
+
CHECK_OBJECT(self);
|
|
110
97
|
|
|
98
|
+
struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
|
|
111
99
|
Py_INCREF(asyncgen->m_qualname);
|
|
112
100
|
return asyncgen->m_qualname;
|
|
113
101
|
}
|
|
114
102
|
|
|
115
|
-
static int Nuitka_Asyncgen_set_qualname(
|
|
116
|
-
CHECK_OBJECT(
|
|
103
|
+
static int Nuitka_Asyncgen_set_qualname(PyObject *self, PyObject *value, void *data) {
|
|
104
|
+
CHECK_OBJECT(self);
|
|
117
105
|
CHECK_OBJECT_X(value);
|
|
118
106
|
|
|
119
107
|
// Cannot be deleted, not be non-unicode value.
|
|
@@ -124,6 +112,7 @@ static int Nuitka_Asyncgen_set_qualname(struct Nuitka_AsyncgenObject *asyncgen,
|
|
|
124
112
|
return -1;
|
|
125
113
|
}
|
|
126
114
|
|
|
115
|
+
struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
|
|
127
116
|
PyObject *tmp = asyncgen->m_qualname;
|
|
128
117
|
Py_INCREF(value);
|
|
129
118
|
asyncgen->m_qualname = value;
|
|
@@ -132,19 +121,21 @@ static int Nuitka_Asyncgen_set_qualname(struct Nuitka_AsyncgenObject *asyncgen,
|
|
|
132
121
|
return 0;
|
|
133
122
|
}
|
|
134
123
|
|
|
135
|
-
static PyObject *Nuitka_Asyncgen_get_ag_await(
|
|
136
|
-
CHECK_OBJECT(
|
|
124
|
+
static PyObject *Nuitka_Asyncgen_get_ag_await(PyObject *self, void *data) {
|
|
125
|
+
CHECK_OBJECT(self);
|
|
137
126
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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;
|
|
141
131
|
} else {
|
|
142
|
-
|
|
132
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
143
133
|
return Py_None;
|
|
144
134
|
}
|
|
145
135
|
}
|
|
146
136
|
|
|
147
|
-
static PyObject *Nuitka_Asyncgen_get_code(
|
|
137
|
+
static PyObject *Nuitka_Asyncgen_get_code(PyObject *self, void *data) {
|
|
138
|
+
struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
|
|
148
139
|
CHECK_OBJECT(asyncgen);
|
|
149
140
|
CHECK_OBJECT(asyncgen->m_code_object);
|
|
150
141
|
|
|
@@ -152,8 +143,8 @@ static PyObject *Nuitka_Asyncgen_get_code(struct Nuitka_AsyncgenObject *asyncgen
|
|
|
152
143
|
return (PyObject *)asyncgen->m_code_object;
|
|
153
144
|
}
|
|
154
145
|
|
|
155
|
-
static int Nuitka_Asyncgen_set_code(
|
|
156
|
-
CHECK_OBJECT(
|
|
146
|
+
static int Nuitka_Asyncgen_set_code(PyObject *self, PyObject *value, void *data) {
|
|
147
|
+
CHECK_OBJECT(self);
|
|
157
148
|
|
|
158
149
|
PyThreadState *tstate = PyThreadState_GET();
|
|
159
150
|
|
|
@@ -161,7 +152,8 @@ static int Nuitka_Asyncgen_set_code(struct Nuitka_AsyncgenObject *asyncgen, PyOb
|
|
|
161
152
|
return -1;
|
|
162
153
|
}
|
|
163
154
|
|
|
164
|
-
static PyObject *Nuitka_Asyncgen_get_frame(
|
|
155
|
+
static PyObject *Nuitka_Asyncgen_get_frame(PyObject *self, void *data) {
|
|
156
|
+
struct Nuitka_AsyncgenObject *asyncgen = (struct Nuitka_AsyncgenObject *)self;
|
|
165
157
|
CHECK_OBJECT(asyncgen);
|
|
166
158
|
CHECK_OBJECT_X(asyncgen->m_frame);
|
|
167
159
|
|
|
@@ -169,13 +161,13 @@ static PyObject *Nuitka_Asyncgen_get_frame(struct Nuitka_AsyncgenObject *asyncge
|
|
|
169
161
|
Py_INCREF(asyncgen->m_frame);
|
|
170
162
|
return (PyObject *)asyncgen->m_frame;
|
|
171
163
|
} else {
|
|
172
|
-
|
|
164
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
173
165
|
return Py_None;
|
|
174
166
|
}
|
|
175
167
|
}
|
|
176
168
|
|
|
177
|
-
static int Nuitka_Asyncgen_set_frame(
|
|
178
|
-
CHECK_OBJECT(
|
|
169
|
+
static int Nuitka_Asyncgen_set_frame(PyObject *self, PyObject *value, void *data) {
|
|
170
|
+
CHECK_OBJECT(self);
|
|
179
171
|
CHECK_OBJECT_X(value);
|
|
180
172
|
|
|
181
173
|
PyThreadState *tstate = PyThreadState_GET();
|
|
@@ -200,23 +192,23 @@ static PyObject *Nuitka_YieldFromAsyncgenCore(PyThreadState *tstate, struct Nuit
|
|
|
200
192
|
CHECK_OBJECT(asyncgen);
|
|
201
193
|
CHECK_OBJECT_X(send_value);
|
|
202
194
|
|
|
203
|
-
PyObject *
|
|
204
|
-
CHECK_OBJECT(
|
|
195
|
+
PyObject *yield_from = asyncgen->m_yield_from;
|
|
196
|
+
CHECK_OBJECT(yield_from);
|
|
205
197
|
|
|
206
198
|
// Need to make it unaccessible while using it.
|
|
207
|
-
asyncgen->
|
|
199
|
+
asyncgen->m_yield_from = NULL;
|
|
208
200
|
|
|
209
201
|
PyObject *returned_value;
|
|
210
|
-
PyObject *yielded = _Nuitka_YieldFromCore(tstate,
|
|
202
|
+
PyObject *yielded = _Nuitka_YieldFromCore(tstate, yield_from, send_value, &returned_value, mode);
|
|
211
203
|
|
|
212
204
|
if (yielded == NULL) {
|
|
213
|
-
assert(asyncgen->
|
|
214
|
-
Py_DECREF(
|
|
205
|
+
assert(asyncgen->m_yield_from == NULL);
|
|
206
|
+
Py_DECREF(yield_from);
|
|
215
207
|
|
|
216
208
|
yielded = ((asyncgen_code)asyncgen->m_code)(tstate, asyncgen, returned_value);
|
|
217
209
|
} else {
|
|
218
|
-
assert(asyncgen->
|
|
219
|
-
asyncgen->
|
|
210
|
+
assert(asyncgen->m_yield_from == NULL);
|
|
211
|
+
asyncgen->m_yield_from = yield_from;
|
|
220
212
|
}
|
|
221
213
|
|
|
222
214
|
return yielded;
|
|
@@ -295,28 +287,24 @@ static PyObject *Nuitka_YieldFromAsyncgenInitial(PyThreadState *tstate, struct N
|
|
|
295
287
|
static PyObject *Nuitka_AsyncgenValueWrapper_New(PyObject *value);
|
|
296
288
|
|
|
297
289
|
static PySendResult _Nuitka_Asyncgen_sendR(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen,
|
|
298
|
-
PyObject *value, bool closing,
|
|
299
|
-
|
|
290
|
+
PyObject *value, bool closing,
|
|
291
|
+
struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
300
292
|
PyObject **result) {
|
|
301
293
|
CHECK_OBJECT(asyncgen);
|
|
302
294
|
assert(Nuitka_Asyncgen_Check((PyObject *)asyncgen));
|
|
303
295
|
CHECK_OBJECT_X(value);
|
|
304
|
-
|
|
305
|
-
CHECK_OBJECT_X(exception_value);
|
|
306
|
-
CHECK_OBJECT_X(exception_tb);
|
|
296
|
+
CHECK_EXCEPTION_STATE_X(exception_state);
|
|
307
297
|
|
|
308
298
|
#if _DEBUG_ASYNCGEN
|
|
309
299
|
PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
|
|
310
300
|
PRINT_COROUTINE_VALUE("value", value);
|
|
311
|
-
|
|
301
|
+
PRINT_EXCEPTION_STATE(exception_state);
|
|
312
302
|
PRINT_CURRENT_EXCEPTION();
|
|
313
303
|
PRINT_NEW_LINE();
|
|
314
304
|
#endif
|
|
315
305
|
|
|
316
306
|
if (value != NULL) {
|
|
317
|
-
|
|
318
|
-
assert(exception_value == NULL);
|
|
319
|
-
assert(exception_tb == NULL);
|
|
307
|
+
ASSERT_EMPTY_EXCEPTION_STATE(exception_state);
|
|
320
308
|
}
|
|
321
309
|
|
|
322
310
|
if (asyncgen->m_status == status_Unused && value != NULL && value != Py_None) {
|
|
@@ -357,11 +345,11 @@ static PySendResult _Nuitka_Asyncgen_sendR(PyThreadState *tstate, struct Nuitka_
|
|
|
357
345
|
asyncgen->m_running = true;
|
|
358
346
|
|
|
359
347
|
// Check for thrown exception, and publish it.
|
|
360
|
-
if (unlikely(
|
|
348
|
+
if (unlikely(HAS_EXCEPTION_STATE(exception_state))) {
|
|
361
349
|
assert(value == NULL);
|
|
362
350
|
|
|
363
351
|
// Transfer exception ownership to published.
|
|
364
|
-
|
|
352
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
365
353
|
}
|
|
366
354
|
|
|
367
355
|
if (asyncgen->m_frame) {
|
|
@@ -378,7 +366,7 @@ static PySendResult _Nuitka_Asyncgen_sendR(PyThreadState *tstate, struct Nuitka_
|
|
|
378
366
|
|
|
379
367
|
PyObject *yielded;
|
|
380
368
|
|
|
381
|
-
if (asyncgen->
|
|
369
|
+
if (asyncgen->m_yield_from == NULL) {
|
|
382
370
|
yielded = ((asyncgen_code)asyncgen->m_code)(tstate, asyncgen, value);
|
|
383
371
|
} else {
|
|
384
372
|
// This does not release the value if any, so we need to do it afterwards.
|
|
@@ -386,16 +374,14 @@ static PySendResult _Nuitka_Asyncgen_sendR(PyThreadState *tstate, struct Nuitka_
|
|
|
386
374
|
Py_XDECREF(value);
|
|
387
375
|
}
|
|
388
376
|
|
|
389
|
-
// If the asyncgen returns with
|
|
377
|
+
// If the asyncgen returns with m_yield_from set, it wants us to yield
|
|
390
378
|
// from that value from now on.
|
|
391
|
-
while (yielded == NULL && asyncgen->
|
|
379
|
+
while (yielded == NULL && asyncgen->m_yield_from != NULL) {
|
|
392
380
|
yielded = Nuitka_YieldFromAsyncgenNext(tstate, asyncgen);
|
|
393
381
|
}
|
|
394
382
|
|
|
395
383
|
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
396
384
|
|
|
397
|
-
tstate = PyThreadState_GET();
|
|
398
|
-
|
|
399
385
|
// Remove the back frame from asyncgen if it's there.
|
|
400
386
|
if (asyncgen->m_frame) {
|
|
401
387
|
// assert(tstate->frame == &asyncgen->m_frame->m_frame);
|
|
@@ -441,42 +427,21 @@ static PySendResult _Nuitka_Asyncgen_sendR(PyThreadState *tstate, struct Nuitka_
|
|
|
441
427
|
PyObject *error_occurred = GET_ERROR_OCCURRED(tstate);
|
|
442
428
|
|
|
443
429
|
if (error_occurred == PyExc_StopIteration || error_occurred == PyExc_StopAsyncIteration) {
|
|
444
|
-
|
|
445
|
-
PyTracebackObject *saved_exception_tb;
|
|
446
|
-
|
|
447
|
-
// TODO: For Python3.12, this kind of code ought to use tstate methods entirely.
|
|
448
|
-
FETCH_ERROR_OCCURRED(tstate, &saved_exception_type, &saved_exception_value, &saved_exception_tb);
|
|
449
|
-
NORMALIZE_EXCEPTION(tstate, &saved_exception_type, &saved_exception_value, &saved_exception_tb);
|
|
450
|
-
|
|
430
|
+
char const *message;
|
|
451
431
|
if (error_occurred == PyExc_StopIteration) {
|
|
452
|
-
|
|
432
|
+
message = "async generator raised StopIteration";
|
|
453
433
|
} else {
|
|
454
|
-
|
|
455
|
-
"async generator raised StopAsyncIteration");
|
|
434
|
+
message = "async generator raised StopAsyncIteration";
|
|
456
435
|
}
|
|
457
436
|
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
RAISE_EXCEPTION_WITH_CAUSE(tstate, &exception_type, &exception_value, &exception_tb,
|
|
461
|
-
saved_exception_value);
|
|
462
|
-
|
|
463
|
-
CHECK_OBJECT(exception_value);
|
|
464
|
-
CHECK_OBJECT(saved_exception_value);
|
|
465
|
-
|
|
466
|
-
Py_INCREF(saved_exception_value);
|
|
467
|
-
PyException_SetContext(exception_value, saved_exception_value);
|
|
468
|
-
|
|
469
|
-
Py_DECREF(saved_exception_type);
|
|
470
|
-
Py_XDECREF(saved_exception_tb);
|
|
471
|
-
|
|
472
|
-
RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
|
|
437
|
+
RAISE_RUNTIME_ERROR_RAISED_STOP_ITERATION(tstate, message);
|
|
473
438
|
return PYGEN_ERROR;
|
|
474
439
|
}
|
|
475
440
|
|
|
476
441
|
return PYGEN_ERROR;
|
|
477
442
|
} else {
|
|
478
443
|
// For normal yield, wrap the result value before returning.
|
|
479
|
-
if (asyncgen->
|
|
444
|
+
if (asyncgen->m_yield_from == NULL) {
|
|
480
445
|
// Transferred ownership to constructor of Nuitka_AsyncgenValueWrapper
|
|
481
446
|
PyObject *wrapped = Nuitka_AsyncgenValueWrapper_New(yielded);
|
|
482
447
|
yielded = wrapped;
|
|
@@ -491,25 +456,21 @@ static PySendResult _Nuitka_Asyncgen_sendR(PyThreadState *tstate, struct Nuitka_
|
|
|
491
456
|
Py_XDECREF(value);
|
|
492
457
|
|
|
493
458
|
// Release exception if any, we are finished with it and will raise another.
|
|
494
|
-
|
|
495
|
-
Py_XDECREF(exception_value);
|
|
496
|
-
Py_XDECREF(exception_tb);
|
|
459
|
+
RELEASE_ERROR_OCCURRED_STATE_X(exception_state);
|
|
497
460
|
|
|
498
461
|
return PYGEN_RETURN;
|
|
499
462
|
}
|
|
500
463
|
}
|
|
501
464
|
|
|
502
465
|
static PyObject *_Nuitka_Asyncgen_send(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen, PyObject *value,
|
|
503
|
-
bool closing,
|
|
504
|
-
PyTracebackObject *exception_tb) {
|
|
466
|
+
bool closing, struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
505
467
|
|
|
506
468
|
PyObject *result;
|
|
507
|
-
PySendResult res = _Nuitka_Asyncgen_sendR(tstate, asyncgen, value, closing,
|
|
508
|
-
exception_tb, &result);
|
|
469
|
+
PySendResult res = _Nuitka_Asyncgen_sendR(tstate, asyncgen, value, closing, exception_state, &result);
|
|
509
470
|
|
|
510
471
|
switch (res) {
|
|
511
472
|
case PYGEN_RETURN:
|
|
512
|
-
|
|
473
|
+
SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
|
|
513
474
|
return NULL;
|
|
514
475
|
case PYGEN_NEXT:
|
|
515
476
|
return result;
|
|
@@ -528,9 +489,10 @@ static bool _Nuitka_Asyncgen_close(PyThreadState *tstate, struct Nuitka_Asyncgen
|
|
|
528
489
|
CHECK_OBJECT(asyncgen);
|
|
529
490
|
|
|
530
491
|
if (asyncgen->m_status == status_Running) {
|
|
531
|
-
|
|
492
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
493
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, &exception_state, PyExc_GeneratorExit, NULL, NULL);
|
|
532
494
|
|
|
533
|
-
PyObject *result = _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, true,
|
|
495
|
+
PyObject *result = _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, true, &exception_state);
|
|
534
496
|
|
|
535
497
|
if (unlikely(result)) {
|
|
536
498
|
Py_DECREF(result);
|
|
@@ -545,8 +507,8 @@ static bool _Nuitka_Asyncgen_close(PyThreadState *tstate, struct Nuitka_Asyncgen
|
|
|
545
507
|
return true;
|
|
546
508
|
}
|
|
547
509
|
|
|
548
|
-
static bool
|
|
549
|
-
|
|
510
|
+
static bool _Nuitka_Generator_check_throw(PyThreadState *tstate,
|
|
511
|
+
struct Nuitka_ExceptionPreservationItem *exception_state);
|
|
550
512
|
|
|
551
513
|
// This function is called when yielding to a asyncgen through "_Nuitka_YieldFromPassExceptionTo"
|
|
552
514
|
// and potentially wrapper objects used by generators, or by the throw method itself.
|
|
@@ -555,41 +517,35 @@ static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exc
|
|
|
555
517
|
// value of exception_type will not be NULL, but the actual exception will not necessarily
|
|
556
518
|
// be normalized.
|
|
557
519
|
static PyObject *_Nuitka_Asyncgen_throw2(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen,
|
|
558
|
-
bool close_on_genexit,
|
|
559
|
-
|
|
520
|
+
bool close_on_genexit,
|
|
521
|
+
struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
560
522
|
CHECK_OBJECT(asyncgen);
|
|
561
523
|
assert(Nuitka_Asyncgen_Check((PyObject *)asyncgen));
|
|
562
|
-
|
|
563
|
-
CHECK_OBJECT_X(exception_value);
|
|
564
|
-
CHECK_OBJECT_X(exception_tb);
|
|
524
|
+
CHECK_EXCEPTION_STATE(exception_state);
|
|
565
525
|
|
|
566
526
|
#if _DEBUG_ASYNCGEN
|
|
567
527
|
PRINT_ASYNCGEN_STATUS("Enter", asyncgen);
|
|
568
|
-
PRINT_COROUTINE_VALUE("
|
|
569
|
-
|
|
528
|
+
PRINT_COROUTINE_VALUE("yield_from", asyncgen->m_yield_from);
|
|
529
|
+
PRINT_EXCEPTION_STATE(exception_state);
|
|
570
530
|
PRINT_NEW_LINE();
|
|
571
531
|
#endif
|
|
572
532
|
|
|
573
|
-
if (asyncgen->
|
|
533
|
+
if (asyncgen->m_yield_from != NULL) {
|
|
574
534
|
// TODO: This check is not done for coroutines, correct?
|
|
575
535
|
if (close_on_genexit) {
|
|
576
|
-
if (
|
|
536
|
+
if (EXCEPTION_STATE_MATCH_BOOL_SINGLE(tstate, exception_state, PyExc_GeneratorExit)) {
|
|
577
537
|
// Asynchronous generators need to close the yield_from.
|
|
578
538
|
Nuitka_MarkAsyncgenAsRunning(asyncgen);
|
|
579
|
-
bool res = Nuitka_gen_close_iter(tstate, asyncgen->
|
|
539
|
+
bool res = Nuitka_gen_close_iter(tstate, asyncgen->m_yield_from);
|
|
580
540
|
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
581
541
|
|
|
582
542
|
if (res == false) {
|
|
583
543
|
// Release exception, we are done with it now and pick up the new one.
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
Py_XDECREF(exception_tb);
|
|
587
|
-
|
|
588
|
-
FETCH_ERROR_OCCURRED(tstate, &exception_type, &exception_value, &exception_tb);
|
|
544
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
545
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
589
546
|
}
|
|
590
547
|
|
|
591
|
-
return _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, false,
|
|
592
|
-
exception_tb);
|
|
548
|
+
return _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, false, exception_state);
|
|
593
549
|
}
|
|
594
550
|
}
|
|
595
551
|
|
|
@@ -597,56 +553,55 @@ static PyObject *_Nuitka_Asyncgen_throw2(PyThreadState *tstate, struct Nuitka_As
|
|
|
597
553
|
|
|
598
554
|
#if _DEBUG_ASYNCGEN
|
|
599
555
|
PRINT_ASYNCGEN_STATUS("Passing to yielded from", asyncgen);
|
|
600
|
-
PRINT_COROUTINE_VALUE("
|
|
556
|
+
PRINT_COROUTINE_VALUE("m_yield_from", asyncgen->m_yield_from);
|
|
601
557
|
PRINT_NEW_LINE();
|
|
602
558
|
#endif
|
|
603
559
|
|
|
604
560
|
#if NUITKA_UNCOMPILED_THROW_INTEGRATION
|
|
605
|
-
if (PyGen_CheckExact(asyncgen->
|
|
606
|
-
PyGenObject *gen = (PyGenObject *)asyncgen->
|
|
561
|
+
if (PyGen_CheckExact(asyncgen->m_yield_from) || PyCoro_CheckExact(asyncgen->m_yield_from)) {
|
|
562
|
+
PyGenObject *gen = (PyGenObject *)asyncgen->m_yield_from;
|
|
607
563
|
|
|
608
564
|
// Transferred exception ownership to "Nuitka_UncompiledGenerator_throw".
|
|
609
565
|
Nuitka_MarkAsyncgenAsRunning(asyncgen);
|
|
610
|
-
ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1,
|
|
566
|
+
ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
|
|
611
567
|
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
612
568
|
} else
|
|
613
569
|
#endif
|
|
614
|
-
if (Nuitka_Generator_Check(asyncgen->
|
|
615
|
-
struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)asyncgen->
|
|
570
|
+
if (Nuitka_Generator_Check(asyncgen->m_yield_from)) {
|
|
571
|
+
struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)asyncgen->m_yield_from);
|
|
616
572
|
// Transferred exception ownership to "_Nuitka_Generator_throw2".
|
|
617
573
|
Nuitka_MarkAsyncgenAsRunning(asyncgen);
|
|
618
|
-
ret = _Nuitka_Generator_throw2(tstate, gen,
|
|
574
|
+
ret = _Nuitka_Generator_throw2(tstate, gen, exception_state);
|
|
619
575
|
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
620
|
-
} else if (Nuitka_Coroutine_Check(asyncgen->
|
|
621
|
-
struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)asyncgen->
|
|
576
|
+
} else if (Nuitka_Coroutine_Check(asyncgen->m_yield_from)) {
|
|
577
|
+
struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)asyncgen->m_yield_from);
|
|
622
578
|
// Transferred exception ownership to "_Nuitka_Coroutine_throw2".
|
|
623
579
|
Nuitka_MarkAsyncgenAsRunning(asyncgen);
|
|
624
|
-
ret = _Nuitka_Coroutine_throw2(tstate, coro, true,
|
|
580
|
+
ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
|
|
625
581
|
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
626
|
-
} else if (Nuitka_CoroutineWrapper_Check(asyncgen->
|
|
582
|
+
} else if (Nuitka_CoroutineWrapper_Check(asyncgen->m_yield_from)) {
|
|
627
583
|
struct Nuitka_CoroutineObject *coro =
|
|
628
|
-
((struct Nuitka_CoroutineWrapperObject *)asyncgen->
|
|
584
|
+
((struct Nuitka_CoroutineWrapperObject *)asyncgen->m_yield_from)->m_coroutine;
|
|
629
585
|
|
|
630
586
|
// Transferred exception ownership to "_Nuitka_Coroutine_throw2".
|
|
631
587
|
Nuitka_MarkAsyncgenAsRunning(asyncgen);
|
|
632
|
-
ret = _Nuitka_Coroutine_throw2(tstate, coro, true,
|
|
588
|
+
ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
|
|
633
589
|
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
634
|
-
} else if (Nuitka_AsyncgenAsend_Check(asyncgen->
|
|
590
|
+
} else if (Nuitka_AsyncgenAsend_Check(asyncgen->m_yield_from)) {
|
|
635
591
|
struct Nuitka_AsyncgenAsendObject *asyncgen_asend =
|
|
636
|
-
((struct Nuitka_AsyncgenAsendObject *)asyncgen->
|
|
592
|
+
((struct Nuitka_AsyncgenAsendObject *)asyncgen->m_yield_from);
|
|
637
593
|
|
|
638
594
|
// Transferred exception ownership to "_Nuitka_AsyncgenAsend_throw2".
|
|
639
595
|
Nuitka_MarkAsyncgenAsRunning(asyncgen);
|
|
640
|
-
ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend,
|
|
596
|
+
ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend, exception_state);
|
|
641
597
|
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
642
598
|
} else {
|
|
643
|
-
PyObject *meth = PyObject_GetAttr(asyncgen->
|
|
599
|
+
PyObject *meth = PyObject_GetAttr(asyncgen->m_yield_from, const_str_plain_throw);
|
|
600
|
+
|
|
644
601
|
if (unlikely(meth == NULL)) {
|
|
645
602
|
if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
|
|
646
603
|
// Release exception, we are done with it now.
|
|
647
|
-
|
|
648
|
-
Py_XDECREF(exception_value);
|
|
649
|
-
Py_XDECREF(exception_tb);
|
|
604
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
650
605
|
|
|
651
606
|
return NULL;
|
|
652
607
|
}
|
|
@@ -657,43 +612,41 @@ static PyObject *_Nuitka_Asyncgen_throw2(PyThreadState *tstate, struct Nuitka_As
|
|
|
657
612
|
goto throw_here;
|
|
658
613
|
}
|
|
659
614
|
|
|
660
|
-
|
|
615
|
+
CHECK_EXCEPTION_STATE(exception_state);
|
|
661
616
|
|
|
662
617
|
#if 0
|
|
663
618
|
// TODO: Add slow mode traces.
|
|
664
|
-
PRINT_ITEM(coroutine->
|
|
619
|
+
PRINT_ITEM(coroutine->m_yield_from);
|
|
665
620
|
PRINT_NEW_LINE();
|
|
666
621
|
#endif
|
|
667
622
|
|
|
668
623
|
Nuitka_MarkAsyncgenAsRunning(asyncgen);
|
|
669
|
-
ret =
|
|
624
|
+
ret = Nuitka_CallGeneratorThrowMethod(meth, exception_state);
|
|
670
625
|
Nuitka_MarkAsyncgenAsNotRunning(asyncgen);
|
|
671
626
|
|
|
672
627
|
Py_DECREF(meth);
|
|
673
628
|
|
|
674
629
|
// Release exception, we are done with it now.
|
|
675
|
-
|
|
676
|
-
Py_XDECREF(exception_value);
|
|
677
|
-
Py_XDECREF(exception_tb);
|
|
630
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
678
631
|
}
|
|
679
632
|
|
|
680
633
|
if (unlikely(ret == NULL)) {
|
|
681
634
|
PyObject *val;
|
|
682
635
|
|
|
683
|
-
if (
|
|
636
|
+
if (Nuitka_PyGen_FetchStopIterationValue(tstate, &val)) {
|
|
684
637
|
CHECK_OBJECT(val);
|
|
685
638
|
|
|
686
|
-
asyncgen->
|
|
639
|
+
asyncgen->m_yield_from = NULL;
|
|
687
640
|
|
|
688
641
|
// Return value, not to continue with yielding from.
|
|
689
|
-
if (asyncgen->
|
|
690
|
-
CHECK_OBJECT(asyncgen->
|
|
642
|
+
if (asyncgen->m_yield_from != NULL) {
|
|
643
|
+
CHECK_OBJECT(asyncgen->m_yield_from);
|
|
691
644
|
#if _DEBUG_ASYNCGEN
|
|
692
645
|
PRINT_ASYNCGEN_STATUS("Yield from removal:", asyncgen);
|
|
693
|
-
PRINT_COROUTINE_VALUE("
|
|
646
|
+
PRINT_COROUTINE_VALUE("yield_from", asyncgen->m_yield_from);
|
|
694
647
|
#endif
|
|
695
|
-
Py_DECREF(asyncgen->
|
|
696
|
-
asyncgen->
|
|
648
|
+
Py_DECREF(asyncgen->m_yield_from);
|
|
649
|
+
asyncgen->m_yield_from = NULL;
|
|
697
650
|
}
|
|
698
651
|
|
|
699
652
|
#if _DEBUG_ASYNCGEN
|
|
@@ -702,15 +655,22 @@ static PyObject *_Nuitka_Asyncgen_throw2(PyThreadState *tstate, struct Nuitka_As
|
|
|
702
655
|
PRINT_NEW_LINE();
|
|
703
656
|
#endif
|
|
704
657
|
|
|
705
|
-
|
|
658
|
+
struct Nuitka_ExceptionPreservationItem no_exception_state;
|
|
659
|
+
INIT_ERROR_OCCURRED_STATE(&no_exception_state);
|
|
660
|
+
|
|
661
|
+
ret = _Nuitka_Asyncgen_send(tstate, asyncgen, val, false, &no_exception_state);
|
|
706
662
|
} else {
|
|
707
663
|
#if _DEBUG_ASYNCGEN
|
|
708
664
|
PRINT_ASYNCGEN_STATUS("Sending exception value into ourselves", asyncgen);
|
|
709
|
-
PRINT_COROUTINE_VALUE("
|
|
665
|
+
PRINT_COROUTINE_VALUE("yield_from", asyncgen->m_yield_from);
|
|
710
666
|
PRINT_CURRENT_EXCEPTION();
|
|
711
667
|
PRINT_NEW_LINE();
|
|
712
668
|
#endif
|
|
713
|
-
|
|
669
|
+
|
|
670
|
+
struct Nuitka_ExceptionPreservationItem no_exception_state;
|
|
671
|
+
INIT_ERROR_OCCURRED_STATE(&no_exception_state);
|
|
672
|
+
|
|
673
|
+
ret = _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, false, &no_exception_state);
|
|
714
674
|
}
|
|
715
675
|
|
|
716
676
|
#if _DEBUG_ASYNCGEN
|
|
@@ -737,30 +697,33 @@ throw_here:
|
|
|
737
697
|
PRINT_ASYNCGEN_STATUS("Need to throw into itself", asyncgen);
|
|
738
698
|
#endif
|
|
739
699
|
|
|
740
|
-
if (unlikely(
|
|
741
|
-
// Exception was released by
|
|
700
|
+
if (unlikely(_Nuitka_Generator_check_throw(tstate, exception_state) == false)) {
|
|
701
|
+
// Exception was released by _Nuitka_Generator_check_throw already.
|
|
742
702
|
return NULL;
|
|
743
703
|
}
|
|
744
704
|
|
|
745
705
|
PyObject *result;
|
|
746
706
|
|
|
747
707
|
if (asyncgen->m_status == status_Running) {
|
|
748
|
-
result = _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, false,
|
|
708
|
+
result = _Nuitka_Asyncgen_send(tstate, asyncgen, NULL, false, exception_state);
|
|
749
709
|
} else if (asyncgen->m_status == status_Finished) {
|
|
750
|
-
|
|
710
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
751
711
|
result = NULL;
|
|
752
712
|
} else {
|
|
713
|
+
PyTracebackObject *exception_tb = GET_EXCEPTION_STATE_TRACEBACK(exception_state);
|
|
714
|
+
|
|
753
715
|
if (exception_tb == NULL) {
|
|
754
716
|
// TODO: Our compiled objects really need a way to store common
|
|
755
717
|
// stuff in a "shared" part across all instances, and outside of
|
|
756
718
|
// run time, so we could reuse this.
|
|
757
719
|
struct Nuitka_FrameObject *frame =
|
|
758
720
|
MAKE_FUNCTION_FRAME(tstate, asyncgen->m_code_object, asyncgen->m_module, 0);
|
|
759
|
-
|
|
721
|
+
SET_EXCEPTION_STATE_TRACEBACK(exception_state,
|
|
722
|
+
MAKE_TRACEBACK(frame, asyncgen->m_code_object->co_firstlineno));
|
|
760
723
|
Py_DECREF(frame);
|
|
761
724
|
}
|
|
762
725
|
|
|
763
|
-
|
|
726
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
764
727
|
|
|
765
728
|
#if _DEBUG_ASYNCGEN
|
|
766
729
|
PRINT_ASYNCGEN_STATUS("Finishing from exception", asyncgen);
|
|
@@ -774,7 +737,7 @@ throw_here:
|
|
|
774
737
|
|
|
775
738
|
#if _DEBUG_ASYNCGEN
|
|
776
739
|
PRINT_ASYNCGEN_STATUS("Leave", asyncgen);
|
|
777
|
-
PRINT_COROUTINE_VALUE("
|
|
740
|
+
PRINT_COROUTINE_VALUE("yield_from", asyncgen->m_yield_from);
|
|
778
741
|
PRINT_CURRENT_EXCEPTION();
|
|
779
742
|
PRINT_NEW_LINE();
|
|
780
743
|
#endif
|
|
@@ -804,15 +767,17 @@ static PyObject *Nuitka_Asyncgen_throw(PyThreadState *tstate, struct Nuitka_Asyn
|
|
|
804
767
|
#endif
|
|
805
768
|
|
|
806
769
|
// Handing ownership of exception over, we need not release it ourselves
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
770
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
771
|
+
if (_Nuitka_Generator_make_throw_exception_state(tstate, &exception_state, exception_type, exception_value,
|
|
772
|
+
exception_tb) == false) {
|
|
773
|
+
return NULL;
|
|
774
|
+
}
|
|
810
775
|
|
|
811
|
-
PyObject *result = _Nuitka_Asyncgen_throw2(tstate, asyncgen, false,
|
|
776
|
+
PyObject *result = _Nuitka_Asyncgen_throw2(tstate, asyncgen, false, &exception_state);
|
|
812
777
|
|
|
813
778
|
if (result == NULL) {
|
|
814
779
|
if (HAS_ERROR_OCCURRED(tstate) == false) {
|
|
815
|
-
|
|
780
|
+
SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
|
|
816
781
|
}
|
|
817
782
|
}
|
|
818
783
|
|
|
@@ -822,9 +787,7 @@ static PyObject *Nuitka_Asyncgen_throw(PyThreadState *tstate, struct Nuitka_Asyn
|
|
|
822
787
|
PRINT_CURRENT_EXCEPTION();
|
|
823
788
|
#endif
|
|
824
789
|
|
|
825
|
-
|
|
826
|
-
CHECK_OBJECT_X(exception_value);
|
|
827
|
-
CHECK_OBJECT_X(exception_tb);
|
|
790
|
+
CHECK_EXCEPTION_STATE(&exception_state);
|
|
828
791
|
|
|
829
792
|
return result;
|
|
830
793
|
}
|
|
@@ -937,7 +900,10 @@ static PySendResult _Nuitka_Asyncgen_am_send(struct Nuitka_AsyncgenObject *async
|
|
|
937
900
|
|
|
938
901
|
PyThreadState *tstate = PyThreadState_GET();
|
|
939
902
|
|
|
940
|
-
|
|
903
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
904
|
+
INIT_ERROR_OCCURRED_STATE(&exception_state);
|
|
905
|
+
|
|
906
|
+
PySendResult res = _Nuitka_Asyncgen_sendR(tstate, asyncgen, arg, false, &exception_state, result);
|
|
941
907
|
|
|
942
908
|
#if _DEBUG_ASYNCGEN
|
|
943
909
|
PRINT_ASYNCGEN_STATUS("Leave", asyncgen);
|
|
@@ -955,9 +921,8 @@ static void Nuitka_Asyncgen_tp_finalize(struct Nuitka_AsyncgenObject *asyncgen)
|
|
|
955
921
|
|
|
956
922
|
PyThreadState *tstate = PyThreadState_GET();
|
|
957
923
|
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
FETCH_ERROR_OCCURRED(tstate, &save_exception_type, &save_exception_value, &save_exception_tb);
|
|
924
|
+
struct Nuitka_ExceptionPreservationItem saved_exception_state;
|
|
925
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
961
926
|
|
|
962
927
|
bool close_result = _Nuitka_Asyncgen_close(tstate, asyncgen);
|
|
963
928
|
|
|
@@ -966,7 +931,7 @@ static void Nuitka_Asyncgen_tp_finalize(struct Nuitka_AsyncgenObject *asyncgen)
|
|
|
966
931
|
}
|
|
967
932
|
|
|
968
933
|
/* Restore the saved exception if any. */
|
|
969
|
-
|
|
934
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
970
935
|
}
|
|
971
936
|
|
|
972
937
|
#define MAX_ASYNCGEN_FREE_LIST_COUNT 100
|
|
@@ -987,13 +952,12 @@ static void Nuitka_Asyncgen_tp_dealloc(struct Nuitka_AsyncgenObject *asyncgen) {
|
|
|
987
952
|
PyThreadState *tstate = PyThreadState_GET();
|
|
988
953
|
|
|
989
954
|
// Save the current exception, if any, we must preserve it.
|
|
990
|
-
|
|
991
|
-
PyTracebackObject *save_exception_tb;
|
|
955
|
+
struct Nuitka_ExceptionPreservationItem saved_exception_state;
|
|
992
956
|
|
|
993
957
|
PyObject *finalizer = asyncgen->m_finalizer;
|
|
994
958
|
if (finalizer != NULL && asyncgen->m_closed == false) {
|
|
995
|
-
|
|
996
|
-
|
|
959
|
+
// Save the current exception, if any.
|
|
960
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
997
961
|
|
|
998
962
|
PyObject *res = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, finalizer, (PyObject *)asyncgen);
|
|
999
963
|
|
|
@@ -1003,11 +967,11 @@ static void Nuitka_Asyncgen_tp_dealloc(struct Nuitka_AsyncgenObject *asyncgen) {
|
|
|
1003
967
|
Py_DECREF(res);
|
|
1004
968
|
}
|
|
1005
969
|
|
|
1006
|
-
|
|
970
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
1007
971
|
return;
|
|
1008
972
|
}
|
|
1009
973
|
|
|
1010
|
-
|
|
974
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
1011
975
|
|
|
1012
976
|
bool close_result = _Nuitka_Asyncgen_close(tstate, asyncgen);
|
|
1013
977
|
|
|
@@ -1046,7 +1010,7 @@ static void Nuitka_Asyncgen_tp_dealloc(struct Nuitka_AsyncgenObject *asyncgen) {
|
|
|
1046
1010
|
/* Put the object into free list or release to GC */
|
|
1047
1011
|
releaseToFreeList(free_list_asyncgens, asyncgen, MAX_ASYNCGEN_FREE_LIST_COUNT);
|
|
1048
1012
|
|
|
1049
|
-
|
|
1013
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
1050
1014
|
}
|
|
1051
1015
|
|
|
1052
1016
|
static PyObject *Nuitka_Asyncgen_tp_repr(struct Nuitka_AsyncgenObject *asyncgen) {
|
|
@@ -1059,7 +1023,7 @@ static PyObject *Nuitka_Asyncgen_tp_repr(struct Nuitka_AsyncgenObject *asyncgen)
|
|
|
1059
1023
|
static int Nuitka_Asyncgen_tp_traverse(struct Nuitka_AsyncgenObject *asyncgen, visitproc visit, void *arg) {
|
|
1060
1024
|
CHECK_OBJECT(asyncgen);
|
|
1061
1025
|
|
|
1062
|
-
Py_VISIT(asyncgen->
|
|
1026
|
+
Py_VISIT(asyncgen->m_yield_from);
|
|
1063
1027
|
|
|
1064
1028
|
for (Py_ssize_t i = 0; i < asyncgen->m_closure_given; i++) {
|
|
1065
1029
|
Py_VISIT(asyncgen->m_closure[i]);
|
|
@@ -1091,12 +1055,12 @@ static PyAsyncMethods Nuitka_Asyncgen_as_async = {
|
|
|
1091
1055
|
|
|
1092
1056
|
// TODO: Set "__doc__" automatically for method clones of compiled types from
|
|
1093
1057
|
// the documentation of built-in original type.
|
|
1094
|
-
static PyGetSetDef
|
|
1095
|
-
{(char *)"__name__",
|
|
1096
|
-
{(char *)"__qualname__",
|
|
1097
|
-
{(char *)"ag_await",
|
|
1098
|
-
{(char *)"ag_code",
|
|
1099
|
-
{(char *)"ag_frame",
|
|
1058
|
+
static PyGetSetDef Nuitka_Asyncgen_tp_getset[] = {
|
|
1059
|
+
{(char *)"__name__", Nuitka_Asyncgen_get_name, Nuitka_Asyncgen_set_name, NULL},
|
|
1060
|
+
{(char *)"__qualname__", Nuitka_Asyncgen_get_qualname, Nuitka_Asyncgen_set_qualname, NULL},
|
|
1061
|
+
{(char *)"ag_await", Nuitka_Asyncgen_get_ag_await, NULL, NULL},
|
|
1062
|
+
{(char *)"ag_code", Nuitka_Asyncgen_get_code, Nuitka_Asyncgen_set_code, NULL},
|
|
1063
|
+
{(char *)"ag_frame", Nuitka_Asyncgen_get_frame, Nuitka_Asyncgen_set_frame, NULL},
|
|
1100
1064
|
|
|
1101
1065
|
{NULL}};
|
|
1102
1066
|
|
|
@@ -1136,7 +1100,7 @@ PyTypeObject Nuitka_Asyncgen_Type = {
|
|
|
1136
1100
|
0, // tp_iternext
|
|
1137
1101
|
Nuitka_Asyncgen_methods, // tp_methods
|
|
1138
1102
|
Nuitka_Asyncgen_members, // tp_members
|
|
1139
|
-
|
|
1103
|
+
Nuitka_Asyncgen_tp_getset, // tp_getset
|
|
1140
1104
|
0, // tp_base
|
|
1141
1105
|
0, // tp_dict
|
|
1142
1106
|
0, // tp_descr_get
|
|
@@ -1195,7 +1159,7 @@ PyObject *Nuitka_Asyncgen_New(asyncgen_code code, PyObject *module, PyObject *na
|
|
|
1195
1159
|
result->m_qualname = qualname;
|
|
1196
1160
|
Py_INCREF(qualname);
|
|
1197
1161
|
|
|
1198
|
-
result->
|
|
1162
|
+
result->m_yield_from = NULL;
|
|
1199
1163
|
|
|
1200
1164
|
memcpy(&result->m_closure[0], closure, closure_given * sizeof(struct Nuitka_CellObject *));
|
|
1201
1165
|
result->m_closure_given = closure_given;
|
|
@@ -1393,7 +1357,13 @@ struct _PyAsyncGenWrappedValue {
|
|
|
1393
1357
|
PyObject *agw_val;
|
|
1394
1358
|
};
|
|
1395
1359
|
|
|
1360
|
+
#if PYTHON_VERSION < 0x3d0
|
|
1396
1361
|
#define _PyAsyncGenWrappedValue_CheckExact(o) (Py_TYPE(o) == &_PyAsyncGenWrappedValue_Type)
|
|
1362
|
+
#else
|
|
1363
|
+
static PyTypeObject *Nuitka_PyAsyncGenWrappedValue_Type = NULL;
|
|
1364
|
+
|
|
1365
|
+
#define _PyAsyncGenWrappedValue_CheckExact(o) (Py_TYPE(o) == Nuitka_PyAsyncGenWrappedValue_Type)
|
|
1366
|
+
#endif
|
|
1397
1367
|
|
|
1398
1368
|
static PyObject *_Nuitka_Asyncgen_unwrap_value(PyThreadState *tstate, struct Nuitka_AsyncgenObject *asyncgen,
|
|
1399
1369
|
PyObject *result) {
|
|
@@ -1404,7 +1374,7 @@ static PyObject *_Nuitka_Asyncgen_unwrap_value(PyThreadState *tstate, struct Nui
|
|
|
1404
1374
|
PyObject *error = GET_ERROR_OCCURRED(tstate);
|
|
1405
1375
|
|
|
1406
1376
|
if (error == NULL) {
|
|
1407
|
-
|
|
1377
|
+
SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
|
|
1408
1378
|
asyncgen->m_closed = true;
|
|
1409
1379
|
} else if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, error, PyExc_StopAsyncIteration) ||
|
|
1410
1380
|
EXCEPTION_MATCH_BOOL_SINGLE(tstate, error, PyExc_GeneratorExit)) {
|
|
@@ -1419,7 +1389,7 @@ static PyObject *_Nuitka_Asyncgen_unwrap_value(PyThreadState *tstate, struct Nui
|
|
|
1419
1389
|
|
|
1420
1390
|
if (_PyAsyncGenWrappedValue_CheckExact(result)) {
|
|
1421
1391
|
/* async yield */
|
|
1422
|
-
|
|
1392
|
+
Nuitka_SetStopIterationValue(tstate, ((struct _PyAsyncGenWrappedValue *)result)->agw_val);
|
|
1423
1393
|
|
|
1424
1394
|
Py_DECREF(result);
|
|
1425
1395
|
|
|
@@ -1429,7 +1399,7 @@ static PyObject *_Nuitka_Asyncgen_unwrap_value(PyThreadState *tstate, struct Nui
|
|
|
1429
1399
|
return NULL;
|
|
1430
1400
|
} else if (Nuitka_AsyncgenWrappedValue_CheckExact(result)) {
|
|
1431
1401
|
/* async yield */
|
|
1432
|
-
|
|
1402
|
+
Nuitka_SetStopIterationValue(tstate, ((struct Nuitka_AsyncgenWrappedValueObject *)result)->m_value);
|
|
1433
1403
|
|
|
1434
1404
|
Py_DECREF(result);
|
|
1435
1405
|
|
|
@@ -1486,7 +1456,7 @@ static PyObject *Nuitka_AsyncgenAsend_send(struct Nuitka_AsyncgenAsendObject *as
|
|
|
1486
1456
|
|
|
1487
1457
|
if (asyncgen_asend->m_state == AWAITABLE_STATE_CLOSED) {
|
|
1488
1458
|
#if PYTHON_VERSION < 0x390
|
|
1489
|
-
|
|
1459
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1490
1460
|
#else
|
|
1491
1461
|
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "cannot reuse already awaited __anext__()/asend()");
|
|
1492
1462
|
#endif
|
|
@@ -1530,7 +1500,11 @@ static PyObject *Nuitka_AsyncgenAsend_send(struct Nuitka_AsyncgenAsendObject *as
|
|
|
1530
1500
|
#endif
|
|
1531
1501
|
|
|
1532
1502
|
Py_INCREF(arg);
|
|
1533
|
-
|
|
1503
|
+
|
|
1504
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
1505
|
+
INIT_ERROR_OCCURRED_STATE(&exception_state);
|
|
1506
|
+
|
|
1507
|
+
PyObject *result = _Nuitka_Asyncgen_send(tstate, asyncgen_asend->m_gen, arg, false, &exception_state);
|
|
1534
1508
|
|
|
1535
1509
|
#if _DEBUG_ASYNCGEN
|
|
1536
1510
|
PRINT_STRING("Returned from _Nuitka_Asyncgen_send\n");
|
|
@@ -1590,7 +1564,7 @@ static PyObject *Nuitka_AsyncgenAsend_throw(struct Nuitka_AsyncgenAsendObject *a
|
|
|
1590
1564
|
PyThreadState *tstate = PyThreadState_GET();
|
|
1591
1565
|
|
|
1592
1566
|
if (asyncgen_asend->m_state == AWAITABLE_STATE_CLOSED) {
|
|
1593
|
-
|
|
1567
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1594
1568
|
return NULL;
|
|
1595
1569
|
}
|
|
1596
1570
|
|
|
@@ -1625,28 +1599,26 @@ static PyObject *Nuitka_AsyncgenAsend_throw(struct Nuitka_AsyncgenAsendObject *a
|
|
|
1625
1599
|
}
|
|
1626
1600
|
|
|
1627
1601
|
static PyObject *_Nuitka_AsyncgenAsend_throw2(PyThreadState *tstate, struct Nuitka_AsyncgenAsendObject *asyncgen_asend,
|
|
1628
|
-
|
|
1629
|
-
PyTracebackObject *exception_tb) {
|
|
1602
|
+
struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
1630
1603
|
#if _DEBUG_ASYNCGEN
|
|
1631
1604
|
PRINT_ASYNCGENASEND_STATUS("Enter", asyncgen_asend);
|
|
1632
|
-
|
|
1605
|
+
PRINT_EXCEPTION_STATE(exception_state);
|
|
1633
1606
|
PRINT_CURRENT_EXCEPTION();
|
|
1634
1607
|
PRINT_NEW_LINE();
|
|
1635
1608
|
#endif
|
|
1636
1609
|
|
|
1637
1610
|
if (asyncgen_asend->m_state == AWAITABLE_STATE_CLOSED) {
|
|
1638
|
-
|
|
1611
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1639
1612
|
return NULL;
|
|
1640
1613
|
}
|
|
1641
1614
|
|
|
1642
|
-
PyObject *result =
|
|
1643
|
-
_Nuitka_Asyncgen_throw2(tstate, asyncgen_asend->m_gen, false, exception_type, exception_value, exception_tb);
|
|
1615
|
+
PyObject *result = _Nuitka_Asyncgen_throw2(tstate, asyncgen_asend->m_gen, false, exception_state);
|
|
1644
1616
|
|
|
1645
1617
|
// TODO: This might not be all that necessary as this is not directly outside facing,
|
|
1646
1618
|
// but there were tests failing when this was not the specific value.
|
|
1647
1619
|
if (result == NULL) {
|
|
1648
|
-
if (
|
|
1649
|
-
|
|
1620
|
+
if (HAS_ERROR_OCCURRED(tstate) == false) {
|
|
1621
|
+
SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
|
|
1650
1622
|
}
|
|
1651
1623
|
}
|
|
1652
1624
|
|
|
@@ -1679,7 +1651,7 @@ static PyObject *_Nuitka_AsyncgenAsend_throw2(PyThreadState *tstate, struct Nuit
|
|
|
1679
1651
|
static PyObject *Nuitka_AsyncgenAsend_close(struct Nuitka_AsyncgenAsendObject *asyncgen_asend, PyObject *args) {
|
|
1680
1652
|
asyncgen_asend->m_state = AWAITABLE_STATE_CLOSED;
|
|
1681
1653
|
|
|
1682
|
-
|
|
1654
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
1683
1655
|
return Py_None;
|
|
1684
1656
|
}
|
|
1685
1657
|
|
|
@@ -1857,7 +1829,7 @@ static PyObject *Nuitka_AsyncgenAthrow_send(struct Nuitka_AsyncgenAthrowObject *
|
|
|
1857
1829
|
// Closing twice is not allowed with 3.9 or higher.
|
|
1858
1830
|
if (asyncgen_athrow->m_state == AWAITABLE_STATE_CLOSED) {
|
|
1859
1831
|
#if PYTHON_VERSION < 0x390
|
|
1860
|
-
|
|
1832
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1861
1833
|
#else
|
|
1862
1834
|
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "cannot reuse already awaited aclose()/athrow()");
|
|
1863
1835
|
#endif
|
|
@@ -1867,7 +1839,7 @@ static PyObject *Nuitka_AsyncgenAthrow_send(struct Nuitka_AsyncgenAthrowObject *
|
|
|
1867
1839
|
|
|
1868
1840
|
// If finished, just report StopIteration.
|
|
1869
1841
|
if (asyncgen->m_status == status_Finished) {
|
|
1870
|
-
|
|
1842
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1871
1843
|
return NULL;
|
|
1872
1844
|
}
|
|
1873
1845
|
|
|
@@ -1891,9 +1863,9 @@ static PyObject *Nuitka_AsyncgenAthrow_send(struct Nuitka_AsyncgenAthrowObject *
|
|
|
1891
1863
|
if (asyncgen->m_closed) {
|
|
1892
1864
|
#if PYTHON_VERSION >= 0x380
|
|
1893
1865
|
asyncgen_athrow->m_state = AWAITABLE_STATE_CLOSED;
|
|
1894
|
-
|
|
1866
|
+
SET_CURRENT_EXCEPTION_STOP_ASYNC_ITERATION(tstate);
|
|
1895
1867
|
#else
|
|
1896
|
-
|
|
1868
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1897
1869
|
#endif
|
|
1898
1870
|
return NULL;
|
|
1899
1871
|
}
|
|
@@ -1914,10 +1886,12 @@ static PyObject *Nuitka_AsyncgenAthrow_send(struct Nuitka_AsyncgenAthrowObject *
|
|
|
1914
1886
|
if (asyncgen_athrow->m_args == NULL) {
|
|
1915
1887
|
asyncgen->m_closed = true;
|
|
1916
1888
|
|
|
1917
|
-
|
|
1889
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
1890
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, &exception_state, PyExc_GeneratorExit, NULL, NULL);
|
|
1891
|
+
|
|
1918
1892
|
retval = _Nuitka_Asyncgen_throw2(tstate, asyncgen,
|
|
1919
1893
|
1, /* Do not close generator when PyExc_GeneratorExit is passed */
|
|
1920
|
-
|
|
1894
|
+
&exception_state);
|
|
1921
1895
|
|
|
1922
1896
|
if (retval) {
|
|
1923
1897
|
if (_PyAsyncGenWrappedValue_CheckExact(retval) || Nuitka_AsyncgenWrappedValue_CheckExact(retval)) {
|
|
@@ -1944,13 +1918,15 @@ static PyObject *Nuitka_AsyncgenAthrow_send(struct Nuitka_AsyncgenAthrowObject *
|
|
|
1944
1918
|
}
|
|
1945
1919
|
|
|
1946
1920
|
// Handing ownership of exception over, we need not release it ourselves
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1921
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
1922
|
+
if (_Nuitka_Generator_make_throw_exception_state(tstate, &exception_state, exception_type, exception_value,
|
|
1923
|
+
exception_tb) == false) {
|
|
1924
|
+
return NULL;
|
|
1925
|
+
}
|
|
1950
1926
|
|
|
1951
1927
|
retval = _Nuitka_Asyncgen_throw2(tstate, asyncgen,
|
|
1952
1928
|
0, /* Do not close generator when PyExc_GeneratorExit is passed */
|
|
1953
|
-
|
|
1929
|
+
&exception_state);
|
|
1954
1930
|
|
|
1955
1931
|
retval = _Nuitka_Asyncgen_unwrap_value(tstate, asyncgen, retval);
|
|
1956
1932
|
}
|
|
@@ -1964,7 +1940,10 @@ static PyObject *Nuitka_AsyncgenAthrow_send(struct Nuitka_AsyncgenAthrowObject *
|
|
|
1964
1940
|
|
|
1965
1941
|
assert(asyncgen_athrow->m_state == AWAITABLE_STATE_ITER);
|
|
1966
1942
|
|
|
1967
|
-
|
|
1943
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
1944
|
+
INIT_ERROR_OCCURRED_STATE(&exception_state);
|
|
1945
|
+
|
|
1946
|
+
retval = _Nuitka_Asyncgen_send(tstate, asyncgen, arg, false, &exception_state);
|
|
1968
1947
|
|
|
1969
1948
|
if (asyncgen_athrow->m_args) {
|
|
1970
1949
|
return _Nuitka_Asyncgen_unwrap_value(tstate, asyncgen, retval);
|
|
@@ -1996,7 +1975,7 @@ check_error:
|
|
|
1996
1975
|
|
|
1997
1976
|
if (asyncgen_athrow->m_args == NULL) {
|
|
1998
1977
|
CLEAR_ERROR_OCCURRED(tstate);
|
|
1999
|
-
|
|
1978
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
2000
1979
|
}
|
|
2001
1980
|
} else if (PyErr_ExceptionMatches(PyExc_GeneratorExit)) {
|
|
2002
1981
|
asyncgen_athrow->m_state = AWAITABLE_STATE_CLOSED;
|
|
@@ -2004,8 +1983,7 @@ check_error:
|
|
|
2004
1983
|
#if PYTHON_VERSION >= 0x380
|
|
2005
1984
|
if (asyncgen_athrow->m_args == NULL) {
|
|
2006
1985
|
#endif
|
|
2007
|
-
|
|
2008
|
-
SET_CURRENT_EXCEPTION_TYPE0(tstate, PyExc_StopIteration);
|
|
1986
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
2009
1987
|
#if PYTHON_VERSION >= 0x380
|
|
2010
1988
|
}
|
|
2011
1989
|
#endif
|
|
@@ -2036,7 +2014,7 @@ static PyObject *Nuitka_AsyncgenAthrow_throw(struct Nuitka_AsyncgenAthrowObject
|
|
|
2036
2014
|
|
|
2037
2015
|
if (asyncgen_athrow->m_state == AWAITABLE_STATE_CLOSED) {
|
|
2038
2016
|
#if PYTHON_VERSION < 0x390
|
|
2039
|
-
|
|
2017
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
2040
2018
|
#else
|
|
2041
2019
|
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "cannot reuse already awaited aclose()/athrow()");
|
|
2042
2020
|
#endif
|
|
@@ -2064,7 +2042,7 @@ static PyObject *Nuitka_AsyncgenAthrow_throw(struct Nuitka_AsyncgenAthrowObject
|
|
|
2064
2042
|
|
|
2065
2043
|
#if PYTHON_VERSION >= 0x390
|
|
2066
2044
|
if (PyErr_ExceptionMatches(PyExc_StopAsyncIteration) || PyErr_ExceptionMatches(PyExc_GeneratorExit)) {
|
|
2067
|
-
|
|
2045
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
2068
2046
|
}
|
|
2069
2047
|
#endif
|
|
2070
2048
|
|
|
@@ -2079,7 +2057,7 @@ static PyObject *Nuitka_AsyncgenAthrow_tp_iternext(struct Nuitka_AsyncgenAthrowO
|
|
|
2079
2057
|
static PyObject *Nuitka_AsyncgenAthrow_close(struct Nuitka_AsyncgenAthrowObject *asyncgen_athrow) {
|
|
2080
2058
|
asyncgen_athrow->m_state = AWAITABLE_STATE_CLOSED;
|
|
2081
2059
|
|
|
2082
|
-
|
|
2060
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
2083
2061
|
return Py_None;
|
|
2084
2062
|
}
|
|
2085
2063
|
|
|
@@ -2210,4 +2188,26 @@ static void _initCompiledAsyncgenTypes(void) {
|
|
|
2210
2188
|
Nuitka_PyType_Ready(&Nuitka_AsyncgenAsend_Type, NULL, true, false, true, true, false);
|
|
2211
2189
|
Nuitka_PyType_Ready(&Nuitka_AsyncgenAthrow_Type, NULL, true, false, true, true, false);
|
|
2212
2190
|
Nuitka_PyType_Ready(&Nuitka_AsyncgenValueWrapper_Type, NULL, false, false, false, false, false);
|
|
2191
|
+
|
|
2192
|
+
#if PYTHON_VERSION >= 0x3d0
|
|
2193
|
+
PyThreadState *tstate = PyThreadState_GET();
|
|
2194
|
+
PyObject *asyncgen_wrapper_object = _PyIntrinsics_UnaryFunctions[INTRINSIC_ASYNC_GEN_WRAP].func(tstate, Py_None);
|
|
2195
|
+
Nuitka_PyAsyncGenWrappedValue_Type = Py_TYPE(asyncgen_wrapper_object);
|
|
2196
|
+
Py_DECREF(asyncgen_wrapper_object);
|
|
2197
|
+
#endif
|
|
2213
2198
|
}
|
|
2199
|
+
|
|
2200
|
+
// Part of "Nuitka", an optimizing Python compiler that is compatible and
|
|
2201
|
+
// integrates with CPython, but also works on its own.
|
|
2202
|
+
//
|
|
2203
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
2204
|
+
// you may not use this file except in compliance with the License.
|
|
2205
|
+
// You may obtain a copy of the License at
|
|
2206
|
+
//
|
|
2207
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
2208
|
+
//
|
|
2209
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
2210
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
2211
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2212
|
+
// See the License for the specific language governing permissions and
|
|
2213
|
+
// limitations under the License.
|