Nuitka-winsvc 1.8__cp311-cp311-win_amd64.whl → 2.4.8__cp311-cp311-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of Nuitka-winsvc might be problematic. Click here for more details.
- Nuitka_winsvc-1.8.data/scripts/nuitka-run.bat → Nuitka_winsvc-2.4.8.data/scripts/nuitka-run.cmd +9 -9
- Nuitka_winsvc-1.8.data/scripts/nuitka.bat → Nuitka_winsvc-2.4.8.data/scripts/nuitka.cmd +15 -15
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/METADATA +4 -3
- Nuitka_winsvc-2.4.8.dist-info/RECORD +954 -0
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/WHEEL +1 -1
- nuitka/Builtins.py +18 -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 +400 -0
- nuitka/MainControl.py +200 -112
- nuitka/ModuleRegistry.py +83 -20
- nuitka/OptionParsing.py +368 -175
- nuitka/Options.py +632 -213
- nuitka/OutputDirectories.py +40 -21
- nuitka/PostProcessing.py +73 -50
- nuitka/Progress.py +58 -24
- nuitka/PythonFlavors.py +141 -32
- nuitka/PythonOperators.py +18 -17
- nuitka/PythonVersions.py +106 -19
- nuitka/Serialization.py +68 -55
- nuitka/SourceCodeReferences.py +19 -17
- nuitka/Tracing.py +108 -70
- nuitka/TreeXML.py +31 -26
- nuitka/Variables.py +39 -41
- nuitka/Version.py +21 -7
- nuitka/__init__.py +5 -4
- nuitka/__main__.py +95 -29
- nuitka/__past__.py +44 -34
- nuitka/build/Backend.scons +202 -140
- nuitka/build/CCompilerVersion.scons +39 -31
- nuitka/build/DataComposerInterface.py +20 -17
- nuitka/build/Onefile.scons +50 -54
- nuitka/build/SconsCaching.py +93 -90
- nuitka/build/SconsCompilerSettings.py +157 -69
- nuitka/build/SconsHacks.py +25 -19
- nuitka/build/SconsInterface.py +154 -54
- nuitka/build/SconsProgress.py +19 -18
- nuitka/build/SconsSpawn.py +62 -33
- nuitka/build/SconsUtils.py +147 -55
- nuitka/build/__init__.py +5 -4
- nuitka/build/include/nuitka/allocator.h +105 -22
- nuitka/build/include/nuitka/builtins.h +17 -17
- nuitka/build/include/nuitka/calling.h +18 -18
- nuitka/build/include/nuitka/checkers.h +17 -18
- nuitka/build/include/nuitka/checksum_tools.h +14 -19
- nuitka/build/include/nuitka/compiled_asyncgen.h +18 -18
- 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 +91 -53
- 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 +29 -18
- nuitka/build/include/nuitka/constants_blob.h +17 -17
- 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 +593 -190
- 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 -18
- 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 +17 -17
- 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 +24 -22
- 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 +32 -20
- nuitka/build/include/nuitka/helper/iterators.h +17 -17
- 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 +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_add.h +17 -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_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 +17 -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 +17 -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 +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +17 -17
- nuitka/build/include/nuitka/helper/raising.h +29 -17
- nuitka/build/include/nuitka/helper/rangeobjects.h +17 -17
- nuitka/build/include/nuitka/helper/richcomparisons.h +14 -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 +38 -20
- nuitka/build/include/nuitka/importing.h +28 -21
- nuitka/build/include/nuitka/jit_sources.h +25 -0
- nuitka/build/include/nuitka/prelude.h +128 -46
- nuitka/build/include/nuitka/printing.h +22 -17
- 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 +32 -33
- nuitka/build/include/nuitka/tracing.h +28 -18
- nuitka/build/include/nuitka/type_aliases.h +27 -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/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 +176 -182
- nuitka/build/static_src/CompiledCellType.c +63 -40
- nuitka/build/static_src/CompiledCodeHelpers.c +181 -128
- nuitka/build/static_src/CompiledCoroutineType.c +196 -203
- nuitka/build/static_src/CompiledFrameType.c +287 -133
- nuitka/build/static_src/CompiledFunctionType.c +389 -95
- nuitka/build/static_src/CompiledGeneratorType.c +376 -252
- nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +185 -198
- nuitka/build/static_src/CompiledMethodType.c +83 -71
- nuitka/build/static_src/HelpersAllocator.c +88 -19
- nuitka/build/static_src/HelpersAttributes.c +33 -54
- nuitka/build/static_src/HelpersBuiltin.c +43 -33
- nuitka/build/static_src/HelpersBuiltinTypeMethods.c +17 -17
- nuitka/build/static_src/HelpersBytes.c +19 -20
- nuitka/build/static_src/HelpersCalling.c +33 -30
- nuitka/build/static_src/HelpersCallingGenerated.c +1000 -181
- nuitka/build/static_src/HelpersChecksumTools.c +35 -21
- nuitka/build/static_src/HelpersClasses.c +17 -17
- nuitka/build/static_src/HelpersComparisonEq.c +518 -492
- nuitka/build/static_src/HelpersComparisonEqUtils.c +21 -19
- nuitka/build/static_src/HelpersComparisonGe.c +513 -497
- nuitka/build/static_src/HelpersComparisonGt.c +512 -496
- nuitka/build/static_src/HelpersComparisonLe.c +513 -497
- nuitka/build/static_src/HelpersComparisonLt.c +512 -496
- nuitka/build/static_src/HelpersComparisonNe.c +520 -492
- nuitka/build/static_src/HelpersConsole.c +96 -0
- nuitka/build/static_src/HelpersConstantsBlob.c +542 -519
- nuitka/build/static_src/HelpersDeepcopy.c +33 -33
- nuitka/build/static_src/HelpersDictionaries.c +51 -29
- nuitka/build/static_src/HelpersDictionariesGenerated.c +177 -68
- 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 +161 -50
- nuitka/build/static_src/HelpersFiles.c +37 -17
- 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 +48 -20
- nuitka/build/static_src/HelpersImportHard.c +53 -17
- nuitka/build/static_src/HelpersJitSources.c +46 -0
- nuitka/build/static_src/HelpersLists.c +140 -50
- 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 +173 -146
- nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +99 -52
- nuitka/build/static_src/HelpersOperationBinaryBitand.c +50 -50
- nuitka/build/static_src/HelpersOperationBinaryBitor.c +50 -50
- nuitka/build/static_src/HelpersOperationBinaryBitxor.c +50 -50
- nuitka/build/static_src/HelpersOperationBinaryDivmod.c +41 -41
- nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +17 -17
- nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +41 -41
- nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +20 -21
- nuitka/build/static_src/HelpersOperationBinaryLshift.c +47 -47
- nuitka/build/static_src/HelpersOperationBinaryMatmult.c +24 -24
- nuitka/build/static_src/HelpersOperationBinaryMod.c +107 -107
- nuitka/build/static_src/HelpersOperationBinaryMult.c +81 -75
- nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +33 -30
- nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +41 -41
- nuitka/build/static_src/HelpersOperationBinaryPow.c +44 -44
- nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +12 -12
- nuitka/build/static_src/HelpersOperationBinaryRshift.c +47 -47
- nuitka/build/static_src/HelpersOperationBinarySub.c +80 -80
- nuitka/build/static_src/HelpersOperationBinaryTruediv.c +41 -41
- nuitka/build/static_src/HelpersOperationInplaceAdd.c +171 -153
- nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +24 -22
- nuitka/build/static_src/HelpersOperationInplaceBitand.c +53 -53
- nuitka/build/static_src/HelpersOperationInplaceBitor.c +53 -53
- nuitka/build/static_src/HelpersOperationInplaceBitxor.c +53 -53
- nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +62 -62
- nuitka/build/static_src/HelpersOperationInplaceLshift.c +44 -44
- nuitka/build/static_src/HelpersOperationInplaceMatmult.c +37 -37
- nuitka/build/static_src/HelpersOperationInplaceMod.c +134 -134
- nuitka/build/static_src/HelpersOperationInplaceMult.c +78 -78
- nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +62 -62
- nuitka/build/static_src/HelpersOperationInplacePow.c +62 -62
- nuitka/build/static_src/HelpersOperationInplaceRshift.c +44 -44
- nuitka/build/static_src/HelpersOperationInplaceSub.c +112 -112
- nuitka/build/static_src/HelpersOperationInplaceTruediv.c +62 -62
- nuitka/build/static_src/HelpersProfiling.c +24 -23
- nuitka/build/static_src/HelpersPythonPgo.c +22 -22
- nuitka/build/static_src/HelpersRaising.c +88 -20
- 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 +234 -37
- nuitka/build/static_src/HelpersTuples.c +46 -34
- nuitka/build/static_src/HelpersTypes.c +68 -23
- nuitka/build/static_src/InspectPatcher.c +108 -27
- nuitka/build/static_src/MainProgram.c +359 -263
- nuitka/build/static_src/MetaPathBasedLoader.c +367 -242
- nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +39 -26
- nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +17 -18
- nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +97 -22
- nuitka/build/static_src/OnefileBootstrap.c +276 -164
- nuitka/build/static_src/OnefileSplashScreen.cpp +51 -27
- nuitka/code_generation/AsyncgenCodes.py +19 -17
- nuitka/code_generation/AttributeCodes.py +31 -27
- nuitka/code_generation/BinaryOperationHelperDefinitions.py +24 -20
- nuitka/code_generation/BranchCodes.py +19 -17
- nuitka/code_generation/BuiltinCodes.py +20 -17
- nuitka/code_generation/CallCodes.py +19 -17
- nuitka/code_generation/ClassCodes.py +19 -17
- nuitka/code_generation/CodeGeneration.py +48 -27
- nuitka/code_generation/CodeHelperSelection.py +19 -17
- nuitka/code_generation/CodeHelpers.py +24 -20
- nuitka/code_generation/CodeObjectCodes.py +34 -24
- nuitka/code_generation/ComparisonCodes.py +38 -20
- nuitka/code_generation/ComparisonHelperDefinitions.py +19 -17
- nuitka/code_generation/ConditionalCodes.py +19 -17
- nuitka/code_generation/ConstantCodes.py +82 -28
- nuitka/code_generation/Contexts.py +152 -26
- nuitka/code_generation/CoroutineCodes.py +19 -17
- nuitka/code_generation/CtypesCodes.py +19 -17
- nuitka/code_generation/DictCodes.py +25 -23
- nuitka/code_generation/Emission.py +21 -18
- nuitka/code_generation/ErrorCodes.py +27 -33
- nuitka/code_generation/EvalCodes.py +24 -20
- nuitka/code_generation/ExceptionCodes.py +27 -18
- nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +20 -17
- nuitka/code_generation/ExpressionCodes.py +19 -17
- nuitka/code_generation/FrameCodes.py +24 -20
- nuitka/code_generation/FunctionCodes.py +24 -21
- nuitka/code_generation/GeneratorCodes.py +23 -20
- nuitka/code_generation/GlobalConstants.py +43 -23
- nuitka/code_generation/GlobalsLocalsCodes.py +21 -19
- 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 +19 -17
- nuitka/code_generation/JitCodes.py +44 -0
- nuitka/code_generation/LabelCodes.py +19 -17
- nuitka/code_generation/LineNumberCodes.py +19 -17
- 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 +43 -25
- nuitka/code_generation/Namify.py +27 -23
- nuitka/code_generation/NetworkxCodes.py +51 -0
- nuitka/code_generation/OperationCodes.py +29 -31
- nuitka/code_generation/PackageResourceCodes.py +59 -23
- nuitka/code_generation/PrintCodes.py +19 -17
- nuitka/code_generation/PythonAPICodes.py +19 -17
- nuitka/code_generation/RaisingCodes.py +19 -17
- nuitka/code_generation/Reports.py +19 -17
- nuitka/code_generation/ReturnCodes.py +19 -17
- 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 +19 -17
- nuitka/code_generation/TupleCodes.py +20 -18
- nuitka/code_generation/TypeAliasCodes.py +71 -0
- nuitka/code_generation/VariableCodes.py +26 -22
- nuitka/code_generation/VariableDeclarations.py +20 -17
- nuitka/code_generation/YieldCodes.py +22 -20
- nuitka/code_generation/__init__.py +5 -4
- nuitka/code_generation/c_types/CTypeBases.py +19 -17
- 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 +19 -17
- nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +19 -17
- nuitka/code_generation/c_types/CTypeNuitkaInts.py +19 -18
- nuitka/code_generation/c_types/CTypeNuitkaVoids.py +19 -17
- nuitka/code_generation/c_types/CTypePyObjectPointers.py +27 -25
- nuitka/code_generation/c_types/CTypeVoids.py +20 -17
- nuitka/code_generation/c_types/__init__.py +5 -4
- nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +18 -17
- nuitka/code_generation/templates/CodeTemplatesConstants.py +132 -36
- nuitka/code_generation/templates/CodeTemplatesCoroutines.py +18 -17
- nuitka/code_generation/templates/CodeTemplatesExceptions.py +19 -18
- nuitka/code_generation/templates/CodeTemplatesFrames.py +18 -17
- nuitka/code_generation/templates/CodeTemplatesFunction.py +18 -17
- nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +19 -17
- nuitka/code_generation/templates/CodeTemplatesIterators.py +18 -18
- nuitka/code_generation/templates/CodeTemplatesLoader.py +25 -19
- nuitka/code_generation/templates/CodeTemplatesModules.py +244 -165
- nuitka/code_generation/templates/CodeTemplatesVariables.py +42 -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 +18 -18
- nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +76 -25
- 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 +121 -48
- nuitka/code_generation/templates_c/HelperImportHard.c.j2 +18 -18
- nuitka/code_generation/templates_c/HelperLongTools.c.j2 +18 -18
- 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/HelperOperationComparison.c.j2 +35 -35
- nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +28 -28
- 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 +44 -32
- nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +20 -20
- nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +28 -28
- nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +24 -24
- nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +33 -29
- nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +20 -20
- nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +27 -27
- 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 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +21 -18
- nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +26 -24
- 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 +19 -18
- nuitka/containers/OrderedSetsFallback.py +19 -17
- nuitka/containers/__init__.py +5 -4
- nuitka/distutils/Build.py +19 -18
- nuitka/distutils/DistutilCommands.py +34 -23
- nuitka/distutils/__init__.py +5 -4
- nuitka/finalizations/Finalization.py +20 -17
- nuitka/finalizations/FinalizeMarkups.py +21 -41
- nuitka/finalizations/__init__.py +5 -4
- nuitka/freezer/DependsExe.py +48 -28
- nuitka/freezer/DllDependenciesCommon.py +47 -20
- nuitka/freezer/DllDependenciesMacOS.py +147 -57
- nuitka/freezer/DllDependenciesPosix.py +29 -19
- nuitka/freezer/DllDependenciesWin32.py +29 -21
- nuitka/freezer/ImportDetection.py +20 -17
- nuitka/freezer/IncludedDataFiles.py +118 -47
- nuitka/freezer/IncludedEntryPoints.py +102 -38
- nuitka/freezer/Onefile.py +32 -22
- nuitka/freezer/Standalone.py +105 -50
- 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 +286 -92
- nuitka/importing/PreloadedPackages.py +21 -18
- nuitka/importing/Recursion.py +131 -47
- nuitka/importing/StandardLibrary.py +46 -28
- nuitka/importing/__init__.py +5 -4
- nuitka/nodes/AsyncgenNodes.py +19 -17
- 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 +24 -20
- 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 +68 -19
- 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 +1250 -302
- nuitka/nodes/ClassNodes.py +49 -29
- nuitka/nodes/CodeObjectSpecs.py +29 -18
- nuitka/nodes/ComparisonNodes.py +19 -17
- nuitka/nodes/ConditionalNodes.py +21 -23
- nuitka/nodes/ConstantRefNodes.py +57 -17
- nuitka/nodes/ContainerMakingNodes.py +19 -17
- nuitka/nodes/ContainerOperationNodes.py +19 -17
- nuitka/nodes/CoroutineNodes.py +19 -17
- nuitka/nodes/CtypesNodes.py +19 -18
- nuitka/nodes/DictionaryNodes.py +19 -18
- nuitka/nodes/ExceptionNodes.py +29 -17
- nuitka/nodes/ExecEvalNodes.py +19 -17
- nuitka/nodes/ExpressionBases.py +34 -26
- nuitka/nodes/ExpressionBasesGenerated.py +54 -32
- nuitka/nodes/ExpressionShapeMixins.py +19 -17
- nuitka/nodes/FrameNodes.py +19 -17
- nuitka/nodes/FunctionAttributeNodes.py +19 -17
- nuitka/nodes/FunctionNodes.py +81 -35
- nuitka/nodes/FutureSpecs.py +35 -20
- nuitka/nodes/GeneratorNodes.py +21 -19
- nuitka/nodes/GlobalsLocalsNodes.py +22 -17
- nuitka/nodes/HardImportNodesGenerated.py +545 -129
- nuitka/nodes/ImportHardNodes.py +46 -38
- nuitka/nodes/ImportNodes.py +436 -446
- 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 +45 -43
- nuitka/nodes/NodeMakingHelpers.py +21 -19
- nuitka/nodes/NodeMetaClasses.py +45 -28
- nuitka/nodes/OperatorNodes.py +28 -26
- nuitka/nodes/OperatorNodesUnary.py +20 -17
- nuitka/nodes/OsSysNodes.py +66 -18
- nuitka/nodes/OutlineNodes.py +22 -20
- 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 -77
- nuitka/nodes/StatementNodes.py +19 -17
- nuitka/nodes/StrNodes.py +19 -17
- nuitka/nodes/StringConcatenationNodes.py +20 -17
- nuitka/nodes/SubscriptNodes.py +26 -24
- nuitka/nodes/TensorflowNodes.py +38 -0
- nuitka/nodes/TryNodes.py +19 -17
- nuitka/nodes/TypeMatchNodes.py +19 -17
- nuitka/nodes/TypeNodes.py +40 -17
- 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 +145 -39
- nuitka/nodes/shapes/ControlFlowDescriptions.py +19 -17
- nuitka/nodes/shapes/ShapeMixins.py +40 -17
- nuitka/nodes/shapes/StandardShapes.py +27 -20
- nuitka/nodes/shapes/__init__.py +5 -4
- nuitka/optimizations/BytecodeDemotion.py +19 -17
- 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 +610 -109
- nuitka/plugins/Plugins.py +241 -58
- nuitka/plugins/YamlPluginBase.py +121 -0
- nuitka/plugins/__init__.py +5 -4
- nuitka/plugins/standard/AntiBloatPlugin.py +357 -129
- 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 +407 -46
- nuitka/plugins/standard/KivyPlugin.py +30 -17
- nuitka/plugins/standard/MatplotlibPlugin.py +88 -42
- nuitka/plugins/standard/MultiprocessingPlugin.py +25 -20
- 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/PmwPlugin.py +30 -27
- nuitka/plugins/standard/PySidePyQtPlugin.py +74 -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 +103 -53
- nuitka/plugins/standard/TorchPlugin.py +20 -17
- nuitka/plugins/standard/TransformersPlugin.py +94 -30
- 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 +3449 -1299
- nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +14 -14
- nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +121 -66
- nuitka/reports/CompilationReportReader.py +67 -0
- nuitka/reports/LicenseReport.rst.j2 +21 -21
- nuitka/reports/Reports.py +352 -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 +30 -20
- nuitka/specs/BuiltinStrOperationSpecs.py +19 -18
- nuitka/specs/BuiltinTypeOperationSpecs.py +18 -18
- nuitka/specs/BuiltinUnicodeOperationSpecs.py +18 -17
- nuitka/specs/HardImportSpecs.py +67 -22
- nuitka/specs/ParameterSpecs.py +56 -41
- 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 +19 -21
- 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 +93 -71
- nuitka/tools/specialize/Common.py +18 -17
- nuitka/tools/specialize/SpecializeC.py +31 -27
- nuitka/tools/specialize/SpecializePython.py +108 -45
- nuitka/tools/specialize/__init__.py +5 -4
- nuitka/tools/testing/Common.py +106 -52
- 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 +36 -29
- 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 +22 -25
- nuitka/tools/testing/run_nuitka_tests/__init__.py +5 -4
- nuitka/tools/testing/run_nuitka_tests/__main__.py +57 -40
- nuitka/tools/watch/AutoStage.py +144 -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 +176 -147
- nuitka/tree/ComplexCallHelperFunctions.py +80 -58
- nuitka/tree/Extractions.py +19 -17
- nuitka/tree/InternalModule.py +29 -20
- nuitka/tree/Operations.py +19 -17
- nuitka/tree/ReformulationAssertStatements.py +20 -17
- nuitka/tree/ReformulationAssignmentStatements.py +92 -91
- nuitka/tree/ReformulationBooleanExpressions.py +19 -17
- nuitka/tree/ReformulationCallExpressions.py +20 -18
- nuitka/tree/ReformulationClasses.py +45 -39
- nuitka/tree/ReformulationClasses3.py +146 -98
- nuitka/tree/ReformulationComparisonExpressions.py +29 -35
- nuitka/tree/ReformulationContractionExpressions.py +58 -55
- nuitka/tree/ReformulationDictionaryCreation.py +40 -35
- nuitka/tree/ReformulationExecStatements.py +42 -39
- nuitka/tree/ReformulationForLoopStatements.py +30 -34
- nuitka/tree/ReformulationFunctionStatements.py +58 -54
- nuitka/tree/ReformulationImportStatements.py +34 -29
- nuitka/tree/ReformulationLambdaExpressions.py +23 -24
- nuitka/tree/ReformulationMatchStatements.py +244 -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 +21 -19
- 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 +84 -19
- nuitka/utils/Distributions.py +445 -54
- nuitka/utils/Download.py +89 -57
- nuitka/utils/Execution.py +73 -34
- nuitka/utils/FileOperations.py +318 -74
- nuitka/utils/Hashing.py +55 -33
- nuitka/utils/Images.py +26 -19
- nuitka/utils/Importing.py +118 -24
- nuitka/utils/InstalledPythons.py +80 -75
- nuitka/utils/InstanceCounters.py +20 -17
- nuitka/utils/Jinja2.py +30 -22
- nuitka/utils/Json.py +19 -17
- nuitka/utils/MacOSApp.py +26 -18
- nuitka/utils/MemoryUsage.py +20 -18
- nuitka/utils/ModuleNames.py +42 -26
- 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 +115 -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.4.8.dist-info}/LICENSE.txt +0 -0
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.dist-info}/entry_points.txt +0 -0
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.4.8.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 Generators.
|
|
19
4
|
*
|
|
20
5
|
* Unlike in CPython, we have one type for just generators, this doesn't do coroutines
|
|
@@ -28,6 +13,13 @@
|
|
|
28
13
|
/* This file is included from another C file, help IDEs to still parse it on its own. */
|
|
29
14
|
#ifdef __IDE_ONLY__
|
|
30
15
|
#include "nuitka/prelude.h"
|
|
16
|
+
#include <structmember.h>
|
|
17
|
+
#endif
|
|
18
|
+
|
|
19
|
+
#if _DEBUG_REFCOUNTS
|
|
20
|
+
int count_active_Nuitka_Generator_Type;
|
|
21
|
+
int count_allocated_Nuitka_Generator_Type;
|
|
22
|
+
int count_released_Nuitka_Generator_Type;
|
|
31
23
|
#endif
|
|
32
24
|
|
|
33
25
|
// In a separate file, code to interact with uncompiled generators, that does
|
|
@@ -118,13 +110,15 @@ static void Nuitka_MarkGeneratorAsNotRunning(struct Nuitka_GeneratorObject *gene
|
|
|
118
110
|
}
|
|
119
111
|
|
|
120
112
|
static PyObject *Nuitka_Generator_tp_repr(struct Nuitka_GeneratorObject *generator) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
113
|
+
#if PYTHON_VERSION < 0x300
|
|
114
|
+
return Nuitka_String_FromFormat("<compiled_generator object %s at %p>", Nuitka_String_AsString(generator->m_name),
|
|
115
|
+
generator);
|
|
116
|
+
#elif PYTHON_VERSION < 0x350
|
|
117
|
+
return Nuitka_String_FromFormat("<compiled_generator object %U at %p>", generator->m_name, generator);
|
|
118
|
+
|
|
124
119
|
#else
|
|
125
|
-
|
|
120
|
+
return Nuitka_String_FromFormat("<compiled_generator object %U at %p>", generator->m_qualname, generator);
|
|
126
121
|
#endif
|
|
127
|
-
generator);
|
|
128
122
|
}
|
|
129
123
|
|
|
130
124
|
static long Nuitka_Generator_tp_traverse(struct Nuitka_GeneratorObject *generator, visitproc visit, void *arg) {
|
|
@@ -132,7 +126,7 @@ static long Nuitka_Generator_tp_traverse(struct Nuitka_GeneratorObject *generato
|
|
|
132
126
|
|
|
133
127
|
// TODO: Identify the impact of not visiting owned objects like module.
|
|
134
128
|
#if PYTHON_VERSION >= 0x300
|
|
135
|
-
Py_VISIT(generator->
|
|
129
|
+
Py_VISIT(generator->m_yield_from);
|
|
136
130
|
#endif
|
|
137
131
|
|
|
138
132
|
for (Py_ssize_t i = 0; i < generator->m_closure_given; i++) {
|
|
@@ -159,12 +153,16 @@ static void Nuitka_Generator_release_closure(struct Nuitka_GeneratorObject *gene
|
|
|
159
153
|
static PyObject *ERROR_GET_STOP_ITERATION_VALUE(PyThreadState *tstate) {
|
|
160
154
|
assert(PyErr_ExceptionMatches(PyExc_StopIteration));
|
|
161
155
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
FETCH_ERROR_OCCURRED(tstate, &exception_type, &exception_value, &exception_tb);
|
|
156
|
+
struct Nuitka_ExceptionPreservationItem saved_exception_state;
|
|
157
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
165
158
|
|
|
166
|
-
|
|
167
|
-
|
|
159
|
+
#if PYTHON_VERSION < 0x3c0
|
|
160
|
+
Py_DECREF(saved_exception_state.exception_type);
|
|
161
|
+
Py_XDECREF(saved_exception_state.exception_tb);
|
|
162
|
+
#endif
|
|
163
|
+
|
|
164
|
+
// We own a reference, and we mean to return it.
|
|
165
|
+
PyObject *exception_value = saved_exception_state.exception_value;
|
|
168
166
|
|
|
169
167
|
PyObject *value = NULL;
|
|
170
168
|
|
|
@@ -179,27 +177,45 @@ static PyObject *ERROR_GET_STOP_ITERATION_VALUE(PyThreadState *tstate) {
|
|
|
179
177
|
}
|
|
180
178
|
|
|
181
179
|
if (value == NULL) {
|
|
182
|
-
|
|
180
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
183
181
|
value = Py_None;
|
|
184
182
|
}
|
|
185
183
|
|
|
186
184
|
return value;
|
|
187
185
|
}
|
|
188
186
|
|
|
187
|
+
static PyObject *Nuitka_CallGeneratorThrowMethod(PyObject *throw_method,
|
|
188
|
+
struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
189
|
+
|
|
190
|
+
// TODO: Faster call code should be used.
|
|
191
|
+
|
|
192
|
+
#if PYTHON_VERSION < 0x3c0
|
|
193
|
+
PyObject *result =
|
|
194
|
+
PyObject_CallFunctionObjArgs(throw_method, exception_state->exception_type, exception_state->exception_value,
|
|
195
|
+
exception_state->exception_tb, NULL);
|
|
196
|
+
|
|
197
|
+
return result;
|
|
198
|
+
#else
|
|
199
|
+
// For Python 3.12 or higher, we don't create the type and tb args, code was
|
|
200
|
+
// always supposed to handle single argument forms and is now.
|
|
201
|
+
PyObject *result = PyObject_CallFunctionObjArgs(throw_method, exception_state->exception_value, NULL);
|
|
202
|
+
|
|
203
|
+
return result;
|
|
204
|
+
#endif
|
|
205
|
+
}
|
|
206
|
+
|
|
189
207
|
static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator,
|
|
190
|
-
|
|
191
|
-
PyTracebackObject *exception_tb);
|
|
208
|
+
struct Nuitka_ExceptionPreservationItem *exception_state);
|
|
192
209
|
#if PYTHON_VERSION >= 0x350
|
|
193
210
|
static PyObject *_Nuitka_Coroutine_throw2(PyThreadState *tstate, struct Nuitka_CoroutineObject *coroutine, bool closing,
|
|
194
|
-
|
|
195
|
-
PyTracebackObject *exception_tb);
|
|
211
|
+
struct Nuitka_ExceptionPreservationItem *exception_state);
|
|
196
212
|
#endif
|
|
197
213
|
|
|
198
|
-
static PyObject *_Nuitka_YieldFromPassExceptionTo(PyThreadState *tstate, PyObject *value,
|
|
199
|
-
|
|
214
|
+
static PyObject *_Nuitka_YieldFromPassExceptionTo(PyThreadState *tstate, PyObject *value,
|
|
215
|
+
struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
200
216
|
// The yielding generator is being closed, but we also are tasked to
|
|
201
217
|
// immediately close the currently running sub-generator.
|
|
202
|
-
if (
|
|
218
|
+
if (EXCEPTION_STATE_MATCH_BOOL_SINGLE(tstate, exception_state, PyExc_GeneratorExit)) {
|
|
203
219
|
PyObject *close_method = PyObject_GetAttr(value, const_str_plain_close);
|
|
204
220
|
|
|
205
221
|
if (close_method) {
|
|
@@ -208,9 +224,7 @@ static PyObject *_Nuitka_YieldFromPassExceptionTo(PyThreadState *tstate, PyObjec
|
|
|
208
224
|
|
|
209
225
|
if (unlikely(close_value == NULL)) {
|
|
210
226
|
// Release exception, we are done with it, raising the one from close instead.
|
|
211
|
-
|
|
212
|
-
Py_XDECREF(exception_value);
|
|
213
|
-
Py_XDECREF(exception_tb);
|
|
227
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
214
228
|
|
|
215
229
|
return NULL;
|
|
216
230
|
}
|
|
@@ -225,7 +239,7 @@ static PyObject *_Nuitka_YieldFromPassExceptionTo(PyThreadState *tstate, PyObjec
|
|
|
225
239
|
}
|
|
226
240
|
|
|
227
241
|
// Transfer exception ownership to published.
|
|
228
|
-
|
|
242
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
229
243
|
|
|
230
244
|
return NULL;
|
|
231
245
|
}
|
|
@@ -239,8 +253,7 @@ static PyObject *_Nuitka_YieldFromPassExceptionTo(PyThreadState *tstate, PyObjec
|
|
|
239
253
|
PyGenObject *gen = (PyGenObject *)value;
|
|
240
254
|
|
|
241
255
|
// Handing exception ownership over.
|
|
242
|
-
PyObject *result =
|
|
243
|
-
Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_type, exception_value, exception_tb);
|
|
256
|
+
PyObject *result = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
|
|
244
257
|
|
|
245
258
|
return result;
|
|
246
259
|
}
|
|
@@ -249,60 +262,55 @@ static PyObject *_Nuitka_YieldFromPassExceptionTo(PyThreadState *tstate, PyObjec
|
|
|
249
262
|
if (Nuitka_Generator_Check(value)) {
|
|
250
263
|
struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)value);
|
|
251
264
|
|
|
252
|
-
return _Nuitka_Generator_throw2(tstate, gen,
|
|
265
|
+
return _Nuitka_Generator_throw2(tstate, gen, exception_state);
|
|
253
266
|
}
|
|
254
267
|
|
|
255
268
|
#if PYTHON_VERSION >= 0x350
|
|
256
269
|
if (Nuitka_Coroutine_Check(value)) {
|
|
257
270
|
struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)value);
|
|
258
271
|
// Handing exception ownership over.
|
|
259
|
-
return _Nuitka_Coroutine_throw2(tstate, coro, true,
|
|
272
|
+
return _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
|
|
260
273
|
}
|
|
261
274
|
|
|
262
275
|
if (Nuitka_CoroutineWrapper_Check(value)) {
|
|
263
276
|
struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineWrapperObject *)value)->m_coroutine;
|
|
264
277
|
// Handing exception ownership over.
|
|
265
|
-
return _Nuitka_Coroutine_throw2(tstate, coro, true,
|
|
278
|
+
return _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
|
|
266
279
|
}
|
|
267
280
|
#endif
|
|
268
281
|
|
|
269
282
|
PyObject *throw_method = PyObject_GetAttr(value, const_str_plain_throw);
|
|
270
283
|
|
|
271
284
|
if (throw_method) {
|
|
272
|
-
PyObject *result =
|
|
273
|
-
PyObject_CallFunctionObjArgs(throw_method, exception_type, exception_value, exception_tb, NULL);
|
|
285
|
+
PyObject *result = Nuitka_CallGeneratorThrowMethod(throw_method, exception_state);
|
|
274
286
|
Py_DECREF(throw_method);
|
|
275
287
|
|
|
276
288
|
// Releasing exception we own.
|
|
277
|
-
|
|
278
|
-
Py_XDECREF(exception_value);
|
|
279
|
-
Py_XDECREF(exception_tb);
|
|
289
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
280
290
|
|
|
281
291
|
return result;
|
|
282
292
|
} else if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, GET_ERROR_OCCURRED(tstate), PyExc_AttributeError)) {
|
|
283
293
|
// Restoring the exception we own, to be released when handling it.
|
|
284
|
-
|
|
294
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
285
295
|
|
|
286
296
|
return NULL;
|
|
287
297
|
} else {
|
|
288
298
|
assert(HAS_ERROR_OCCURRED(tstate));
|
|
289
299
|
|
|
290
300
|
// Releasing exception we own.
|
|
291
|
-
|
|
292
|
-
Py_XDECREF(exception_value);
|
|
293
|
-
Py_XDECREF(exception_tb);
|
|
301
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
294
302
|
|
|
295
303
|
return NULL;
|
|
296
304
|
}
|
|
297
305
|
}
|
|
298
306
|
|
|
299
307
|
static PyObject *_Nuitka_YieldFromGeneratorCore(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator,
|
|
300
|
-
PyObject *
|
|
308
|
+
PyObject *yield_from, PyObject *send_value) {
|
|
301
309
|
// Send iteration value to the sub-generator, which may be a CPython
|
|
302
310
|
// generator object, something with an iterator next, or a send method,
|
|
303
311
|
// where the later is only required if values other than "None" need to
|
|
304
312
|
// be passed in.
|
|
305
|
-
CHECK_OBJECT(
|
|
313
|
+
CHECK_OBJECT(yield_from);
|
|
306
314
|
assert(send_value != NULL || HAS_ERROR_OCCURRED(tstate));
|
|
307
315
|
|
|
308
316
|
PyObject *retval;
|
|
@@ -315,14 +323,13 @@ static PyObject *_Nuitka_YieldFromGeneratorCore(PyThreadState *tstate, struct Nu
|
|
|
315
323
|
PRINT_NEW_LINE();
|
|
316
324
|
#endif
|
|
317
325
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
FETCH_ERROR_OCCURRED(tstate, &exception_type, &exception_value, &exception_tb);
|
|
326
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
327
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &exception_state);
|
|
321
328
|
|
|
322
329
|
// Exception, was thrown into us, need to send that to sub-generator.
|
|
323
|
-
if (
|
|
330
|
+
if (HAS_EXCEPTION_STATE(&exception_state)) {
|
|
324
331
|
// Passing ownership of exception fetch to it.
|
|
325
|
-
retval = _Nuitka_YieldFromPassExceptionTo(tstate,
|
|
332
|
+
retval = _Nuitka_YieldFromPassExceptionTo(tstate, yield_from, &exception_state);
|
|
326
333
|
|
|
327
334
|
// TODO: This wants to look at retval most definitely, send_value is going to be NULL.
|
|
328
335
|
if (unlikely(send_value == NULL)) {
|
|
@@ -335,23 +342,23 @@ static PyObject *_Nuitka_YieldFromGeneratorCore(PyThreadState *tstate, struct Nu
|
|
|
335
342
|
return NULL;
|
|
336
343
|
}
|
|
337
344
|
}
|
|
338
|
-
} else if (PyGen_CheckExact(
|
|
339
|
-
retval = Nuitka_PyGen_Send(tstate, (PyGenObject *)
|
|
345
|
+
} else if (PyGen_CheckExact(yield_from)) {
|
|
346
|
+
retval = Nuitka_PyGen_Send(tstate, (PyGenObject *)yield_from, Py_None);
|
|
340
347
|
}
|
|
341
348
|
#if PYTHON_VERSION >= 0x350
|
|
342
|
-
else if (PyCoro_CheckExact(
|
|
343
|
-
retval = Nuitka_PyGen_Send(tstate, (PyGenObject *)
|
|
349
|
+
else if (PyCoro_CheckExact(yield_from)) {
|
|
350
|
+
retval = Nuitka_PyGen_Send(tstate, (PyGenObject *)yield_from, Py_None);
|
|
344
351
|
}
|
|
345
352
|
#endif
|
|
346
|
-
else if (send_value == Py_None && Py_TYPE(
|
|
347
|
-
retval = Py_TYPE(
|
|
353
|
+
else if (send_value == Py_None && Py_TYPE(yield_from)->tp_iternext != NULL) {
|
|
354
|
+
retval = Py_TYPE(yield_from)->tp_iternext(yield_from);
|
|
348
355
|
} else {
|
|
349
|
-
// Bug compatibility here, before
|
|
356
|
+
// Bug compatibility here, before Python3 tuples were unrolled in calls, which is what
|
|
350
357
|
// PyObject_CallMethod does.
|
|
351
|
-
#if PYTHON_VERSION >=
|
|
352
|
-
retval = PyObject_CallMethodObjArgs(
|
|
358
|
+
#if PYTHON_VERSION >= 0x300
|
|
359
|
+
retval = PyObject_CallMethodObjArgs(yield_from, const_str_plain_send, send_value, NULL);
|
|
353
360
|
#else
|
|
354
|
-
retval = PyObject_CallMethod(
|
|
361
|
+
retval = PyObject_CallMethod(yield_from, (char *)"send", (char *)"O", send_value);
|
|
355
362
|
#endif
|
|
356
363
|
}
|
|
357
364
|
|
|
@@ -360,7 +367,7 @@ static PyObject *_Nuitka_YieldFromGeneratorCore(PyThreadState *tstate, struct Nu
|
|
|
360
367
|
PyObject *error = GET_ERROR_OCCURRED(tstate);
|
|
361
368
|
|
|
362
369
|
if (error == NULL) {
|
|
363
|
-
|
|
370
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
364
371
|
generator->m_returned = Py_None;
|
|
365
372
|
} else if (likely(EXCEPTION_MATCH_BOOL_SINGLE(tstate, error, PyExc_StopIteration))) {
|
|
366
373
|
// The sub-generator has given an exception. In case of
|
|
@@ -382,15 +389,15 @@ static PyObject *Nuitka_YieldFromGeneratorCore(PyThreadState *tstate, struct Nui
|
|
|
382
389
|
CHECK_OBJECT(generator);
|
|
383
390
|
CHECK_OBJECT_X(send_value);
|
|
384
391
|
|
|
385
|
-
PyObject *
|
|
386
|
-
CHECK_OBJECT(
|
|
392
|
+
PyObject *yield_from = generator->m_yield_from;
|
|
393
|
+
CHECK_OBJECT(yield_from);
|
|
387
394
|
|
|
388
395
|
// Need to make it unaccessible while using it.
|
|
389
|
-
generator->
|
|
390
|
-
PyObject *yielded = _Nuitka_YieldFromGeneratorCore(tstate, generator,
|
|
396
|
+
generator->m_yield_from = NULL;
|
|
397
|
+
PyObject *yielded = _Nuitka_YieldFromGeneratorCore(tstate, generator, yield_from, send_value);
|
|
391
398
|
|
|
392
399
|
if (yielded == NULL) {
|
|
393
|
-
Py_DECREF(
|
|
400
|
+
Py_DECREF(yield_from);
|
|
394
401
|
|
|
395
402
|
if (generator->m_returned != NULL) {
|
|
396
403
|
PyObject *yield_from_result = generator->m_returned;
|
|
@@ -403,7 +410,7 @@ static PyObject *Nuitka_YieldFromGeneratorCore(PyThreadState *tstate, struct Nui
|
|
|
403
410
|
}
|
|
404
411
|
|
|
405
412
|
} else {
|
|
406
|
-
generator->
|
|
413
|
+
generator->m_yield_from = yield_from;
|
|
407
414
|
}
|
|
408
415
|
|
|
409
416
|
return yielded;
|
|
@@ -414,7 +421,7 @@ static PyObject *Nuitka_YieldFromGeneratorNext(PyThreadState *tstate, struct Nui
|
|
|
414
421
|
|
|
415
422
|
// Coroutines are already perfect for yielding from.
|
|
416
423
|
#if PYTHON_VERSION >= 0x350
|
|
417
|
-
if (PyCoro_CheckExact(generator->
|
|
424
|
+
if (PyCoro_CheckExact(generator->m_yield_from) || Nuitka_Coroutine_Check(generator->m_yield_from)) {
|
|
418
425
|
if (unlikely((generator->m_code_object->co_flags & CO_ITERABLE_COROUTINE) == 0)) {
|
|
419
426
|
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
|
|
420
427
|
"cannot 'yield from' a coroutine object in a non-coroutine generator");
|
|
@@ -422,10 +429,10 @@ static PyObject *Nuitka_YieldFromGeneratorNext(PyThreadState *tstate, struct Nui
|
|
|
422
429
|
} else
|
|
423
430
|
#endif
|
|
424
431
|
{
|
|
425
|
-
PyObject *new_iterator = MAKE_ITERATOR(tstate, generator->
|
|
432
|
+
PyObject *new_iterator = MAKE_ITERATOR(tstate, generator->m_yield_from);
|
|
426
433
|
if (new_iterator != NULL) {
|
|
427
|
-
Py_DECREF(generator->
|
|
428
|
-
generator->
|
|
434
|
+
Py_DECREF(generator->m_yield_from);
|
|
435
|
+
generator->m_yield_from = new_iterator;
|
|
429
436
|
}
|
|
430
437
|
}
|
|
431
438
|
|
|
@@ -451,35 +458,60 @@ static void _Nuitka_GeneratorPopFrame(PyThreadState *tstate, Nuitka_ThreadStateF
|
|
|
451
458
|
#if PYTHON_VERSION < 0x3b0
|
|
452
459
|
tstate->frame = return_frame;
|
|
453
460
|
#else
|
|
454
|
-
tstate
|
|
461
|
+
CURRENT_TSTATE_INTERPRETER_FRAME(tstate) = return_frame;
|
|
455
462
|
#endif
|
|
456
463
|
|
|
457
464
|
PRINT_TOP_FRAME("Generator pop exit gives top frame:");
|
|
458
465
|
}
|
|
459
466
|
|
|
467
|
+
#if PYTHON_VERSION >= 0x350
|
|
468
|
+
static void RAISE_RUNTIME_ERROR_RAISED_STOP_ITERATION(PyThreadState *tstate, char const *message) {
|
|
469
|
+
|
|
470
|
+
struct Nuitka_ExceptionPreservationItem saved_exception_state;
|
|
471
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
472
|
+
|
|
473
|
+
#if PYTHON_VERSION < 0x3c0
|
|
474
|
+
NORMALIZE_EXCEPTION(tstate, &saved_exception_state.exception_type, &saved_exception_state.exception_value,
|
|
475
|
+
&saved_exception_state.exception_tb);
|
|
476
|
+
#endif
|
|
477
|
+
|
|
478
|
+
struct Nuitka_ExceptionPreservationItem new_exception_state;
|
|
479
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_STR(tstate, &new_exception_state, PyExc_RuntimeError, message);
|
|
480
|
+
|
|
481
|
+
#if PYTHON_VERSION < 0x3c0
|
|
482
|
+
NORMALIZE_EXCEPTION(tstate, &new_exception_state.exception_type, &new_exception_state.exception_value,
|
|
483
|
+
&new_exception_state.exception_tb);
|
|
484
|
+
#endif
|
|
485
|
+
|
|
486
|
+
Py_INCREF(saved_exception_state.exception_value);
|
|
487
|
+
RAISE_EXCEPTION_WITH_CAUSE_STATE(tstate, &new_exception_state, saved_exception_state.exception_value);
|
|
488
|
+
|
|
489
|
+
Py_INCREF(saved_exception_state.exception_value);
|
|
490
|
+
PyException_SetContext(new_exception_state.exception_value, saved_exception_state.exception_value);
|
|
491
|
+
|
|
492
|
+
RELEASE_ERROR_OCCURRED_STATE_X(&saved_exception_state);
|
|
493
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, &new_exception_state);
|
|
494
|
+
}
|
|
495
|
+
#endif
|
|
496
|
+
|
|
460
497
|
static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator,
|
|
461
|
-
PyObject *value,
|
|
462
|
-
PyTracebackObject *exception_tb) {
|
|
498
|
+
PyObject *value, struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
463
499
|
CHECK_OBJECT(generator);
|
|
464
500
|
assert(Nuitka_Generator_Check((PyObject *)generator));
|
|
465
|
-
|
|
466
|
-
CHECK_OBJECT_X(exception_value);
|
|
467
|
-
CHECK_OBJECT_X(exception_tb);
|
|
501
|
+
CHECK_EXCEPTION_STATE_X(exception_state);
|
|
468
502
|
CHECK_OBJECT_X(value);
|
|
469
503
|
assert(PyThreadState_GET() == tstate);
|
|
470
504
|
|
|
471
505
|
#if _DEBUG_GENERATOR
|
|
472
506
|
PRINT_GENERATOR_STATUS("Enter", generator);
|
|
473
507
|
PRINT_COROUTINE_VALUE("value", value);
|
|
474
|
-
|
|
508
|
+
PRINT_EXCEPTION_STATE(exception_state);
|
|
475
509
|
PRINT_CURRENT_EXCEPTION();
|
|
476
510
|
PRINT_NEW_LINE();
|
|
477
511
|
#endif
|
|
478
512
|
|
|
479
513
|
if (value != NULL) {
|
|
480
|
-
|
|
481
|
-
assert(exception_value == NULL);
|
|
482
|
-
assert(exception_tb == NULL);
|
|
514
|
+
ASSERT_EMPTY_EXCEPTION_STATE(exception_state);
|
|
483
515
|
}
|
|
484
516
|
|
|
485
517
|
if (generator->m_status != status_Finished) {
|
|
@@ -521,15 +553,15 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
521
553
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
522
554
|
|
|
523
555
|
// Check for thrown exception, publish it to the generator code.
|
|
524
|
-
if (unlikely(
|
|
556
|
+
if (unlikely(HAS_EXCEPTION_STATE(exception_state))) {
|
|
525
557
|
assert(value == NULL);
|
|
526
558
|
|
|
527
559
|
// Transfer exception ownership to published.
|
|
528
|
-
|
|
560
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
529
561
|
}
|
|
530
562
|
|
|
531
563
|
#if _DEBUG_GENERATOR
|
|
532
|
-
PRINT_GENERATOR_STATUS("Switching to
|
|
564
|
+
PRINT_GENERATOR_STATUS("Switching to generator", generator);
|
|
533
565
|
PRINT_COROUTINE_VALUE("value", value);
|
|
534
566
|
PRINT_CURRENT_EXCEPTION();
|
|
535
567
|
PRINT_NEW_LINE();
|
|
@@ -539,7 +571,7 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
539
571
|
PyObject *yielded;
|
|
540
572
|
|
|
541
573
|
#if PYTHON_VERSION >= 0x300
|
|
542
|
-
if (generator->
|
|
574
|
+
if (generator->m_yield_from == NULL) {
|
|
543
575
|
yielded = ((generator_code)generator->m_code)(tstate, generator, value);
|
|
544
576
|
} else {
|
|
545
577
|
// This does not release the value if any, so we need to do it afterwards.
|
|
@@ -552,9 +584,9 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
552
584
|
assert(PyThreadState_GET() == tstate);
|
|
553
585
|
|
|
554
586
|
#if PYTHON_VERSION >= 0x300
|
|
555
|
-
// If the generator returns with
|
|
587
|
+
// If the generator returns with m_yield_from set, it wants us to yield
|
|
556
588
|
// from that value from now on.
|
|
557
|
-
while (yielded == NULL && generator->
|
|
589
|
+
while (yielded == NULL && generator->m_yield_from != NULL) {
|
|
558
590
|
yielded = Nuitka_YieldFromGeneratorNext(tstate, generator);
|
|
559
591
|
}
|
|
560
592
|
#endif
|
|
@@ -567,7 +599,9 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
567
599
|
// assert(tstate->frame == &generator->m_frame->m_frame);
|
|
568
600
|
assertFrameObject(generator->m_frame);
|
|
569
601
|
|
|
570
|
-
|
|
602
|
+
if (generator->m_frame->m_frame.f_back) {
|
|
603
|
+
Py_CLEAR(generator->m_frame->m_frame.f_back);
|
|
604
|
+
}
|
|
571
605
|
}
|
|
572
606
|
|
|
573
607
|
// Return back to the frame that called us.
|
|
@@ -589,7 +623,7 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
589
623
|
Nuitka_MarkGeneratorAsFinished(generator);
|
|
590
624
|
|
|
591
625
|
if (generator->m_frame != NULL) {
|
|
592
|
-
#if PYTHON_VERSION >=
|
|
626
|
+
#if PYTHON_VERSION >= 0x300
|
|
593
627
|
Nuitka_SetFrameGenerator(generator->m_frame, NULL);
|
|
594
628
|
#endif
|
|
595
629
|
Py_DECREF(generator->m_frame);
|
|
@@ -612,30 +646,7 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
612
646
|
generator->m_code_object->co_flags & CO_FUTURE_GENERATOR_STOP &&
|
|
613
647
|
#endif
|
|
614
648
|
GET_ERROR_OCCURRED(tstate) == PyExc_StopIteration) {
|
|
615
|
-
|
|
616
|
-
PyTracebackObject *saved_exception_tb;
|
|
617
|
-
|
|
618
|
-
// TODO: For Python3.12, this kind of code ought to use tstate methods entirely.
|
|
619
|
-
FETCH_ERROR_OCCURRED(tstate, &saved_exception_type, &saved_exception_value, &saved_exception_tb);
|
|
620
|
-
NORMALIZE_EXCEPTION(tstate, &saved_exception_type, &saved_exception_value, &saved_exception_tb);
|
|
621
|
-
|
|
622
|
-
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "generator raised StopIteration");
|
|
623
|
-
|
|
624
|
-
FETCH_ERROR_OCCURRED(tstate, &exception_type, &exception_value, &exception_tb);
|
|
625
|
-
|
|
626
|
-
RAISE_EXCEPTION_WITH_CAUSE(tstate, &exception_type, &exception_value, &exception_tb,
|
|
627
|
-
saved_exception_value);
|
|
628
|
-
|
|
629
|
-
CHECK_OBJECT(exception_value);
|
|
630
|
-
CHECK_OBJECT(saved_exception_value);
|
|
631
|
-
|
|
632
|
-
Py_INCREF(saved_exception_value);
|
|
633
|
-
PyException_SetContext(exception_value, saved_exception_value);
|
|
634
|
-
|
|
635
|
-
Py_DECREF(saved_exception_type);
|
|
636
|
-
Py_XDECREF(saved_exception_tb);
|
|
637
|
-
|
|
638
|
-
RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
|
|
649
|
+
RAISE_RUNTIME_ERROR_RAISED_STOP_ITERATION(tstate, "generator raised StopIteration");
|
|
639
650
|
|
|
640
651
|
return NULL;
|
|
641
652
|
}
|
|
@@ -697,9 +708,9 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
697
708
|
tstate->exc_value = Py_None;
|
|
698
709
|
tstate->exc_traceback = (PyObject *)Py_None;
|
|
699
710
|
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
711
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
712
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
713
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
703
714
|
|
|
704
715
|
Py_XDECREF(old_type);
|
|
705
716
|
Py_XDECREF(old_value);
|
|
@@ -725,9 +736,11 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
725
736
|
}
|
|
726
737
|
|
|
727
738
|
static PyObject *Nuitka_Generator_send(struct Nuitka_GeneratorObject *generator, PyObject *value) {
|
|
739
|
+
CHECK_OBJECT(value);
|
|
740
|
+
|
|
728
741
|
PyThreadState *tstate = PyThreadState_GET();
|
|
729
742
|
|
|
730
|
-
if (generator->m_status == status_Unused && value !=
|
|
743
|
+
if (generator->m_status == status_Unused && value != Py_None) {
|
|
731
744
|
// Buggy CPython 3.10 refuses to allow later usage.
|
|
732
745
|
#if PYTHON_VERSION >= 0x3a0 && PYTHON_VERSION < 0x3a2
|
|
733
746
|
Nuitka_MarkGeneratorAsFinished(generator);
|
|
@@ -740,7 +753,11 @@ static PyObject *Nuitka_Generator_send(struct Nuitka_GeneratorObject *generator,
|
|
|
740
753
|
|
|
741
754
|
// We need to transfer ownership of the sent value.
|
|
742
755
|
Py_INCREF(value);
|
|
743
|
-
|
|
756
|
+
|
|
757
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
758
|
+
INIT_ERROR_OCCURRED_STATE(&exception_state);
|
|
759
|
+
|
|
760
|
+
PyObject *result = _Nuitka_Generator_send(tstate, generator, value, &exception_state);
|
|
744
761
|
|
|
745
762
|
if (result == NULL) {
|
|
746
763
|
if (HAS_ERROR_OCCURRED(tstate) == false) {
|
|
@@ -754,15 +771,23 @@ static PyObject *Nuitka_Generator_send(struct Nuitka_GeneratorObject *generator,
|
|
|
754
771
|
static PyObject *Nuitka_Generator_tp_iternext(struct Nuitka_GeneratorObject *generator) {
|
|
755
772
|
PyThreadState *tstate = PyThreadState_GET();
|
|
756
773
|
|
|
757
|
-
|
|
758
|
-
|
|
774
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
775
|
+
|
|
776
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
777
|
+
INIT_ERROR_OCCURRED_STATE(&exception_state);
|
|
778
|
+
|
|
779
|
+
return _Nuitka_Generator_send(tstate, generator, Py_None, &exception_state);
|
|
759
780
|
}
|
|
760
781
|
|
|
761
782
|
/* Our own qiter interface, which is for quicker simple loop style iteration,
|
|
762
783
|
that does not send anything in. */
|
|
763
784
|
PyObject *Nuitka_Generator_qiter(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator, bool *finished) {
|
|
764
|
-
|
|
765
|
-
|
|
785
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
786
|
+
|
|
787
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
788
|
+
INIT_ERROR_OCCURRED_STATE(&exception_state);
|
|
789
|
+
|
|
790
|
+
PyObject *result = _Nuitka_Generator_send(tstate, generator, Py_None, &exception_state);
|
|
766
791
|
|
|
767
792
|
if (result == NULL) {
|
|
768
793
|
if (unlikely(!CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(tstate))) {
|
|
@@ -798,9 +823,10 @@ static bool _Nuitka_Generator_close(PyThreadState *tstate, struct Nuitka_Generat
|
|
|
798
823
|
CHECK_OBJECT(generator);
|
|
799
824
|
|
|
800
825
|
if (generator->m_status == status_Running) {
|
|
801
|
-
|
|
826
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
827
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, &exception_state, PyExc_GeneratorExit, NULL, NULL);
|
|
802
828
|
|
|
803
|
-
PyObject *result = _Nuitka_Generator_send(tstate, generator, NULL,
|
|
829
|
+
PyObject *result = _Nuitka_Generator_send(tstate, generator, NULL, &exception_state);
|
|
804
830
|
|
|
805
831
|
if (unlikely(result)) {
|
|
806
832
|
Py_DECREF(result);
|
|
@@ -831,20 +857,15 @@ static PyObject *Nuitka_Generator_close(struct Nuitka_GeneratorObject *generator
|
|
|
831
857
|
if (unlikely(r == false)) {
|
|
832
858
|
return NULL;
|
|
833
859
|
} else {
|
|
834
|
-
|
|
860
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
835
861
|
return Py_None;
|
|
836
862
|
}
|
|
837
863
|
}
|
|
838
864
|
|
|
839
|
-
|
|
840
|
-
static bool
|
|
841
|
-
|
|
842
|
-
CHECK_OBJECT(*exception_type);
|
|
843
|
-
CHECK_OBJECT_X(*exception_value);
|
|
844
|
-
CHECK_OBJECT_X(*exception_tb);
|
|
845
|
-
|
|
865
|
+
#if PYTHON_VERSION >= 0x3c0
|
|
866
|
+
static bool _Nuitka_Generator_check_throw_args(PyThreadState *tstate, PyObject **exception_type,
|
|
867
|
+
PyObject **exception_value, PyTracebackObject **exception_tb) {
|
|
846
868
|
if (*exception_tb == (PyTracebackObject *)Py_None) {
|
|
847
|
-
Py_DECREF(*exception_tb);
|
|
848
869
|
*exception_tb = NULL;
|
|
849
870
|
} else if (*exception_tb != NULL && !PyTraceBack_Check(*exception_tb)) {
|
|
850
871
|
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "throw() third argument must be a traceback object");
|
|
@@ -852,7 +873,6 @@ static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exc
|
|
|
852
873
|
}
|
|
853
874
|
|
|
854
875
|
if (PyExceptionClass_Check(*exception_type)) {
|
|
855
|
-
// TODO: Must not / need not normalize here?
|
|
856
876
|
NORMALIZE_EXCEPTION(tstate, exception_type, exception_value, exception_tb);
|
|
857
877
|
} else if (PyExceptionInstance_Check(*exception_type)) {
|
|
858
878
|
if (*exception_value != NULL && *exception_value != Py_None) {
|
|
@@ -862,10 +882,8 @@ static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exc
|
|
|
862
882
|
}
|
|
863
883
|
|
|
864
884
|
// Release old None value and replace it with the object, then set the exception type
|
|
865
|
-
// from the class.
|
|
866
|
-
Py_XDECREF(*exception_value);
|
|
885
|
+
// from the class. The "None" is known immortal here and needs no refcount correction.
|
|
867
886
|
*exception_value = *exception_type;
|
|
868
|
-
|
|
869
887
|
*exception_type = PyExceptionInstance_Class(*exception_type);
|
|
870
888
|
Py_INCREF(*exception_type);
|
|
871
889
|
} else {
|
|
@@ -883,10 +901,95 @@ static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exc
|
|
|
883
901
|
return true;
|
|
884
902
|
|
|
885
903
|
failed_throw:
|
|
904
|
+
|
|
905
|
+
return false;
|
|
906
|
+
}
|
|
907
|
+
#endif
|
|
908
|
+
|
|
909
|
+
static bool _Nuitka_Generator_make_throw_exception_state(PyThreadState *tstate,
|
|
910
|
+
struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
911
|
+
PyObject *exception_type, PyObject *exception_value,
|
|
912
|
+
PyTracebackObject *exception_tb) {
|
|
913
|
+
|
|
914
|
+
#if PYTHON_VERSION >= 0x3c0
|
|
915
|
+
Py_INCREF(exception_type);
|
|
916
|
+
Py_XINCREF(exception_value);
|
|
917
|
+
Py_XINCREF(exception_tb);
|
|
918
|
+
|
|
919
|
+
if (_Nuitka_Generator_check_throw_args(tstate, &exception_type, &exception_value, &exception_tb) == false) {
|
|
920
|
+
Py_DECREF(exception_type);
|
|
921
|
+
Py_XDECREF(exception_value);
|
|
922
|
+
Py_XDECREF(exception_tb);
|
|
923
|
+
|
|
924
|
+
return false;
|
|
925
|
+
}
|
|
926
|
+
#endif
|
|
927
|
+
|
|
928
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, exception_state, exception_type, exception_value, exception_tb);
|
|
929
|
+
|
|
930
|
+
#if PYTHON_VERSION >= 0x3c0
|
|
931
|
+
Py_DECREF(exception_type);
|
|
932
|
+
Py_XDECREF(exception_value);
|
|
933
|
+
Py_XDECREF(exception_tb);
|
|
934
|
+
#endif
|
|
935
|
+
|
|
936
|
+
return true;
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
// Shared code for checking a thrown exception, coroutines, asyncgen, uncompiled
|
|
940
|
+
// ones do this too. For pre-3.12, the checking needs to be done late, for 3.12
|
|
941
|
+
// early, so it's a separate function.
|
|
942
|
+
static bool _Nuitka_Generator_check_throw(PyThreadState *tstate,
|
|
943
|
+
struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
944
|
+
CHECK_EXCEPTION_STATE(exception_state);
|
|
945
|
+
|
|
946
|
+
#if PYTHON_VERSION < 0x3c0
|
|
947
|
+
if (exception_state->exception_tb == (PyTracebackObject *)Py_None) {
|
|
948
|
+
Py_DECREF(exception_state->exception_tb);
|
|
949
|
+
exception_state->exception_tb = NULL;
|
|
950
|
+
} else if (exception_state->exception_tb != NULL && !PyTraceBack_Check(exception_state->exception_tb)) {
|
|
951
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "throw() third argument must be a traceback object");
|
|
952
|
+
goto failed_throw;
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
if (PyExceptionClass_Check(exception_state->exception_type)) {
|
|
956
|
+
// TODO: Must not / need not normalize here?
|
|
957
|
+
NORMALIZE_EXCEPTION(tstate, &exception_state->exception_type, &exception_state->exception_value,
|
|
958
|
+
&exception_state->exception_tb);
|
|
959
|
+
} else if (PyExceptionInstance_Check(exception_state->exception_type)) {
|
|
960
|
+
if (exception_state->exception_value != NULL && exception_state->exception_value != Py_None) {
|
|
961
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
|
|
962
|
+
"instance exception may not have a separate value");
|
|
963
|
+
goto failed_throw;
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
// Release old None value and replace it with the object, then set the exception type
|
|
967
|
+
// from the class.
|
|
968
|
+
Py_XDECREF(exception_state->exception_value);
|
|
969
|
+
exception_state->exception_value = exception_state->exception_type;
|
|
970
|
+
|
|
971
|
+
exception_state->exception_type = PyExceptionInstance_Class(exception_state->exception_type);
|
|
972
|
+
Py_INCREF(exception_state->exception_type);
|
|
973
|
+
} else {
|
|
974
|
+
#if PYTHON_VERSION < 0x300
|
|
975
|
+
PyErr_Format(PyExc_TypeError, "exceptions must be classes, or instances, not %s",
|
|
976
|
+
Py_TYPE(exception_state->exception_type)->tp_name);
|
|
977
|
+
#else
|
|
978
|
+
PyErr_Format(PyExc_TypeError, "exceptions must be classes or instances deriving from BaseException, not %s",
|
|
979
|
+
Py_TYPE(exception_state->exception_type)->tp_name);
|
|
980
|
+
#endif
|
|
981
|
+
|
|
982
|
+
goto failed_throw;
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
#endif
|
|
986
|
+
return true;
|
|
987
|
+
|
|
988
|
+
#if PYTHON_VERSION < 0x3c0
|
|
989
|
+
failed_throw:
|
|
990
|
+
#endif
|
|
886
991
|
// Release exception, we are done with it now.
|
|
887
|
-
|
|
888
|
-
Py_XDECREF(*exception_value);
|
|
889
|
-
Py_XDECREF(*exception_tb);
|
|
992
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
890
993
|
|
|
891
994
|
return false;
|
|
892
995
|
}
|
|
@@ -902,49 +1005,49 @@ static bool _Nuitka_Asyncgen_close(PyThreadState *tstate, struct Nuitka_Asyncgen
|
|
|
902
1005
|
#endif
|
|
903
1006
|
|
|
904
1007
|
// Note: This is also used for coroutines and asyncgen
|
|
905
|
-
static bool Nuitka_gen_close_iter(PyThreadState *tstate, PyObject *
|
|
1008
|
+
static bool Nuitka_gen_close_iter(PyThreadState *tstate, PyObject *yield_from) {
|
|
906
1009
|
#if _DEBUG_GENERATOR
|
|
907
1010
|
PRINT_STRING("Nuitka_gen_close_iter: Enter\n");
|
|
908
1011
|
#endif
|
|
909
1012
|
|
|
910
|
-
CHECK_OBJECT(
|
|
1013
|
+
CHECK_OBJECT(yield_from);
|
|
911
1014
|
|
|
912
|
-
// TODO: Could specialize depending in
|
|
1015
|
+
// TODO: Could specialize depending in yield_from type for performance. Many
|
|
913
1016
|
// times these will be our own ones, or known ones like uncompiled
|
|
914
1017
|
// generators.
|
|
915
|
-
if (Nuitka_Generator_Check(
|
|
1018
|
+
if (Nuitka_Generator_Check(yield_from)) {
|
|
916
1019
|
#if _DEBUG_GENERATOR
|
|
917
1020
|
PRINT_STRING("Nuitka_gen_close_iter: Defer to _Nuitka_Generator_close\n");
|
|
918
1021
|
#endif
|
|
919
|
-
return _Nuitka_Generator_close(tstate, (struct Nuitka_GeneratorObject *)
|
|
1022
|
+
return _Nuitka_Generator_close(tstate, (struct Nuitka_GeneratorObject *)yield_from);
|
|
920
1023
|
}
|
|
921
1024
|
|
|
922
1025
|
#if PYTHON_VERSION >= 0x350
|
|
923
|
-
if (Nuitka_Coroutine_Check(
|
|
1026
|
+
if (Nuitka_Coroutine_Check(yield_from)) {
|
|
924
1027
|
#if _DEBUG_GENERATOR
|
|
925
1028
|
PRINT_STRING("Nuitka_gen_close_iter: Defer to _Nuitka_Coroutine_close\n");
|
|
926
1029
|
#endif
|
|
927
|
-
return _Nuitka_Coroutine_close(tstate, (struct Nuitka_CoroutineObject *)
|
|
1030
|
+
return _Nuitka_Coroutine_close(tstate, (struct Nuitka_CoroutineObject *)yield_from);
|
|
928
1031
|
}
|
|
929
1032
|
#endif
|
|
930
1033
|
|
|
931
1034
|
#if PYTHON_VERSION >= 0x360
|
|
932
|
-
if (Nuitka_Asyncgen_Check(
|
|
1035
|
+
if (Nuitka_Asyncgen_Check(yield_from)) {
|
|
933
1036
|
#if _DEBUG_GENERATOR
|
|
934
1037
|
PRINT_STRING("Nuitka_gen_close_iter: Defer to _Nuitka_Asyncgen_close\n");
|
|
935
1038
|
#endif
|
|
936
|
-
return _Nuitka_Asyncgen_close(tstate, (struct Nuitka_AsyncgenObject *)
|
|
1039
|
+
return _Nuitka_Asyncgen_close(tstate, (struct Nuitka_AsyncgenObject *)yield_from);
|
|
937
1040
|
}
|
|
938
1041
|
#endif
|
|
939
1042
|
|
|
940
|
-
PyObject *meth = PyObject_GetAttr(
|
|
1043
|
+
PyObject *meth = PyObject_GetAttr(yield_from, const_str_plain_close);
|
|
941
1044
|
|
|
942
1045
|
if (unlikely(meth == NULL)) {
|
|
943
1046
|
if (unlikely(!PyErr_ExceptionMatches(PyExc_AttributeError))) {
|
|
944
1047
|
#if _DEBUG_GENERATOR
|
|
945
1048
|
PRINT_STRING("Nuitka_gen_close_iter: Strange error while looking up close method.\n");
|
|
946
1049
|
#endif
|
|
947
|
-
PyErr_WriteUnraisable(
|
|
1050
|
+
PyErr_WriteUnraisable(yield_from);
|
|
948
1051
|
}
|
|
949
1052
|
|
|
950
1053
|
CLEAR_ERROR_OCCURRED(tstate);
|
|
@@ -980,113 +1083,105 @@ static bool Nuitka_gen_close_iter(PyThreadState *tstate, PyObject *yieldfrom) {
|
|
|
980
1083
|
static bool Nuitka_AsyncgenAsend_Check(PyObject *object);
|
|
981
1084
|
struct Nuitka_AsyncgenAsendObject;
|
|
982
1085
|
static PyObject *_Nuitka_AsyncgenAsend_throw2(PyThreadState *tstate, struct Nuitka_AsyncgenAsendObject *asyncgen_asend,
|
|
983
|
-
|
|
984
|
-
PyTracebackObject *exception_tb);
|
|
1086
|
+
struct Nuitka_ExceptionPreservationItem *exception_state);
|
|
985
1087
|
#endif
|
|
986
1088
|
|
|
987
1089
|
static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator,
|
|
988
|
-
|
|
989
|
-
PyTracebackObject *exception_tb) {
|
|
1090
|
+
struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
990
1091
|
#if _DEBUG_GENERATOR
|
|
991
1092
|
PRINT_GENERATOR_STATUS("Enter", generator);
|
|
992
|
-
PRINT_COROUTINE_VALUE("
|
|
993
|
-
|
|
1093
|
+
PRINT_COROUTINE_VALUE("yield_from", generator->m_yield_from);
|
|
1094
|
+
PRINT_EXCEPTION_STATE(exception_state);
|
|
994
1095
|
PRINT_NEW_LINE();
|
|
995
1096
|
#endif
|
|
996
1097
|
|
|
997
1098
|
CHECK_OBJECT(generator);
|
|
998
1099
|
assert(Nuitka_Generator_Check((PyObject *)generator));
|
|
999
|
-
|
|
1000
|
-
CHECK_OBJECT_X(exception_value);
|
|
1001
|
-
CHECK_OBJECT_X(exception_tb);
|
|
1100
|
+
CHECK_EXCEPTION_STATE(exception_state);
|
|
1002
1101
|
|
|
1003
1102
|
#if PYTHON_VERSION >= 0x300
|
|
1004
|
-
if (generator->
|
|
1005
|
-
if (
|
|
1103
|
+
if (generator->m_yield_from != NULL) {
|
|
1104
|
+
if (EXCEPTION_STATE_MATCH_BOOL_SINGLE(tstate, exception_state, PyExc_GeneratorExit)) {
|
|
1006
1105
|
// Generators need to close the yield_from.
|
|
1007
1106
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1008
|
-
bool res = Nuitka_gen_close_iter(tstate, generator->
|
|
1107
|
+
bool res = Nuitka_gen_close_iter(tstate, generator->m_yield_from);
|
|
1009
1108
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1010
1109
|
|
|
1011
1110
|
if (res == false) {
|
|
1012
1111
|
// Release exception, we are done with it now and pick up the new one.
|
|
1013
|
-
|
|
1014
|
-
Py_XDECREF(exception_value);
|
|
1015
|
-
Py_XDECREF(exception_tb);
|
|
1112
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
1016
1113
|
|
|
1017
|
-
|
|
1114
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
1018
1115
|
}
|
|
1019
1116
|
|
|
1020
1117
|
// Transferred exception ownership to "_Nuitka_Generator_send".
|
|
1021
|
-
return _Nuitka_Generator_send(tstate, generator, NULL,
|
|
1118
|
+
return _Nuitka_Generator_send(tstate, generator, NULL, exception_state);
|
|
1022
1119
|
}
|
|
1023
1120
|
|
|
1024
1121
|
PyObject *ret;
|
|
1025
1122
|
|
|
1026
1123
|
#if _DEBUG_GENERATOR
|
|
1027
1124
|
PRINT_GENERATOR_STATUS("Passing to yielded from", generator);
|
|
1028
|
-
PRINT_COROUTINE_VALUE("
|
|
1125
|
+
PRINT_COROUTINE_VALUE("m_yield_from", generator->m_yield_from);
|
|
1029
1126
|
PRINT_NEW_LINE();
|
|
1030
1127
|
#endif
|
|
1031
1128
|
|
|
1032
|
-
if (Nuitka_Generator_Check(generator->
|
|
1033
|
-
struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)generator->
|
|
1129
|
+
if (Nuitka_Generator_Check(generator->m_yield_from)) {
|
|
1130
|
+
struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)generator->m_yield_from);
|
|
1034
1131
|
// Transferred exception ownership to "_Nuitka_Generator_throw2".
|
|
1035
1132
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1036
|
-
ret = _Nuitka_Generator_throw2(tstate, gen,
|
|
1133
|
+
ret = _Nuitka_Generator_throw2(tstate, gen, exception_state);
|
|
1037
1134
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1038
1135
|
#if NUITKA_UNCOMPILED_THROW_INTEGRATION
|
|
1039
|
-
} else if (PyGen_CheckExact(generator->
|
|
1040
|
-
PyGenObject *gen = (PyGenObject *)generator->
|
|
1136
|
+
} else if (PyGen_CheckExact(generator->m_yield_from)) {
|
|
1137
|
+
PyGenObject *gen = (PyGenObject *)generator->m_yield_from;
|
|
1041
1138
|
|
|
1042
1139
|
// Transferred exception ownership to "Nuitka_UncompiledGenerator_throw".
|
|
1043
1140
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1044
|
-
ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1,
|
|
1141
|
+
ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
|
|
1045
1142
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1046
1143
|
#endif
|
|
1047
1144
|
#if PYTHON_VERSION >= 0x350
|
|
1048
|
-
} else if (Nuitka_Coroutine_Check(generator->
|
|
1049
|
-
struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)generator->
|
|
1145
|
+
} else if (Nuitka_Coroutine_Check(generator->m_yield_from)) {
|
|
1146
|
+
struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)generator->m_yield_from);
|
|
1050
1147
|
// Transferred exception ownership to "_Nuitka_Coroutine_throw2".
|
|
1051
1148
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1052
|
-
ret = _Nuitka_Coroutine_throw2(tstate, coro, true,
|
|
1149
|
+
ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
|
|
1053
1150
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1054
|
-
} else if (Nuitka_CoroutineWrapper_Check(generator->
|
|
1151
|
+
} else if (Nuitka_CoroutineWrapper_Check(generator->m_yield_from)) {
|
|
1055
1152
|
struct Nuitka_CoroutineObject *coro =
|
|
1056
|
-
((struct Nuitka_CoroutineWrapperObject *)generator->
|
|
1153
|
+
((struct Nuitka_CoroutineWrapperObject *)generator->m_yield_from)->m_coroutine;
|
|
1057
1154
|
|
|
1058
1155
|
// Transferred exception ownership to "_Nuitka_Coroutine_throw2".
|
|
1059
1156
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1060
|
-
ret = _Nuitka_Coroutine_throw2(tstate, coro, true,
|
|
1157
|
+
ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
|
|
1061
1158
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1062
1159
|
#if NUITKA_UNCOMPILED_THROW_INTEGRATION
|
|
1063
|
-
} else if (PyCoro_CheckExact(generator->
|
|
1064
|
-
PyGenObject *gen = (PyGenObject *)generator->
|
|
1160
|
+
} else if (PyCoro_CheckExact(generator->m_yield_from)) {
|
|
1161
|
+
PyGenObject *gen = (PyGenObject *)generator->m_yield_from;
|
|
1065
1162
|
|
|
1066
1163
|
// Transferred exception ownership to "Nuitka_UncompiledGenerator_throw".
|
|
1067
1164
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1068
|
-
ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1,
|
|
1165
|
+
ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
|
|
1069
1166
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1070
1167
|
#endif
|
|
1071
1168
|
#if PYTHON_VERSION >= 0x360
|
|
1072
|
-
} else if (Nuitka_AsyncgenAsend_Check(generator->
|
|
1169
|
+
} else if (Nuitka_AsyncgenAsend_Check(generator->m_yield_from)) {
|
|
1073
1170
|
struct Nuitka_AsyncgenAsendObject *asyncgen_asend =
|
|
1074
|
-
((struct Nuitka_AsyncgenAsendObject *)generator->
|
|
1171
|
+
((struct Nuitka_AsyncgenAsendObject *)generator->m_yield_from);
|
|
1075
1172
|
|
|
1076
1173
|
// Transferred exception ownership to "_Nuitka_AsyncgenAsend_throw2".
|
|
1077
1174
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1078
|
-
ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend,
|
|
1175
|
+
ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend, exception_state);
|
|
1079
1176
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1080
1177
|
#endif
|
|
1081
1178
|
#endif
|
|
1082
1179
|
} else {
|
|
1083
|
-
PyObject *meth = PyObject_GetAttr(generator->
|
|
1180
|
+
PyObject *meth = PyObject_GetAttr(generator->m_yield_from, const_str_plain_throw);
|
|
1084
1181
|
if (unlikely(meth == NULL)) {
|
|
1085
1182
|
if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
|
|
1086
1183
|
// Release exception, we are done with it now.
|
|
1087
|
-
|
|
1088
|
-
Py_XDECREF(exception_value);
|
|
1089
|
-
Py_XDECREF(exception_tb);
|
|
1184
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
1090
1185
|
|
|
1091
1186
|
return NULL;
|
|
1092
1187
|
}
|
|
@@ -1097,35 +1192,33 @@ static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate, struct Nuitka_G
|
|
|
1097
1192
|
goto throw_here;
|
|
1098
1193
|
}
|
|
1099
1194
|
|
|
1100
|
-
|
|
1195
|
+
CHECK_EXCEPTION_STATE(exception_state);
|
|
1101
1196
|
|
|
1102
1197
|
#if 0
|
|
1103
1198
|
// TODO: Add slow mode traces.
|
|
1104
|
-
PRINT_ITEM(coroutine->
|
|
1199
|
+
PRINT_ITEM(coroutine->m_yield_from);
|
|
1105
1200
|
PRINT_NEW_LINE();
|
|
1106
1201
|
#endif
|
|
1107
1202
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1108
|
-
ret =
|
|
1203
|
+
ret = Nuitka_CallGeneratorThrowMethod(meth, exception_state);
|
|
1109
1204
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1110
1205
|
|
|
1111
1206
|
Py_DECREF(meth);
|
|
1112
1207
|
|
|
1113
1208
|
// Release exception, we are done with it now.
|
|
1114
|
-
|
|
1115
|
-
Py_XDECREF(exception_value);
|
|
1116
|
-
Py_XDECREF(exception_tb);
|
|
1209
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
1117
1210
|
}
|
|
1118
1211
|
|
|
1119
1212
|
if (unlikely(ret == NULL)) {
|
|
1120
1213
|
// Return value or exception, not to continue with yielding from.
|
|
1121
|
-
if (generator->
|
|
1122
|
-
CHECK_OBJECT(generator->
|
|
1214
|
+
if (generator->m_yield_from != NULL) {
|
|
1215
|
+
CHECK_OBJECT(generator->m_yield_from);
|
|
1123
1216
|
#if _DEBUG_GENERATOR
|
|
1124
1217
|
PRINT_GENERATOR_STATUS("Null return, yield from removal:", generator);
|
|
1125
|
-
PRINT_COROUTINE_VALUE("
|
|
1218
|
+
PRINT_COROUTINE_VALUE("yield_from", generator->m_yield_from);
|
|
1126
1219
|
#endif
|
|
1127
|
-
Py_DECREF(generator->
|
|
1128
|
-
generator->
|
|
1220
|
+
Py_DECREF(generator->m_yield_from);
|
|
1221
|
+
generator->m_yield_from = NULL;
|
|
1129
1222
|
}
|
|
1130
1223
|
|
|
1131
1224
|
PyObject *val;
|
|
@@ -1138,14 +1231,21 @@ static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate, struct Nuitka_G
|
|
|
1138
1231
|
PRINT_NEW_LINE();
|
|
1139
1232
|
#endif
|
|
1140
1233
|
|
|
1141
|
-
|
|
1234
|
+
struct Nuitka_ExceptionPreservationItem no_exception_state;
|
|
1235
|
+
INIT_ERROR_OCCURRED_STATE(&no_exception_state);
|
|
1236
|
+
|
|
1237
|
+
ret = _Nuitka_Generator_send(tstate, generator, val, &no_exception_state);
|
|
1142
1238
|
} else {
|
|
1143
1239
|
#if _DEBUG_GENERATOR
|
|
1144
1240
|
PRINT_GENERATOR_STATUS("Sending exception value into ourselves", generator);
|
|
1145
1241
|
PRINT_CURRENT_EXCEPTION();
|
|
1146
1242
|
PRINT_NEW_LINE();
|
|
1147
1243
|
#endif
|
|
1148
|
-
|
|
1244
|
+
|
|
1245
|
+
struct Nuitka_ExceptionPreservationItem no_exception_state;
|
|
1246
|
+
INIT_ERROR_OCCURRED_STATE(&no_exception_state);
|
|
1247
|
+
|
|
1248
|
+
ret = _Nuitka_Generator_send(tstate, generator, NULL, &no_exception_state);
|
|
1149
1249
|
}
|
|
1150
1250
|
|
|
1151
1251
|
#if _DEBUG_GENERATOR
|
|
@@ -1171,15 +1271,14 @@ throw_here:
|
|
|
1171
1271
|
|
|
1172
1272
|
// We continue to have exception ownership here.
|
|
1173
1273
|
|
|
1174
|
-
if (unlikely(
|
|
1175
|
-
// Exception was released by
|
|
1274
|
+
if (unlikely(_Nuitka_Generator_check_throw(tstate, exception_state) == false)) {
|
|
1275
|
+
// Exception was released by _Nuitka_Generator_check_throw already.
|
|
1176
1276
|
return NULL;
|
|
1177
1277
|
}
|
|
1178
1278
|
|
|
1179
1279
|
if (generator->m_status == status_Running) {
|
|
1180
1280
|
// Passing exception ownership to _Nuitka_Generator_send
|
|
1181
|
-
PyObject *result =
|
|
1182
|
-
_Nuitka_Generator_send(tstate, generator, NULL, exception_type, exception_value, exception_tb);
|
|
1281
|
+
PyObject *result = _Nuitka_Generator_send(tstate, generator, NULL, exception_state);
|
|
1183
1282
|
|
|
1184
1283
|
if (result == NULL) {
|
|
1185
1284
|
if (GET_ERROR_OCCURRED(tstate) == NULL) {
|
|
@@ -1189,21 +1288,24 @@ throw_here:
|
|
|
1189
1288
|
|
|
1190
1289
|
return result;
|
|
1191
1290
|
} else if (generator->m_status == status_Finished) {
|
|
1192
|
-
|
|
1291
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
1193
1292
|
|
|
1194
1293
|
return NULL;
|
|
1195
1294
|
} else {
|
|
1295
|
+
PyTracebackObject *exception_tb = GET_EXCEPTION_STATE_TRACEBACK(exception_state);
|
|
1296
|
+
|
|
1196
1297
|
if (exception_tb == NULL) {
|
|
1197
1298
|
// TODO: Our compiled objects really need a way to store common
|
|
1198
1299
|
// stuff in a "shared" part across all instances, and outside of
|
|
1199
1300
|
// run time, so we could reuse this.
|
|
1200
1301
|
struct Nuitka_FrameObject *frame =
|
|
1201
1302
|
MAKE_FUNCTION_FRAME(tstate, generator->m_code_object, generator->m_module, 0);
|
|
1202
|
-
|
|
1303
|
+
SET_EXCEPTION_STATE_TRACEBACK(exception_state,
|
|
1304
|
+
MAKE_TRACEBACK(frame, generator->m_code_object->co_firstlineno));
|
|
1203
1305
|
Py_DECREF(frame);
|
|
1204
1306
|
}
|
|
1205
1307
|
|
|
1206
|
-
|
|
1308
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
1207
1309
|
|
|
1208
1310
|
Nuitka_MarkGeneratorAsFinished(generator);
|
|
1209
1311
|
|
|
@@ -1223,14 +1325,16 @@ static PyObject *Nuitka_Generator_throw(struct Nuitka_GeneratorObject *generator
|
|
|
1223
1325
|
return NULL;
|
|
1224
1326
|
}
|
|
1225
1327
|
|
|
1226
|
-
// Handing ownership of exception over, we need not release it ourselves
|
|
1227
|
-
Py_INCREF(exception_type);
|
|
1228
|
-
Py_XINCREF(exception_value);
|
|
1229
|
-
Py_XINCREF(exception_tb);
|
|
1230
|
-
|
|
1231
1328
|
PyThreadState *tstate = PyThreadState_GET();
|
|
1232
1329
|
|
|
1233
|
-
|
|
1330
|
+
// Handing ownership of exception over, we need not release it ourselves
|
|
1331
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
1332
|
+
if (_Nuitka_Generator_make_throw_exception_state(tstate, &exception_state, exception_type, exception_value,
|
|
1333
|
+
exception_tb) == false) {
|
|
1334
|
+
return NULL;
|
|
1335
|
+
}
|
|
1336
|
+
|
|
1337
|
+
PyObject *result = _Nuitka_Generator_throw2(tstate, generator, &exception_state);
|
|
1234
1338
|
|
|
1235
1339
|
if (result == NULL) {
|
|
1236
1340
|
if (HAS_ERROR_OCCURRED(tstate) == false) {
|
|
@@ -1248,7 +1352,7 @@ static PyObject *Nuitka_Generator_throw(struct Nuitka_GeneratorObject *generator
|
|
|
1248
1352
|
return result;
|
|
1249
1353
|
}
|
|
1250
1354
|
|
|
1251
|
-
#if PYTHON_VERSION >=
|
|
1355
|
+
#if PYTHON_VERSION >= 0x300
|
|
1252
1356
|
static void Nuitka_Generator_tp_finalizer(struct Nuitka_GeneratorObject *generator) {
|
|
1253
1357
|
if (generator->m_status != status_Running) {
|
|
1254
1358
|
return;
|
|
@@ -1256,9 +1360,8 @@ static void Nuitka_Generator_tp_finalizer(struct Nuitka_GeneratorObject *generat
|
|
|
1256
1360
|
|
|
1257
1361
|
PyThreadState *tstate = PyThreadState_GET();
|
|
1258
1362
|
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
FETCH_ERROR_OCCURRED(tstate, &save_exception_type, &save_exception_value, &save_exception_tb);
|
|
1363
|
+
struct Nuitka_ExceptionPreservationItem saved_exception_state;
|
|
1364
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
1262
1365
|
|
|
1263
1366
|
bool close_result = _Nuitka_Generator_close(tstate, generator);
|
|
1264
1367
|
|
|
@@ -1266,8 +1369,8 @@ static void Nuitka_Generator_tp_finalizer(struct Nuitka_GeneratorObject *generat
|
|
|
1266
1369
|
PyErr_WriteUnraisable((PyObject *)generator);
|
|
1267
1370
|
}
|
|
1268
1371
|
|
|
1269
|
-
|
|
1270
|
-
|
|
1372
|
+
// Restore the saved exception if any.
|
|
1373
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
1271
1374
|
}
|
|
1272
1375
|
#endif
|
|
1273
1376
|
|
|
@@ -1276,6 +1379,11 @@ static struct Nuitka_GeneratorObject *free_list_generators = NULL;
|
|
|
1276
1379
|
static int free_list_generators_count = 0;
|
|
1277
1380
|
|
|
1278
1381
|
static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator) {
|
|
1382
|
+
#if _DEBUG_REFCOUNTS
|
|
1383
|
+
count_active_Nuitka_Generator_Type -= 1;
|
|
1384
|
+
count_released_Nuitka_Generator_Type += 1;
|
|
1385
|
+
#endif
|
|
1386
|
+
|
|
1279
1387
|
// Revive temporarily.
|
|
1280
1388
|
assert(Py_REFCNT(generator) == 0);
|
|
1281
1389
|
Py_SET_REFCNT(generator, 1);
|
|
@@ -1283,9 +1391,8 @@ static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator
|
|
|
1283
1391
|
PyThreadState *tstate = PyThreadState_GET();
|
|
1284
1392
|
|
|
1285
1393
|
// Save the current exception, if any, we must preserve it.
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
FETCH_ERROR_OCCURRED(tstate, &save_exception_type, &save_exception_value, &save_exception_tb);
|
|
1394
|
+
struct Nuitka_ExceptionPreservationItem saved_exception_state;
|
|
1395
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
1289
1396
|
|
|
1290
1397
|
if (generator->m_status == status_Running) {
|
|
1291
1398
|
bool close_result = _Nuitka_Generator_close(tstate, generator);
|
|
@@ -1305,7 +1412,7 @@ static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator
|
|
|
1305
1412
|
}
|
|
1306
1413
|
|
|
1307
1414
|
if (generator->m_frame != NULL) {
|
|
1308
|
-
#if PYTHON_VERSION >=
|
|
1415
|
+
#if PYTHON_VERSION >= 0x300
|
|
1309
1416
|
Nuitka_SetFrameGenerator(generator->m_frame, NULL);
|
|
1310
1417
|
#endif
|
|
1311
1418
|
Py_DECREF(generator->m_frame);
|
|
@@ -1329,7 +1436,7 @@ static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator
|
|
|
1329
1436
|
/* Put the object into free list or release to GC */
|
|
1330
1437
|
releaseToFreeList(free_list_generators, generator, MAX_GENERATOR_FREE_LIST_COUNT);
|
|
1331
1438
|
|
|
1332
|
-
|
|
1439
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
1333
1440
|
}
|
|
1334
1441
|
|
|
1335
1442
|
static long Nuitka_Generator_tp_hash(struct Nuitka_GeneratorObject *generator) { return generator->m_counter; }
|
|
@@ -1382,11 +1489,11 @@ static int Nuitka_Generator_set_qualname(struct Nuitka_GeneratorObject *generato
|
|
|
1382
1489
|
}
|
|
1383
1490
|
|
|
1384
1491
|
static PyObject *Nuitka_Generator_get_yieldfrom(struct Nuitka_GeneratorObject *generator) {
|
|
1385
|
-
if (generator->
|
|
1386
|
-
Py_INCREF(generator->
|
|
1387
|
-
return generator->
|
|
1492
|
+
if (generator->m_yield_from) {
|
|
1493
|
+
Py_INCREF(generator->m_yield_from);
|
|
1494
|
+
return generator->m_yield_from;
|
|
1388
1495
|
} else {
|
|
1389
|
-
|
|
1496
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
1390
1497
|
return Py_None;
|
|
1391
1498
|
}
|
|
1392
1499
|
}
|
|
@@ -1434,7 +1541,7 @@ static PyObject *Nuitka_Generator_get_running(struct Nuitka_GeneratorObject *gen
|
|
|
1434
1541
|
result = PyInt_FromLong(generator->m_running);
|
|
1435
1542
|
#else
|
|
1436
1543
|
result = BOOL_FROM(generator->m_running != 0);
|
|
1437
|
-
|
|
1544
|
+
Py_INCREF_IMMORTAL(result);
|
|
1438
1545
|
#endif
|
|
1439
1546
|
return result;
|
|
1440
1547
|
}
|
|
@@ -1457,7 +1564,7 @@ static int Nuitka_Generator_set_running(struct Nuitka_GeneratorObject *generator
|
|
|
1457
1564
|
return -1;
|
|
1458
1565
|
}
|
|
1459
1566
|
|
|
1460
|
-
static PyGetSetDef
|
|
1567
|
+
static PyGetSetDef Nuitka_Generator_tp_getset[] = {
|
|
1461
1568
|
#if PYTHON_VERSION < 0x350
|
|
1462
1569
|
{(char *)"__name__", (getter)Nuitka_Generator_get_name, NULL, NULL},
|
|
1463
1570
|
#else
|
|
@@ -1487,8 +1594,6 @@ static PyAsyncMethods Nuitka_Generator_as_async = {
|
|
|
1487
1594
|
};
|
|
1488
1595
|
#endif
|
|
1489
1596
|
|
|
1490
|
-
#include <structmember.h>
|
|
1491
|
-
|
|
1492
1597
|
PyTypeObject Nuitka_Generator_Type = {
|
|
1493
1598
|
PyVarObject_HEAD_INIT(NULL, 0) "compiled_generator", // tp_name
|
|
1494
1599
|
sizeof(struct Nuitka_GeneratorObject), // tp_basicsize
|
|
@@ -1527,7 +1632,7 @@ PyTypeObject Nuitka_Generator_Type = {
|
|
|
1527
1632
|
(iternextfunc)Nuitka_Generator_tp_iternext, // tp_iternext
|
|
1528
1633
|
Nuitka_Generator_methods, // tp_methods
|
|
1529
1634
|
NULL, // tp_members
|
|
1530
|
-
|
|
1635
|
+
Nuitka_Generator_tp_getset, // tp_getset
|
|
1531
1636
|
0, // tp_base
|
|
1532
1637
|
0, // tp_dict
|
|
1533
1638
|
0, // tp_descr_get
|
|
@@ -1545,7 +1650,7 @@ PyTypeObject Nuitka_Generator_Type = {
|
|
|
1545
1650
|
0, // tp_weaklist
|
|
1546
1651
|
0, // tp_del
|
|
1547
1652
|
0 // tp_version_tag
|
|
1548
|
-
#if PYTHON_VERSION >=
|
|
1653
|
+
#if PYTHON_VERSION >= 0x300
|
|
1549
1654
|
,
|
|
1550
1655
|
(destructor)Nuitka_Generator_tp_finalizer // tp_finalize
|
|
1551
1656
|
#endif
|
|
@@ -1591,7 +1696,7 @@ void _initCompiledGeneratorType(void) {
|
|
|
1591
1696
|
assert(Nuitka_Generator_Type.tp_subclasses != PyGen_Type.tp_subclasses || PyGen_Type.tp_cache == NULL);
|
|
1592
1697
|
assert(Nuitka_Generator_Type.tp_weaklist != PyGen_Type.tp_weaklist);
|
|
1593
1698
|
assert(Nuitka_Generator_Type.tp_del != PyGen_Type.tp_del || PyGen_Type.tp_del == NULL);
|
|
1594
|
-
#if PYTHON_VERSION >=
|
|
1699
|
+
#if PYTHON_VERSION >= 0x300
|
|
1595
1700
|
assert(Nuitka_Generator_Type.tp_finalize != PyGen_Type.tp_finalize || PyGen_Type.tp_finalize == NULL);
|
|
1596
1701
|
#endif
|
|
1597
1702
|
|
|
@@ -1612,6 +1717,11 @@ PyObject *Nuitka_Generator_New(generator_code code, PyObject *module, PyObject *
|
|
|
1612
1717
|
#endif
|
|
1613
1718
|
PyCodeObject *code_object, struct Nuitka_CellObject **closure, Py_ssize_t closure_given,
|
|
1614
1719
|
Py_ssize_t heap_storage_size) {
|
|
1720
|
+
#if _DEBUG_REFCOUNTS
|
|
1721
|
+
count_active_Nuitka_Generator_Type += 1;
|
|
1722
|
+
count_allocated_Nuitka_Generator_Type += 1;
|
|
1723
|
+
#endif
|
|
1724
|
+
|
|
1615
1725
|
struct Nuitka_GeneratorObject *result;
|
|
1616
1726
|
|
|
1617
1727
|
// TODO: Change the var part of the type to 1 maybe
|
|
@@ -1649,7 +1759,7 @@ PyObject *Nuitka_Generator_New(generator_code code, PyObject *module, PyObject *
|
|
|
1649
1759
|
#endif
|
|
1650
1760
|
|
|
1651
1761
|
#if PYTHON_VERSION >= 0x300
|
|
1652
|
-
result->
|
|
1762
|
+
result->m_yield_from = NULL;
|
|
1653
1763
|
#endif
|
|
1654
1764
|
|
|
1655
1765
|
memcpy(&result->m_closure[0], closure, closure_given * sizeof(struct Nuitka_CellObject *));
|
|
@@ -1707,4 +1817,18 @@ PyObject *Nuitka_Generator_NewEmpty(PyObject *module, PyObject *name,
|
|
|
1707
1817
|
|
|
1708
1818
|
// Chain frames to generator and asyncgen code, as they need to close them with access
|
|
1709
1819
|
// to best functions.
|
|
1710
|
-
#include "CompiledFrameType.c"
|
|
1820
|
+
#include "CompiledFrameType.c"
|
|
1821
|
+
// Part of "Nuitka", an optimizing Python compiler that is compatible and
|
|
1822
|
+
// integrates with CPython, but also works on its own.
|
|
1823
|
+
//
|
|
1824
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
1825
|
+
// you may not use this file except in compliance with the License.
|
|
1826
|
+
// You may obtain a copy of the License at
|
|
1827
|
+
//
|
|
1828
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
1829
|
+
//
|
|
1830
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
1831
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
1832
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1833
|
+
// See the License for the specific language governing permissions and
|
|
1834
|
+
// limitations under the License.
|