QUERY · ISSUE
Type Inference issue when using struct in viper
bug
MY_TYPE = {
"var": 0 | uctypes.UINT32
}
storage = bytearray(uctypes.sizeof(MY_TYPE))
@micropython.viper
def bugreport():
data = uctypes.struct(ptr32(storage), MY_TYPE)
data.var += int(1)
bugreport()
For some reason data.var is an object even though it's type is clearly defined from the struct. the following error occurs:
ViperTypeError: can\'t do binary op between \'object\' and \'int\'
CANDIDATE · ISSUE
Hidden Extraneous memory allocation
import uctypes
import gc
import micropython
MY_TYPE = {
'var': 0 | uctypes.UINT32,
"previous_measurements": 4 | uctypes.UINT32,
}
buffer = bytearray(uctypes.sizeof(MY_TYPE))
@micropython.viper
def bugreport():
while True:
data = uctypes.struct(ptr32(buffer), MY_TYPE)
data.var = int(data.var) + 1
if __name__ == '__main__':
gc.collect()
gc.disable()
bugreport()
This code crash but shouldn't ever allocate memory after the garbage collector is disabled.
When the bugreport is compiled, offsets should be computable by reading MY_TYPE, and memory access replaced accordingly.
I thought that allocating all the data ahead of time in a struct would help make my code jitter free but it seems impossible in micropython.