https://github.com/python/cpython/commit/cf2cd0be822df9e1ec6913a31da44f6960e1ab71
commit: cf2cd0be822df9e1ec6913a31da44f6960e1ab71
branch: main
author: Chien Wong <[email protected]>
committer: gpshead <[email protected]>
date: 2026-05-28T08:05:03-07:00
summary:

gh-115988: Add ARM64 and RISCV BCJ filters constants in lzma module (GH-115989)


---------

Signed-off-by: Chien Wong <[email protected]>
Co-authored-by: Gregory P. Smith <[email protected]>

files:
A Misc/NEWS.d/next/Library/2024-03-17-22-16-53.gh-issue-115988.EshSDM.rst
M Doc/library/lzma.rst
M Doc/whatsnew/3.16.rst
M Lib/lzma.py
M Lib/test/test_lzma.py
M Modules/_lzmamodule.c

diff --git a/Doc/library/lzma.rst b/Doc/library/lzma.rst
index 6cede00b218678..cd72174d54f6e6 100644
--- a/Doc/library/lzma.rst
+++ b/Doc/library/lzma.rst
@@ -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
diff --git a/Doc/whatsnew/3.16.rst b/Doc/whatsnew/3.16.rst
index 4aaf5cda57e83b..a6911b68c2eb75 100644
--- a/Doc/whatsnew/3.16.rst
+++ b/Doc/whatsnew/3.16.rst
@@ -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
 --
 
diff --git a/Lib/lzma.py b/Lib/lzma.py
index 316066d024ea02..fb4bbf650f849a 100644
--- a/Lib/lzma.py
+++ b/Lib/lzma.py
@@ -13,6 +13,7 @@
     "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",
diff --git a/Lib/test/test_lzma.py b/Lib/test/test_lzma.py
index e93c3c37354e27..d4f954b34c1252 100644
--- a/Lib/test/test_lzma.py
+++ b/Lib/test/test_lzma.py
@@ -383,6 +383,12 @@ def test_uninitialized_LZMADecompressor_crash(self):
         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
index 00000000000000..4efde6a48c26cc
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-03-17-22-16-53.gh-issue-115988.EshSDM.rst
@@ -0,0 +1 @@
+:mod:`lzma` adds constants to support the newer BCJ filters for ARM64 and 
RISC-V.
diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c
index 237aae544a847b..4335a8bb162414 100644
--- a/Modules/_lzmamodule.c
+++ b/Modules/_lzmamodule.c
@@ -26,6 +26,19 @@
     #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);

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to