• Damien George's avatar
    py/compile: Fix scope of assignment expression target in comprehensions. · 7c1584ae
    Damien George authored
    
    
    When := is used in a comprehension the target variable is bound to the
    parent scope, so it's either a global or a nonlocal.  Prior to this commit
    that was handled by simply using the parent scope's id_info for the
    target variable.  That's completely wrong because it uses the slot number
    for the parent's Python stack to store the variable, rather than the slot
    number for the comprehension.  This will in most cases lead to incorrect
    behaviour or memory faults.
    
    This commit fixes the scoping of the target variable by explicitly
    declaring it a global or nonlocal, depending on whether the parent is the
    global scope or not.  Then the id_info of the comprehension can be used to
    access the target variable.  This fixes a lot of cases of using := in a
    comprehension.
    
    Code size change for this commit:
    
           bare-arm:    +0 +0.000%
        minimal x86:    +0 +0.000%
           unix x64:  +152 +0.019% standard
              stm32:   +96 +0.024% PYBV10
             cc3200:   +96 +0.052%
            esp8266:  +196 +0.028% GENERIC
              esp32:  +156 +0.010% GENERIC[incl +8(data)]
             mimxrt:   +96 +0.027% TEENSY40
         renesas-ra:   +88 +0.014% RA6M2_EK
                nrf:   +88 +0.048% pca10040
                rp2:  +104 +0.020% PICO
               samd:   +88 +0.033% ADAFRUIT_ITSYBITSY_M4_EXPRESS
    
    Fixes issue #10895.
    Signed-off-by: default avatarDamien George <damien@micropython.org>
    7c1584ae
emit.h 14.3 KB