diff options
author | Damien George <damien.p.george@gmail.com> | 2014-04-08 23:11:51 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-04-08 23:11:51 +0100 |
commit | 803b9263ab1049d19d62d9a09e5f82084b7afa41 (patch) | |
tree | 1f97f3f4a1fabea34327d1af4db520a348f29dbe /py | |
parent | eec91057b827013a3e02c51b60e46c8597295132 (diff) | |
parent | a985b4593d3f0c788c5e6ef0066bf82ae550cfb8 (diff) | |
download | micropython-803b9263ab1049d19d62d9a09e5f82084b7afa41.tar.gz micropython-803b9263ab1049d19d62d9a09e5f82084b7afa41.zip |
Merge branch 'master' of github.com:micropython/micropython
Diffstat (limited to 'py')
-rw-r--r-- | py/obj.c | 18 | ||||
-rw-r--r-- | py/obj.h | 2 | ||||
-rw-r--r-- | py/objint.c | 38 | ||||
-rw-r--r-- | py/qstrdefs.h | 2 |
4 files changed, 60 insertions, 0 deletions
@@ -330,3 +330,21 @@ mp_obj_t mp_identity(mp_obj_t self) { return self; } MP_DEFINE_CONST_FUN_OBJ_1(mp_identity_obj, mp_identity); + +bool mp_get_buffer(mp_obj_t obj, buffer_info_t *bufinfo) { + mp_obj_base_t *o = (mp_obj_base_t *)obj; + if (o->type->buffer_p.get_buffer == NULL) { + return false; + } + o->type->buffer_p.get_buffer(o, bufinfo, BUFFER_READ); + if (bufinfo->buf == NULL) { + return false; + } + return true; +} + +void mp_get_buffer_raise(mp_obj_t obj, buffer_info_t *bufinfo) { + if (!mp_get_buffer(obj, bufinfo)) { + nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "Object with buffer protocol required")); + } +} @@ -196,6 +196,8 @@ typedef struct _buffer_info_t { typedef struct _mp_buffer_p_t { machine_int_t (*get_buffer)(mp_obj_t obj, buffer_info_t *bufinfo, int flags); } mp_buffer_p_t; +bool mp_get_buffer(mp_obj_t obj, buffer_info_t *bufinfo); +void mp_get_buffer_raise(mp_obj_t obj, buffer_info_t *bufinfo); // Stream protocol typedef struct _mp_stream_p_t { diff --git a/py/objint.c b/py/objint.c index e1b67a16b3..05269ce379 100644 --- a/py/objint.c +++ b/py/objint.c @@ -261,6 +261,43 @@ mp_obj_t mp_obj_int_binary_op_extra_cases(int op, mp_obj_t lhs_in, mp_obj_t rhs_ return MP_OBJ_NULL; } +STATIC mp_obj_t int_from_bytes(uint n_args, const mp_obj_t *args) { + buffer_info_t bufinfo; + mp_get_buffer_raise(args[0], &bufinfo); + + assert(bufinfo.len >= sizeof(machine_int_t)); + // TODO: Support long ints + // TODO: Support byteorder param + // TODO: Support signed param + return mp_obj_new_int_from_uint(*(machine_uint_t*)bufinfo.buf); +} + +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(int_from_bytes_obj, 1, 3, int_from_bytes); + +STATIC mp_obj_t int_to_bytes(uint n_args, const mp_obj_t *args) { + machine_int_t val = mp_obj_int_get_checked(args[0]); + + uint len = MP_OBJ_SMALL_INT_VALUE(args[1]); + byte *data; + + // TODO: Support long ints + // TODO: Support byteorder param + // TODO: Support signed param + mp_obj_t o = mp_obj_str_builder_start(&mp_type_bytes, len, &data); + memset(data, 0, len); + memcpy(data, &val, len < sizeof(machine_int_t) ? len : sizeof(machine_int_t)); + return mp_obj_str_builder_end(o); +} + +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(int_to_bytes_obj, 2, 4, int_to_bytes); + +STATIC const mp_map_elem_t int_locals_dict_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR_from_bytes), (mp_obj_t)&int_from_bytes_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_to_bytes), (mp_obj_t)&int_to_bytes_obj }, +}; + +STATIC MP_DEFINE_CONST_DICT(int_locals_dict, int_locals_dict_table); + const mp_obj_type_t mp_type_int = { { &mp_type_type }, .name = MP_QSTR_int, @@ -268,4 +305,5 @@ const mp_obj_type_t mp_type_int = { .make_new = mp_obj_int_make_new, .unary_op = mp_obj_int_unary_op, .binary_op = mp_obj_int_binary_op, + .locals_dict = (mp_obj_t)&int_locals_dict, }; diff --git a/py/qstrdefs.h b/py/qstrdefs.h index 29eb51d0ba..0c2c032f29 100644 --- a/py/qstrdefs.h +++ b/py/qstrdefs.h @@ -96,6 +96,7 @@ Q(eval) Q(exec) Q(filter) Q(float) +Q(from_bytes) Q(getattr) Q(globals) Q(hash) @@ -127,6 +128,7 @@ Q(sum) Q(super) Q(str) Q(sys) +Q(to_bytes) Q(tuple) Q(type) Q(value) |