* 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
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
--
"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",
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):
--- /dev/null
+:mod:`lzma` adds constants to support the newer BCJ filters for ARM64 and RISC-V.
#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
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:
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);
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);