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
|
#ifndef __NUITKA_EXCEPTIONS_H__
|
|
19
4
|
#define __NUITKA_EXCEPTIONS_H__
|
|
20
5
|
|
|
@@ -26,7 +11,7 @@
|
|
|
26
11
|
#include "nuitka/printing.h"
|
|
27
12
|
|
|
28
13
|
// Did an error occur.
|
|
29
|
-
NUITKA_MAY_BE_UNUSED static inline bool HAS_ERROR_OCCURRED(PyThreadState *tstate) {
|
|
14
|
+
NUITKA_MAY_BE_UNUSED static inline bool HAS_ERROR_OCCURRED(PyThreadState const *tstate) {
|
|
30
15
|
#if PYTHON_VERSION < 0x3c0
|
|
31
16
|
return tstate->curexc_type != NULL;
|
|
32
17
|
#else
|
|
@@ -34,16 +19,28 @@ NUITKA_MAY_BE_UNUSED static inline bool HAS_ERROR_OCCURRED(PyThreadState *tstate
|
|
|
34
19
|
#endif
|
|
35
20
|
}
|
|
36
21
|
|
|
37
|
-
// Get the error type occurred.
|
|
38
|
-
NUITKA_MAY_BE_UNUSED static inline PyObject *GET_ERROR_OCCURRED(PyThreadState *tstate) {
|
|
22
|
+
// Get the error type occurred, no reference given.
|
|
23
|
+
NUITKA_MAY_BE_UNUSED static inline PyObject *GET_ERROR_OCCURRED(PyThreadState const *const tstate) {
|
|
39
24
|
#if PYTHON_VERSION < 0x3c0
|
|
40
25
|
return tstate->curexc_type;
|
|
41
26
|
#else
|
|
42
|
-
return (PyObject *)
|
|
27
|
+
return tstate->current_exception ? (PyObject *)PyExceptionInstance_Class(tstate->current_exception) : NULL;
|
|
43
28
|
#endif
|
|
44
29
|
}
|
|
45
30
|
|
|
46
|
-
//
|
|
31
|
+
// Checks that an exception value is normalized or NULL.
|
|
32
|
+
NUITKA_MAY_BE_UNUSED static inline void ASSERT_NORMALIZED_EXCEPTION_VALUE_X(PyObject const *const exception_value) {
|
|
33
|
+
CHECK_OBJECT_X(exception_value);
|
|
34
|
+
assert(exception_value == NULL || PyExceptionInstance_Check(exception_value));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Checks that an exception value is normalized and not NULL.
|
|
38
|
+
NUITKA_MAY_BE_UNUSED static inline void ASSERT_NORMALIZED_EXCEPTION_VALUE(PyObject *exception_value) {
|
|
39
|
+
CHECK_OBJECT(exception_value);
|
|
40
|
+
assert(PyExceptionInstance_Check(exception_value));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Clear error, which likely set, similar to "_PyErr_Clear(tstate)" and "PyErr_Clear"
|
|
47
44
|
NUITKA_MAY_BE_UNUSED static inline void CLEAR_ERROR_OCCURRED(PyThreadState *tstate) {
|
|
48
45
|
#if PYTHON_VERSION < 0x3c0
|
|
49
46
|
PyObject *old_type = tstate->curexc_type;
|
|
@@ -58,13 +55,16 @@ NUITKA_MAY_BE_UNUSED static inline void CLEAR_ERROR_OCCURRED(PyThreadState *tsta
|
|
|
58
55
|
Py_XDECREF(old_value);
|
|
59
56
|
Py_XDECREF(old_tb);
|
|
60
57
|
#else
|
|
61
|
-
PyObject *
|
|
58
|
+
PyObject *old_exception_value = tstate->current_exception;
|
|
59
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
|
|
60
|
+
|
|
62
61
|
tstate->current_exception = NULL;
|
|
63
|
-
|
|
62
|
+
|
|
63
|
+
Py_XDECREF(old_exception_value);
|
|
64
64
|
#endif
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
// Clear error, which is not likely set, use CLEAR_ERROR_OCCURRED not sure there is an error.
|
|
67
|
+
// Clear error, which is not likely set, use "CLEAR_ERROR_OCCURRED" not sure there is an error.
|
|
68
68
|
NUITKA_MAY_BE_UNUSED static inline bool DROP_ERROR_OCCURRED(PyThreadState *tstate) {
|
|
69
69
|
|
|
70
70
|
#if PYTHON_VERSION < 0x3c0
|
|
@@ -85,11 +85,12 @@ NUITKA_MAY_BE_UNUSED static inline bool DROP_ERROR_OCCURRED(PyThreadState *tstat
|
|
|
85
85
|
}
|
|
86
86
|
#else
|
|
87
87
|
if (unlikely(tstate->current_exception != NULL)) {
|
|
88
|
-
PyObject *
|
|
88
|
+
PyObject *old_exception_value = tstate->current_exception;
|
|
89
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE(old_exception_value);
|
|
89
90
|
|
|
90
91
|
tstate->current_exception = NULL;
|
|
91
92
|
|
|
92
|
-
Py_DECREF(
|
|
93
|
+
Py_DECREF(old_exception_value);
|
|
93
94
|
|
|
94
95
|
return true;
|
|
95
96
|
}
|
|
@@ -97,9 +98,8 @@ NUITKA_MAY_BE_UNUSED static inline bool DROP_ERROR_OCCURRED(PyThreadState *tstat
|
|
|
97
98
|
return false;
|
|
98
99
|
}
|
|
99
100
|
|
|
100
|
-
// Python3.12: TODO, fetching into a structure is probably needed.
|
|
101
101
|
#if PYTHON_VERSION < 0x3c0
|
|
102
|
-
// Fetch the current error into object variables
|
|
102
|
+
// Fetch the current error into object variables, transfers reference coming from tstate ownership
|
|
103
103
|
NUITKA_MAY_BE_UNUSED static void FETCH_ERROR_OCCURRED(PyThreadState *tstate, PyObject **exception_type,
|
|
104
104
|
PyObject **exception_value,
|
|
105
105
|
PyTracebackObject **exception_traceback) {
|
|
@@ -180,6 +180,7 @@ NUITKA_MAY_BE_UNUSED static PyTracebackObject *ADD_TRACEBACK(PyTracebackObject *
|
|
|
180
180
|
|
|
181
181
|
PyTracebackObject *traceback_new = MAKE_TRACEBACK(frame, lineno);
|
|
182
182
|
traceback_new->tb_next = exception_tb;
|
|
183
|
+
Py_INCREF(exception_tb);
|
|
183
184
|
return traceback_new;
|
|
184
185
|
}
|
|
185
186
|
|
|
@@ -315,7 +316,7 @@ NUITKA_MAY_BE_UNUSED inline static void SET_CURRENT_EXCEPTION(PyThreadState *tst
|
|
|
315
316
|
#endif
|
|
316
317
|
|
|
317
318
|
#if _NUITKA_MAINTAIN_SYS_EXC_VARS
|
|
318
|
-
// Set sys attributes in the fastest possible way
|
|
319
|
+
// Set sys attributes in the fastest possible way, spell-checker: ignore sysdict
|
|
319
320
|
PyObject *sys_dict = tstate->interp->sysdict;
|
|
320
321
|
CHECK_OBJECT(sys_dict);
|
|
321
322
|
|
|
@@ -337,8 +338,16 @@ NUITKA_MAY_BE_UNUSED inline static void SET_CURRENT_EXCEPTION(PyThreadState *tst
|
|
|
337
338
|
#endif
|
|
338
339
|
}
|
|
339
340
|
|
|
341
|
+
// Normalize an exception, may release old values and replace them, expects
|
|
342
|
+
// references passed and returns them.
|
|
343
|
+
NUITKA_MAY_BE_UNUSED static inline void NORMALIZE_EXCEPTION(PyThreadState *tstate, PyObject **exception_type,
|
|
344
|
+
PyObject **exception_value,
|
|
345
|
+
PyTracebackObject **exception_tb);
|
|
346
|
+
|
|
347
|
+
extern PyObject *NORMALIZE_EXCEPTION_VALUE_FOR_RAISE(PyThreadState *tstate, PyObject *exception_type);
|
|
348
|
+
|
|
340
349
|
// Helper that sets the current thread exception, and has no reference passed.
|
|
341
|
-
// Similar to PyErr_SetNone.
|
|
350
|
+
// Similar to "PyErr_SetNone".
|
|
342
351
|
NUITKA_MAY_BE_UNUSED inline static void SET_CURRENT_EXCEPTION_TYPE0(PyThreadState *tstate, PyObject *exception_type) {
|
|
343
352
|
CHECK_OBJECT(exception_type);
|
|
344
353
|
|
|
@@ -362,9 +371,12 @@ NUITKA_MAY_BE_UNUSED inline static void SET_CURRENT_EXCEPTION_TYPE0(PyThreadStat
|
|
|
362
371
|
Py_XDECREF(old_exception_traceback);
|
|
363
372
|
#else
|
|
364
373
|
PyObject *old_exception = tstate->current_exception;
|
|
374
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception);
|
|
365
375
|
|
|
366
|
-
|
|
367
|
-
|
|
376
|
+
// TODO: Make the call, exception creation on the outside somehow.
|
|
377
|
+
PyObject *exception_value = NORMALIZE_EXCEPTION_VALUE_FOR_RAISE(tstate, exception_type);
|
|
378
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE(exception_value);
|
|
379
|
+
tstate->current_exception = exception_value;
|
|
368
380
|
|
|
369
381
|
#if _DEBUG_EXCEPTIONS
|
|
370
382
|
PRINT_STRING("SET_CURRENT_EXCEPTION_TYPE0:\n");
|
|
@@ -376,9 +388,12 @@ NUITKA_MAY_BE_UNUSED inline static void SET_CURRENT_EXCEPTION_TYPE0(PyThreadStat
|
|
|
376
388
|
}
|
|
377
389
|
|
|
378
390
|
// Same as "PyErr_SetObject" CPython API, use this instead.
|
|
379
|
-
#if PYTHON_VERSION < 0x3c0
|
|
380
391
|
NUITKA_MAY_BE_UNUSED inline static void
|
|
381
392
|
SET_CURRENT_EXCEPTION_TYPE0_VALUE0(PyThreadState *tstate, PyObject *exception_type, PyObject *exception_value) {
|
|
393
|
+
CHECK_OBJECT(exception_type);
|
|
394
|
+
CHECK_OBJECT(exception_value);
|
|
395
|
+
|
|
396
|
+
#if PYTHON_VERSION < 0x3c0
|
|
382
397
|
PyObject *old_exception_type = tstate->curexc_type;
|
|
383
398
|
PyObject *old_exception_value = tstate->curexc_value;
|
|
384
399
|
PyObject *old_exception_traceback = tstate->curexc_traceback;
|
|
@@ -397,10 +412,33 @@ SET_CURRENT_EXCEPTION_TYPE0_VALUE0(PyThreadState *tstate, PyObject *exception_ty
|
|
|
397
412
|
Py_XDECREF(old_exception_type);
|
|
398
413
|
Py_XDECREF(old_exception_value);
|
|
399
414
|
Py_XDECREF(old_exception_traceback);
|
|
415
|
+
#else
|
|
416
|
+
PyObject *old_exception_value = tstate->current_exception;
|
|
417
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
|
|
418
|
+
|
|
419
|
+
// TODO: Make the call on the outside.
|
|
420
|
+
NORMALIZE_EXCEPTION(tstate, &exception_type, &exception_value, NULL);
|
|
421
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE(exception_value);
|
|
422
|
+
tstate->current_exception = exception_value;
|
|
423
|
+
Py_INCREF(exception_value);
|
|
424
|
+
|
|
425
|
+
#if _DEBUG_EXCEPTIONS
|
|
426
|
+
PRINT_STRING("SET_CURRENT_EXCEPTION_TYPE_0_VALUE0:\n");
|
|
427
|
+
PRINT_CURRENT_EXCEPTION();
|
|
428
|
+
#endif
|
|
429
|
+
|
|
430
|
+
Py_XDECREF(old_exception_value);
|
|
431
|
+
#endif
|
|
400
432
|
}
|
|
401
433
|
|
|
434
|
+
// TODO: For Python3.12 it would be nice to know it's normalized already, so we
|
|
435
|
+
// can avoid the call to "NORMALIZE_EXCEPTION".
|
|
402
436
|
NUITKA_MAY_BE_UNUSED inline static void
|
|
403
437
|
SET_CURRENT_EXCEPTION_TYPE0_VALUE1(PyThreadState *tstate, PyObject *exception_type, PyObject *exception_value) {
|
|
438
|
+
CHECK_OBJECT(exception_type);
|
|
439
|
+
CHECK_OBJECT(exception_value);
|
|
440
|
+
|
|
441
|
+
#if PYTHON_VERSION < 0x3c0
|
|
404
442
|
PyObject *old_exception_type = tstate->curexc_type;
|
|
405
443
|
PyObject *old_exception_value = tstate->curexc_value;
|
|
406
444
|
PyObject *old_exception_traceback = tstate->curexc_traceback;
|
|
@@ -418,9 +456,23 @@ SET_CURRENT_EXCEPTION_TYPE0_VALUE1(PyThreadState *tstate, PyObject *exception_ty
|
|
|
418
456
|
Py_XDECREF(old_exception_type);
|
|
419
457
|
Py_XDECREF(old_exception_value);
|
|
420
458
|
Py_XDECREF(old_exception_traceback);
|
|
421
|
-
|
|
459
|
+
#else
|
|
460
|
+
PyObject *old_exception_value = tstate->current_exception;
|
|
461
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
|
|
462
|
+
|
|
463
|
+
// TODO: Make the call, exception creation on the outside somehow.
|
|
464
|
+
NORMALIZE_EXCEPTION(tstate, &exception_type, &exception_value, NULL);
|
|
465
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_value);
|
|
466
|
+
tstate->current_exception = exception_value;
|
|
422
467
|
|
|
468
|
+
#if _DEBUG_EXCEPTIONS
|
|
469
|
+
PRINT_STRING("SET_CURRENT_EXCEPTION_TYPE0_VALUE1:\n");
|
|
470
|
+
PRINT_CURRENT_EXCEPTION();
|
|
471
|
+
#endif
|
|
472
|
+
|
|
473
|
+
Py_XDECREF(old_exception_value);
|
|
423
474
|
#endif
|
|
475
|
+
}
|
|
424
476
|
|
|
425
477
|
// Helper that sets the current thread exception, and has no reference passed.
|
|
426
478
|
// Same as CPython API PyErr_SetString
|
|
@@ -466,7 +518,7 @@ NUITKA_MAY_BE_UNUSED static inline void PRESERVE_FRAME_EXCEPTION(PyThreadState *
|
|
|
466
518
|
PRINT_STRING("PRESERVE_FRAME_EXCEPTION: no exception to preserve\n");
|
|
467
519
|
#endif
|
|
468
520
|
frame->f_exc_type = Py_None;
|
|
469
|
-
|
|
521
|
+
Py_INCREF_IMMORTAL(frame->f_exc_type);
|
|
470
522
|
frame->f_exc_value = NULL;
|
|
471
523
|
frame->f_exc_traceback = NULL;
|
|
472
524
|
}
|
|
@@ -517,106 +569,518 @@ NUITKA_MAY_BE_UNUSED static inline void RESTORE_FRAME_EXCEPTION(PyThreadState *t
|
|
|
517
569
|
|
|
518
570
|
#endif
|
|
519
571
|
|
|
520
|
-
// Similar to PyException_SetTraceback, only done for Python3.
|
|
572
|
+
// Similar to "PyException_SetTraceback", only done for Python3.
|
|
521
573
|
#if PYTHON_VERSION < 0x300
|
|
522
574
|
#define ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(exception_value, exception_tb) ;
|
|
523
575
|
#else
|
|
524
576
|
NUITKA_MAY_BE_UNUSED static inline void ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(PyObject *exception_value,
|
|
525
577
|
PyTracebackObject *exception_tb) {
|
|
526
578
|
CHECK_OBJECT(exception_value);
|
|
527
|
-
|
|
579
|
+
CHECK_OBJECT_X(exception_tb);
|
|
528
580
|
|
|
529
|
-
if (exception_tb == (PyTracebackObject *)Py_None
|
|
530
|
-
|
|
581
|
+
if (exception_tb == (PyTracebackObject *)Py_None) {
|
|
582
|
+
exception_tb = NULL;
|
|
531
583
|
}
|
|
532
584
|
|
|
533
585
|
assert(PyExceptionInstance_Check(exception_value));
|
|
534
|
-
assert(PyTraceBack_Check(exception_tb));
|
|
586
|
+
assert(exception_tb == NULL || PyTraceBack_Check(exception_tb));
|
|
535
587
|
|
|
536
588
|
PyBaseExceptionObject *e = (PyBaseExceptionObject *)exception_value;
|
|
537
589
|
|
|
538
590
|
PyObject *old = e->traceback;
|
|
539
|
-
|
|
591
|
+
Py_XINCREF(exception_tb);
|
|
540
592
|
e->traceback = (PyObject *)exception_tb;
|
|
541
593
|
Py_XDECREF(old);
|
|
542
594
|
}
|
|
543
595
|
|
|
544
596
|
// Much like "PyException_GetTraceback", but does not give a reference.
|
|
545
597
|
NUITKA_MAY_BE_UNUSED static inline PyTracebackObject *GET_EXCEPTION_TRACEBACK(PyObject *exception_value) {
|
|
598
|
+
CHECK_OBJECT(exception_value);
|
|
546
599
|
assert(PyExceptionInstance_Check(exception_value));
|
|
547
600
|
|
|
548
601
|
PyBaseExceptionObject *exc_object = (PyBaseExceptionObject *)(exception_value);
|
|
549
602
|
return (PyTracebackObject *)exc_object->traceback;
|
|
550
603
|
}
|
|
604
|
+
|
|
551
605
|
#endif
|
|
552
606
|
|
|
607
|
+
NUITKA_MAY_BE_UNUSED static bool EXCEPTION_MATCH_BOOL_SINGLE(PyThreadState *tstate, PyObject *exception_value,
|
|
608
|
+
PyObject *exception_checked);
|
|
609
|
+
|
|
610
|
+
NUITKA_MAY_BE_UNUSED static bool _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(PyThreadState *tstate, PyObject *exception_type) {
|
|
553
611
|
#if PYTHON_VERSION < 0x3c0
|
|
554
|
-
|
|
555
|
-
|
|
612
|
+
PyObject *exception_current = tstate->curexc_type;
|
|
613
|
+
#else
|
|
614
|
+
PyObject *exception_current = tstate->current_exception;
|
|
615
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_current);
|
|
616
|
+
#endif
|
|
617
|
+
if (exception_current == NULL) {
|
|
618
|
+
return true;
|
|
619
|
+
} else if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_current, exception_type)) {
|
|
620
|
+
CHECK_OBJECT(exception_current);
|
|
556
621
|
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
622
|
+
#if PYTHON_VERSION < 0x3c0
|
|
623
|
+
// Clear the exception first, we believe we know it doesn't have side effects.
|
|
624
|
+
Py_DECREF(exception_current);
|
|
625
|
+
tstate->curexc_type = NULL;
|
|
626
|
+
|
|
627
|
+
PyObject *old_value = tstate->curexc_value;
|
|
628
|
+
PyObject *old_tb = tstate->curexc_traceback;
|
|
629
|
+
|
|
630
|
+
tstate->curexc_value = NULL;
|
|
631
|
+
tstate->curexc_traceback = NULL;
|
|
632
|
+
|
|
633
|
+
Py_XDECREF(old_value);
|
|
634
|
+
Py_XDECREF(old_tb);
|
|
635
|
+
#else
|
|
636
|
+
tstate->current_exception = NULL;
|
|
637
|
+
Py_DECREF(exception_current);
|
|
564
638
|
#endif
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
639
|
+
|
|
640
|
+
return true;
|
|
641
|
+
} else {
|
|
642
|
+
return false;
|
|
569
643
|
}
|
|
644
|
+
}
|
|
570
645
|
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
646
|
+
/* Special helper that checks for StopIteration and if so clears it, only
|
|
647
|
+
indicating if it was set in the return value.
|
|
648
|
+
|
|
649
|
+
Equivalent to if(PyErr_ExceptionMatches(PyExc_StopIteration) PyErr_Clear();
|
|
650
|
+
|
|
651
|
+
If error is raised by built-in function next() and an iterator’s __next__()
|
|
652
|
+
method to signal that there are no further items produced by the iterator then
|
|
653
|
+
it resets the TSTATE to NULL and returns True else return False
|
|
654
|
+
|
|
655
|
+
*/
|
|
656
|
+
NUITKA_MAY_BE_UNUSED static bool CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(PyThreadState *tstate) {
|
|
657
|
+
return _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(tstate, PyExc_StopIteration);
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
/* Special helper that checks for KeyError and if so clears it, only
|
|
661
|
+
indicating if it was set in the return value.
|
|
662
|
+
|
|
663
|
+
Equivalent to if(PyErr_ExceptionMatches(PyExc_KeyError) PyErr_Clear();
|
|
664
|
+
|
|
665
|
+
*/
|
|
666
|
+
NUITKA_MAY_BE_UNUSED static bool CHECK_AND_CLEAR_KEY_ERROR_OCCURRED(PyThreadState *tstate) {
|
|
667
|
+
return _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(tstate, PyExc_KeyError);
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
NUITKA_MAY_BE_UNUSED static bool CHECK_AND_CLEAR_ATTRIBUTE_ERROR_OCCURRED(PyThreadState *tstate) {
|
|
671
|
+
return _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(tstate, PyExc_AttributeError);
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
#if PYTHON_VERSION >= 0x3c0
|
|
675
|
+
NUITKA_MAY_BE_UNUSED static PyObject *MAKE_TUPLE1(PyThreadState *tstate, PyObject *element1);
|
|
676
|
+
|
|
677
|
+
NUITKA_MAY_BE_UNUSED static PyObject *MAKE_EXCEPTION_FROM_TYPE_ARG0(PyThreadState *tstate, PyObject *type,
|
|
678
|
+
PyObject *arg) {
|
|
679
|
+
PyBaseExceptionObject *self;
|
|
680
|
+
|
|
681
|
+
PyTypeObject *type_object = (PyTypeObject *)type;
|
|
682
|
+
|
|
683
|
+
self = (PyBaseExceptionObject *)(type_object->tp_alloc(type_object, 0));
|
|
684
|
+
|
|
685
|
+
self->dict = NULL;
|
|
686
|
+
self->notes = NULL;
|
|
687
|
+
self->traceback = self->cause = self->context = NULL;
|
|
688
|
+
self->suppress_context = 0;
|
|
689
|
+
|
|
690
|
+
assert(arg != NULL);
|
|
691
|
+
|
|
692
|
+
if (!PyTuple_Check(arg)) {
|
|
693
|
+
self->args = MAKE_TUPLE1(tstate, arg);
|
|
694
|
+
} else {
|
|
695
|
+
self->args = Py_NewRef(arg);
|
|
574
696
|
}
|
|
575
697
|
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
698
|
+
return (PyObject *)self;
|
|
699
|
+
}
|
|
700
|
+
#else
|
|
701
|
+
|
|
702
|
+
extern PyObject *CALL_FUNCTION_WITH_SINGLE_ARG(PyThreadState *tstate, PyObject *called, PyObject *arg);
|
|
703
|
+
|
|
704
|
+
NUITKA_MAY_BE_UNUSED static PyObject *MAKE_EXCEPTION_FROM_TYPE_ARG0(PyThreadState *tstate, PyObject *type,
|
|
705
|
+
PyObject *arg) {
|
|
706
|
+
return CALL_FUNCTION_WITH_SINGLE_ARG(tstate, type, arg);
|
|
580
707
|
}
|
|
708
|
+
|
|
581
709
|
#endif
|
|
582
710
|
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
711
|
+
#if PYTHON_VERSION < 0x3c0
|
|
712
|
+
struct Nuitka_ExceptionPreservationItem {
|
|
713
|
+
PyObject *exception_type;
|
|
714
|
+
PyObject *exception_value;
|
|
715
|
+
PyTracebackObject *exception_tb;
|
|
716
|
+
};
|
|
717
|
+
|
|
718
|
+
static const struct Nuitka_ExceptionPreservationItem Empty_Nuitka_ExceptionPreservationItem = {0};
|
|
719
|
+
|
|
720
|
+
// Fetch the current exception into state, transfers reference coming from tstate ownership. Old values are overwritten.
|
|
721
|
+
NUITKA_MAY_BE_UNUSED static void FETCH_ERROR_OCCURRED_STATE(PyThreadState *tstate,
|
|
722
|
+
struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
723
|
+
FETCH_ERROR_OCCURRED(tstate, &exception_state->exception_type, &exception_state->exception_value,
|
|
724
|
+
&exception_state->exception_tb);
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
// Restore the current exception from state, transfers reference from state to tstate ownership.
|
|
728
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
729
|
+
RESTORE_ERROR_OCCURRED_STATE(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
730
|
+
RESTORE_ERROR_OCCURRED(tstate, exception_state->exception_type, exception_state->exception_value,
|
|
731
|
+
exception_state->exception_tb);
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
735
|
+
FETCH_ERROR_OCCURRED_STATE_UNTRACED(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
736
|
+
FETCH_ERROR_OCCURRED_UNTRACED(tstate, &exception_state->exception_type, &exception_state->exception_value,
|
|
737
|
+
&exception_state->exception_tb);
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
741
|
+
RESTORE_ERROR_OCCURRED_STATE_UNTRACED(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
742
|
+
RESTORE_ERROR_OCCURRED_UNTRACED(tstate, exception_state->exception_type, exception_state->exception_value,
|
|
743
|
+
exception_state->exception_tb);
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
747
|
+
ASSERT_SAME_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem const *exception_state1,
|
|
748
|
+
struct Nuitka_ExceptionPreservationItem const *exception_state2) {
|
|
749
|
+
assert(exception_state1->exception_type == exception_state2->exception_type);
|
|
750
|
+
assert(exception_state1->exception_value == exception_state2->exception_value);
|
|
751
|
+
assert(exception_state1->exception_tb == exception_state2->exception_tb);
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
755
|
+
ASSERT_EMPTY_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem const *exception_state) {
|
|
756
|
+
assert(exception_state->exception_type == NULL);
|
|
757
|
+
assert(exception_state->exception_value == NULL);
|
|
758
|
+
assert(exception_state->exception_tb == NULL);
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
NUITKA_MAY_BE_UNUSED static void INIT_ERROR_OCCURRED_STATE(struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
762
|
+
exception_state->exception_type = NULL;
|
|
763
|
+
exception_state->exception_value = NULL;
|
|
764
|
+
exception_state->exception_tb = NULL;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
768
|
+
RELEASE_ERROR_OCCURRED_STATE(struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
769
|
+
CHECK_OBJECT(exception_state->exception_type);
|
|
770
|
+
CHECK_OBJECT_X(exception_state->exception_value);
|
|
771
|
+
CHECK_OBJECT_X(exception_state->exception_tb);
|
|
772
|
+
Py_DECREF(exception_state->exception_type);
|
|
773
|
+
Py_XDECREF(exception_state->exception_value);
|
|
774
|
+
Py_XDECREF(exception_state->exception_tb);
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
778
|
+
RELEASE_ERROR_OCCURRED_STATE_X(struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
779
|
+
CHECK_OBJECT_X(exception_state->exception_type);
|
|
780
|
+
CHECK_OBJECT_X(exception_state->exception_value);
|
|
781
|
+
CHECK_OBJECT_X(exception_state->exception_tb);
|
|
782
|
+
|
|
783
|
+
Py_XDECREF(exception_state->exception_type);
|
|
784
|
+
Py_XDECREF(exception_state->exception_value);
|
|
785
|
+
Py_XDECREF(exception_state->exception_tb);
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
NUITKA_MAY_BE_UNUSED static void SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(
|
|
789
|
+
PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state, PyObject *exception_type,
|
|
790
|
+
PyObject *exception_value, PyTracebackObject *exception_tb) {
|
|
791
|
+
Py_INCREF(exception_type);
|
|
792
|
+
Py_XINCREF(exception_value);
|
|
793
|
+
Py_XINCREF(exception_tb);
|
|
794
|
+
|
|
795
|
+
exception_state->exception_type = exception_type;
|
|
796
|
+
exception_state->exception_value = exception_value;
|
|
797
|
+
exception_state->exception_tb = exception_tb;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
801
|
+
ASSIGN_ARGS_FROM_EXCEPTION_PRESERVATION_STATE(struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
802
|
+
PyObject **exception_type, PyObject **exception_value,
|
|
803
|
+
PyTracebackObject **exception_tb) {
|
|
804
|
+
|
|
805
|
+
*exception_type = exception_state->exception_type;
|
|
806
|
+
Py_INCREF(*exception_type);
|
|
807
|
+
*exception_value = exception_state->exception_value;
|
|
808
|
+
Py_XINCREF(*exception_value);
|
|
809
|
+
*exception_tb = exception_state->exception_tb;
|
|
810
|
+
Py_XINCREF(*exception_tb);
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
NUITKA_MAY_BE_UNUSED static PyTracebackObject *
|
|
814
|
+
GET_EXCEPTION_STATE_TRACEBACK(struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
815
|
+
return exception_state->exception_tb;
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
// Transfer ownership of the traceback to the exception state.
|
|
819
|
+
NUITKA_MAY_BE_UNUSED static void SET_EXCEPTION_STATE_TRACEBACK(struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
820
|
+
PyTracebackObject *exception_tb) {
|
|
821
|
+
CHECK_OBJECT_X(exception_state->exception_tb);
|
|
822
|
+
CHECK_OBJECT_X(exception_tb);
|
|
823
|
+
|
|
824
|
+
Py_XDECREF(exception_state->exception_tb);
|
|
825
|
+
exception_state->exception_tb = exception_tb;
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
NUITKA_MAY_BE_UNUSED static bool HAS_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem const *exception_state) {
|
|
829
|
+
return exception_state->exception_type != NULL;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
NUITKA_MAY_BE_UNUSED static bool
|
|
833
|
+
EXCEPTION_STATE_MATCH_BOOL_SINGLE(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
834
|
+
PyObject *exception_checked) {
|
|
835
|
+
return EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_state->exception_type, exception_checked);
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
NUITKA_MAY_BE_UNUSED inline static void
|
|
839
|
+
CHECK_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem const *exception_state) {
|
|
840
|
+
CHECK_OBJECT(exception_state->exception_type);
|
|
841
|
+
CHECK_OBJECT_X(exception_state->exception_value);
|
|
842
|
+
CHECK_OBJECT_X(exception_state->exception_tb);
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
NUITKA_MAY_BE_UNUSED inline static void
|
|
846
|
+
CHECK_EXCEPTION_STATE_X(struct Nuitka_ExceptionPreservationItem const *exception_state) {
|
|
847
|
+
CHECK_OBJECT_X(exception_state->exception_type);
|
|
848
|
+
CHECK_OBJECT_X(exception_state->exception_value);
|
|
849
|
+
CHECK_OBJECT_X(exception_state->exception_tb);
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
#else
|
|
853
|
+
struct Nuitka_ExceptionPreservationItem {
|
|
854
|
+
PyObject *exception_value;
|
|
855
|
+
};
|
|
856
|
+
|
|
857
|
+
static const struct Nuitka_ExceptionPreservationItem Empty_Nuitka_ExceptionPreservationItem = {0};
|
|
858
|
+
|
|
859
|
+
// Fetch the current exception into state, transfers reference coming from tstate ownership. Old value is overwritten.
|
|
860
|
+
NUITKA_MAY_BE_UNUSED static void FETCH_ERROR_OCCURRED_STATE(PyThreadState *tstate,
|
|
861
|
+
struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
862
|
+
exception_state->exception_value = tstate->current_exception;
|
|
863
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
|
|
864
|
+
|
|
587
865
|
#if _DEBUG_EXCEPTIONS
|
|
588
|
-
PRINT_STRING("
|
|
866
|
+
PRINT_STRING("FETCH_ERROR_OCCURRED_STATE:\n");
|
|
867
|
+
PRINT_CURRENT_EXCEPTION();
|
|
589
868
|
#endif
|
|
590
|
-
NORMALIZE_EXCEPTION(tstate, exception_type, exception_value, exception_tb);
|
|
591
|
-
ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(*exception_value, *exception_tb);
|
|
592
869
|
|
|
593
|
-
|
|
870
|
+
tstate->current_exception = NULL;
|
|
871
|
+
}
|
|
594
872
|
|
|
595
|
-
|
|
596
|
-
|
|
873
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
874
|
+
FETCH_ERROR_OCCURRED_STATE_UNTRACED(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
875
|
+
exception_state->exception_value = tstate->current_exception;
|
|
876
|
+
tstate->current_exception = NULL;
|
|
877
|
+
|
|
878
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
882
|
+
RESTORE_ERROR_OCCURRED_STATE(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
883
|
+
PyObject *old_exception_value = tstate->current_exception;
|
|
884
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
|
|
885
|
+
|
|
886
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
|
|
887
|
+
tstate->current_exception = exception_state->exception_value;
|
|
888
|
+
|
|
889
|
+
#if _DEBUG_EXCEPTIONS
|
|
890
|
+
PRINT_STRING("RESTORE_ERROR_OCCURRED_STATE:\n");
|
|
891
|
+
PRINT_CURRENT_EXCEPTION();
|
|
597
892
|
#endif
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
893
|
+
|
|
894
|
+
Py_XDECREF(old_exception_value);
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
898
|
+
RESTORE_ERROR_OCCURRED_STATE_UNTRACED(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
899
|
+
PyObject *old_exception_value = tstate->current_exception;
|
|
900
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
|
|
901
|
+
|
|
902
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
|
|
903
|
+
tstate->current_exception = exception_state->exception_value;
|
|
904
|
+
|
|
905
|
+
Py_XDECREF(old_exception_value);
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
909
|
+
ASSERT_SAME_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem *exception_state1,
|
|
910
|
+
struct Nuitka_ExceptionPreservationItem *exception_state2) {
|
|
911
|
+
assert(exception_state1->exception_value == exception_state2->exception_value);
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
915
|
+
ASSERT_EMPTY_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem const *exception_state) {
|
|
916
|
+
assert(exception_state->exception_value == NULL);
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
NUITKA_MAY_BE_UNUSED static void INIT_ERROR_OCCURRED_STATE(struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
920
|
+
exception_state->exception_value = NULL;
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
924
|
+
RELEASE_ERROR_OCCURRED_STATE(struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
925
|
+
CHECK_OBJECT(exception_state->exception_value);
|
|
926
|
+
Py_DECREF(exception_state->exception_value);
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
930
|
+
RELEASE_ERROR_OCCURRED_STATE_X(struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
931
|
+
CHECK_OBJECT_X(exception_state->exception_value);
|
|
932
|
+
Py_XDECREF(exception_state->exception_value);
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
NUITKA_MAY_BE_UNUSED static void SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(
|
|
936
|
+
PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state, PyObject *exception_type,
|
|
937
|
+
PyObject *exception_value, PyTracebackObject *exception_tb) {
|
|
938
|
+
|
|
939
|
+
Py_XINCREF(exception_type);
|
|
940
|
+
Py_XINCREF(exception_value);
|
|
941
|
+
Py_XINCREF(exception_tb);
|
|
942
|
+
|
|
943
|
+
NORMALIZE_EXCEPTION(tstate, &exception_type, &exception_value, &exception_tb);
|
|
944
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE(exception_value);
|
|
945
|
+
|
|
946
|
+
exception_state->exception_value = exception_value;
|
|
947
|
+
Py_INCREF(exception_value);
|
|
948
|
+
|
|
949
|
+
ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(exception_value, exception_tb);
|
|
950
|
+
|
|
951
|
+
Py_XDECREF(exception_type);
|
|
952
|
+
Py_XDECREF(exception_value);
|
|
953
|
+
Py_XDECREF(exception_tb);
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
NUITKA_MAY_BE_UNUSED static void
|
|
957
|
+
ASSIGN_ARGS_FROM_EXCEPTION_PRESERVATION_STATE(struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
958
|
+
PyObject **exception_type, PyObject **exception_value,
|
|
959
|
+
PyTracebackObject **exception_tb) {
|
|
960
|
+
|
|
961
|
+
*exception_value = exception_state->exception_value;
|
|
962
|
+
|
|
963
|
+
if (*exception_value) {
|
|
964
|
+
Py_INCREF(*exception_value);
|
|
965
|
+
|
|
966
|
+
*exception_type = (PyObject *)PyExceptionInstance_Class(*exception_value);
|
|
967
|
+
Py_INCREF(*exception_type);
|
|
968
|
+
*exception_tb = GET_EXCEPTION_TRACEBACK(*exception_value);
|
|
969
|
+
Py_XINCREF(*exception_tb);
|
|
970
|
+
} else {
|
|
971
|
+
*exception_type = NULL;
|
|
972
|
+
*exception_tb = NULL;
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
NUITKA_MAY_BE_UNUSED static PyTracebackObject *
|
|
977
|
+
GET_EXCEPTION_STATE_TRACEBACK(struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
978
|
+
return GET_EXCEPTION_TRACEBACK(exception_state->exception_value);
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
// Transfer ownership of the traceback to the exception state.
|
|
982
|
+
NUITKA_MAY_BE_UNUSED static void SET_EXCEPTION_STATE_TRACEBACK(struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
983
|
+
PyTracebackObject *exception_tb) {
|
|
984
|
+
ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(exception_state->exception_value, exception_tb);
|
|
985
|
+
Py_XDECREF(exception_tb);
|
|
986
|
+
CHECK_OBJECT_X(exception_tb);
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
NUITKA_MAY_BE_UNUSED static bool HAS_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem const *exception_state) {
|
|
990
|
+
return exception_state->exception_value != NULL;
|
|
991
|
+
}
|
|
992
|
+
|
|
993
|
+
NUITKA_MAY_BE_UNUSED static bool
|
|
994
|
+
EXCEPTION_STATE_MATCH_BOOL_SINGLE(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem const *exception_state,
|
|
995
|
+
PyObject *exception_checked) {
|
|
996
|
+
return EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_state->exception_value, exception_checked);
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
NUITKA_MAY_BE_UNUSED inline static void
|
|
1000
|
+
CHECK_EXCEPTION_STATE(struct Nuitka_ExceptionPreservationItem const *exception_state) {
|
|
1001
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE(exception_state->exception_value);
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
NUITKA_MAY_BE_UNUSED inline static void
|
|
1005
|
+
CHECK_EXCEPTION_STATE_X(struct Nuitka_ExceptionPreservationItem const *exception_state) {
|
|
1006
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
|
|
1007
|
+
}
|
|
1008
|
+
|
|
601
1009
|
#endif
|
|
602
1010
|
|
|
603
|
-
|
|
1011
|
+
NUITKA_MAY_BE_UNUSED inline static void SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0(
|
|
1012
|
+
PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state, PyObject *exception_type) {
|
|
604
1013
|
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
1014
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, exception_state, exception_type, NULL, NULL);
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
extern PyObject *CALL_FUNCTION_WITH_SINGLE_ARG(PyThreadState *tstate, PyObject *called, PyObject *arg);
|
|
1018
|
+
|
|
1019
|
+
NUITKA_MAY_BE_UNUSED inline static void
|
|
1020
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_VALUE1(PyThreadState *tstate,
|
|
1021
|
+
struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
1022
|
+
PyObject *exception_type, PyObject *exception_value) {
|
|
1023
|
+
#if PYTHON_VERSION < 0x3c0
|
|
1024
|
+
Py_INCREF(exception_type);
|
|
1025
|
+
|
|
1026
|
+
exception_state->exception_type = exception_type;
|
|
1027
|
+
exception_state->exception_value = exception_value;
|
|
1028
|
+
exception_state->exception_tb = NULL;
|
|
1029
|
+
#else
|
|
1030
|
+
PyObject *exc = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, exception_type, exception_value);
|
|
1031
|
+
exception_state->exception_value = exc;
|
|
1032
|
+
Py_DECREF(exception_value);
|
|
610
1033
|
#endif
|
|
1034
|
+
}
|
|
611
1035
|
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
1036
|
+
NUITKA_MAY_BE_UNUSED inline static void
|
|
1037
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_VALUE1_NORMALIZED(PyThreadState *tstate,
|
|
1038
|
+
struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
1039
|
+
PyObject *exception_type, PyObject *exception_value) {
|
|
1040
|
+
#if PYTHON_VERSION < 0x3c0
|
|
1041
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_VALUE1(tstate, exception_state, exception_type, exception_value);
|
|
1042
|
+
#else
|
|
1043
|
+
exception_state->exception_value = exception_value;
|
|
1044
|
+
#endif
|
|
615
1045
|
}
|
|
616
1046
|
|
|
1047
|
+
NUITKA_MAY_BE_UNUSED inline static void
|
|
1048
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_VALUE0(PyThreadState *tstate,
|
|
1049
|
+
struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
1050
|
+
PyObject *exception_type, PyObject *exception_value) {
|
|
1051
|
+
// TODO: Add variants for normalized values only.
|
|
1052
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, exception_state, exception_type, exception_value, NULL);
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
NUITKA_MAY_BE_UNUSED inline static void
|
|
1056
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_STR(PyThreadState *tstate,
|
|
1057
|
+
struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
1058
|
+
PyObject *exception_type, char const *value) {
|
|
1059
|
+
PyObject *exception_value = Nuitka_String_FromString(value);
|
|
1060
|
+
|
|
1061
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_VALUE1(tstate, exception_state, exception_type, exception_value);
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
#define SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_FORMAT1(tstate, exception_state, exception_type, message, arg1) \
|
|
1065
|
+
{ \
|
|
1066
|
+
PyObject *exception_value = Nuitka_String_FromFormat(message, arg1); \
|
|
1067
|
+
CHECK_OBJECT(exception_value); \
|
|
1068
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_VALUE1(tstate, exception_state, exception_type, exception_value); \
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
#define SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_FORMAT2(tstate, exception_state, exception_type, message, arg1, \
|
|
1072
|
+
arg2) \
|
|
1073
|
+
{ \
|
|
1074
|
+
PyObject *exception_value = Nuitka_String_FromFormat(message, arg1, arg2); \
|
|
1075
|
+
CHECK_OBJECT(exception_value); \
|
|
1076
|
+
SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_VALUE1(tstate, exception_state, exception_type, exception_value); \
|
|
1077
|
+
}
|
|
1078
|
+
|
|
617
1079
|
NUITKA_MAY_BE_UNUSED static bool EXCEPTION_MATCH_GENERATOR(PyThreadState *tstate, PyObject *exception_value) {
|
|
618
1080
|
CHECK_OBJECT(exception_value);
|
|
619
1081
|
|
|
1082
|
+
// TODO: For Python3.12 this must be done differently to be a lot better.
|
|
1083
|
+
|
|
620
1084
|
// We need to check the class.
|
|
621
1085
|
if (PyExceptionInstance_Check(exception_value)) {
|
|
622
1086
|
exception_value = PyExceptionInstance_Class(exception_value);
|
|
@@ -629,9 +1093,8 @@ NUITKA_MAY_BE_UNUSED static bool EXCEPTION_MATCH_GENERATOR(PyThreadState *tstate
|
|
|
629
1093
|
|
|
630
1094
|
if (PyExceptionClass_Check(exception_value)) {
|
|
631
1095
|
// Save the current exception, if any, we must preserve it.
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
FETCH_ERROR_OCCURRED(tstate, &save_exception_type, &save_exception_value, &save_exception_tb);
|
|
1096
|
+
struct Nuitka_ExceptionPreservationItem saved_exception_state;
|
|
1097
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
635
1098
|
|
|
636
1099
|
int res = PyObject_IsSubclass(exception_value, PyExc_GeneratorExit);
|
|
637
1100
|
|
|
@@ -651,7 +1114,7 @@ NUITKA_MAY_BE_UNUSED static bool EXCEPTION_MATCH_GENERATOR(PyThreadState *tstate
|
|
|
651
1114
|
PyErr_WriteUnraisable(exception_value);
|
|
652
1115
|
}
|
|
653
1116
|
|
|
654
|
-
|
|
1117
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
655
1118
|
|
|
656
1119
|
return res == 1;
|
|
657
1120
|
}
|
|
@@ -659,6 +1122,15 @@ NUITKA_MAY_BE_UNUSED static bool EXCEPTION_MATCH_GENERATOR(PyThreadState *tstate
|
|
|
659
1122
|
return false;
|
|
660
1123
|
}
|
|
661
1124
|
|
|
1125
|
+
NUITKA_MAY_BE_UNUSED static bool
|
|
1126
|
+
EXCEPTION_STATE_MATCH_GENERATOR(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
1127
|
+
#if PYTHON_VERSION < 0x3c0
|
|
1128
|
+
return EXCEPTION_MATCH_GENERATOR(tstate, exception_state->exception_type);
|
|
1129
|
+
#else
|
|
1130
|
+
return EXCEPTION_MATCH_GENERATOR(tstate, exception_state->exception_value);
|
|
1131
|
+
#endif
|
|
1132
|
+
}
|
|
1133
|
+
|
|
662
1134
|
NUITKA_MAY_BE_UNUSED static bool EXCEPTION_MATCH_BOOL_SINGLE(PyThreadState *tstate, PyObject *exception_value,
|
|
663
1135
|
PyObject *exception_checked) {
|
|
664
1136
|
CHECK_OBJECT(exception_value);
|
|
@@ -675,11 +1147,13 @@ NUITKA_MAY_BE_UNUSED static bool EXCEPTION_MATCH_BOOL_SINGLE(PyThreadState *tsta
|
|
|
675
1147
|
}
|
|
676
1148
|
|
|
677
1149
|
if (PyExceptionClass_Check(exception_value)) {
|
|
1150
|
+
#if PYTHON_VERSION < 0x300
|
|
678
1151
|
// Save the current exception, if any, we must preserve it.
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
FETCH_ERROR_OCCURRED(tstate, &save_exception_type, &save_exception_value, &save_exception_tb);
|
|
1152
|
+
struct Nuitka_ExceptionPreservationItem saved_exception_state;
|
|
1153
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
682
1154
|
|
|
1155
|
+
// Python3.10 at least uses PyType_IsSubtype and needs no
|
|
1156
|
+
// fetch restore.
|
|
683
1157
|
int res = PyObject_IsSubclass(exception_value, exception_checked);
|
|
684
1158
|
|
|
685
1159
|
// This function must not fail, so print the error here */
|
|
@@ -687,9 +1161,13 @@ NUITKA_MAY_BE_UNUSED static bool EXCEPTION_MATCH_BOOL_SINGLE(PyThreadState *tsta
|
|
|
687
1161
|
PyErr_WriteUnraisable(exception_value);
|
|
688
1162
|
}
|
|
689
1163
|
|
|
690
|
-
|
|
1164
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
691
1165
|
|
|
692
1166
|
return res == 1;
|
|
1167
|
+
#else
|
|
1168
|
+
int res = Nuitka_Type_IsSubtype((PyTypeObject *)exception_value, (PyTypeObject *)exception_checked);
|
|
1169
|
+
return res == 1;
|
|
1170
|
+
#endif
|
|
693
1171
|
}
|
|
694
1172
|
|
|
695
1173
|
return false;
|
|
@@ -711,9 +1189,8 @@ NUITKA_MAY_BE_UNUSED static inline int _EXCEPTION_MATCH_BOOL(PyThreadState *tsta
|
|
|
711
1189
|
#if PYTHON_VERSION < 0x300
|
|
712
1190
|
if (PyExceptionClass_Check(exception_class) && PyExceptionClass_Check(exception_checked)) {
|
|
713
1191
|
// Save the current exception, if any, we must preserve it.
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
FETCH_ERROR_OCCURRED(tstate, &save_exception_type, &save_exception_value, &save_exception_tb);
|
|
1192
|
+
struct Nuitka_ExceptionPreservationItem saved_exception_state;
|
|
1193
|
+
FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
717
1194
|
|
|
718
1195
|
// Avoid recursion limit being exceeded just then
|
|
719
1196
|
int recursion_limit = Py_GetRecursionLimit();
|
|
@@ -731,7 +1208,7 @@ NUITKA_MAY_BE_UNUSED static inline int _EXCEPTION_MATCH_BOOL(PyThreadState *tsta
|
|
|
731
1208
|
res = 0;
|
|
732
1209
|
}
|
|
733
1210
|
|
|
734
|
-
|
|
1211
|
+
RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
|
|
735
1212
|
|
|
736
1213
|
return res;
|
|
737
1214
|
} else {
|
|
@@ -795,48 +1272,102 @@ NUITKA_MAY_BE_UNUSED static inline int EXCEPTION_MATCH_BOOL(PyThreadState *tstat
|
|
|
795
1272
|
}
|
|
796
1273
|
}
|
|
797
1274
|
|
|
798
|
-
|
|
799
|
-
// Attach the exception context if necessary.
|
|
800
|
-
NUITKA_MAY_BE_UNUSED static inline void ADD_EXCEPTION_CONTEXT(PyThreadState *tstate, PyObject **exception_type,
|
|
801
|
-
PyObject **exception_value) {
|
|
802
|
-
PyObject *context = EXC_VALUE(tstate);
|
|
1275
|
+
// Normalize an exception type to a value.
|
|
803
1276
|
|
|
804
|
-
|
|
805
|
-
|
|
1277
|
+
extern void Nuitka_Err_NormalizeException(PyThreadState *tstate, PyObject **exc, PyObject **val,
|
|
1278
|
+
PyTracebackObject **tb);
|
|
806
1279
|
|
|
807
|
-
|
|
808
|
-
|
|
1280
|
+
// Normalize an exception, may release old values and replace them, expects
|
|
1281
|
+
// references passed and returns them.
|
|
1282
|
+
NUITKA_MAY_BE_UNUSED static inline void NORMALIZE_EXCEPTION(PyThreadState *tstate, PyObject **exception_type,
|
|
1283
|
+
PyObject **exception_value,
|
|
1284
|
+
PyTracebackObject **exception_tb) {
|
|
1285
|
+
#if _DEBUG_EXCEPTIONS
|
|
1286
|
+
PRINT_STRING("NORMALIZE_EXCEPTION: Enter\n");
|
|
1287
|
+
PRINT_EXCEPTION(*exception_type, *exception_value, *exception_tb);
|
|
1288
|
+
#endif
|
|
1289
|
+
CHECK_OBJECT_X(*exception_type);
|
|
1290
|
+
CHECK_OBJECT_X(*exception_value);
|
|
1291
|
+
if (exception_tb) {
|
|
1292
|
+
CHECK_OBJECT_X(*exception_tb);
|
|
809
1293
|
}
|
|
810
|
-
|
|
1294
|
+
|
|
1295
|
+
// TODO: Often we already know this to be true.
|
|
1296
|
+
if (*exception_type != Py_None && *exception_type != NULL) {
|
|
1297
|
+
Nuitka_Err_NormalizeException(tstate, exception_type, exception_value, exception_tb);
|
|
1298
|
+
}
|
|
1299
|
+
|
|
1300
|
+
#if _DEBUG_EXCEPTIONS
|
|
1301
|
+
PRINT_STRING("NORMALIZE_EXCEPTION: Leave\n");
|
|
1302
|
+
PRINT_EXCEPTION(*exception_type, *exception_value, exception_tb ? *exception_tb : NULL);
|
|
811
1303
|
#endif
|
|
1304
|
+
}
|
|
812
1305
|
|
|
813
|
-
NUITKA_MAY_BE_UNUSED static bool _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(PyThreadState *tstate, PyObject *exception_type) {
|
|
814
1306
|
#if PYTHON_VERSION < 0x3c0
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
1307
|
+
// Normalize an exception, may release old values and replace them, expects
|
|
1308
|
+
// references passed and returns them.
|
|
1309
|
+
static inline void NORMALIZE_EXCEPTION_STATE(PyThreadState *tstate,
|
|
1310
|
+
struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
1311
|
+
CHECK_EXCEPTION_STATE_X(exception_state);
|
|
1312
|
+
|
|
1313
|
+
NORMALIZE_EXCEPTION(tstate, &exception_state->exception_type, &exception_state->exception_value,
|
|
1314
|
+
&exception_state->exception_tb);
|
|
1315
|
+
}
|
|
1316
|
+
#endif
|
|
1317
|
+
|
|
1318
|
+
extern PyObject *CALL_FUNCTION_NO_ARGS(PyThreadState *tstate, PyObject *called);
|
|
818
1319
|
|
|
1320
|
+
// Publish an exception, erasing the values of the variables.
|
|
1321
|
+
NUITKA_MAY_BE_UNUSED static inline void
|
|
1322
|
+
PUBLISH_CURRENT_EXCEPTION(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
1323
|
+
#if _DEBUG_EXCEPTIONS
|
|
1324
|
+
PRINT_STRING("PUBLISH_CURRENT_EXCEPTION:\n");
|
|
1325
|
+
PRINT_EXCEPTION_STATE(exception_state);
|
|
819
1326
|
#endif
|
|
820
|
-
if (exception_current == NULL) {
|
|
821
|
-
return true;
|
|
822
|
-
} else if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_current, exception_type)) {
|
|
823
|
-
// Clear the exception first, we believe we know it doesn't have side effects.
|
|
824
|
-
Py_DECREF(exception_current);
|
|
825
1327
|
|
|
826
1328
|
#if PYTHON_VERSION < 0x3c0
|
|
827
|
-
|
|
1329
|
+
NORMALIZE_EXCEPTION_STATE(tstate, exception_state);
|
|
1330
|
+
ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(exception_state->exception_value, exception_state->exception_tb);
|
|
1331
|
+
#endif
|
|
828
1332
|
|
|
829
|
-
|
|
830
|
-
PyObject *old_tb = tstate->curexc_traceback;
|
|
1333
|
+
struct Nuitka_ExceptionStackItem exc_state;
|
|
831
1334
|
|
|
832
|
-
|
|
833
|
-
|
|
1335
|
+
#if PYTHON_VERSION < 0x3b0
|
|
1336
|
+
exc_state.exception_type = exception_state->exception_type;
|
|
1337
|
+
#endif
|
|
1338
|
+
exc_state.exception_value = exception_state->exception_value;
|
|
1339
|
+
#if PYTHON_VERSION < 0x3b0
|
|
1340
|
+
exc_state.exception_tb = exception_state->exception_tb;
|
|
1341
|
+
#endif
|
|
834
1342
|
|
|
835
|
-
|
|
836
|
-
|
|
1343
|
+
SET_CURRENT_EXCEPTION(tstate, &exc_state);
|
|
1344
|
+
|
|
1345
|
+
#if PYTHON_VERSION >= 0x3b0 && PYTHON_VERSION < 0x3c0
|
|
1346
|
+
// TODO: We shouldn't get these in the first place, we don't transfer the
|
|
1347
|
+
// type anymore and the exception tb could come in already attached.
|
|
1348
|
+
Py_DECREF(exception_state->exception_type);
|
|
1349
|
+
Py_XDECREF(exception_state->exception_tb);
|
|
1350
|
+
#endif
|
|
1351
|
+
|
|
1352
|
+
INIT_ERROR_OCCURRED_STATE(exception_state);
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
NUITKA_MAY_BE_UNUSED static bool
|
|
1356
|
+
_CHECK_AND_CLEAR_EXCEPTION_STATE(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
1357
|
+
PyObject *exception_type) {
|
|
1358
|
+
#if PYTHON_VERSION < 0x3c0
|
|
1359
|
+
PyObject *exception_current = exception_state->exception_type;
|
|
837
1360
|
#else
|
|
838
|
-
|
|
1361
|
+
PyObject *exception_current = exception_state->exception_value;
|
|
1362
|
+
ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_current);
|
|
839
1363
|
#endif
|
|
1364
|
+
if (exception_current == NULL) {
|
|
1365
|
+
return true;
|
|
1366
|
+
} else if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_current, exception_type)) {
|
|
1367
|
+
CHECK_OBJECT(exception_current);
|
|
1368
|
+
|
|
1369
|
+
RELEASE_ERROR_OCCURRED_STATE(exception_state);
|
|
1370
|
+
INIT_ERROR_OCCURRED_STATE(exception_state);
|
|
840
1371
|
|
|
841
1372
|
return true;
|
|
842
1373
|
} else {
|
|
@@ -844,69 +1375,84 @@ NUITKA_MAY_BE_UNUSED static bool _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(PyThreadSta
|
|
|
844
1375
|
}
|
|
845
1376
|
}
|
|
846
1377
|
|
|
847
|
-
|
|
848
|
-
|
|
1378
|
+
// TODO: Get rid of "CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED" and rename this to
|
|
1379
|
+
// its name.
|
|
1380
|
+
NUITKA_MAY_BE_UNUSED static bool
|
|
1381
|
+
CHECK_AND_CLEAR_STOP_ITERATION_STATE(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
1382
|
+
return _CHECK_AND_CLEAR_EXCEPTION_STATE(tstate, exception_state, PyExc_StopIteration);
|
|
1383
|
+
}
|
|
849
1384
|
|
|
850
|
-
|
|
1385
|
+
// Format a UnboundLocalError exception for a variable name. TODO: This is more
|
|
1386
|
+
// for "raising.h" it seems.
|
|
1387
|
+
extern void FORMAT_UNBOUND_LOCAL_ERROR(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
1388
|
+
PyObject *variable_name);
|
|
851
1389
|
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
1390
|
+
extern void FORMAT_UNBOUND_CLOSURE_ERROR(PyThreadState *tstate,
|
|
1391
|
+
struct Nuitka_ExceptionPreservationItem *exception_state,
|
|
1392
|
+
PyObject *variable_name);
|
|
855
1393
|
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
1394
|
+
#if PYTHON_VERSION >= 0x300
|
|
1395
|
+
static inline PyBaseExceptionObject *_PyBaseExceptionObject_cast(PyObject *exc) {
|
|
1396
|
+
assert(PyExceptionInstance_Check(exc));
|
|
1397
|
+
return (PyBaseExceptionObject *)exc;
|
|
859
1398
|
}
|
|
860
1399
|
|
|
861
|
-
|
|
862
|
-
|
|
1400
|
+
// Exception context, replacement for "PyException_GetContext", it however gives no
|
|
1401
|
+
// reference.
|
|
1402
|
+
NUITKA_MAY_BE_UNUSED static inline PyObject *Nuitka_Exception_GetContext(PyObject *self) {
|
|
1403
|
+
return _PyBaseExceptionObject_cast(self)->context;
|
|
1404
|
+
}
|
|
863
1405
|
|
|
864
|
-
|
|
1406
|
+
// Exception context, replacement for "PyException_SetContext" it however doesn't
|
|
1407
|
+
// consume a reference.
|
|
1408
|
+
NUITKA_MAY_BE_UNUSED static inline void Nuitka_Exception_SetContext(PyObject *self, PyObject *context) {
|
|
1409
|
+
CHECK_OBJECT(context);
|
|
865
1410
|
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
return _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(tstate, PyExc_KeyError);
|
|
1411
|
+
Py_INCREF(context);
|
|
1412
|
+
Py_XSETREF(_PyBaseExceptionObject_cast(self)->context, context);
|
|
869
1413
|
}
|
|
870
1414
|
|
|
871
|
-
NUITKA_MAY_BE_UNUSED static
|
|
872
|
-
|
|
1415
|
+
NUITKA_MAY_BE_UNUSED static inline void Nuitka_Exception_DeleteContext(PyObject *self) {
|
|
1416
|
+
Py_XSETREF(_PyBaseExceptionObject_cast(self)->context, NULL);
|
|
873
1417
|
}
|
|
874
1418
|
|
|
875
|
-
|
|
876
|
-
|
|
1419
|
+
#if PYTHON_VERSION >= 0x300
|
|
1420
|
+
// Attach the exception context if necessary.
|
|
1421
|
+
NUITKA_MAY_BE_UNUSED static inline void
|
|
1422
|
+
ADD_EXCEPTION_CONTEXT(PyThreadState *tstate, struct Nuitka_ExceptionPreservationItem *exception_state) {
|
|
1423
|
+
PyObject *context = EXC_VALUE(tstate);
|
|
877
1424
|
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
1425
|
+
if (context != NULL) {
|
|
1426
|
+
#if PYTHON_VERSION < 0x3c0
|
|
1427
|
+
NORMALIZE_EXCEPTION_STATE(tstate, exception_state);
|
|
881
1428
|
#endif
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
extern void FORMAT_UNBOUND_CLOSURE_ERROR(PyObject **exception_type, PyObject **exception_value,
|
|
887
|
-
PyObject *variable_name);
|
|
888
|
-
|
|
1429
|
+
Nuitka_Exception_SetContext(exception_state->exception_value, context);
|
|
1430
|
+
}
|
|
1431
|
+
}
|
|
889
1432
|
#endif
|
|
890
1433
|
|
|
891
|
-
|
|
892
|
-
static
|
|
893
|
-
PyBaseExceptionObject *self;
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
self->dict = NULL;
|
|
898
|
-
self->notes = NULL;
|
|
899
|
-
self->traceback = self->cause = self->context = NULL;
|
|
900
|
-
self->suppress_context = 0;
|
|
901
|
-
|
|
902
|
-
assert(arg != NULL);
|
|
1434
|
+
// Our replacement for "PyException_SetCause", consumes a reference.
|
|
1435
|
+
NUITKA_MAY_BE_UNUSED static inline void Nuitka_Exception_SetCause(PyObject *self, PyObject *cause) {
|
|
1436
|
+
PyBaseExceptionObject *base_self = _PyBaseExceptionObject_cast(self);
|
|
1437
|
+
base_self->suppress_context = 1;
|
|
1438
|
+
Py_XSETREF(base_self->cause, cause);
|
|
1439
|
+
}
|
|
903
1440
|
|
|
904
|
-
|
|
905
|
-
self->args = MAKE_TUPLE1(arg);
|
|
906
|
-
} else {
|
|
907
|
-
self->args = Py_NewRef(arg);
|
|
908
|
-
}
|
|
1441
|
+
#endif
|
|
909
1442
|
|
|
910
|
-
return (PyObject *)self;
|
|
911
|
-
}
|
|
912
1443
|
#endif
|
|
1444
|
+
|
|
1445
|
+
// Part of "Nuitka", an optimizing Python compiler that is compatible and
|
|
1446
|
+
// integrates with CPython, but also works on its own.
|
|
1447
|
+
//
|
|
1448
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
1449
|
+
// you may not use this file except in compliance with the License.
|
|
1450
|
+
// You may obtain a copy of the License at
|
|
1451
|
+
//
|
|
1452
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
1453
|
+
//
|
|
1454
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
1455
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
1456
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1457
|
+
// See the License for the specific language governing permissions and
|
|
1458
|
+
// limitations under the License.
|