py/viper: Allow casting of Python integers to viper pointers.
This allows you to pass a number (being an address) to a viper function that expects a pointer, and also allows casting of integers to pointers within viper functions. This was actually the original behaviour, but it regressed due to native type identifiers being promoted to 4 bits in width.
This commit is contained in:
parent
9e78ab4b86
commit
3e02b1d19a
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
29
tests/micropython/viper_addr.py
Normal file
29
tests/micropython/viper_addr.py
Normal file
@ -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)
|
6
tests/micropython/viper_addr.py.exp
Normal file
6
tests/micropython/viper_addr.py.exp
Normal file
@ -0,0 +1,6 @@
|
||||
<class 'bytearray'>
|
||||
<class 'int'>
|
||||
bytearray(b'0000')
|
||||
bytearray(b'1111')
|
||||
bytearray(b'2222')
|
||||
bytearray(b'2233')
|
Loading…
Reference in New Issue
Block a user