diff options
| -rw-r--r-- | py/nativeglue.c | 10 | ||||
| -rw-r--r-- | tests/micropython/viper_addr.py | 29 | ||||
| -rw-r--r-- | tests/micropython/viper_addr.py.exp | 6 | 
3 files changed, 42 insertions, 3 deletions
| diff --git a/py/nativeglue.c b/py/nativeglue.c index e27d69e14..bc2f4ff5e 100644 --- a/py/nativeglue.c +++ b/py/nativeglue.c @@ -50,10 +50,14 @@ mp_uint_t mp_convert_obj_to_native(mp_obj_t obj, mp_uint_t type) {          case MP_NATIVE_TYPE_BOOL:          case MP_NATIVE_TYPE_INT:          case MP_NATIVE_TYPE_UINT: return mp_obj_get_int_truncated(obj); -        default: { // a pointer +        default: { // cast obj to a pointer              mp_buffer_info_t bufinfo; -            mp_get_buffer_raise(obj, &bufinfo, MP_BUFFER_RW); -            return (mp_uint_t)bufinfo.buf; +            if (mp_get_buffer(obj, &bufinfo, MP_BUFFER_RW)) { +                return (mp_uint_t)bufinfo.buf; +            } else { +                // assume obj is an integer that represents an address +                return mp_obj_get_int_truncated(obj); +            }          }      }  } diff --git a/tests/micropython/viper_addr.py b/tests/micropython/viper_addr.py new file mode 100644 index 000000000..cd953ce07 --- /dev/null +++ b/tests/micropython/viper_addr.py @@ -0,0 +1,29 @@ +# test passing addresses to viper + +@micropython.viper +def get_addr(x:ptr) -> ptr: +    return x + +@micropython.viper +def memset(dest:ptr8, c:int, n:int): +    for i in range(n): +        dest[i] = c + +# create array and get its address +ar = bytearray('0000') +addr = get_addr(ar) +print(type(ar)) +print(type(addr)) +print(ar) + +# pass array as an object +memset(ar, ord('1'), len(ar)) +print(ar) + +# pass direct pointer to array buffer +memset(addr, ord('2'), len(ar)) +print(ar) + +# pass direct pointer to array buffer, with offset +memset(addr + 2, ord('3'), len(ar) - 2) +print(ar) diff --git a/tests/micropython/viper_addr.py.exp b/tests/micropython/viper_addr.py.exp new file mode 100644 index 000000000..87a18e1e2 --- /dev/null +++ b/tests/micropython/viper_addr.py.exp @@ -0,0 +1,6 @@ +<class 'bytearray'> +<class 'int'> +bytearray(b'0000') +bytearray(b'1111') +bytearray(b'2222') +bytearray(b'2233') | 
