From 66dc1397c92f6accf102bcd15c6395902fd46c8b Mon Sep 17 00:00:00 2001 From: Damien George Date: Thu, 1 Jun 2023 12:12:22 +1000 Subject: [PATCH] py/obj: Accept user types in mp_obj_get_int_maybe. This is possible now that MP_UNARY_OP_INT_MAYBE exists. As a consequence mp_obj_get_int now also supports user types, which was previously possible with MP_UNARY_OP_INT but no tests existed for it. Signed-off-by: Damien George --- py/obj.c | 7 ++++++- tests/basics/string_format_modulo.py | 6 ++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/py/obj.c b/py/obj.c index dc6919467..64c52eeb7 100644 --- a/py/obj.c +++ b/py/obj.c @@ -326,7 +326,12 @@ bool mp_obj_get_int_maybe(mp_const_obj_t arg, mp_int_t *value) { } else if (mp_obj_is_exact_type(arg, &mp_type_int)) { *value = mp_obj_int_get_checked(arg); } else { - return false; + arg = mp_unary_op(MP_UNARY_OP_INT_MAYBE, (mp_obj_t)arg); + if (arg != MP_OBJ_NULL) { + *value = mp_obj_int_get_checked(arg); + } else { + return false; + } } return true; } diff --git a/tests/basics/string_format_modulo.py b/tests/basics/string_format_modulo.py index 01f8e7ed2..14b4a6a48 100644 --- a/tests/basics/string_format_modulo.py +++ b/tests/basics/string_format_modulo.py @@ -13,6 +13,12 @@ print("=%s=" % [1, 2]) print("=%s=" % "str") print("=%r=" % "str") +# test calling __int__ +class A: + def __int__(self): + return 123 +print("%d" % A()) + try: print("=%s=%s=" % 1) except TypeError: