micropython/tests/cmdline/cmd_showbc.py
Damien George a506335524 py/emit: Suppress unreachable bytecode/native code that follows jump.
This new logic tracks when an unconditional jump/raise occurs in the
emitted code stream (bytecode or native machine code) and suppresses all
subsequent code, until a label is assigned.  This eliminates a lot of
cases of dead code, with relatively simple logic.

This commit combined with the previous one (that removed the existing
dead-code finding logic) has the following code size change:

       bare-arm:   -16 -0.028%
    minimal x86:   -60 -0.036%
       unix x64:  -368 -0.070%
    unix nanbox:   -80 -0.017%
          stm32:  -204 -0.052% PYBV10
         cc3200:    +0 +0.000%
        esp8266:  -232 -0.033% GENERIC
          esp32:  -224 -0.015% GENERIC[incl -40(data)]
         mimxrt:  -192 -0.054% TEENSY40
     renesas-ra:  -200 -0.032% RA6M2_EK
            nrf:   +28 +0.015% pca10040
            rp2:  -256 -0.050% PICO
           samd:   -12 -0.009% ADAFRUIT_ITSYBITSY_M4_EXPRESS

Signed-off-by: Damien George <damien@micropython.org>
2022-06-20 22:28:18 +10:00

161 lines
2.1 KiB
Python

# cmdline: -v -v
# test printing of all bytecodes
# fmt: off
def f():
# constants
a = None + False + True
a = 0
a = 1000
a = -1000
# constructing data
a = 1
b = (1, 2)
c = [1, 2]
d = {1, 2}
e = {}
f = {1:2}
g = 'a'
h = b'a'
# unary/binary ops
i = 1
j = 2
k = a + b
l = -a
m = not a
m = a == b == c
m = not (a == b and b == c)
# attributes
n = b.c
b.c = n
# subscript
p = b[0]
b[0] = p
b[0] += p
# slice
a = b[::]
# sequence unpacking
a, b = c
a, *a = a
# tuple swapping
a, b = b, a
a, b, c = c, b, a
# del fast
del a
# globals
global gl
gl = a
del gl
# comprehensions
a = (b for c in d if e)
a = [b for c in d if e]
a = {b:b for c in d if e}
# function calls
a()
a(1)
a(b=1)
a(*b)
# method calls
a.b()
a.b(1)
a.b(c=1)
a.b(*c)
# jumps
if a:
x
else:
y
while a:
b
while not a:
b
a = a or a
# for loop
for a in b:
c
# exceptions
try:
while a:
break
except:
b
finally:
c
while a:
try:
break
except:
pass
# with
with a:
b
# closed over variables
x = 1
def closure():
nonlocal x; a = x + 1
x = 1
del x
# import
import a
from a import b
#from sys import * # tested at module scope
# raise
if a: raise
if a: raise 1
# return
if a: return
if a: return 1
# function with lots of locals
def f():
l1 = l2 = l3 = l4 = l5 = l6 = l7 = l8 = l9 = l10 = 1
m1 = m2 = m3 = m4 = m5 = m6 = m7 = m8 = m9 = m10 = 2
l10 + m10
# functions with default args
def f(a=1):
pass
def f(b=2):
return b + a
# function which yields
def f():
yield
yield 1
yield from 1
# class
class Class:
pass
# delete name
del Class
# load super method
def f(self):
super().f()
# import * (needs to be in module scope)
from sys import *