• Jim Mussared's avatar
    py/dynruntime.h: Implement MP_OBJ_NEW_QSTR. · a64f2fdc
    Jim Mussared authored
    
    
    Because mpy_ld.py doesn't know the target object representation, it emits
    instances of `MP_OBJ_NEW_QSTR(MP_QSTR_Foo)` as const string objects, rather
    than qstrs. However this doesn't work for map keys (e.g. for a locals dict)
    because the map has all_keys_are_qstrs flag is set (and also auto-complete
    requires the map keys to be qstrs).
    
    Instead, emit them as regular qstrs, and make a functioning MP_OBJ_NEW_QSTR
    function available (via `native_to_obj`, also used for e.g. making
    integers).
    
    Remove the code from mpy_ld.py to emit qstrs as constant strings, but leave
    behind the scaffold to emit constant objects in case we want to do use this
    in the future.
    
    Strictly this should be a .mpy sub-version bump, even though the function
    table isn't changing, it does lead to a change in behavior for a new .mpy
    running against old MicroPython. `mp_native_to_obj` will incorrectly return
    the qstr value directly as an `mp_obj_t`, leading to unexpected results.
    But given that it's broken at the moment, it seems unlikely that anyone is
    relying on this, so it's not work the other downsides of a sub-version bump
    (i.e. breaking pure-Python modules that use @native). The opposite case of
    running an old .mpy on new MicroPython is unchanged, and remains broken in
    exactly the same way.
    
    This work was funded through GitHub Sponsors.
    Signed-off-by: default avatarJim Mussared <jim.mussared@gmail.com>
    a64f2fdc
runtime0.h 6.25 KB