]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-115988: Add ARM64 and RISCV BCJ filters constants in lzma module (GH-115989)
authorChien Wong <m@xv97.com>
Thu, 28 May 2026 15:05:03 +0000 (23:05 +0800)
committerGitHub <noreply@github.com>
Thu, 28 May 2026 15:05:03 +0000 (08:05 -0700)
---------

Signed-off-by: Chien Wong <m@xv97.com>
Co-authored-by: Gregory P. Smith <greg@krypto.org>
Doc/library/lzma.rst
Doc/whatsnew/3.16.rst
Lib/lzma.py
Lib/test/test_lzma.py
Misc/NEWS.d/next/Library/2024-03-17-22-16-53.gh-issue-115988.EshSDM.rst [new file with mode: 0644]
Modules/_lzmamodule.c

index 6cede00b2186789aff1ecb2ec61c29aa2e623b7b..cd72174d54f6e62338d42110deb85d11e83df765 100644 (file)
@@ -356,12 +356,26 @@ options. Valid filter IDs are as follows:
 
 * Branch-Call-Jump (BCJ) filters:
 
-  * :const:`FILTER_X86`
-  * :const:`FILTER_IA64`
-  * :const:`FILTER_ARM`
-  * :const:`FILTER_ARMTHUMB`
-  * :const:`FILTER_POWERPC`
-  * :const:`FILTER_SPARC`
+  * :const:`!FILTER_X86`
+  * :const:`!FILTER_IA64`
+  * :const:`!FILTER_ARM`
+  * :const:`!FILTER_ARMTHUMB`
+  * :const:`!FILTER_POWERPC`
+  * :const:`!FILTER_SPARC`
+
+    The above work on all lzma runtime library versions.
+
+  * :const:`!FILTER_ARM64`
+
+    Only works if the lzma version is 5.4.0 or later.
+
+    .. versionadded:: next
+
+  * :const:`!FILTER_RISCV`
+
+    Only works if the lzma version is 5.6.0 or later.
+
+    .. versionadded:: next
 
 A filter chain can consist of up to 4 filters, and cannot be empty. The last
 filter in the chain must be a compression filter, and any other filters must be
index 4aaf5cda57e83b841c6d5b47ae2658546a61b920..a6911b68c2eb756654fd576594f6076fa4743e22 100644 (file)
@@ -93,6 +93,15 @@ gzip
   which is passed on to the constructor of the :class:`~gzip.GzipFile` class.
   (Contributed by Marin Misur in :gh:`91372`.)
 
+lzma
+----
+
+* Add support of new BCJ filters ARM64 and RISC-V via
+  :const:`!lzma.FILTER_ARM64` and :const:`!lzma.FILTER_RISCV`.  Note that the
+  new filters will work only if runtime library supports them. ARM64 filter
+  requires ``lzma`` 5.4.0 or newer while RISC-V requires 5.6.0 or newer.
+  (Contributed by Chien Wong in :gh:`115988`.)
+
 os
 --
 
index 316066d024ea02f3bf5edda62df3127b2f0247f8..fb4bbf650f849a471ab4dac100cc65b943fc3be1 100644 (file)
@@ -13,6 +13,7 @@ __all__ = [
     "CHECK_ID_MAX", "CHECK_UNKNOWN",
     "FILTER_LZMA1", "FILTER_LZMA2", "FILTER_DELTA", "FILTER_X86", "FILTER_IA64",
     "FILTER_ARM", "FILTER_ARMTHUMB", "FILTER_POWERPC", "FILTER_SPARC",
+    "FILTER_ARM64", "FILTER_RISCV",
     "FORMAT_AUTO", "FORMAT_XZ", "FORMAT_ALONE", "FORMAT_RAW",
     "MF_HC3", "MF_HC4", "MF_BT2", "MF_BT3", "MF_BT4",
     "MODE_FAST", "MODE_NORMAL", "PRESET_DEFAULT", "PRESET_EXTREME",
index e93c3c37354e27f9584db0021b28efb2a481e1c5..d4f954b34c1252655223ecb65056063028a2f062 100644 (file)
@@ -383,6 +383,12 @@ class CompressorDecompressorTestCase(unittest.TestCase):
         self.assertEqual(LZMADecompressor.__new__(LZMADecompressor).
                          decompress(bytes()), b'')
 
+    def test_riscv_filter_constant_exists(self):
+        self.assertTrue(lzma.FILTER_RISCV)
+
+    def test_arm64_filter_constant_exists(self):
+        self.assertTrue(lzma.FILTER_ARM64)
+
 
 class CompressDecompressFunctionTestCase(unittest.TestCase):
 
diff --git a/Misc/NEWS.d/next/Library/2024-03-17-22-16-53.gh-issue-115988.EshSDM.rst b/Misc/NEWS.d/next/Library/2024-03-17-22-16-53.gh-issue-115988.EshSDM.rst
new file mode 100644 (file)
index 0000000..4efde6a
--- /dev/null
@@ -0,0 +1 @@
+:mod:`lzma` adds constants to support the newer BCJ filters for ARM64 and RISC-V.
index 237aae544a847bf8e5c6237a4ebdfc6d93cdb99c..4335a8bb162414d4e24bc9f0466471478354cd33 100644 (file)
     #error "The maximum block size accepted by liblzma is SIZE_MAX."
 #endif
 
+
+/*
+ * If the lzma.h we're building against is so old as not to define these, this
+ * provides their equivalent values so that the names remain defined in Python
+ * regardless of the header versions used at build time.
+ */
+#ifndef LZMA_FILTER_ARM64
+#define LZMA_FILTER_ARM64       LZMA_VLI_C(0x0A)
+#endif
+#ifndef LZMA_FILTER_RISCV
+#define LZMA_FILTER_RISCV       LZMA_VLI_C(0x0B)
+#endif
+
 /* On success, return value >= 0
    On failure, return -1 */
 static inline Py_ssize_t
@@ -373,6 +386,8 @@ lzma_filter_converter(_lzma_state *state, PyObject *spec, void *ptr)
         case LZMA_FILTER_ARM:
         case LZMA_FILTER_ARMTHUMB:
         case LZMA_FILTER_SPARC:
+        case LZMA_FILTER_ARM64:
+        case LZMA_FILTER_RISCV:
             f->options = parse_filter_spec_bcj(state, spec);
             return f->options != NULL;
         default:
@@ -491,7 +506,9 @@ build_filter_spec(const lzma_filter *f)
         case LZMA_FILTER_IA64:
         case LZMA_FILTER_ARM:
         case LZMA_FILTER_ARMTHUMB:
-        case LZMA_FILTER_SPARC: {
+        case LZMA_FILTER_SPARC:
+        case LZMA_FILTER_ARM64:
+        case LZMA_FILTER_RISCV: {
             lzma_options_bcj *options = f->options;
             if (options) {
                 ADD_FIELD(options, start_offset);
@@ -1544,6 +1561,8 @@ lzma_exec(PyObject *module)
     ADD_INT_PREFIX_MACRO(module, FILTER_ARMTHUMB);
     ADD_INT_PREFIX_MACRO(module, FILTER_SPARC);
     ADD_INT_PREFIX_MACRO(module, FILTER_POWERPC);
+    ADD_INT_PREFIX_MACRO(module, FILTER_ARM64);
+    ADD_INT_PREFIX_MACRO(module, FILTER_RISCV);
     ADD_INT_PREFIX_MACRO(module, MF_HC3);
     ADD_INT_PREFIX_MACRO(module, MF_HC4);
     ADD_INT_PREFIX_MACRO(module, MF_BT2);