From 5f8faca44787cad44723c6e217de1bcbf36d3bf7 Mon Sep 17 00:00:00 2001 From: Jukka Lehtosalo Date: Thu, 20 Nov 2025 13:14:35 +0000 Subject: [PATCH 1/2] [mypyc] Add primitive for librt.base64.b64decode Forgot to add this in #20263. --- mypyc/lib-rt/librt_base64.c | 5 +++-- mypyc/lib-rt/librt_base64.h | 5 +++-- mypyc/primitives/misc_ops.py | 11 +++++++++++ mypyc/test-data/irbuild-base64.test | 19 ++++++++++++++++++- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/mypyc/lib-rt/librt_base64.c b/mypyc/lib-rt/librt_base64.c index 1720359ef9a6..9eb59d950c11 100644 --- a/mypyc/lib-rt/librt_base64.c +++ b/mypyc/lib-rt/librt_base64.c @@ -261,12 +261,12 @@ static PyMethodDef librt_base64_module_methods[] = { static int base64_abi_version(void) { - return 0; + return LIBRT_BASE64_ABI_VERSION; } static int base64_api_version(void) { - return 0; + return LIBRT_BASE64_API_VERSION; } static int @@ -278,6 +278,7 @@ librt_base64_module_exec(PyObject *m) (void *)base64_abi_version, (void *)base64_api_version, (void *)b64encode_internal, + (void *)b64decode_internal, }; PyObject *c_api_object = PyCapsule_New((void *)base64_api, "librt.base64._C_API", NULL); if (PyModule_Add(m, "_C_API", c_api_object) < 0) { diff --git a/mypyc/lib-rt/librt_base64.h b/mypyc/lib-rt/librt_base64.h index cc97e54155fd..177cd0c1cfef 100644 --- a/mypyc/lib-rt/librt_base64.h +++ b/mypyc/lib-rt/librt_base64.h @@ -13,14 +13,15 @@ import_librt_base64(void) #else // MYPYC_EXPERIMENTAL #define LIBRT_BASE64_ABI_VERSION 0 -#define LIBRT_BASE64_API_VERSION 0 -#define LIBRT_BASE64_API_LEN 3 +#define LIBRT_BASE64_API_VERSION 1 +#define LIBRT_BASE64_API_LEN 4 static void *LibRTBase64_API[LIBRT_BASE64_API_LEN]; #define LibRTBase64_ABIVersion (*(int (*)(void)) LibRTBase64_API[0]) #define LibRTBase64_APIVersion (*(int (*)(void)) LibRTBase64_API[1]) #define LibRTBase64_b64encode_internal (*(PyObject* (*)(PyObject *source)) LibRTBase64_API[2]) +#define LibRTBase64_b64decode_internal (*(PyObject* (*)(PyObject *source)) LibRTBase64_API[3]) static int import_librt_base64(void) diff --git a/mypyc/primitives/misc_ops.py b/mypyc/primitives/misc_ops.py index bb225a76acd8..1b4c438b58fe 100644 --- a/mypyc/primitives/misc_ops.py +++ b/mypyc/primitives/misc_ops.py @@ -5,6 +5,7 @@ from mypyc.ir.ops import ERR_FALSE, ERR_MAGIC, ERR_MAGIC_OVERLAPPING, ERR_NEVER from mypyc.ir.rtypes import ( KNOWN_NATIVE_TYPES, + RUnion, bit_rprimitive, bool_rprimitive, bytes_rprimitive, @@ -475,3 +476,13 @@ experimental=True, capsule="librt.base64", ) + +function_op( + name="librt.base64.b64decode", + arg_types=[RUnion([bytes_rprimitive, str_rprimitive])], + return_type=bytes_rprimitive, + c_function_name="LibRTBase64_b64decode_internal", + error_kind=ERR_MAGIC, + experimental=True, + capsule="librt.base64", +) diff --git a/mypyc/test-data/irbuild-base64.test b/mypyc/test-data/irbuild-base64.test index bc73b7e35431..4d41f2912700 100644 --- a/mypyc/test-data/irbuild-base64.test +++ b/mypyc/test-data/irbuild-base64.test @@ -1,14 +1,31 @@ [case testBase64_experimental] -from librt.base64 import b64encode +from librt.base64 import b64encode, b64decode def enc(b: bytes) -> bytes: return b64encode(b) + +def dec_bytes(b: bytes) -> bytes: + return b64decode(b) + +def dec_str(b: str) -> bytes: + return b64decode(b) [out] def enc(b): b, r0 :: bytes L0: r0 = LibRTBase64_b64encode_internal(b) return r0 +def dec_bytes(b): + b, r0 :: bytes +L0: + r0 = LibRTBase64_b64decode_internal(b) + return r0 +def dec_str(b): + b :: str + r0 :: bytes +L0: + r0 = LibRTBase64_b64decode_internal(b) + return r0 [case testBase64ExperimentalDisabled] from librt.base64 import b64encode From f0afca6b10dcf9c0575310151caf5bf0f3289dcd Mon Sep 17 00:00:00 2001 From: Jukka Lehtosalo Date: Thu, 20 Nov 2025 13:33:58 +0000 Subject: [PATCH 2/2] Fix compilation --- mypyc/lib-rt/librt_base64.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mypyc/lib-rt/librt_base64.c b/mypyc/lib-rt/librt_base64.c index 9eb59d950c11..b23be59959c5 100644 --- a/mypyc/lib-rt/librt_base64.c +++ b/mypyc/lib-rt/librt_base64.c @@ -259,6 +259,8 @@ static PyMethodDef librt_base64_module_methods[] = { {NULL, NULL, 0, NULL} }; +#ifdef MYPYC_EXPERIMENTAL + static int base64_abi_version(void) { return LIBRT_BASE64_ABI_VERSION; @@ -269,6 +271,8 @@ base64_api_version(void) { return LIBRT_BASE64_API_VERSION; } +#endif + static int librt_base64_module_exec(PyObject *m) {