diff options
| author | Dan Halbert <halbert@adafruit.com> | 2019-10-15 09:00:14 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-10-15 09:00:14 -0400 |
| commit | 9de155a1325bdba9873bfaa106c0638b296636b0 (patch) | |
| tree | 19e2b8ffffb68224d19d4d2bae7b751af309e18c | |
| parent | 756e4a41da27a7683fe93b5ee6dc6445cdea3985 (diff) | |
| parent | 1610d06bb438961722c558bd695d6964c76cc080 (diff) | |
Merge pull request #2220 from tannewt/support_dunder_bytes
Support __bytes__
| -rw-r--r-- | py/objstr.c | 16 | ||||
| -rw-r--r-- | tests/basics/class_bytes.py | 9 |
2 files changed, 21 insertions, 4 deletions
diff --git a/py/objstr.c b/py/objstr.c index 6ef9a15b5..fde264681 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -31,6 +31,7 @@ #include "py/unicode.h" #include "py/objstr.h" #include "py/objlist.h" +#include "py/objtype.h" #include "py/runtime.h" #include "py/stackctrl.h" @@ -226,10 +227,6 @@ STATIC mp_obj_t bytes_make_new(const mp_obj_type_t *type_in, size_t n_args, cons return MP_OBJ_FROM_PTR(o); } - if (n_args > 1) { - goto wrong_args; - } - if (MP_OBJ_IS_SMALL_INT(args[0])) { mp_int_t len = MP_OBJ_SMALL_INT_VALUE(args[0]); if (len < 0) { @@ -241,6 +238,17 @@ STATIC mp_obj_t bytes_make_new(const mp_obj_type_t *type_in, size_t n_args, cons return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); } + if (n_args > 1) { + goto wrong_args; + } + + // check if __bytes__ exists, and if so delegate to it + mp_obj_t dest[2]; + mp_load_method_maybe(args[0], MP_QSTR___bytes__, dest); + if (dest[0] != MP_OBJ_NULL) { + return mp_call_method_n_kw(0, 0, dest); + } + // check if argument has the buffer protocol mp_buffer_info_t bufinfo; if (mp_get_buffer(args[0], &bufinfo, MP_BUFFER_READ)) { diff --git a/tests/basics/class_bytes.py b/tests/basics/class_bytes.py new file mode 100644 index 000000000..75e2e7244 --- /dev/null +++ b/tests/basics/class_bytes.py @@ -0,0 +1,9 @@ +class C1: + def __init__(self, value): + self.value = value + + def __bytes__(self): + return self.value + +c1 = C1(b"class 1") +print(bytes(c1)) |
