Nuitka-winsvc 1.8__cp311-cp311-win_amd64.whl → 2.5.1__cp311-cp311-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of Nuitka-winsvc might be problematic. Click here for more details.
- Nuitka_winsvc-1.8.data/scripts/nuitka-run.bat → Nuitka_winsvc-2.5.1.data/scripts/nuitka-run.cmd +9 -9
- Nuitka_winsvc-1.8.data/scripts/nuitka.bat → Nuitka_winsvc-2.5.1.data/scripts/nuitka.cmd +15 -15
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/METADATA +5 -3
- Nuitka_winsvc-2.5.1.dist-info/RECORD +977 -0
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/WHEEL +1 -1
- nuitka/Builtins.py +49 -17
- nuitka/BytecodeCaching.py +24 -20
- nuitka/Bytecodes.py +23 -19
- nuitka/CacheCleanup.py +28 -23
- nuitka/Constants.py +19 -17
- nuitka/Errors.py +23 -17
- nuitka/HardImportRegistry.py +408 -0
- nuitka/MainControl.py +209 -116
- nuitka/ModuleRegistry.py +83 -20
- nuitka/OptionParsing.py +467 -221
- nuitka/Options.py +701 -225
- nuitka/OutputDirectories.py +47 -23
- nuitka/PostProcessing.py +133 -79
- nuitka/Progress.py +73 -24
- nuitka/PythonFlavors.py +141 -32
- nuitka/PythonOperators.py +18 -17
- nuitka/PythonVersions.py +107 -19
- nuitka/Serialization.py +70 -55
- nuitka/SourceCodeReferences.py +19 -17
- nuitka/Tracing.py +176 -70
- nuitka/TreeXML.py +31 -26
- nuitka/Variables.py +39 -41
- nuitka/Version.py +22 -8
- nuitka/__init__.py +5 -4
- nuitka/__main__.py +95 -29
- nuitka/__past__.py +44 -34
- nuitka/build/Backend.scons +243 -141
- nuitka/build/CCompilerVersion.scons +45 -31
- nuitka/build/DataComposerInterface.py +20 -17
- nuitka/build/Onefile.scons +56 -54
- nuitka/build/SconsCaching.py +105 -92
- nuitka/build/SconsCompilerSettings.py +167 -68
- nuitka/build/SconsHacks.py +25 -19
- nuitka/build/SconsInterface.py +155 -54
- nuitka/build/SconsProgress.py +19 -18
- nuitka/build/SconsSpawn.py +62 -33
- nuitka/build/SconsUtils.py +152 -55
- nuitka/build/__init__.py +5 -4
- nuitka/build/include/nuitka/allocator.h +228 -22
- nuitka/build/include/nuitka/builtins.h +17 -17
- nuitka/build/include/nuitka/calling.h +24 -24
- nuitka/build/include/nuitka/checkers.h +17 -18
- nuitka/build/include/nuitka/checksum_tools.h +14 -19
- nuitka/build/include/nuitka/compiled_asyncgen.h +28 -25
- nuitka/build/include/nuitka/compiled_cell.h +33 -18
- nuitka/build/include/nuitka/compiled_coroutine.h +18 -18
- nuitka/build/include/nuitka/compiled_frame.h +93 -54
- nuitka/build/include/nuitka/compiled_function.h +42 -20
- nuitka/build/include/nuitka/compiled_generator.h +24 -18
- nuitka/build/include/nuitka/compiled_method.h +17 -18
- nuitka/build/include/nuitka/constants.h +35 -18
- nuitka/build/include/nuitka/constants_blob.h +17 -17
- nuitka/build/include/nuitka/debug_settings.h +60 -0
- nuitka/build/include/nuitka/environment_variables.h +30 -0
- nuitka/build/include/nuitka/environment_variables_system.h +45 -0
- nuitka/build/include/nuitka/exception_groups.h +23 -26
- nuitka/build/include/nuitka/exceptions.h +717 -171
- nuitka/build/include/nuitka/filesystem_paths.h +26 -20
- nuitka/build/include/nuitka/freelists.h +38 -18
- nuitka/build/include/nuitka/helper/attributes.h +24 -22
- nuitka/build/include/nuitka/helper/boolean.h +17 -17
- nuitka/build/include/nuitka/helper/bytearrays.h +17 -17
- nuitka/build/include/nuitka/helper/bytes.h +14 -15
- nuitka/build/include/nuitka/helper/calling_generated.h +69 -69
- nuitka/build/include/nuitka/helper/comparisons_dual_eq.h +47 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_ge.h +39 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_gt.h +39 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_le.h +47 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_lt.h +47 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_ne.h +39 -0
- nuitka/build/include/nuitka/helper/comparisons_eq.h +17 -17
- nuitka/build/include/nuitka/helper/comparisons_ge.h +17 -17
- nuitka/build/include/nuitka/helper/comparisons_gt.h +17 -17
- nuitka/build/include/nuitka/helper/comparisons_le.h +17 -17
- nuitka/build/include/nuitka/helper/comparisons_lt.h +17 -17
- nuitka/build/include/nuitka/helper/comparisons_ne.h +17 -17
- nuitka/build/include/nuitka/helper/complex.h +17 -17
- nuitka/build/include/nuitka/helper/dictionaries.h +89 -51
- nuitka/build/include/nuitka/helper/floats.h +17 -18
- nuitka/build/include/nuitka/helper/import_hard.h +25 -17
- nuitka/build/include/nuitka/helper/indexes.h +17 -18
- nuitka/build/include/nuitka/helper/ints.h +115 -54
- nuitka/build/include/nuitka/helper/iterators.h +99 -51
- nuitka/build/include/nuitka/helper/lists.h +26 -24
- nuitka/build/include/nuitka/helper/lists_generated.h +22 -22
- nuitka/build/include/nuitka/helper/mappings.h +17 -18
- nuitka/build/include/nuitka/helper/operations.h +20 -17
- nuitka/build/include/nuitka/helper/operations_binary_add.h +23 -17
- nuitka/build/include/nuitka/helper/operations_binary_bitand.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_bitor.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_divmod.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_dual_add.h +34 -0
- nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_lshift.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_matmult.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_mod.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_mult.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_pow.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_rshift.h +17 -17
- nuitka/build/include/nuitka/helper/operations_binary_sub.h +23 -17
- nuitka/build/include/nuitka/helper/operations_binary_truediv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_builtin_types.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_add.h +20 -17
- nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_mod.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_mult.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_pow.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +17 -17
- nuitka/build/include/nuitka/helper/operations_inplace_sub.h +20 -17
- nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +17 -17
- nuitka/build/include/nuitka/helper/raising.h +68 -37
- nuitka/build/include/nuitka/helper/rangeobjects.h +17 -17
- nuitka/build/include/nuitka/helper/richcomparisons.h +21 -14
- nuitka/build/include/nuitka/helper/sequences.h +19 -13
- nuitka/build/include/nuitka/helper/sets.h +11 -12
- nuitka/build/include/nuitka/helper/slices.h +31 -25
- nuitka/build/include/nuitka/helper/strings.h +16 -17
- nuitka/build/include/nuitka/helper/subscripts.h +18 -201
- nuitka/build/include/nuitka/helper/tuples.h +64 -52
- nuitka/build/include/nuitka/helpers.h +50 -22
- nuitka/build/include/nuitka/importing.h +28 -21
- nuitka/build/include/nuitka/jit_sources.h +25 -0
- nuitka/build/include/nuitka/prelude.h +163 -71
- nuitka/build/include/nuitka/printing.h +29 -22
- nuitka/build/include/nuitka/python_pgo.h +19 -18
- nuitka/build/include/nuitka/safe_string_ops.h +20 -18
- nuitka/build/include/nuitka/threading.h +45 -32
- nuitka/build/include/nuitka/tracing.h +28 -18
- nuitka/build/include/nuitka/type_aliases.h +30 -0
- nuitka/build/include/nuitka/unfreezing.h +29 -23
- nuitka/build/inline_copy/bin/scons.py +14 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +6 -6
- nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +0 -3
- nuitka/build/inline_copy/python_hacl/LICENSE.txt +201 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.c +1430 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.h +66 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.c +463 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.h +66 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.c +1273 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.h +204 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.c +734 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.h +131 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Streaming_Types.h +83 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt128_Verified.h +346 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt_8_16_32_64.h +107 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/fstar_uint128_struct_endianness.h +68 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/internal/target.h +293 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/lowstar_endianness.h +231 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/types.h +14 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_MD5.h +56 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA1.h +56 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA2.h +164 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA3.h +65 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/python_hacl_namespaces.h +89 -0
- nuitka/build/inline_copy/stubgen/astunparse.py +938 -0
- nuitka/build/inline_copy/stubgen/six.py +998 -0
- nuitka/build/inline_copy/stubgen/stubgen.py +307 -0
- nuitka/build/inline_copy/tqdm/tqdm/__init__.py +2 -2
- nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +4 -1
- nuitka/build/inline_copy/tqdm/tqdm/utils.py +14 -8
- nuitka/build/inline_copy/tqdm/tqdm/version.py +1 -8
- nuitka/build/inline_copy/zlib/LICENSE +22 -0
- nuitka/build/inline_copy/zlib/crc32.c +1049 -0
- nuitka/build/inline_copy/zlib/crc32.h +9446 -0
- nuitka/build/inline_copy/zlib/zconf.h +551 -0
- nuitka/build/inline_copy/zlib/zlib.h +1938 -0
- nuitka/build/inline_copy/zlib/zutil.h +275 -0
- nuitka/build/static_src/CompiledAsyncgenType.c +221 -221
- nuitka/build/static_src/CompiledCellType.c +69 -44
- nuitka/build/static_src/CompiledCodeHelpers.c +276 -159
- nuitka/build/static_src/CompiledCoroutineType.c +229 -226
- nuitka/build/static_src/CompiledFrameType.c +323 -138
- nuitka/build/static_src/CompiledFunctionType.c +547 -231
- nuitka/build/static_src/CompiledGeneratorType.c +416 -290
- nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +593 -228
- nuitka/build/static_src/CompiledMethodType.c +91 -82
- nuitka/build/static_src/HelpersAllocator.c +352 -45
- nuitka/build/static_src/HelpersAttributes.c +30 -72
- nuitka/build/static_src/HelpersBuiltin.c +65 -46
- nuitka/build/static_src/HelpersBuiltinTypeMethods.c +17 -17
- nuitka/build/static_src/HelpersBytes.c +19 -20
- nuitka/build/static_src/HelpersCalling.c +40 -37
- nuitka/build/static_src/HelpersCallingGenerated.c +1061 -242
- nuitka/build/static_src/HelpersChecksumTools.c +35 -21
- nuitka/build/static_src/HelpersClasses.c +17 -17
- nuitka/build/static_src/HelpersComparisonDualEq.c +183 -0
- nuitka/build/static_src/HelpersComparisonDualGe.c +121 -0
- nuitka/build/static_src/HelpersComparisonDualGt.c +121 -0
- nuitka/build/static_src/HelpersComparisonDualLe.c +183 -0
- nuitka/build/static_src/HelpersComparisonDualLt.c +183 -0
- nuitka/build/static_src/HelpersComparisonDualNe.c +121 -0
- nuitka/build/static_src/HelpersComparisonEq.c +536 -496
- nuitka/build/static_src/HelpersComparisonEqUtils.c +22 -19
- nuitka/build/static_src/HelpersComparisonGe.c +531 -501
- nuitka/build/static_src/HelpersComparisonGt.c +530 -500
- nuitka/build/static_src/HelpersComparisonLe.c +531 -501
- nuitka/build/static_src/HelpersComparisonLt.c +530 -500
- nuitka/build/static_src/HelpersComparisonNe.c +538 -496
- nuitka/build/static_src/HelpersConsole.c +122 -0
- nuitka/build/static_src/HelpersConstantsBlob.c +550 -521
- nuitka/build/static_src/HelpersDeepcopy.c +33 -33
- nuitka/build/static_src/HelpersDictionaries.c +232 -63
- nuitka/build/static_src/HelpersDictionariesGenerated.c +130 -127
- nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
- nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
- nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +93 -0
- nuitka/build/static_src/HelpersExceptions.c +147 -62
- nuitka/build/static_src/HelpersFiles.c +116 -22
- nuitka/build/static_src/HelpersFilesystemPaths.c +292 -181
- nuitka/build/static_src/HelpersFloats.c +37 -31
- nuitka/build/static_src/HelpersHeapStorage.c +21 -17
- nuitka/build/static_src/HelpersImport.c +61 -29
- nuitka/build/static_src/HelpersImportHard.c +74 -61
- nuitka/build/static_src/HelpersJitSources.c +46 -0
- nuitka/build/static_src/HelpersLists.c +237 -58
- nuitka/build/static_src/HelpersListsGenerated.c +41 -41
- nuitka/build/static_src/HelpersMappings.c +17 -17
- nuitka/build/static_src/HelpersMatching.c +137 -51
- nuitka/build/static_src/HelpersOperationBinaryAdd.c +397 -152
- nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +102 -52
- nuitka/build/static_src/HelpersOperationBinaryBitand.c +55 -55
- nuitka/build/static_src/HelpersOperationBinaryBitor.c +55 -55
- nuitka/build/static_src/HelpersOperationBinaryBitxor.c +55 -55
- nuitka/build/static_src/HelpersOperationBinaryDivmod.c +49 -43
- nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +17 -17
- nuitka/build/static_src/HelpersOperationBinaryDualAdd.c +172 -0
- nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +55 -49
- nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +20 -21
- nuitka/build/static_src/HelpersOperationBinaryLshift.c +83 -83
- nuitka/build/static_src/HelpersOperationBinaryMatmult.c +25 -24
- nuitka/build/static_src/HelpersOperationBinaryMod.c +129 -117
- nuitka/build/static_src/HelpersOperationBinaryMult.c +98 -82
- nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +33 -30
- nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +55 -49
- nuitka/build/static_src/HelpersOperationBinaryPow.c +68 -68
- nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +12 -12
- nuitka/build/static_src/HelpersOperationBinaryRshift.c +51 -51
- nuitka/build/static_src/HelpersOperationBinarySub.c +309 -88
- nuitka/build/static_src/HelpersOperationBinaryTruediv.c +49 -43
- nuitka/build/static_src/HelpersOperationInplaceAdd.c +333 -163
- nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +24 -22
- nuitka/build/static_src/HelpersOperationInplaceBitand.c +58 -58
- nuitka/build/static_src/HelpersOperationInplaceBitor.c +58 -58
- nuitka/build/static_src/HelpersOperationInplaceBitxor.c +58 -58
- nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +73 -68
- nuitka/build/static_src/HelpersOperationInplaceLshift.c +64 -64
- nuitka/build/static_src/HelpersOperationInplaceMatmult.c +38 -37
- nuitka/build/static_src/HelpersOperationInplaceMod.c +145 -140
- nuitka/build/static_src/HelpersOperationInplaceMult.c +89 -84
- nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +73 -68
- nuitka/build/static_src/HelpersOperationInplacePow.c +82 -82
- nuitka/build/static_src/HelpersOperationInplaceRshift.c +48 -48
- nuitka/build/static_src/HelpersOperationInplaceSub.c +275 -122
- nuitka/build/static_src/HelpersOperationInplaceTruediv.c +68 -63
- nuitka/build/static_src/HelpersProfiling.c +25 -24
- nuitka/build/static_src/HelpersPythonPgo.c +22 -22
- nuitka/build/static_src/HelpersRaising.c +296 -283
- nuitka/build/static_src/HelpersSafeStrings.c +34 -22
- nuitka/build/static_src/HelpersSequences.c +18 -19
- nuitka/build/static_src/HelpersSlices.c +29 -23
- nuitka/build/static_src/HelpersStrings.c +235 -38
- nuitka/build/static_src/HelpersTuples.c +46 -34
- nuitka/build/static_src/HelpersTypes.c +166 -25
- nuitka/build/static_src/InspectPatcher.c +108 -27
- nuitka/build/static_src/MainProgram.c +464 -280
- nuitka/build/static_src/MetaPathBasedLoader.c +381 -257
- nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +39 -26
- nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +17 -18
- nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +227 -29
- nuitka/build/static_src/OnefileBootstrap.c +281 -164
- nuitka/build/static_src/OnefileSplashScreen.cpp +51 -27
- nuitka/code_generation/AsyncgenCodes.py +21 -23
- nuitka/code_generation/AttributeCodes.py +31 -27
- nuitka/code_generation/BinaryOperationHelperDefinitions.py +290 -184
- nuitka/code_generation/BranchCodes.py +19 -17
- nuitka/code_generation/BuiltinCodes.py +29 -18
- nuitka/code_generation/CallCodes.py +35 -33
- nuitka/code_generation/ClassCodes.py +19 -17
- nuitka/code_generation/CodeGeneration.py +61 -28
- nuitka/code_generation/CodeHelperSelection.py +20 -18
- nuitka/code_generation/CodeHelpers.py +28 -21
- nuitka/code_generation/CodeObjectCodes.py +36 -26
- nuitka/code_generation/ComparisonCodes.py +51 -22
- nuitka/code_generation/ComparisonHelperDefinitions.py +42 -25
- nuitka/code_generation/ConditionalCodes.py +19 -17
- nuitka/code_generation/ConstantCodes.py +82 -28
- nuitka/code_generation/Contexts.py +180 -42
- nuitka/code_generation/CoroutineCodes.py +21 -23
- nuitka/code_generation/CtypesCodes.py +19 -17
- nuitka/code_generation/DictCodes.py +28 -26
- nuitka/code_generation/Emission.py +21 -18
- nuitka/code_generation/ErrorCodes.py +57 -79
- nuitka/code_generation/EvalCodes.py +24 -20
- nuitka/code_generation/ExceptionCodes.py +182 -104
- nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +45 -27
- nuitka/code_generation/ExpressionCodes.py +19 -17
- nuitka/code_generation/FrameCodes.py +28 -31
- nuitka/code_generation/FunctionCodes.py +26 -27
- nuitka/code_generation/GeneratorCodes.py +25 -26
- nuitka/code_generation/GlobalConstants.py +51 -25
- nuitka/code_generation/GlobalsLocalsCodes.py +23 -21
- nuitka/code_generation/IdCodes.py +19 -17
- nuitka/code_generation/ImportCodes.py +90 -50
- nuitka/code_generation/Indentation.py +23 -22
- nuitka/code_generation/IndexCodes.py +19 -17
- nuitka/code_generation/InjectCCodes.py +14 -12
- nuitka/code_generation/IntegerCodes.py +19 -17
- nuitka/code_generation/IteratorCodes.py +86 -71
- nuitka/code_generation/JitCodes.py +44 -0
- nuitka/code_generation/LabelCodes.py +19 -17
- nuitka/code_generation/LineNumberCodes.py +20 -20
- nuitka/code_generation/ListCodes.py +32 -36
- nuitka/code_generation/LoaderCodes.py +22 -17
- nuitka/code_generation/LocalsDictCodes.py +56 -32
- nuitka/code_generation/LoopCodes.py +19 -17
- nuitka/code_generation/MatchCodes.py +42 -22
- nuitka/code_generation/ModuleCodes.py +71 -29
- nuitka/code_generation/Namify.py +27 -23
- nuitka/code_generation/NetworkxCodes.py +51 -0
- nuitka/code_generation/OperationCodes.py +80 -51
- nuitka/code_generation/PackageResourceCodes.py +96 -23
- nuitka/code_generation/PrintCodes.py +19 -17
- nuitka/code_generation/PythonAPICodes.py +19 -17
- nuitka/code_generation/RaisingCodes.py +183 -107
- nuitka/code_generation/Reports.py +32 -22
- nuitka/code_generation/ReturnCodes.py +20 -32
- nuitka/code_generation/SetCodes.py +19 -17
- nuitka/code_generation/SliceCodes.py +22 -20
- nuitka/code_generation/StringCodes.py +19 -17
- nuitka/code_generation/SubscriptCodes.py +24 -30
- nuitka/code_generation/TensorflowCodes.py +54 -0
- nuitka/code_generation/TryCodes.py +31 -41
- nuitka/code_generation/TupleCodes.py +20 -18
- nuitka/code_generation/TypeAliasCodes.py +119 -0
- nuitka/code_generation/VariableCodes.py +118 -55
- nuitka/code_generation/VariableDeclarations.py +28 -25
- nuitka/code_generation/YieldCodes.py +23 -21
- nuitka/code_generation/__init__.py +5 -4
- nuitka/code_generation/c_types/CTypeBases.py +29 -19
- nuitka/code_generation/c_types/CTypeBooleans.py +19 -17
- nuitka/code_generation/c_types/CTypeCFloats.py +19 -17
- nuitka/code_generation/c_types/CTypeCLongs.py +19 -18
- nuitka/code_generation/c_types/CTypeModuleDictVariables.py +22 -17
- nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +22 -21
- nuitka/code_generation/c_types/CTypeNuitkaInts.py +89 -43
- nuitka/code_generation/c_types/CTypeNuitkaVoids.py +20 -18
- nuitka/code_generation/c_types/CTypePyObjectPointers.py +43 -31
- nuitka/code_generation/c_types/CTypeVoids.py +20 -17
- nuitka/code_generation/c_types/__init__.py +5 -4
- nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +20 -19
- nuitka/code_generation/templates/CodeTemplatesConstants.py +143 -39
- nuitka/code_generation/templates/CodeTemplatesCoroutines.py +20 -19
- nuitka/code_generation/templates/CodeTemplatesExceptions.py +33 -33
- nuitka/code_generation/templates/CodeTemplatesFrames.py +36 -27
- nuitka/code_generation/templates/CodeTemplatesFunction.py +20 -19
- nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +21 -19
- nuitka/code_generation/templates/CodeTemplatesIterators.py +19 -53
- nuitka/code_generation/templates/CodeTemplatesLoader.py +25 -19
- nuitka/code_generation/templates/CodeTemplatesModules.py +278 -169
- nuitka/code_generation/templates/CodeTemplatesVariables.py +115 -27
- nuitka/code_generation/templates/TemplateDebugWrapper.py +19 -18
- nuitka/code_generation/templates/__init__.py +5 -4
- nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +19 -19
- nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +21 -21
- nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +79 -28
- nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +22 -22
- nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +19 -19
- nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +19 -19
- nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +74 -106
- nuitka/code_generation/templates_c/HelperImportHard.c.j2 +19 -20
- nuitka/code_generation/templates_c/HelperLongTools.c.j2 +19 -19
- nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +6 -6
- nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +23 -23
- nuitka/code_generation/templates_c/HelperOperationBinaryDual.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +35 -35
- nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +37 -37
- nuitka/code_generation/templates_c/HelperOperationComparisonDual.c.j2 +86 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +18 -18
- nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +50 -38
- nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +27 -27
- nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +37 -37
- nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +31 -31
- nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +35 -31
- nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +20 -20
- nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +28 -28
- nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +48 -48
- nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +21 -18
- nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +27 -25
- nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +17 -17
- nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +21 -18
- nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +17 -17
- nuitka/containers/Namedtuples.py +25 -18
- nuitka/containers/OrderedSets.py +105 -5
- nuitka/containers/OrderedSetsFallback.py +19 -17
- nuitka/containers/__init__.py +5 -4
- nuitka/distutils/Build.py +33 -18
- nuitka/distutils/DistutilCommands.py +84 -33
- nuitka/distutils/__init__.py +5 -4
- nuitka/finalizations/Finalization.py +21 -18
- nuitka/finalizations/FinalizeMarkups.py +31 -55
- nuitka/finalizations/__init__.py +5 -4
- nuitka/freezer/DependsExe.py +60 -30
- nuitka/freezer/DllDependenciesCommon.py +47 -20
- nuitka/freezer/DllDependenciesMacOS.py +165 -58
- nuitka/freezer/DllDependenciesPosix.py +29 -19
- nuitka/freezer/DllDependenciesWin32.py +55 -33
- nuitka/freezer/ImportDetection.py +23 -17
- nuitka/freezer/IncludedDataFiles.py +142 -48
- nuitka/freezer/IncludedEntryPoints.py +104 -39
- nuitka/freezer/Onefile.py +32 -22
- nuitka/freezer/Standalone.py +166 -53
- nuitka/freezer/__init__.py +5 -4
- nuitka/importing/IgnoreListing.py +19 -17
- nuitka/importing/ImportCache.py +24 -21
- nuitka/importing/ImportResolving.py +103 -95
- nuitka/importing/Importing.py +319 -98
- nuitka/importing/PreloadedPackages.py +21 -18
- nuitka/importing/Recursion.py +142 -47
- nuitka/importing/StandardLibrary.py +96 -80
- nuitka/importing/__init__.py +5 -4
- nuitka/nodes/AsyncgenNodes.py +22 -23
- nuitka/nodes/AttributeLookupNodes.py +19 -17
- nuitka/nodes/AttributeNodes.py +19 -17
- nuitka/nodes/AttributeNodesGenerated.py +49 -24
- nuitka/nodes/BuiltinAllNodes.py +19 -17
- nuitka/nodes/BuiltinAnyNodes.py +19 -17
- nuitka/nodes/BuiltinComplexNodes.py +20 -17
- nuitka/nodes/BuiltinDecodingNodes.py +19 -17
- nuitka/nodes/BuiltinDecoratorNodes.py +19 -17
- nuitka/nodes/BuiltinDictNodes.py +19 -17
- nuitka/nodes/BuiltinFormatNodes.py +20 -17
- nuitka/nodes/BuiltinHashNodes.py +19 -17
- nuitka/nodes/BuiltinInputNodes.py +19 -17
- nuitka/nodes/BuiltinIntegerNodes.py +19 -17
- nuitka/nodes/BuiltinIteratorNodes.py +25 -21
- nuitka/nodes/BuiltinLenNodes.py +19 -17
- nuitka/nodes/BuiltinNextNodes.py +19 -17
- nuitka/nodes/BuiltinOpenNodes.py +52 -18
- nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +40 -23
- nuitka/nodes/BuiltinRangeNodes.py +21 -19
- nuitka/nodes/BuiltinRefNodes.py +73 -40
- nuitka/nodes/BuiltinSumNodes.py +20 -18
- nuitka/nodes/BuiltinTypeNodes.py +19 -17
- nuitka/nodes/BuiltinVarsNodes.py +19 -18
- nuitka/nodes/BytesNodes.py +19 -17
- nuitka/nodes/CallNodes.py +19 -17
- nuitka/nodes/Checkers.py +19 -17
- nuitka/nodes/ChildrenHavingMixins.py +1624 -283
- nuitka/nodes/ClassNodes.py +49 -29
- nuitka/nodes/CodeObjectSpecs.py +29 -18
- nuitka/nodes/ComparisonNodes.py +19 -17
- nuitka/nodes/ConditionalNodes.py +24 -25
- nuitka/nodes/ConstantRefNodes.py +57 -17
- nuitka/nodes/ContainerMakingNodes.py +19 -17
- nuitka/nodes/ContainerOperationNodes.py +19 -17
- nuitka/nodes/CoroutineNodes.py +22 -23
- nuitka/nodes/CtypesNodes.py +19 -18
- nuitka/nodes/DictionaryNodes.py +19 -18
- nuitka/nodes/ExceptionNodes.py +131 -43
- nuitka/nodes/ExecEvalNodes.py +19 -17
- nuitka/nodes/ExpressionBases.py +34 -26
- nuitka/nodes/ExpressionBasesGenerated.py +341 -35
- nuitka/nodes/ExpressionShapeMixins.py +19 -17
- nuitka/nodes/FrameNodes.py +41 -28
- nuitka/nodes/FunctionAttributeNodes.py +19 -17
- nuitka/nodes/FunctionNodes.py +84 -38
- nuitka/nodes/FutureSpecs.py +35 -20
- nuitka/nodes/GeneratorNodes.py +24 -25
- nuitka/nodes/GlobalsLocalsNodes.py +22 -17
- nuitka/nodes/HardImportNodesGenerated.py +746 -148
- nuitka/nodes/ImportHardNodes.py +46 -38
- nuitka/nodes/ImportNodes.py +438 -448
- nuitka/nodes/IndicatorMixins.py +19 -17
- nuitka/nodes/InjectCNodes.py +19 -18
- nuitka/nodes/IterationHandles.py +55 -34
- nuitka/nodes/KeyValuePairNodes.py +19 -17
- nuitka/nodes/ListOperationNodes.py +33 -21
- nuitka/nodes/LocalsDictNodes.py +19 -17
- nuitka/nodes/LocalsScopes.py +41 -41
- nuitka/nodes/LoopNodes.py +28 -17
- nuitka/nodes/MatchNodes.py +37 -24
- nuitka/nodes/ModuleAttributeNodes.py +18 -35
- nuitka/nodes/ModuleNodes.py +90 -31
- nuitka/nodes/NetworkxNodes.py +45 -0
- nuitka/nodes/NodeBases.py +73 -44
- nuitka/nodes/NodeMakingHelpers.py +92 -69
- nuitka/nodes/NodeMetaClasses.py +45 -28
- nuitka/nodes/OperatorNodes.py +28 -26
- nuitka/nodes/OperatorNodesUnary.py +148 -20
- nuitka/nodes/OsSysNodes.py +97 -18
- nuitka/nodes/OutlineNodes.py +24 -22
- nuitka/nodes/PackageMetadataNodes.py +37 -27
- nuitka/nodes/PackageResourceNodes.py +29 -23
- nuitka/nodes/PrintNodes.py +19 -17
- nuitka/nodes/ReturnNodes.py +20 -18
- nuitka/nodes/SideEffectNodes.py +19 -17
- nuitka/nodes/SliceNodes.py +20 -18
- nuitka/nodes/StatementBasesGenerated.py +125 -79
- nuitka/nodes/StatementNodes.py +27 -24
- nuitka/nodes/StrNodes.py +19 -17
- nuitka/nodes/StringConcatenationNodes.py +20 -17
- nuitka/nodes/SubscriptNodes.py +27 -25
- nuitka/nodes/TensorflowNodes.py +38 -0
- nuitka/nodes/TryNodes.py +19 -17
- nuitka/nodes/TypeMatchNodes.py +19 -17
- nuitka/nodes/TypeNodes.py +68 -18
- nuitka/nodes/VariableAssignNodes.py +122 -64
- nuitka/nodes/VariableDelNodes.py +19 -17
- nuitka/nodes/VariableNameNodes.py +19 -17
- nuitka/nodes/VariableRefNodes.py +63 -26
- nuitka/nodes/VariableReleaseNodes.py +19 -17
- nuitka/nodes/YieldNodes.py +21 -19
- nuitka/nodes/__init__.py +5 -4
- nuitka/nodes/shapes/BuiltinTypeShapes.py +169 -46
- nuitka/nodes/shapes/ControlFlowDescriptions.py +19 -17
- nuitka/nodes/shapes/ShapeMixins.py +57 -17
- nuitka/nodes/shapes/StandardShapes.py +80 -21
- nuitka/nodes/shapes/__init__.py +5 -4
- nuitka/optimizations/BytecodeDemotion.py +21 -18
- nuitka/optimizations/FunctionInlining.py +22 -23
- nuitka/optimizations/Graphs.py +19 -17
- nuitka/optimizations/Optimization.py +39 -35
- nuitka/optimizations/OptimizeBuiltinCalls.py +31 -27
- nuitka/optimizations/Tags.py +19 -18
- nuitka/optimizations/TraceCollections.py +67 -24
- nuitka/optimizations/ValueTraces.py +92 -25
- nuitka/optimizations/__init__.py +5 -4
- nuitka/pgo/PGO.py +33 -23
- nuitka/pgo/__init__.py +5 -4
- nuitka/plugins/PluginBase.py +655 -112
- nuitka/plugins/Plugins.py +247 -61
- nuitka/plugins/YamlPluginBase.py +121 -0
- nuitka/plugins/__init__.py +5 -4
- nuitka/plugins/standard/AntiBloatPlugin.py +374 -135
- nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +20 -19
- nuitka/plugins/standard/DataFilesPlugin.py +65 -29
- nuitka/plugins/standard/DelvewheelPlugin.py +32 -24
- nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
- nuitka/plugins/standard/DillPlugin/dill-postLoad.py +256 -0
- nuitka/plugins/standard/DillPlugin.py +42 -134
- nuitka/plugins/standard/DllFilesPlugin.py +125 -42
- nuitka/plugins/standard/EnumPlugin.py +19 -17
- nuitka/plugins/standard/EventletPlugin.py +19 -17
- nuitka/plugins/standard/GeventPlugin.py +19 -17
- nuitka/plugins/standard/GiPlugin.py +44 -28
- nuitka/plugins/standard/GlfwPlugin.py +20 -17
- nuitka/plugins/standard/ImplicitImports.py +403 -54
- nuitka/plugins/standard/KivyPlugin.py +24 -20
- nuitka/plugins/standard/MatplotlibPlugin.py +99 -42
- nuitka/plugins/standard/MultiprocessingPlugin.py +35 -39
- nuitka/plugins/standard/NumpyPlugin.py +19 -17
- nuitka/plugins/standard/OptionsNannyPlugin.py +48 -76
- nuitka/plugins/standard/PbrPlugin.py +21 -19
- nuitka/plugins/standard/PkgResourcesPlugin.py +34 -23
- nuitka/plugins/standard/PlaywrightPlugin.py +184 -0
- nuitka/plugins/standard/PmwPlugin.py +30 -27
- nuitka/plugins/standard/PySidePyQtPlugin.py +82 -80
- nuitka/plugins/standard/PywebViewPlugin.py +19 -17
- nuitka/plugins/standard/SpacyPlugin.py +136 -0
- nuitka/plugins/standard/TensorflowPlugin.py +20 -17
- nuitka/plugins/standard/TkinterPlugin.py +102 -108
- nuitka/plugins/standard/TorchPlugin.py +20 -17
- nuitka/plugins/standard/TransformersPlugin.py +90 -231
- nuitka/plugins/standard/TrioPlugin.py +18 -15
- nuitka/plugins/standard/UpxPlugin.py +21 -19
- nuitka/plugins/standard/__init__.py +5 -4
- nuitka/plugins/standard/standard.nuitka-package.config.yml +3925 -1293
- nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +14 -14
- nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +154 -66
- nuitka/reports/CompilationReportReader.py +79 -0
- nuitka/reports/LicenseReport.rst.j2 +21 -21
- nuitka/reports/Reports.py +363 -76
- nuitka/reports/__init__.py +5 -4
- nuitka/specs/BuiltinBytesOperationSpecs.py +18 -17
- nuitka/specs/BuiltinDictOperationSpecs.py +18 -17
- nuitka/specs/BuiltinListOperationSpecs.py +18 -17
- nuitka/specs/BuiltinParameterSpecs.py +35 -21
- nuitka/specs/BuiltinStrOperationSpecs.py +19 -18
- nuitka/specs/BuiltinTypeOperationSpecs.py +18 -18
- nuitka/specs/BuiltinUnicodeOperationSpecs.py +18 -17
- nuitka/specs/HardImportSpecs.py +74 -22
- nuitka/specs/ParameterSpecs.py +60 -45
- nuitka/specs/__init__.py +5 -4
- nuitka/tools/Basics.py +20 -18
- nuitka/tools/__init__.py +5 -4
- nuitka/tools/commercial/__init__.py +7 -6
- nuitka/tools/data_composer/DataComposer.py +78 -62
- nuitka/tools/data_composer/__init__.py +5 -4
- nuitka/tools/data_composer/__main__.py +18 -17
- nuitka/tools/environments/CreateEnvironment.py +20 -17
- nuitka/tools/environments/Virtualenv.py +60 -32
- nuitka/tools/environments/__init__.py +5 -4
- nuitka/tools/general/__init__.py +5 -4
- nuitka/tools/general/dll_report/__init__.py +5 -4
- nuitka/tools/general/dll_report/__main__.py +29 -22
- nuitka/tools/general/find_module/FindModuleCode.py +35 -22
- nuitka/tools/general/find_module/__init__.py +5 -4
- nuitka/tools/onefile_compressor/OnefileCompressor.py +213 -131
- nuitka/tools/onefile_compressor/__init__.py +5 -4
- nuitka/tools/onefile_compressor/__main__.py +18 -17
- nuitka/tools/podman/Podman.py +19 -17
- nuitka/tools/podman/__init__.py +5 -4
- nuitka/tools/podman/__main__.py +35 -19
- nuitka/tools/profiler/__init__.py +5 -4
- nuitka/tools/profiler/__main__.py +18 -17
- nuitka/tools/scanning/DisplayPackageDLLs.py +47 -22
- nuitka/tools/scanning/DisplayPackageData.py +31 -19
- nuitka/tools/scanning/__init__.py +5 -4
- nuitka/tools/specialize/CTypeDescriptions.py +251 -80
- nuitka/tools/specialize/Common.py +18 -17
- nuitka/tools/specialize/SpecializeC.py +248 -82
- nuitka/tools/specialize/SpecializePython.py +108 -45
- nuitka/tools/specialize/__init__.py +5 -4
- nuitka/tools/testing/Common.py +175 -114
- nuitka/tools/testing/Constructs.py +19 -17
- nuitka/tools/testing/OutputComparison.py +54 -18
- nuitka/tools/testing/Pythons.py +19 -18
- nuitka/tools/testing/RuntimeTracing.py +20 -19
- nuitka/tools/testing/SearchModes.py +26 -20
- nuitka/tools/testing/Valgrind.py +19 -17
- nuitka/tools/testing/__init__.py +5 -4
- nuitka/tools/testing/check_reference_counts/__init__.py +5 -4
- nuitka/tools/testing/check_reference_counts/__main__.py +18 -18
- nuitka/tools/testing/compare_with_cpython/__init__.py +5 -4
- nuitka/tools/testing/compare_with_cpython/__main__.py +39 -30
- nuitka/tools/testing/find_sxs_modules/__init__.py +5 -4
- nuitka/tools/testing/find_sxs_modules/__main__.py +17 -17
- nuitka/tools/testing/measure_construct_performance/__init__.py +5 -4
- nuitka/tools/testing/measure_construct_performance/__main__.py +23 -33
- nuitka/tools/testing/run_nuitka_tests/__init__.py +5 -4
- nuitka/tools/testing/run_nuitka_tests/__main__.py +134 -51
- nuitka/tools/watch/AutoStage.py +145 -0
- nuitka/tools/watch/GitHub.py +113 -0
- nuitka/tools/watch/__init__.py +5 -4
- nuitka/tools/watch/__main__.py +322 -91
- nuitka/tree/Building.py +184 -182
- nuitka/tree/ComplexCallHelperFunctions.py +84 -58
- nuitka/tree/Extractions.py +19 -17
- nuitka/tree/InternalModule.py +29 -20
- nuitka/tree/Operations.py +19 -17
- nuitka/tree/ReformulationAssertStatements.py +51 -31
- nuitka/tree/ReformulationAssignmentStatements.py +96 -91
- nuitka/tree/ReformulationBooleanExpressions.py +19 -17
- nuitka/tree/ReformulationCallExpressions.py +20 -18
- nuitka/tree/ReformulationClasses.py +45 -39
- nuitka/tree/ReformulationClasses3.py +239 -116
- nuitka/tree/ReformulationComparisonExpressions.py +29 -35
- nuitka/tree/ReformulationContractionExpressions.py +58 -55
- nuitka/tree/ReformulationDictionaryCreation.py +41 -35
- nuitka/tree/ReformulationExecStatements.py +42 -39
- nuitka/tree/ReformulationForLoopStatements.py +30 -34
- nuitka/tree/ReformulationFunctionStatements.py +59 -55
- nuitka/tree/ReformulationImportStatements.py +34 -29
- nuitka/tree/ReformulationLambdaExpressions.py +23 -24
- nuitka/tree/ReformulationMatchStatements.py +246 -92
- nuitka/tree/ReformulationMultidist.py +22 -18
- nuitka/tree/ReformulationNamespacePackages.py +55 -46
- nuitka/tree/ReformulationPrintStatements.py +23 -24
- nuitka/tree/ReformulationSequenceCreation.py +50 -49
- nuitka/tree/ReformulationSubscriptExpressions.py +19 -17
- nuitka/tree/ReformulationTryExceptStatements.py +19 -17
- nuitka/tree/ReformulationTryFinallyStatements.py +34 -17
- nuitka/tree/ReformulationWhileLoopStatements.py +19 -17
- nuitka/tree/ReformulationWithStatements.py +39 -41
- nuitka/tree/ReformulationYieldExpressions.py +44 -24
- nuitka/tree/SourceHandling.py +76 -31
- nuitka/tree/SyntaxErrors.py +19 -17
- nuitka/tree/TreeHelpers.py +33 -20
- nuitka/tree/VariableClosure.py +35 -39
- nuitka/tree/__init__.py +5 -4
- nuitka/utils/AppDirs.py +41 -20
- nuitka/utils/CStrings.py +66 -21
- nuitka/utils/CommandLineOptions.py +111 -22
- nuitka/utils/Distributions.py +445 -54
- nuitka/utils/Download.py +89 -57
- nuitka/utils/Execution.py +102 -58
- nuitka/utils/FileOperations.py +357 -128
- nuitka/utils/Hashing.py +55 -33
- nuitka/utils/Images.py +26 -19
- nuitka/utils/Importing.py +119 -37
- nuitka/utils/InlineCopies.py +52 -0
- nuitka/utils/InstalledPythons.py +85 -75
- nuitka/utils/InstanceCounters.py +20 -17
- nuitka/utils/Jinja2.py +30 -22
- nuitka/utils/Json.py +21 -19
- nuitka/utils/MacOSApp.py +26 -18
- nuitka/utils/MemoryUsage.py +20 -18
- nuitka/utils/ModuleNames.py +42 -26
- nuitka/utils/PackageResources.py +44 -0
- nuitka/utils/ReExecute.py +50 -28
- nuitka/utils/Rest.py +20 -17
- nuitka/utils/SharedLibraries.py +161 -75
- nuitka/utils/Shebang.py +20 -17
- nuitka/utils/Signing.py +63 -18
- nuitka/utils/SlotMetaClasses.py +57 -0
- nuitka/utils/StaticLibraries.py +83 -56
- nuitka/utils/ThreadedExecutor.py +18 -17
- nuitka/utils/Timing.py +22 -20
- nuitka/utils/Utils.py +132 -25
- nuitka/utils/WindowsFileUsage.py +22 -20
- nuitka/utils/WindowsResources.py +25 -18
- nuitka/utils/Yaml.py +62 -24
- nuitka/utils/__init__.py +5 -4
- Nuitka_winsvc-1.8.dist-info/RECORD +0 -905
- nuitka/build/inline_copy/tqdm/tqdm/_tqdm_gui.py +0 -9
- nuitka/build/inline_copy/tqdm/tqdm/gui.py +0 -191
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/LICENSE.txt +0 -0
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/entry_points.txt +0 -0
- {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/top_level.txt +0 -0
|
@@ -1,20 +1,5 @@
|
|
|
1
|
-
// Copyright
|
|
2
|
-
|
|
3
|
-
// Part of "Nuitka", an optimizing Python compiler that is compatible and
|
|
4
|
-
// integrates with CPython, but also works on its own.
|
|
5
|
-
//
|
|
6
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
-
// you may not use this file except in compliance with the License.
|
|
8
|
-
// You may obtain a copy of the License at
|
|
9
|
-
//
|
|
10
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
-
//
|
|
12
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
13
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
-
// See the License for the specific language governing permissions and
|
|
16
|
-
// limitations under the License.
|
|
17
|
-
//
|
|
1
|
+
// Copyright 2024, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
|
|
2
|
+
|
|
18
3
|
/** Compiled 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,16 +153,20 @@ 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
|
|
|
171
|
-
if (exception_value) {
|
|
169
|
+
if (exception_value != NULL) {
|
|
172
170
|
if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_value, PyExc_StopIteration)) {
|
|
173
171
|
value = ((PyStopIterationObject *)exception_value)->value;
|
|
174
172
|
Py_XINCREF(value);
|
|
@@ -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
|
-
if (throw_method) {
|
|
272
|
-
PyObject *result =
|
|
273
|
-
PyObject_CallFunctionObjArgs(throw_method, exception_type, exception_value, exception_tb, NULL);
|
|
284
|
+
if (throw_method != 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
|
-
} else if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, GET_ERROR_OCCURRED(tstate), PyExc_AttributeError)) {
|
|
283
|
-
// Restoring the exception we own, to be released when handling it.
|
|
284
|
-
RESTORE_ERROR_OCCURRED(tstate, exception_type, exception_value, exception_tb);
|
|
285
|
-
|
|
286
|
-
return NULL;
|
|
287
292
|
} else {
|
|
288
293
|
assert(HAS_ERROR_OCCURRED(tstate));
|
|
289
294
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
295
|
+
if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, GET_ERROR_OCCURRED(tstate), PyExc_AttributeError)) {
|
|
296
|
+
// Restoring the exception we own, to be released when handling it.
|
|
297
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
298
|
+
} else {
|
|
299
|
+
// Releasing exception we own.
|
|
300
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
301
|
+
}
|
|
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,56 @@ 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_STATE(tstate, &saved_exception_state);
|
|
475
|
+
#endif
|
|
476
|
+
|
|
477
|
+
struct Nuitka_ExceptionPreservationItem new_exception_state;
|
|
478
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_STR(tstate, &new_exception_state, PyExc_RuntimeError, message);
|
|
479
|
+
|
|
480
|
+
#if PYTHON_VERSION < 0x3c0
|
|
481
|
+
NORMALIZE_EXCEPTION_STATE(tstate, &new_exception_state);
|
|
482
|
+
#endif
|
|
483
|
+
|
|
484
|
+
Py_INCREF(saved_exception_state.exception_value);
|
|
485
|
+
RAISE_EXCEPTION_WITH_CAUSE(tstate, &new_exception_state, saved_exception_state.exception_value);
|
|
486
|
+
|
|
487
|
+
Nuitka_Exception_SetContext(new_exception_state.exception_value, saved_exception_state.exception_value);
|
|
488
|
+
|
|
489
|
+
RELEASE_ERROR_OCCURRED_STATE_X(&saved_exception_state);
|
|
490
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, &new_exception_state);
|
|
491
|
+
}
|
|
492
|
+
#endif
|
|
493
|
+
|
|
460
494
|
static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator,
|
|
461
|
-
PyObject *value,
|
|
462
|
-
PyTracebackObject *exception_tb) {
|
|
495
|
+
PyObject *value, struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
463
496
|
CHECK_OBJECT(generator);
|
|
464
497
|
assert(Nuitka_Generator_Check((PyObject *)generator));
|
|
465
|
-
|
|
466
|
-
CHECK_OBJECT_X(exception_value);
|
|
467
|
-
CHECK_OBJECT_X(exception_tb);
|
|
498
|
+
CHECK_EXCEPTION_STATE_X(exception_state);
|
|
468
499
|
CHECK_OBJECT_X(value);
|
|
469
|
-
assert(PyThreadState_GET() == tstate);
|
|
470
500
|
|
|
471
501
|
#if _DEBUG_GENERATOR
|
|
472
502
|
PRINT_GENERATOR_STATUS("Enter", generator);
|
|
473
503
|
PRINT_COROUTINE_VALUE("value", value);
|
|
474
|
-
|
|
504
|
+
PRINT_EXCEPTION_STATE(exception_state);
|
|
475
505
|
PRINT_CURRENT_EXCEPTION();
|
|
476
506
|
PRINT_NEW_LINE();
|
|
477
507
|
#endif
|
|
478
508
|
|
|
479
509
|
if (value != NULL) {
|
|
480
|
-
|
|
481
|
-
assert(exception_value == NULL);
|
|
482
|
-
assert(exception_tb == NULL);
|
|
510
|
+
ASSERT_EMPTY_EXCEPTION_STATE(exception_state);
|
|
483
511
|
}
|
|
484
512
|
|
|
485
513
|
if (generator->m_status != status_Finished) {
|
|
@@ -521,15 +549,15 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
521
549
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
522
550
|
|
|
523
551
|
// Check for thrown exception, publish it to the generator code.
|
|
524
|
-
if (unlikely(
|
|
552
|
+
if (unlikely(HAS_EXCEPTION_STATE(exception_state))) {
|
|
525
553
|
assert(value == NULL);
|
|
526
554
|
|
|
527
555
|
// Transfer exception ownership to published.
|
|
528
|
-
|
|
556
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
529
557
|
}
|
|
530
558
|
|
|
531
559
|
#if _DEBUG_GENERATOR
|
|
532
|
-
PRINT_GENERATOR_STATUS("Switching to
|
|
560
|
+
PRINT_GENERATOR_STATUS("Switching to generator", generator);
|
|
533
561
|
PRINT_COROUTINE_VALUE("value", value);
|
|
534
562
|
PRINT_CURRENT_EXCEPTION();
|
|
535
563
|
PRINT_NEW_LINE();
|
|
@@ -539,7 +567,7 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
539
567
|
PyObject *yielded;
|
|
540
568
|
|
|
541
569
|
#if PYTHON_VERSION >= 0x300
|
|
542
|
-
if (generator->
|
|
570
|
+
if (generator->m_yield_from == NULL) {
|
|
543
571
|
yielded = ((generator_code)generator->m_code)(tstate, generator, value);
|
|
544
572
|
} else {
|
|
545
573
|
// This does not release the value if any, so we need to do it afterwards.
|
|
@@ -549,17 +577,14 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
549
577
|
#else
|
|
550
578
|
yielded = ((generator_code)generator->m_code)(tstate, generator, value);
|
|
551
579
|
#endif
|
|
552
|
-
assert(PyThreadState_GET() == tstate);
|
|
553
580
|
|
|
554
581
|
#if PYTHON_VERSION >= 0x300
|
|
555
|
-
// If the generator returns with
|
|
582
|
+
// If the generator returns with m_yield_from set, it wants us to yield
|
|
556
583
|
// from that value from now on.
|
|
557
|
-
while (yielded == NULL && generator->
|
|
584
|
+
while (yielded == NULL && generator->m_yield_from != NULL) {
|
|
558
585
|
yielded = Nuitka_YieldFromGeneratorNext(tstate, generator);
|
|
559
586
|
}
|
|
560
587
|
#endif
|
|
561
|
-
assert(PyThreadState_GET() == tstate);
|
|
562
|
-
|
|
563
588
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
564
589
|
|
|
565
590
|
// Remove the generator from the frame stack.
|
|
@@ -567,7 +592,9 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
567
592
|
// assert(tstate->frame == &generator->m_frame->m_frame);
|
|
568
593
|
assertFrameObject(generator->m_frame);
|
|
569
594
|
|
|
570
|
-
|
|
595
|
+
if (generator->m_frame->m_frame.f_back) {
|
|
596
|
+
Py_CLEAR(generator->m_frame->m_frame.f_back);
|
|
597
|
+
}
|
|
571
598
|
}
|
|
572
599
|
|
|
573
600
|
// Return back to the frame that called us.
|
|
@@ -589,7 +616,7 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
589
616
|
Nuitka_MarkGeneratorAsFinished(generator);
|
|
590
617
|
|
|
591
618
|
if (generator->m_frame != NULL) {
|
|
592
|
-
#if PYTHON_VERSION >=
|
|
619
|
+
#if PYTHON_VERSION >= 0x300
|
|
593
620
|
Nuitka_SetFrameGenerator(generator->m_frame, NULL);
|
|
594
621
|
#endif
|
|
595
622
|
Py_DECREF(generator->m_frame);
|
|
@@ -612,30 +639,7 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
612
639
|
generator->m_code_object->co_flags & CO_FUTURE_GENERATOR_STOP &&
|
|
613
640
|
#endif
|
|
614
641
|
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);
|
|
642
|
+
RAISE_RUNTIME_ERROR_RAISED_STOP_ITERATION(tstate, "generator raised StopIteration");
|
|
639
643
|
|
|
640
644
|
return NULL;
|
|
641
645
|
}
|
|
@@ -668,7 +672,7 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
668
672
|
PyObject *old_value = tstate->exc_value;
|
|
669
673
|
PyTracebackObject *old_tb = (PyTracebackObject *)tstate->exc_traceback;
|
|
670
674
|
|
|
671
|
-
// Set sys attributes in the fastest possible way
|
|
675
|
+
// Set sys attributes in the fastest possible way, spell-checker: ignore sysdict
|
|
672
676
|
PyObject *sys_dict = tstate->interp->sysdict;
|
|
673
677
|
CHECK_OBJECT(sys_dict);
|
|
674
678
|
|
|
@@ -697,9 +701,9 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
697
701
|
tstate->exc_value = Py_None;
|
|
698
702
|
tstate->exc_traceback = (PyObject *)Py_None;
|
|
699
703
|
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
704
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
705
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
706
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
703
707
|
|
|
704
708
|
Py_XDECREF(old_type);
|
|
705
709
|
Py_XDECREF(old_value);
|
|
@@ -725,9 +729,11 @@ static PyObject *_Nuitka_Generator_send(PyThreadState *tstate, struct Nuitka_Gen
|
|
|
725
729
|
}
|
|
726
730
|
|
|
727
731
|
static PyObject *Nuitka_Generator_send(struct Nuitka_GeneratorObject *generator, PyObject *value) {
|
|
732
|
+
CHECK_OBJECT(value);
|
|
733
|
+
|
|
728
734
|
PyThreadState *tstate = PyThreadState_GET();
|
|
729
735
|
|
|
730
|
-
if (generator->m_status == status_Unused && value !=
|
|
736
|
+
if (generator->m_status == status_Unused && value != Py_None) {
|
|
731
737
|
// Buggy CPython 3.10 refuses to allow later usage.
|
|
732
738
|
#if PYTHON_VERSION >= 0x3a0 && PYTHON_VERSION < 0x3a2
|
|
733
739
|
Nuitka_MarkGeneratorAsFinished(generator);
|
|
@@ -740,11 +746,15 @@ static PyObject *Nuitka_Generator_send(struct Nuitka_GeneratorObject *generator,
|
|
|
740
746
|
|
|
741
747
|
// We need to transfer ownership of the sent value.
|
|
742
748
|
Py_INCREF(value);
|
|
743
|
-
|
|
749
|
+
|
|
750
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
751
|
+
INIT_ERROR_OCCURRED_STATE(&exception_state);
|
|
752
|
+
|
|
753
|
+
PyObject *result = _Nuitka_Generator_send(tstate, generator, value, &exception_state);
|
|
744
754
|
|
|
745
755
|
if (result == NULL) {
|
|
746
756
|
if (HAS_ERROR_OCCURRED(tstate) == false) {
|
|
747
|
-
|
|
757
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
748
758
|
}
|
|
749
759
|
}
|
|
750
760
|
|
|
@@ -754,15 +764,23 @@ static PyObject *Nuitka_Generator_send(struct Nuitka_GeneratorObject *generator,
|
|
|
754
764
|
static PyObject *Nuitka_Generator_tp_iternext(struct Nuitka_GeneratorObject *generator) {
|
|
755
765
|
PyThreadState *tstate = PyThreadState_GET();
|
|
756
766
|
|
|
757
|
-
|
|
758
|
-
|
|
767
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
768
|
+
|
|
769
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
770
|
+
INIT_ERROR_OCCURRED_STATE(&exception_state);
|
|
771
|
+
|
|
772
|
+
return _Nuitka_Generator_send(tstate, generator, Py_None, &exception_state);
|
|
759
773
|
}
|
|
760
774
|
|
|
761
775
|
/* Our own qiter interface, which is for quicker simple loop style iteration,
|
|
762
776
|
that does not send anything in. */
|
|
763
777
|
PyObject *Nuitka_Generator_qiter(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator, bool *finished) {
|
|
764
|
-
|
|
765
|
-
|
|
778
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
779
|
+
|
|
780
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
781
|
+
INIT_ERROR_OCCURRED_STATE(&exception_state);
|
|
782
|
+
|
|
783
|
+
PyObject *result = _Nuitka_Generator_send(tstate, generator, Py_None, &exception_state);
|
|
766
784
|
|
|
767
785
|
if (result == NULL) {
|
|
768
786
|
if (unlikely(!CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(tstate))) {
|
|
@@ -798,9 +816,10 @@ static bool _Nuitka_Generator_close(PyThreadState *tstate, struct Nuitka_Generat
|
|
|
798
816
|
CHECK_OBJECT(generator);
|
|
799
817
|
|
|
800
818
|
if (generator->m_status == status_Running) {
|
|
801
|
-
|
|
819
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
820
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, &exception_state, PyExc_GeneratorExit, NULL, NULL);
|
|
802
821
|
|
|
803
|
-
PyObject *result = _Nuitka_Generator_send(tstate, generator, NULL,
|
|
822
|
+
PyObject *result = _Nuitka_Generator_send(tstate, generator, NULL, &exception_state);
|
|
804
823
|
|
|
805
824
|
if (unlikely(result)) {
|
|
806
825
|
Py_DECREF(result);
|
|
@@ -823,7 +842,7 @@ static bool _Nuitka_Generator_close(PyThreadState *tstate, struct Nuitka_Generat
|
|
|
823
842
|
return true;
|
|
824
843
|
}
|
|
825
844
|
|
|
826
|
-
static PyObject *Nuitka_Generator_close(struct Nuitka_GeneratorObject *generator) {
|
|
845
|
+
static PyObject *Nuitka_Generator_close(struct Nuitka_GeneratorObject *generator, PyObject *unused) {
|
|
827
846
|
PyThreadState *tstate = PyThreadState_GET();
|
|
828
847
|
|
|
829
848
|
bool r = _Nuitka_Generator_close(tstate, generator);
|
|
@@ -831,20 +850,15 @@ static PyObject *Nuitka_Generator_close(struct Nuitka_GeneratorObject *generator
|
|
|
831
850
|
if (unlikely(r == false)) {
|
|
832
851
|
return NULL;
|
|
833
852
|
} else {
|
|
834
|
-
|
|
853
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
835
854
|
return Py_None;
|
|
836
855
|
}
|
|
837
856
|
}
|
|
838
857
|
|
|
839
|
-
|
|
840
|
-
static bool
|
|
841
|
-
|
|
842
|
-
CHECK_OBJECT(*exception_type);
|
|
843
|
-
CHECK_OBJECT_X(*exception_value);
|
|
844
|
-
CHECK_OBJECT_X(*exception_tb);
|
|
845
|
-
|
|
858
|
+
#if PYTHON_VERSION >= 0x3c0
|
|
859
|
+
static bool _Nuitka_Generator_check_throw_args(PyThreadState *tstate, PyObject **exception_type,
|
|
860
|
+
PyObject **exception_value, PyTracebackObject **exception_tb) {
|
|
846
861
|
if (*exception_tb == (PyTracebackObject *)Py_None) {
|
|
847
|
-
Py_DECREF(*exception_tb);
|
|
848
862
|
*exception_tb = NULL;
|
|
849
863
|
} else if (*exception_tb != NULL && !PyTraceBack_Check(*exception_tb)) {
|
|
850
864
|
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "throw() third argument must be a traceback object");
|
|
@@ -852,7 +866,6 @@ static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exc
|
|
|
852
866
|
}
|
|
853
867
|
|
|
854
868
|
if (PyExceptionClass_Check(*exception_type)) {
|
|
855
|
-
// TODO: Must not / need not normalize here?
|
|
856
869
|
NORMALIZE_EXCEPTION(tstate, exception_type, exception_value, exception_tb);
|
|
857
870
|
} else if (PyExceptionInstance_Check(*exception_type)) {
|
|
858
871
|
if (*exception_value != NULL && *exception_value != Py_None) {
|
|
@@ -862,10 +875,8 @@ static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exc
|
|
|
862
875
|
}
|
|
863
876
|
|
|
864
877
|
// Release old None value and replace it with the object, then set the exception type
|
|
865
|
-
// from the class.
|
|
866
|
-
Py_XDECREF(*exception_value);
|
|
878
|
+
// from the class. The "None" is known immortal here and needs no refcount correction.
|
|
867
879
|
*exception_value = *exception_type;
|
|
868
|
-
|
|
869
880
|
*exception_type = PyExceptionInstance_Class(*exception_type);
|
|
870
881
|
Py_INCREF(*exception_type);
|
|
871
882
|
} else {
|
|
@@ -883,10 +894,94 @@ static bool _Nuitka_Generator_check_throw2(PyThreadState *tstate, PyObject **exc
|
|
|
883
894
|
return true;
|
|
884
895
|
|
|
885
896
|
failed_throw:
|
|
897
|
+
|
|
898
|
+
return false;
|
|
899
|
+
}
|
|
900
|
+
#endif
|
|
901
|
+
|
|
902
|
+
static bool _Nuitka_Generator_make_throw_exception_state(PyThreadState *tstate,
|
|
903
|
+
struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
904
|
+
PyObject *exception_type, PyObject *exception_value,
|
|
905
|
+
PyTracebackObject *exception_tb) {
|
|
906
|
+
|
|
907
|
+
#if PYTHON_VERSION >= 0x3c0
|
|
908
|
+
Py_INCREF(exception_type);
|
|
909
|
+
Py_XINCREF(exception_value);
|
|
910
|
+
Py_XINCREF(exception_tb);
|
|
911
|
+
|
|
912
|
+
if (_Nuitka_Generator_check_throw_args(tstate, &exception_type, &exception_value, &exception_tb) == false) {
|
|
913
|
+
Py_DECREF(exception_type);
|
|
914
|
+
Py_XDECREF(exception_value);
|
|
915
|
+
Py_XDECREF(exception_tb);
|
|
916
|
+
|
|
917
|
+
return false;
|
|
918
|
+
}
|
|
919
|
+
#endif
|
|
920
|
+
|
|
921
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, exception_state, exception_type, exception_value, exception_tb);
|
|
922
|
+
|
|
923
|
+
#if PYTHON_VERSION >= 0x3c0
|
|
924
|
+
Py_DECREF(exception_type);
|
|
925
|
+
Py_XDECREF(exception_value);
|
|
926
|
+
Py_XDECREF(exception_tb);
|
|
927
|
+
#endif
|
|
928
|
+
|
|
929
|
+
return true;
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
// Shared code for checking a thrown exception, coroutines, asyncgen, uncompiled
|
|
933
|
+
// ones do this too. For pre-3.12, the checking needs to be done late, for 3.12
|
|
934
|
+
// early, so it's a separate function.
|
|
935
|
+
static bool _Nuitka_Generator_check_throw(PyThreadState *tstate,
|
|
936
|
+
struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
937
|
+
CHECK_EXCEPTION_STATE(exception_state);
|
|
938
|
+
|
|
939
|
+
#if PYTHON_VERSION < 0x3c0
|
|
940
|
+
if (exception_state->exception_tb == (PyTracebackObject *)Py_None) {
|
|
941
|
+
Py_DECREF(exception_state->exception_tb);
|
|
942
|
+
exception_state->exception_tb = NULL;
|
|
943
|
+
} else if (exception_state->exception_tb != NULL && !PyTraceBack_Check(exception_state->exception_tb)) {
|
|
944
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError, "throw() third argument must be a traceback object");
|
|
945
|
+
goto failed_throw;
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
if (PyExceptionClass_Check(exception_state->exception_type)) {
|
|
949
|
+
// TODO: Must not / need not normalize here?
|
|
950
|
+
NORMALIZE_EXCEPTION_STATE(tstate, exception_state);
|
|
951
|
+
} else if (PyExceptionInstance_Check(exception_state->exception_type)) {
|
|
952
|
+
if (exception_state->exception_value != NULL && exception_state->exception_value != Py_None) {
|
|
953
|
+
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
|
|
954
|
+
"instance exception may not have a separate value");
|
|
955
|
+
goto failed_throw;
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
// Release old None value and replace it with the object, then set the exception type
|
|
959
|
+
// from the class.
|
|
960
|
+
Py_XDECREF(exception_state->exception_value);
|
|
961
|
+
exception_state->exception_value = exception_state->exception_type;
|
|
962
|
+
|
|
963
|
+
exception_state->exception_type = PyExceptionInstance_Class(exception_state->exception_type);
|
|
964
|
+
Py_INCREF(exception_state->exception_type);
|
|
965
|
+
} else {
|
|
966
|
+
#if PYTHON_VERSION < 0x300
|
|
967
|
+
PyErr_Format(PyExc_TypeError, "exceptions must be classes, or instances, not %s",
|
|
968
|
+
Py_TYPE(exception_state->exception_type)->tp_name);
|
|
969
|
+
#else
|
|
970
|
+
PyErr_Format(PyExc_TypeError, "exceptions must be classes or instances deriving from BaseException, not %s",
|
|
971
|
+
Py_TYPE(exception_state->exception_type)->tp_name);
|
|
972
|
+
#endif
|
|
973
|
+
|
|
974
|
+
goto failed_throw;
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
#endif
|
|
978
|
+
return true;
|
|
979
|
+
|
|
980
|
+
#if PYTHON_VERSION < 0x3c0
|
|
981
|
+
failed_throw:
|
|
982
|
+
#endif
|
|
886
983
|
// Release exception, we are done with it now.
|
|
887
|
-
|
|
888
|
-
Py_XDECREF(*exception_value);
|
|
889
|
-
Py_XDECREF(*exception_tb);
|
|
984
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
890
985
|
|
|
891
986
|
return false;
|
|
892
987
|
}
|
|
@@ -902,49 +997,49 @@ static bool _Nuitka_Asyncgen_close(PyThreadState *tstate, struct Nuitka_Asyncgen
|
|
|
902
997
|
#endif
|
|
903
998
|
|
|
904
999
|
// Note: This is also used for coroutines and asyncgen
|
|
905
|
-
static bool Nuitka_gen_close_iter(PyThreadState *tstate, PyObject *
|
|
1000
|
+
static bool Nuitka_gen_close_iter(PyThreadState *tstate, PyObject *yield_from) {
|
|
906
1001
|
#if _DEBUG_GENERATOR
|
|
907
1002
|
PRINT_STRING("Nuitka_gen_close_iter: Enter\n");
|
|
908
1003
|
#endif
|
|
909
1004
|
|
|
910
|
-
CHECK_OBJECT(
|
|
1005
|
+
CHECK_OBJECT(yield_from);
|
|
911
1006
|
|
|
912
|
-
// TODO: Could specialize depending in
|
|
1007
|
+
// TODO: Could specialize depending in yield_from type for performance. Many
|
|
913
1008
|
// times these will be our own ones, or known ones like uncompiled
|
|
914
1009
|
// generators.
|
|
915
|
-
if (Nuitka_Generator_Check(
|
|
1010
|
+
if (Nuitka_Generator_Check(yield_from)) {
|
|
916
1011
|
#if _DEBUG_GENERATOR
|
|
917
1012
|
PRINT_STRING("Nuitka_gen_close_iter: Defer to _Nuitka_Generator_close\n");
|
|
918
1013
|
#endif
|
|
919
|
-
return _Nuitka_Generator_close(tstate, (struct Nuitka_GeneratorObject *)
|
|
1014
|
+
return _Nuitka_Generator_close(tstate, (struct Nuitka_GeneratorObject *)yield_from);
|
|
920
1015
|
}
|
|
921
1016
|
|
|
922
1017
|
#if PYTHON_VERSION >= 0x350
|
|
923
|
-
if (Nuitka_Coroutine_Check(
|
|
1018
|
+
if (Nuitka_Coroutine_Check(yield_from)) {
|
|
924
1019
|
#if _DEBUG_GENERATOR
|
|
925
1020
|
PRINT_STRING("Nuitka_gen_close_iter: Defer to _Nuitka_Coroutine_close\n");
|
|
926
1021
|
#endif
|
|
927
|
-
return _Nuitka_Coroutine_close(tstate, (struct Nuitka_CoroutineObject *)
|
|
1022
|
+
return _Nuitka_Coroutine_close(tstate, (struct Nuitka_CoroutineObject *)yield_from);
|
|
928
1023
|
}
|
|
929
1024
|
#endif
|
|
930
1025
|
|
|
931
1026
|
#if PYTHON_VERSION >= 0x360
|
|
932
|
-
if (Nuitka_Asyncgen_Check(
|
|
1027
|
+
if (Nuitka_Asyncgen_Check(yield_from)) {
|
|
933
1028
|
#if _DEBUG_GENERATOR
|
|
934
1029
|
PRINT_STRING("Nuitka_gen_close_iter: Defer to _Nuitka_Asyncgen_close\n");
|
|
935
1030
|
#endif
|
|
936
|
-
return _Nuitka_Asyncgen_close(tstate, (struct Nuitka_AsyncgenObject *)
|
|
1031
|
+
return _Nuitka_Asyncgen_close(tstate, (struct Nuitka_AsyncgenObject *)yield_from);
|
|
937
1032
|
}
|
|
938
1033
|
#endif
|
|
939
1034
|
|
|
940
|
-
PyObject *meth = PyObject_GetAttr(
|
|
1035
|
+
PyObject *meth = PyObject_GetAttr(yield_from, const_str_plain_close);
|
|
941
1036
|
|
|
942
1037
|
if (unlikely(meth == NULL)) {
|
|
943
1038
|
if (unlikely(!PyErr_ExceptionMatches(PyExc_AttributeError))) {
|
|
944
1039
|
#if _DEBUG_GENERATOR
|
|
945
1040
|
PRINT_STRING("Nuitka_gen_close_iter: Strange error while looking up close method.\n");
|
|
946
1041
|
#endif
|
|
947
|
-
PyErr_WriteUnraisable(
|
|
1042
|
+
PyErr_WriteUnraisable(yield_from);
|
|
948
1043
|
}
|
|
949
1044
|
|
|
950
1045
|
CLEAR_ERROR_OCCURRED(tstate);
|
|
@@ -980,113 +1075,105 @@ static bool Nuitka_gen_close_iter(PyThreadState *tstate, PyObject *yieldfrom) {
|
|
|
980
1075
|
static bool Nuitka_AsyncgenAsend_Check(PyObject *object);
|
|
981
1076
|
struct Nuitka_AsyncgenAsendObject;
|
|
982
1077
|
static PyObject *_Nuitka_AsyncgenAsend_throw2(PyThreadState *tstate, struct Nuitka_AsyncgenAsendObject *asyncgen_asend,
|
|
983
|
-
|
|
984
|
-
PyTracebackObject *exception_tb);
|
|
1078
|
+
struct Nuitka_ExceptionPreservationItem *exception_state);
|
|
985
1079
|
#endif
|
|
986
1080
|
|
|
987
1081
|
static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate, struct Nuitka_GeneratorObject *generator,
|
|
988
|
-
|
|
989
|
-
PyTracebackObject *exception_tb) {
|
|
1082
|
+
struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
990
1083
|
#if _DEBUG_GENERATOR
|
|
991
1084
|
PRINT_GENERATOR_STATUS("Enter", generator);
|
|
992
|
-
PRINT_COROUTINE_VALUE("
|
|
993
|
-
|
|
1085
|
+
PRINT_COROUTINE_VALUE("yield_from", generator->m_yield_from);
|
|
1086
|
+
PRINT_EXCEPTION_STATE(exception_state);
|
|
994
1087
|
PRINT_NEW_LINE();
|
|
995
1088
|
#endif
|
|
996
1089
|
|
|
997
1090
|
CHECK_OBJECT(generator);
|
|
998
1091
|
assert(Nuitka_Generator_Check((PyObject *)generator));
|
|
999
|
-
|
|
1000
|
-
CHECK_OBJECT_X(exception_value);
|
|
1001
|
-
CHECK_OBJECT_X(exception_tb);
|
|
1092
|
+
CHECK_EXCEPTION_STATE(exception_state);
|
|
1002
1093
|
|
|
1003
1094
|
#if PYTHON_VERSION >= 0x300
|
|
1004
|
-
if (generator->
|
|
1005
|
-
if (
|
|
1095
|
+
if (generator->m_yield_from != NULL) {
|
|
1096
|
+
if (EXCEPTION_STATE_MATCH_BOOL_SINGLE(tstate, exception_state, PyExc_GeneratorExit)) {
|
|
1006
1097
|
// Generators need to close the yield_from.
|
|
1007
1098
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1008
|
-
bool res = Nuitka_gen_close_iter(tstate, generator->
|
|
1099
|
+
bool res = Nuitka_gen_close_iter(tstate, generator->m_yield_from);
|
|
1009
1100
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1010
1101
|
|
|
1011
1102
|
if (res == false) {
|
|
1012
1103
|
// 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);
|
|
1104
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
1016
1105
|
|
|
1017
|
-
|
|
1106
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
1018
1107
|
}
|
|
1019
1108
|
|
|
1020
1109
|
// Transferred exception ownership to "_Nuitka_Generator_send".
|
|
1021
|
-
return _Nuitka_Generator_send(tstate, generator, NULL,
|
|
1110
|
+
return _Nuitka_Generator_send(tstate, generator, NULL, exception_state);
|
|
1022
1111
|
}
|
|
1023
1112
|
|
|
1024
1113
|
PyObject *ret;
|
|
1025
1114
|
|
|
1026
1115
|
#if _DEBUG_GENERATOR
|
|
1027
1116
|
PRINT_GENERATOR_STATUS("Passing to yielded from", generator);
|
|
1028
|
-
PRINT_COROUTINE_VALUE("
|
|
1117
|
+
PRINT_COROUTINE_VALUE("m_yield_from", generator->m_yield_from);
|
|
1029
1118
|
PRINT_NEW_LINE();
|
|
1030
1119
|
#endif
|
|
1031
1120
|
|
|
1032
|
-
if (Nuitka_Generator_Check(generator->
|
|
1033
|
-
struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)generator->
|
|
1121
|
+
if (Nuitka_Generator_Check(generator->m_yield_from)) {
|
|
1122
|
+
struct Nuitka_GeneratorObject *gen = ((struct Nuitka_GeneratorObject *)generator->m_yield_from);
|
|
1034
1123
|
// Transferred exception ownership to "_Nuitka_Generator_throw2".
|
|
1035
1124
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1036
|
-
ret = _Nuitka_Generator_throw2(tstate, gen,
|
|
1125
|
+
ret = _Nuitka_Generator_throw2(tstate, gen, exception_state);
|
|
1037
1126
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1038
1127
|
#if NUITKA_UNCOMPILED_THROW_INTEGRATION
|
|
1039
|
-
} else if (PyGen_CheckExact(generator->
|
|
1040
|
-
PyGenObject *gen = (PyGenObject *)generator->
|
|
1128
|
+
} else if (PyGen_CheckExact(generator->m_yield_from)) {
|
|
1129
|
+
PyGenObject *gen = (PyGenObject *)generator->m_yield_from;
|
|
1041
1130
|
|
|
1042
1131
|
// Transferred exception ownership to "Nuitka_UncompiledGenerator_throw".
|
|
1043
1132
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1044
|
-
ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1,
|
|
1133
|
+
ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
|
|
1045
1134
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1046
1135
|
#endif
|
|
1047
1136
|
#if PYTHON_VERSION >= 0x350
|
|
1048
|
-
} else if (Nuitka_Coroutine_Check(generator->
|
|
1049
|
-
struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)generator->
|
|
1137
|
+
} else if (Nuitka_Coroutine_Check(generator->m_yield_from)) {
|
|
1138
|
+
struct Nuitka_CoroutineObject *coro = ((struct Nuitka_CoroutineObject *)generator->m_yield_from);
|
|
1050
1139
|
// Transferred exception ownership to "_Nuitka_Coroutine_throw2".
|
|
1051
1140
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1052
|
-
ret = _Nuitka_Coroutine_throw2(tstate, coro, true,
|
|
1141
|
+
ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
|
|
1053
1142
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1054
|
-
} else if (Nuitka_CoroutineWrapper_Check(generator->
|
|
1143
|
+
} else if (Nuitka_CoroutineWrapper_Check(generator->m_yield_from)) {
|
|
1055
1144
|
struct Nuitka_CoroutineObject *coro =
|
|
1056
|
-
((struct Nuitka_CoroutineWrapperObject *)generator->
|
|
1145
|
+
((struct Nuitka_CoroutineWrapperObject *)generator->m_yield_from)->m_coroutine;
|
|
1057
1146
|
|
|
1058
1147
|
// Transferred exception ownership to "_Nuitka_Coroutine_throw2".
|
|
1059
1148
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1060
|
-
ret = _Nuitka_Coroutine_throw2(tstate, coro, true,
|
|
1149
|
+
ret = _Nuitka_Coroutine_throw2(tstate, coro, true, exception_state);
|
|
1061
1150
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1062
1151
|
#if NUITKA_UNCOMPILED_THROW_INTEGRATION
|
|
1063
|
-
} else if (PyCoro_CheckExact(generator->
|
|
1064
|
-
PyGenObject *gen = (PyGenObject *)generator->
|
|
1152
|
+
} else if (PyCoro_CheckExact(generator->m_yield_from)) {
|
|
1153
|
+
PyGenObject *gen = (PyGenObject *)generator->m_yield_from;
|
|
1065
1154
|
|
|
1066
1155
|
// Transferred exception ownership to "Nuitka_UncompiledGenerator_throw".
|
|
1067
1156
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1068
|
-
ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1,
|
|
1157
|
+
ret = Nuitka_UncompiledGenerator_throw(tstate, gen, 1, exception_state);
|
|
1069
1158
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1070
1159
|
#endif
|
|
1071
1160
|
#if PYTHON_VERSION >= 0x360
|
|
1072
|
-
} else if (Nuitka_AsyncgenAsend_Check(generator->
|
|
1161
|
+
} else if (Nuitka_AsyncgenAsend_Check(generator->m_yield_from)) {
|
|
1073
1162
|
struct Nuitka_AsyncgenAsendObject *asyncgen_asend =
|
|
1074
|
-
((struct Nuitka_AsyncgenAsendObject *)generator->
|
|
1163
|
+
((struct Nuitka_AsyncgenAsendObject *)generator->m_yield_from);
|
|
1075
1164
|
|
|
1076
1165
|
// Transferred exception ownership to "_Nuitka_AsyncgenAsend_throw2".
|
|
1077
1166
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1078
|
-
ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend,
|
|
1167
|
+
ret = _Nuitka_AsyncgenAsend_throw2(tstate, asyncgen_asend, exception_state);
|
|
1079
1168
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1080
1169
|
#endif
|
|
1081
1170
|
#endif
|
|
1082
1171
|
} else {
|
|
1083
|
-
PyObject *meth = PyObject_GetAttr(generator->
|
|
1172
|
+
PyObject *meth = PyObject_GetAttr(generator->m_yield_from, const_str_plain_throw);
|
|
1084
1173
|
if (unlikely(meth == NULL)) {
|
|
1085
1174
|
if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
|
|
1086
1175
|
// Release exception, we are done with it now.
|
|
1087
|
-
|
|
1088
|
-
Py_XDECREF(exception_value);
|
|
1089
|
-
Py_XDECREF(exception_tb);
|
|
1176
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
1090
1177
|
|
|
1091
1178
|
return NULL;
|
|
1092
1179
|
}
|
|
@@ -1097,39 +1184,37 @@ static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate, struct Nuitka_G
|
|
|
1097
1184
|
goto throw_here;
|
|
1098
1185
|
}
|
|
1099
1186
|
|
|
1100
|
-
|
|
1187
|
+
CHECK_EXCEPTION_STATE(exception_state);
|
|
1101
1188
|
|
|
1102
1189
|
#if 0
|
|
1103
1190
|
// TODO: Add slow mode traces.
|
|
1104
|
-
PRINT_ITEM(coroutine->
|
|
1191
|
+
PRINT_ITEM(coroutine->m_yield_from);
|
|
1105
1192
|
PRINT_NEW_LINE();
|
|
1106
1193
|
#endif
|
|
1107
1194
|
Nuitka_MarkGeneratorAsRunning(generator);
|
|
1108
|
-
ret =
|
|
1195
|
+
ret = Nuitka_CallGeneratorThrowMethod(meth, exception_state);
|
|
1109
1196
|
Nuitka_MarkGeneratorAsNotRunning(generator);
|
|
1110
1197
|
|
|
1111
1198
|
Py_DECREF(meth);
|
|
1112
1199
|
|
|
1113
1200
|
// Release exception, we are done with it now.
|
|
1114
|
-
|
|
1115
|
-
Py_XDECREF(exception_value);
|
|
1116
|
-
Py_XDECREF(exception_tb);
|
|
1201
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
1117
1202
|
}
|
|
1118
1203
|
|
|
1119
1204
|
if (unlikely(ret == NULL)) {
|
|
1120
1205
|
// Return value or exception, not to continue with yielding from.
|
|
1121
|
-
if (generator->
|
|
1122
|
-
CHECK_OBJECT(generator->
|
|
1206
|
+
if (generator->m_yield_from != NULL) {
|
|
1207
|
+
CHECK_OBJECT(generator->m_yield_from);
|
|
1123
1208
|
#if _DEBUG_GENERATOR
|
|
1124
1209
|
PRINT_GENERATOR_STATUS("Null return, yield from removal:", generator);
|
|
1125
|
-
PRINT_COROUTINE_VALUE("
|
|
1210
|
+
PRINT_COROUTINE_VALUE("yield_from", generator->m_yield_from);
|
|
1126
1211
|
#endif
|
|
1127
|
-
Py_DECREF(generator->
|
|
1128
|
-
generator->
|
|
1212
|
+
Py_DECREF(generator->m_yield_from);
|
|
1213
|
+
generator->m_yield_from = NULL;
|
|
1129
1214
|
}
|
|
1130
1215
|
|
|
1131
1216
|
PyObject *val;
|
|
1132
|
-
if (
|
|
1217
|
+
if (Nuitka_PyGen_FetchStopIterationValue(tstate, &val)) {
|
|
1133
1218
|
CHECK_OBJECT(val);
|
|
1134
1219
|
|
|
1135
1220
|
#if _DEBUG_GENERATOR
|
|
@@ -1138,14 +1223,21 @@ static PyObject *_Nuitka_Generator_throw2(PyThreadState *tstate, struct Nuitka_G
|
|
|
1138
1223
|
PRINT_NEW_LINE();
|
|
1139
1224
|
#endif
|
|
1140
1225
|
|
|
1141
|
-
|
|
1226
|
+
struct Nuitka_ExceptionPreservationItem no_exception_state;
|
|
1227
|
+
INIT_ERROR_OCCURRED_STATE(&no_exception_state);
|
|
1228
|
+
|
|
1229
|
+
ret = _Nuitka_Generator_send(tstate, generator, val, &no_exception_state);
|
|
1142
1230
|
} else {
|
|
1143
1231
|
#if _DEBUG_GENERATOR
|
|
1144
1232
|
PRINT_GENERATOR_STATUS("Sending exception value into ourselves", generator);
|
|
1145
1233
|
PRINT_CURRENT_EXCEPTION();
|
|
1146
1234
|
PRINT_NEW_LINE();
|
|
1147
1235
|
#endif
|
|
1148
|
-
|
|
1236
|
+
|
|
1237
|
+
struct Nuitka_ExceptionPreservationItem no_exception_state;
|
|
1238
|
+
INIT_ERROR_OCCURRED_STATE(&no_exception_state);
|
|
1239
|
+
|
|
1240
|
+
ret = _Nuitka_Generator_send(tstate, generator, NULL, &no_exception_state);
|
|
1149
1241
|
}
|
|
1150
1242
|
|
|
1151
1243
|
#if _DEBUG_GENERATOR
|
|
@@ -1171,39 +1263,41 @@ throw_here:
|
|
|
1171
1263
|
|
|
1172
1264
|
// We continue to have exception ownership here.
|
|
1173
1265
|
|
|
1174
|
-
if (unlikely(
|
|
1175
|
-
// Exception was released by
|
|
1266
|
+
if (unlikely(_Nuitka_Generator_check_throw(tstate, exception_state) == false)) {
|
|
1267
|
+
// Exception was released by _Nuitka_Generator_check_throw already.
|
|
1176
1268
|
return NULL;
|
|
1177
1269
|
}
|
|
1178
1270
|
|
|
1179
1271
|
if (generator->m_status == status_Running) {
|
|
1180
1272
|
// Passing exception ownership to _Nuitka_Generator_send
|
|
1181
|
-
PyObject *result =
|
|
1182
|
-
_Nuitka_Generator_send(tstate, generator, NULL, exception_type, exception_value, exception_tb);
|
|
1273
|
+
PyObject *result = _Nuitka_Generator_send(tstate, generator, NULL, exception_state);
|
|
1183
1274
|
|
|
1184
1275
|
if (result == NULL) {
|
|
1185
|
-
if (
|
|
1186
|
-
|
|
1276
|
+
if (HAS_ERROR_OCCURRED(tstate) == false) {
|
|
1277
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1187
1278
|
}
|
|
1188
1279
|
}
|
|
1189
1280
|
|
|
1190
1281
|
return result;
|
|
1191
1282
|
} else if (generator->m_status == status_Finished) {
|
|
1192
|
-
|
|
1283
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
1193
1284
|
|
|
1194
1285
|
return NULL;
|
|
1195
1286
|
} else {
|
|
1287
|
+
PyTracebackObject *exception_tb = GET_EXCEPTION_STATE_TRACEBACK(exception_state);
|
|
1288
|
+
|
|
1196
1289
|
if (exception_tb == NULL) {
|
|
1197
1290
|
// TODO: Our compiled objects really need a way to store common
|
|
1198
1291
|
// stuff in a "shared" part across all instances, and outside of
|
|
1199
1292
|
// run time, so we could reuse this.
|
|
1200
1293
|
struct Nuitka_FrameObject *frame =
|
|
1201
1294
|
MAKE_FUNCTION_FRAME(tstate, generator->m_code_object, generator->m_module, 0);
|
|
1202
|
-
|
|
1295
|
+
SET_EXCEPTION_STATE_TRACEBACK(exception_state,
|
|
1296
|
+
MAKE_TRACEBACK(frame, generator->m_code_object->co_firstlineno));
|
|
1203
1297
|
Py_DECREF(frame);
|
|
1204
1298
|
}
|
|
1205
1299
|
|
|
1206
|
-
|
|
1300
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, exception_state);
|
|
1207
1301
|
|
|
1208
1302
|
Nuitka_MarkGeneratorAsFinished(generator);
|
|
1209
1303
|
|
|
@@ -1223,18 +1317,20 @@ static PyObject *Nuitka_Generator_throw(struct Nuitka_GeneratorObject *generator
|
|
|
1223
1317
|
return NULL;
|
|
1224
1318
|
}
|
|
1225
1319
|
|
|
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
1320
|
PyThreadState *tstate = PyThreadState_GET();
|
|
1232
1321
|
|
|
1233
|
-
|
|
1322
|
+
// Handing ownership of exception over, we need not release it ourselves
|
|
1323
|
+
struct Nuitka_ExceptionPreservationItem exception_state;
|
|
1324
|
+
if (_Nuitka_Generator_make_throw_exception_state(tstate, &exception_state, exception_type, exception_value,
|
|
1325
|
+
exception_tb) == false) {
|
|
1326
|
+
return NULL;
|
|
1327
|
+
}
|
|
1328
|
+
|
|
1329
|
+
PyObject *result = _Nuitka_Generator_throw2(tstate, generator, &exception_state);
|
|
1234
1330
|
|
|
1235
1331
|
if (result == NULL) {
|
|
1236
1332
|
if (HAS_ERROR_OCCURRED(tstate) == false) {
|
|
1237
|
-
|
|
1333
|
+
SET_CURRENT_EXCEPTION_STOP_ITERATION_EMPTY(tstate);
|
|
1238
1334
|
}
|
|
1239
1335
|
}
|
|
1240
1336
|
|
|
@@ -1248,7 +1344,7 @@ static PyObject *Nuitka_Generator_throw(struct Nuitka_GeneratorObject *generator
|
|
|
1248
1344
|
return result;
|
|
1249
1345
|
}
|
|
1250
1346
|
|
|
1251
|
-
#if PYTHON_VERSION >=
|
|
1347
|
+
#if PYTHON_VERSION >= 0x300
|
|
1252
1348
|
static void Nuitka_Generator_tp_finalizer(struct Nuitka_GeneratorObject *generator) {
|
|
1253
1349
|
if (generator->m_status != status_Running) {
|
|
1254
1350
|
return;
|
|
@@ -1256,9 +1352,8 @@ static void Nuitka_Generator_tp_finalizer(struct Nuitka_GeneratorObject *generat
|
|
|
1256
1352
|
|
|
1257
1353
|
PyThreadState *tstate = PyThreadState_GET();
|
|
1258
1354
|
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
FETCH_ERROR_OCCURRED(tstate, &save_exception_type, &save_exception_value, &save_exception_tb);
|
|
1355
|
+
struct Nuitka_ExceptionPreservationItem saved_exception_state;
|
|
1356
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
1262
1357
|
|
|
1263
1358
|
bool close_result = _Nuitka_Generator_close(tstate, generator);
|
|
1264
1359
|
|
|
@@ -1266,8 +1361,8 @@ static void Nuitka_Generator_tp_finalizer(struct Nuitka_GeneratorObject *generat
|
|
|
1266
1361
|
PyErr_WriteUnraisable((PyObject *)generator);
|
|
1267
1362
|
}
|
|
1268
1363
|
|
|
1269
|
-
|
|
1270
|
-
|
|
1364
|
+
// Restore the saved exception if any.
|
|
1365
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
1271
1366
|
}
|
|
1272
1367
|
#endif
|
|
1273
1368
|
|
|
@@ -1276,6 +1371,11 @@ static struct Nuitka_GeneratorObject *free_list_generators = NULL;
|
|
|
1276
1371
|
static int free_list_generators_count = 0;
|
|
1277
1372
|
|
|
1278
1373
|
static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator) {
|
|
1374
|
+
#if _DEBUG_REFCOUNTS
|
|
1375
|
+
count_active_Nuitka_Generator_Type -= 1;
|
|
1376
|
+
count_released_Nuitka_Generator_Type += 1;
|
|
1377
|
+
#endif
|
|
1378
|
+
|
|
1279
1379
|
// Revive temporarily.
|
|
1280
1380
|
assert(Py_REFCNT(generator) == 0);
|
|
1281
1381
|
Py_SET_REFCNT(generator, 1);
|
|
@@ -1283,9 +1383,8 @@ static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator
|
|
|
1283
1383
|
PyThreadState *tstate = PyThreadState_GET();
|
|
1284
1384
|
|
|
1285
1385
|
// 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);
|
|
1386
|
+
struct Nuitka_ExceptionPreservationItem saved_exception_state;
|
|
1387
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
1289
1388
|
|
|
1290
1389
|
if (generator->m_status == status_Running) {
|
|
1291
1390
|
bool close_result = _Nuitka_Generator_close(tstate, generator);
|
|
@@ -1305,7 +1404,7 @@ static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator
|
|
|
1305
1404
|
}
|
|
1306
1405
|
|
|
1307
1406
|
if (generator->m_frame != NULL) {
|
|
1308
|
-
#if PYTHON_VERSION >=
|
|
1407
|
+
#if PYTHON_VERSION >= 0x300
|
|
1309
1408
|
Nuitka_SetFrameGenerator(generator->m_frame, NULL);
|
|
1310
1409
|
#endif
|
|
1311
1410
|
Py_DECREF(generator->m_frame);
|
|
@@ -1329,19 +1428,20 @@ static void Nuitka_Generator_tp_dealloc(struct Nuitka_GeneratorObject *generator
|
|
|
1329
1428
|
/* Put the object into free list or release to GC */
|
|
1330
1429
|
releaseToFreeList(free_list_generators, generator, MAX_GENERATOR_FREE_LIST_COUNT);
|
|
1331
1430
|
|
|
1332
|
-
|
|
1431
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
1333
1432
|
}
|
|
1334
1433
|
|
|
1335
1434
|
static long Nuitka_Generator_tp_hash(struct Nuitka_GeneratorObject *generator) { return generator->m_counter; }
|
|
1336
1435
|
|
|
1337
|
-
static PyObject *Nuitka_Generator_get_name(
|
|
1436
|
+
static PyObject *Nuitka_Generator_get_name(PyObject *self, void *data) {
|
|
1437
|
+
struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
|
|
1338
1438
|
PyObject *result = generator->m_name;
|
|
1339
1439
|
Py_INCREF(result);
|
|
1340
1440
|
return result;
|
|
1341
1441
|
}
|
|
1342
1442
|
|
|
1343
1443
|
#if PYTHON_VERSION >= 0x350
|
|
1344
|
-
static int Nuitka_Generator_set_name(
|
|
1444
|
+
static int Nuitka_Generator_set_name(PyObject *self, PyObject *value, void *data) {
|
|
1345
1445
|
// Cannot be deleted, not be non-unicode value.
|
|
1346
1446
|
if (unlikely((value == NULL) || !PyUnicode_Check(value))) {
|
|
1347
1447
|
PyThreadState *tstate = PyThreadState_GET();
|
|
@@ -1350,6 +1450,7 @@ static int Nuitka_Generator_set_name(struct Nuitka_GeneratorObject *generator, P
|
|
|
1350
1450
|
return -1;
|
|
1351
1451
|
}
|
|
1352
1452
|
|
|
1453
|
+
struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
|
|
1353
1454
|
PyObject *tmp = generator->m_name;
|
|
1354
1455
|
Py_INCREF(value);
|
|
1355
1456
|
generator->m_name = value;
|
|
@@ -1358,13 +1459,14 @@ static int Nuitka_Generator_set_name(struct Nuitka_GeneratorObject *generator, P
|
|
|
1358
1459
|
return 0;
|
|
1359
1460
|
}
|
|
1360
1461
|
|
|
1361
|
-
static PyObject *Nuitka_Generator_get_qualname(
|
|
1462
|
+
static PyObject *Nuitka_Generator_get_qualname(PyObject *self, void *data) {
|
|
1463
|
+
struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
|
|
1362
1464
|
PyObject *result = generator->m_qualname;
|
|
1363
1465
|
Py_INCREF(result);
|
|
1364
1466
|
return result;
|
|
1365
1467
|
}
|
|
1366
1468
|
|
|
1367
|
-
static int Nuitka_Generator_set_qualname(
|
|
1469
|
+
static int Nuitka_Generator_set_qualname(PyObject *self, PyObject *value, void *data) {
|
|
1368
1470
|
// Cannot be deleted, not be non-unicode value.
|
|
1369
1471
|
if (unlikely((value == NULL) || !PyUnicode_Check(value))) {
|
|
1370
1472
|
PyThreadState *tstate = PyThreadState_GET();
|
|
@@ -1373,6 +1475,7 @@ static int Nuitka_Generator_set_qualname(struct Nuitka_GeneratorObject *generato
|
|
|
1373
1475
|
return -1;
|
|
1374
1476
|
}
|
|
1375
1477
|
|
|
1478
|
+
struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
|
|
1376
1479
|
PyObject *tmp = generator->m_qualname;
|
|
1377
1480
|
Py_INCREF(value);
|
|
1378
1481
|
generator->m_qualname = value;
|
|
@@ -1381,34 +1484,37 @@ static int Nuitka_Generator_set_qualname(struct Nuitka_GeneratorObject *generato
|
|
|
1381
1484
|
return 0;
|
|
1382
1485
|
}
|
|
1383
1486
|
|
|
1384
|
-
static PyObject *
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1487
|
+
static PyObject *Nuitka_Generator_get_yield_from(PyObject *self, void *data) {
|
|
1488
|
+
struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
|
|
1489
|
+
if (generator->m_yield_from) {
|
|
1490
|
+
Py_INCREF(generator->m_yield_from);
|
|
1491
|
+
return generator->m_yield_from;
|
|
1388
1492
|
} else {
|
|
1389
|
-
|
|
1493
|
+
Py_INCREF_IMMORTAL(Py_None);
|
|
1390
1494
|
return Py_None;
|
|
1391
1495
|
}
|
|
1392
1496
|
}
|
|
1393
1497
|
|
|
1394
1498
|
#endif
|
|
1395
1499
|
|
|
1396
|
-
static PyObject *Nuitka_Generator_get_code(
|
|
1500
|
+
static PyObject *Nuitka_Generator_get_code(PyObject *self, void *data) {
|
|
1501
|
+
struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
|
|
1397
1502
|
PyObject *result = (PyObject *)generator->m_code_object;
|
|
1398
1503
|
Py_INCREF(result);
|
|
1399
1504
|
return result;
|
|
1400
1505
|
}
|
|
1401
1506
|
|
|
1402
|
-
static int Nuitka_Generator_set_code(
|
|
1507
|
+
static int Nuitka_Generator_set_code(PyObject *self, PyObject *value, void *data) {
|
|
1403
1508
|
PyThreadState *tstate = PyThreadState_GET();
|
|
1404
1509
|
|
|
1405
1510
|
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "gi_code is not writable in Nuitka");
|
|
1406
1511
|
return -1;
|
|
1407
1512
|
}
|
|
1408
1513
|
|
|
1409
|
-
static PyObject *Nuitka_Generator_get_frame(
|
|
1514
|
+
static PyObject *Nuitka_Generator_get_frame(PyObject *self, void *data) {
|
|
1410
1515
|
PyObject *result;
|
|
1411
1516
|
|
|
1517
|
+
struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
|
|
1412
1518
|
if (generator->m_frame) {
|
|
1413
1519
|
result = (PyObject *)generator->m_frame;
|
|
1414
1520
|
} else {
|
|
@@ -1419,27 +1525,28 @@ static PyObject *Nuitka_Generator_get_frame(struct Nuitka_GeneratorObject *gener
|
|
|
1419
1525
|
return result;
|
|
1420
1526
|
}
|
|
1421
1527
|
|
|
1422
|
-
static int Nuitka_Generator_set_frame(
|
|
1528
|
+
static int Nuitka_Generator_set_frame(PyObject *self, PyObject *value, void *data) {
|
|
1423
1529
|
PyThreadState *tstate = PyThreadState_GET();
|
|
1424
1530
|
|
|
1425
1531
|
SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_RuntimeError, "gi_frame is not writable in Nuitka");
|
|
1426
1532
|
return -1;
|
|
1427
1533
|
}
|
|
1428
1534
|
|
|
1429
|
-
static PyObject *Nuitka_Generator_get_running(
|
|
1535
|
+
static PyObject *Nuitka_Generator_get_running(PyObject *self, void *data) {
|
|
1430
1536
|
PyObject *result;
|
|
1431
1537
|
|
|
1538
|
+
struct Nuitka_GeneratorObject *generator = (struct Nuitka_GeneratorObject *)self;
|
|
1432
1539
|
/* The type of "gi_running" changed in Python3. */
|
|
1433
1540
|
#if PYTHON_VERSION < 0x300
|
|
1434
|
-
result =
|
|
1541
|
+
result = Nuitka_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
|
}
|
|
1441
1548
|
|
|
1442
|
-
static int Nuitka_Generator_set_running(
|
|
1549
|
+
static int Nuitka_Generator_set_running(PyObject *self, PyObject *value, void *data) {
|
|
1443
1550
|
#if PYTHON_VERSION < 0x300
|
|
1444
1551
|
PyObject *exception_type = PyExc_TypeError;
|
|
1445
1552
|
#else
|
|
@@ -1457,17 +1564,19 @@ static int Nuitka_Generator_set_running(struct Nuitka_GeneratorObject *generator
|
|
|
1457
1564
|
return -1;
|
|
1458
1565
|
}
|
|
1459
1566
|
|
|
1460
|
-
|
|
1567
|
+
// spell-checker: ignore gi_yieldfrom
|
|
1568
|
+
|
|
1569
|
+
static PyGetSetDef Nuitka_Generator_tp_getset[] = {
|
|
1461
1570
|
#if PYTHON_VERSION < 0x350
|
|
1462
|
-
{(char *)"__name__",
|
|
1571
|
+
{(char *)"__name__", Nuitka_Generator_get_name, NULL, NULL},
|
|
1463
1572
|
#else
|
|
1464
|
-
{(char *)"__name__",
|
|
1465
|
-
{(char *)"__qualname__",
|
|
1466
|
-
{(char *)"gi_yieldfrom",
|
|
1573
|
+
{(char *)"__name__", Nuitka_Generator_get_name, Nuitka_Generator_set_name, NULL},
|
|
1574
|
+
{(char *)"__qualname__", Nuitka_Generator_get_qualname, Nuitka_Generator_set_qualname, NULL},
|
|
1575
|
+
{(char *)"gi_yieldfrom", Nuitka_Generator_get_yield_from, NULL, NULL},
|
|
1467
1576
|
#endif
|
|
1468
|
-
{(char *)"gi_code",
|
|
1469
|
-
{(char *)"gi_frame",
|
|
1470
|
-
{(char *)"gi_running",
|
|
1577
|
+
{(char *)"gi_code", Nuitka_Generator_get_code, Nuitka_Generator_set_code, NULL},
|
|
1578
|
+
{(char *)"gi_frame", Nuitka_Generator_get_frame, Nuitka_Generator_set_frame, NULL},
|
|
1579
|
+
{(char *)"gi_running", Nuitka_Generator_get_running, Nuitka_Generator_set_running, NULL},
|
|
1471
1580
|
|
|
1472
1581
|
{NULL}};
|
|
1473
1582
|
|
|
@@ -1487,8 +1596,6 @@ static PyAsyncMethods Nuitka_Generator_as_async = {
|
|
|
1487
1596
|
};
|
|
1488
1597
|
#endif
|
|
1489
1598
|
|
|
1490
|
-
#include <structmember.h>
|
|
1491
|
-
|
|
1492
1599
|
PyTypeObject Nuitka_Generator_Type = {
|
|
1493
1600
|
PyVarObject_HEAD_INIT(NULL, 0) "compiled_generator", // tp_name
|
|
1494
1601
|
sizeof(struct Nuitka_GeneratorObject), // tp_basicsize
|
|
@@ -1512,7 +1619,7 @@ PyTypeObject Nuitka_Generator_Type = {
|
|
|
1512
1619
|
0, // tp_getattro (PyObject_GenericGetAttr)
|
|
1513
1620
|
0, // tp_setattro
|
|
1514
1621
|
0, // tp_as_buffer
|
|
1515
|
-
#if PYTHON_VERSION <
|
|
1622
|
+
#if PYTHON_VERSION < 0x300
|
|
1516
1623
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
|
|
1517
1624
|
#else
|
|
1518
1625
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE,
|
|
@@ -1527,7 +1634,7 @@ PyTypeObject Nuitka_Generator_Type = {
|
|
|
1527
1634
|
(iternextfunc)Nuitka_Generator_tp_iternext, // tp_iternext
|
|
1528
1635
|
Nuitka_Generator_methods, // tp_methods
|
|
1529
1636
|
NULL, // tp_members
|
|
1530
|
-
|
|
1637
|
+
Nuitka_Generator_tp_getset, // tp_getset
|
|
1531
1638
|
0, // tp_base
|
|
1532
1639
|
0, // tp_dict
|
|
1533
1640
|
0, // tp_descr_get
|
|
@@ -1545,7 +1652,7 @@ PyTypeObject Nuitka_Generator_Type = {
|
|
|
1545
1652
|
0, // tp_weaklist
|
|
1546
1653
|
0, // tp_del
|
|
1547
1654
|
0 // tp_version_tag
|
|
1548
|
-
#if PYTHON_VERSION >=
|
|
1655
|
+
#if PYTHON_VERSION >= 0x300
|
|
1549
1656
|
,
|
|
1550
1657
|
(destructor)Nuitka_Generator_tp_finalizer // tp_finalize
|
|
1551
1658
|
#endif
|
|
@@ -1591,7 +1698,7 @@ void _initCompiledGeneratorType(void) {
|
|
|
1591
1698
|
assert(Nuitka_Generator_Type.tp_subclasses != PyGen_Type.tp_subclasses || PyGen_Type.tp_cache == NULL);
|
|
1592
1699
|
assert(Nuitka_Generator_Type.tp_weaklist != PyGen_Type.tp_weaklist);
|
|
1593
1700
|
assert(Nuitka_Generator_Type.tp_del != PyGen_Type.tp_del || PyGen_Type.tp_del == NULL);
|
|
1594
|
-
#if PYTHON_VERSION >=
|
|
1701
|
+
#if PYTHON_VERSION >= 0x300
|
|
1595
1702
|
assert(Nuitka_Generator_Type.tp_finalize != PyGen_Type.tp_finalize || PyGen_Type.tp_finalize == NULL);
|
|
1596
1703
|
#endif
|
|
1597
1704
|
|
|
@@ -1612,6 +1719,11 @@ PyObject *Nuitka_Generator_New(generator_code code, PyObject *module, PyObject *
|
|
|
1612
1719
|
#endif
|
|
1613
1720
|
PyCodeObject *code_object, struct Nuitka_CellObject **closure, Py_ssize_t closure_given,
|
|
1614
1721
|
Py_ssize_t heap_storage_size) {
|
|
1722
|
+
#if _DEBUG_REFCOUNTS
|
|
1723
|
+
count_active_Nuitka_Generator_Type += 1;
|
|
1724
|
+
count_allocated_Nuitka_Generator_Type += 1;
|
|
1725
|
+
#endif
|
|
1726
|
+
|
|
1615
1727
|
struct Nuitka_GeneratorObject *result;
|
|
1616
1728
|
|
|
1617
1729
|
// TODO: Change the var part of the type to 1 maybe
|
|
@@ -1649,7 +1761,7 @@ PyObject *Nuitka_Generator_New(generator_code code, PyObject *module, PyObject *
|
|
|
1649
1761
|
#endif
|
|
1650
1762
|
|
|
1651
1763
|
#if PYTHON_VERSION >= 0x300
|
|
1652
|
-
result->
|
|
1764
|
+
result->m_yield_from = NULL;
|
|
1653
1765
|
#endif
|
|
1654
1766
|
|
|
1655
1767
|
memcpy(&result->m_closure[0], closure, closure_given * sizeof(struct Nuitka_CellObject *));
|
|
@@ -1707,4 +1819,18 @@ PyObject *Nuitka_Generator_NewEmpty(PyObject *module, PyObject *name,
|
|
|
1707
1819
|
|
|
1708
1820
|
// Chain frames to generator and asyncgen code, as they need to close them with access
|
|
1709
1821
|
// to best functions.
|
|
1710
|
-
#include "CompiledFrameType.c"
|
|
1822
|
+
#include "CompiledFrameType.c"
|
|
1823
|
+
// Part of "Nuitka", an optimizing Python compiler that is compatible and
|
|
1824
|
+
// integrates with CPython, but also works on its own.
|
|
1825
|
+
//
|
|
1826
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
1827
|
+
// you may not use this file except in compliance with the License.
|
|
1828
|
+
// You may obtain a copy of the License at
|
|
1829
|
+
//
|
|
1830
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
1831
|
+
//
|
|
1832
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
1833
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
1834
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1835
|
+
// See the License for the specific language governing permissions and
|
|
1836
|
+
// limitations under the License.
|