micropython: add micropython component

This commit is contained in:
KY-zhang-X
2022-09-29 12:10:37 +08:00
parent 1514f1cb9b
commit dd76146324
2679 changed files with 354110 additions and 0 deletions

View File

@@ -0,0 +1,205 @@
try:
str.count
except AttributeError:
print("SKIP")
raise SystemExit
# mad.py
# Alf Clement 27-Mar-2014
#
zero = 0
three = 3
print("1")
print("2")
print(three)
print("{}".format(4))
five = 25 // 5
print(int(five))
j = 0
for i in range(4):
j += i
print(j)
print(3 + 4)
try:
a = 4 // zero
except:
print(8)
print("xxxxxxxxx".count("x"))
def ten():
return 10
print(ten())
a = []
for i in range(13):
a.append(i)
print(a[11])
print(a[-1])
str = "0123456789"
print(str[1] + str[3])
def p(s):
print(s)
p("14")
p(15)
class A:
def __init__(self):
self.a = 16
def print(self):
print(self.a)
def set(self, b):
self.a = b
a = A()
a.print()
a.set(17)
a.print()
b = A()
b.set(a.a + 1)
b.print()
for i in range(20):
pass
print(i)
if 20 > 30:
a = "1"
else:
a = "2"
if 0 < 4:
print(a + "0")
else:
print(a + "1")
a = [20, 21, 22, 23, 24]
for i in a:
if i < 21:
continue
if i > 21:
break
print(i)
b = [a, a, a]
print(b[1][2])
print(161 // 7)
a = 24
while True:
try:
def gcheck():
global a
print(a)
gcheck()
class c25:
x = 25
x = c25()
print(x.x)
raise
except:
print(26)
print(27 + zero)
break
print(28)
k = 29
def f():
global k
k = yield k
print(next(f()))
while True:
k += 1
if k < 30:
continue
break
print(k)
for i in [1, 2, 3]:
class A:
def __init__(self, c):
self.a = i + 10 * c
b = A(3)
print(b.a)
print(34)
p = 0
for i in range(35, -1, -1):
print(i)
p = p + 1
if p > 0:
break
p = 36
while p == 36:
print(p)
p = 37
print(p)
for i in [38]:
print(i)
print(int(exec("def foo(): return 38") == None) + foo())
d = {}
exec("def bar(): return 40", d)
print(d["bar"]())
def fib2(n):
result = []
a, b = 0, 1
while a < n:
result.append(a)
a, b = b, a + b
return result
print(fib2(100)[-2] - 14)
Answer = {}
Answer["ForAll"] = 42
print(Answer["ForAll"])
i = 43
def f(i=i):
print(i)
i = 44
f()
print(i)
while True:
try:
if None != True:
print(45)
break
else:
print(0)
except:
print(0)
print(46)
print(46 + 1)
def u(p):
if p > 3:
return 3 * p
else:
return u(2 * p) - 3 * u(p)
print(u(16))
def u49():
return 49
print(u49())

View File

@@ -0,0 +1,161 @@
# tests for things that are not implemented, or have non-compliant behaviour
try:
import uarray as array
import ustruct
except ImportError:
print("SKIP")
raise SystemExit
# when super can't find self
try:
exec("def f(): super()")
except SyntaxError:
print("SyntaxError")
# store to exception attribute is not allowed
try:
ValueError().x = 0
except AttributeError:
print("AttributeError")
# array deletion not implemented
try:
a = array.array("b", (1, 2, 3))
del a[1]
except TypeError:
print("TypeError")
# slice with step!=1 not implemented
try:
a = array.array("b", (1, 2, 3))
print(a[3:2:2])
except NotImplementedError:
print("NotImplementedError")
# containment, looking for integer not implemented
try:
print(1 in array.array("B", b"12"))
except NotImplementedError:
print("NotImplementedError")
# uPy raises TypeError, shold be ValueError
try:
"%c" % b"\x01\x02"
except (TypeError, ValueError):
print("TypeError, ValueError")
# attributes/subscr not implemented
try:
print("{a[0]}".format(a=[1, 2]))
except NotImplementedError:
print("NotImplementedError")
# str(...) with keywords not implemented
try:
str(b"abc", encoding="utf8")
except NotImplementedError:
print("NotImplementedError")
# str.rsplit(None, n) not implemented
try:
"a a a".rsplit(None, 1)
except NotImplementedError:
print("NotImplementedError")
# str.endswith(s, start) not implemented
try:
"abc".endswith("c", 1)
except NotImplementedError:
print("NotImplementedError")
# str subscr with step!=1 not implemented
try:
print("abc"[1:2:3])
except NotImplementedError:
print("NotImplementedError")
# bytes(...) with keywords not implemented
try:
bytes("abc", encoding="utf8")
except NotImplementedError:
print("NotImplementedError")
# bytes subscr with step!=1 not implemented
try:
b"123"[0:3:2]
except NotImplementedError:
print("NotImplementedError")
# tuple load with step!=1 not implemented
try:
()[2:3:4]
except NotImplementedError:
print("NotImplementedError")
# list store with step!=1 not implemented
try:
[][2:3:4] = []
except NotImplementedError:
print("NotImplementedError")
# list delete with step!=1 not implemented
try:
del [][2:3:4]
except NotImplementedError:
print("NotImplementedError")
# struct pack with too many args, not checked by uPy
print(ustruct.pack("bb", 1, 2, 3))
# struct pack with too few args, not checked by uPy
print(ustruct.pack("bb", 1))
# array slice assignment with unsupported RHS
try:
bytearray(4)[0:1] = [1, 2]
except NotImplementedError:
print("NotImplementedError")
# can't assign attributes to a function
def f():
pass
try:
f.x = 1
except AttributeError:
print("AttributeError")
# can't call a function type (ie make new instances of a function)
try:
type(f)()
except TypeError:
print("TypeError")
# test when object explicitly listed at not-last position in parent tuple
# this is not compliant with CPython because of illegal MRO
class A:
def foo(self):
print("A.foo")
class B(object, A):
pass
B().foo()
# can't assign property (or other special accessors) to already-subclassed class
class A:
pass
class B(A):
pass
try:
A.bar = property()
except AttributeError:
print("AttributeError")

View File

@@ -0,0 +1,23 @@
SyntaxError
AttributeError
TypeError
NotImplementedError
NotImplementedError
TypeError, ValueError
NotImplementedError
NotImplementedError
NotImplementedError
NotImplementedError
NotImplementedError
NotImplementedError
NotImplementedError
NotImplementedError
NotImplementedError
NotImplementedError
b'\x01\x02'
b'\x01\x00'
NotImplementedError
AttributeError
TypeError
A.foo
AttributeError

View File

@@ -0,0 +1,33 @@
# lexer tests for things that are not implemented, or have non-compliant behaviour
def test(code):
try:
exec(code)
print("no Error")
except SyntaxError:
print("SyntaxError")
except NotImplementedError:
print("NotImplementedError")
# uPy requires spaces between literal numbers and keywords, CPy doesn't
try:
eval("1and 0")
except SyntaxError:
print("SyntaxError")
try:
eval("1or 0")
except SyntaxError:
print("SyntaxError")
try:
eval("1if 1else 0")
except SyntaxError:
print("SyntaxError")
try:
eval("1if 0else 0")
except SyntaxError:
print("SyntaxError")
# unicode name escapes are not implemented
test('"\\N{LATIN SMALL LETTER A}"')

View File

@@ -0,0 +1,5 @@
SyntaxError
SyntaxError
SyntaxError
SyntaxError
NotImplementedError

View File

@@ -0,0 +1,99 @@
try:
try:
import uio as io
import usys as sys
except ImportError:
import io
import sys
except ImportError:
print("SKIP")
raise SystemExit
if hasattr(sys, "print_exception"):
print_exception = sys.print_exception
else:
import traceback
print_exception = lambda e, f: traceback.print_exception(None, e, sys.exc_info()[2], file=f)
def print_exc(e):
buf = io.StringIO()
print_exception(e, buf)
s = buf.getvalue()
for l in s.split("\n"):
# uPy on pyboard prints <stdin> as file, so remove filename.
if l.startswith(" File "):
l = l.split('"')
print(l[0], l[2])
# uPy and CPy tracebacks differ in that CPy prints a source line for
# each traceback entry. In this case, we know that offending line
# has 4-space indent, so filter it out.
elif not l.startswith(" "):
print(l)
# basic exception message
try:
raise Exception("msg")
except Exception as e:
print("caught")
print_exc(e)
# exception message with more than 1 source-code line
def f():
g()
def g():
raise Exception("fail")
try:
f()
except Exception as e:
print("caught")
print_exc(e)
# Test that an exception propagated through a finally doesn't have a traceback added there
try:
try:
f()
finally:
print("finally")
except Exception as e:
print("caught")
print_exc(e)
# Test that re-raising an exception doesn't add traceback info
try:
try:
f()
except Exception as e:
print("reraise")
print_exc(e)
raise
except Exception as e:
print("caught")
print_exc(e)
# Here we have a function with lots of bytecode generated for a single source-line, and
# there is an error right at the end of the bytecode. It should report the correct line.
def f():
f([1, 2], [1, 2], [1, 2], {1: 1, 1: 1, 1: 1, 1: 1, 1: 1, 1: 1, 1: f.X})
return 1
try:
f()
except Exception as e:
print_exc(e)
# Test non-stream object passed as output object, only valid for uPy
if hasattr(sys, "print_exception"):
try:
sys.print_exception(Exception, 1)
had_exception = False
except OSError:
had_exception = True
assert had_exception

View File

@@ -0,0 +1,141 @@
# evolve the RGEs of the standard model from electroweak scale up
# by dpgeorge
import math
class RungeKutta(object):
def __init__(self, functions, initConditions, t0, dh, save=True):
self.Trajectory, self.save = [[t0] + initConditions], save
self.functions = [lambda *args: 1.0] + list(functions)
self.N, self.dh = len(self.functions), dh
self.coeff = [1.0 / 6.0, 2.0 / 6.0, 2.0 / 6.0, 1.0 / 6.0]
self.InArgCoeff = [0.0, 0.5, 0.5, 1.0]
def iterate(self):
step = self.Trajectory[-1][:]
istep, iac = step[:], self.InArgCoeff
k, ktmp = self.N * [0.0], self.N * [0.0]
for ic, c in enumerate(self.coeff):
for if_, f in enumerate(self.functions):
arguments = [(x + k[i] * iac[ic]) for i, x in enumerate(istep)]
try:
feval = f(*arguments)
except OverflowError:
return False
if abs(feval) > 1e2: # stop integrating
return False
ktmp[if_] = self.dh * feval
k = ktmp[:]
step = [s + c * k[ik] for ik, s in enumerate(step)]
if self.save:
self.Trajectory += [step]
else:
self.Trajectory = [step]
return True
def solve(self, finishtime):
while self.Trajectory[-1][0] < finishtime:
if not self.iterate():
break
def solveNSteps(self, nSteps):
for i in range(nSteps):
if not self.iterate():
break
def series(self):
return zip(*self.Trajectory)
# 1-loop RGES for the main parameters of the SM
# couplings are: g1, g2, g3 of U(1), SU(2), SU(3); yt (top Yukawa), lambda (Higgs quartic)
# see arxiv.org/abs/0812.4950, eqs 10-15
sysSM = (
lambda *a: 41.0 / 96.0 / math.pi**2 * a[1] ** 3, # g1
lambda *a: -19.0 / 96.0 / math.pi**2 * a[2] ** 3, # g2
lambda *a: -42.0 / 96.0 / math.pi**2 * a[3] ** 3, # g3
lambda *a: 1.0
/ 16.0
/ math.pi**2
* (
9.0 / 2.0 * a[4] ** 3
- 8.0 * a[3] ** 2 * a[4]
- 9.0 / 4.0 * a[2] ** 2 * a[4]
- 17.0 / 12.0 * a[1] ** 2 * a[4]
), # yt
lambda *a: 1.0
/ 16.0
/ math.pi**2
* (
24.0 * a[5] ** 2
+ 12.0 * a[4] ** 2 * a[5]
- 9.0 * a[5] * (a[2] ** 2 + 1.0 / 3.0 * a[1] ** 2)
- 6.0 * a[4] ** 4
+ 9.0 / 8.0 * a[2] ** 4
+ 3.0 / 8.0 * a[1] ** 4
+ 3.0 / 4.0 * a[2] ** 2 * a[1] ** 2
), # lambda
)
def drange(start, stop, step):
r = start
while r < stop:
yield r
r += step
def phaseDiagram(system, trajStart, trajPlot, h=0.1, tend=1.0, range=1.0):
tstart = 0.0
for i in drange(0, range, 0.1 * range):
for j in drange(0, range, 0.1 * range):
rk = RungeKutta(system, trajStart(i, j), tstart, h)
rk.solve(tend)
# draw the line
for tr in rk.Trajectory:
x, y = trajPlot(tr)
print(x, y)
print()
# draw the arrow
continue
l = (len(rk.Trajectory) - 1) / 3
if l > 0 and 2 * l < len(rk.Trajectory):
p1 = rk.Trajectory[l]
p2 = rk.Trajectory[2 * l]
x1, y1 = trajPlot(p1)
x2, y2 = trajPlot(p2)
dx = -0.5 * (y2 - y1) # orthogonal to line
dy = 0.5 * (x2 - x1) # orthogonal to line
# l = math.sqrt(dx*dx + dy*dy)
# if abs(l) > 1e-3:
# l = 0.1 / l
# dx *= l
# dy *= l
print(x1 + dx, y1 + dy)
print(x2, y2)
print(x1 - dx, y1 - dy)
print()
def singleTraj(system, trajStart, h=0.02, tend=1.0):
tstart = 0.0
# compute the trajectory
rk = RungeKutta(system, trajStart, tstart, h)
rk.solve(tend)
# print out trajectory
for i in range(len(rk.Trajectory)):
tr = rk.Trajectory[i]
print(" ".join(["{:.4f}".format(t) for t in tr]))
# phaseDiagram(sysSM, (lambda i, j: [0.354, 0.654, 1.278, 0.8 + 0.2 * i, 0.1 + 0.1 * j]), (lambda a: (a[4], a[5])), h=0.1, tend=math.log(10**17))
# initial conditions at M_Z
singleTraj(
sysSM, [0.354, 0.654, 1.278, 0.983, 0.131], h=0.5, tend=math.log(10**17)
) # true values

View File

@@ -0,0 +1,21 @@
# test sys.atexit() function
import usys
try:
usys.atexit
except AttributeError:
print("SKIP")
raise SystemExit
some_var = None
def do_at_exit():
print("done at exit:", some_var)
usys.atexit(do_at_exit)
some_var = "ok"
print("done before exit")

View File

@@ -0,0 +1,2 @@
done before exit
done at exit: ok

View File

@@ -0,0 +1,27 @@
try:
import usys as sys
except ImportError:
import sys
try:
sys.exc_info
except:
print("SKIP")
raise SystemExit
def f():
print(sys.exc_info()[0:2])
try:
raise ValueError("value", 123)
except:
print(sys.exc_info()[0:2])
f()
# Outside except block, sys.exc_info() should be back to None's
f()
# Recursive except blocks are not handled - just don't
# use exc_info() at all, use explicit variables in "except".

View File

@@ -0,0 +1,110 @@
import sys
try:
sys.settrace
except AttributeError:
print("SKIP")
raise SystemExit
def print_stacktrace(frame, level=0):
# Ignore CPython specific helpers.
if frame.f_globals["__name__"].find("importlib") != -1:
print_stacktrace(frame.f_back, level)
return
print(
"%2d: %s@%s:%s => %s:%d"
% (
level,
" ",
frame.f_globals["__name__"],
frame.f_code.co_name,
# Keep just the filename.
"sys_settrace_" + frame.f_code.co_filename.split("sys_settrace_")[-1],
frame.f_lineno,
)
)
if frame.f_back:
print_stacktrace(frame.f_back, level + 1)
class _Prof:
trace_count = 0
def trace_tick(self, frame, event, arg):
self.trace_count += 1
print_stacktrace(frame)
__prof__ = _Prof()
alice_handler_set = False
def trace_tick_handler_alice(frame, event, arg):
print("### trace_handler::Alice event:", event)
__prof__.trace_tick(frame, event, arg)
return trace_tick_handler_alice
bob_handler_set = False
def trace_tick_handler_bob(frame, event, arg):
print("### trace_handler::Bob event:", event)
__prof__.trace_tick(frame, event, arg)
return trace_tick_handler_bob
def trace_tick_handler(frame, event, arg):
# Ignore CPython specific helpers.
to_ignore = ["importlib", "zipimport", "encodings"]
frame_name = frame.f_globals["__name__"]
if any(name in frame_name for name in to_ignore):
return
print("### trace_handler::main event:", event)
__prof__.trace_tick(frame, event, arg)
if frame.f_code.co_name != "factorial":
return trace_tick_handler
global alice_handler_set
if event == "call" and not alice_handler_set:
alice_handler_set = True
return trace_tick_handler_alice
global bob_handler_set
if event == "call" and not bob_handler_set:
bob_handler_set = True
return trace_tick_handler_bob
return trace_tick_handler
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
def do_tests():
# These commands are here to demonstrate some execution being traced.
print("Who loves the sun?")
print("Not every-", factorial(3))
from sys_settrace_subdir import sys_settrace_generic
sys_settrace_generic.run_tests()
return
sys.settrace(trace_tick_handler)
do_tests()
sys.settrace(None)
print("\n------------------ script exited ------------------")
print("Total traces executed: ", __prof__.trace_count)

View File

@@ -0,0 +1,71 @@
# test sys.settrace with generators
import sys
try:
sys.settrace
except AttributeError:
print("SKIP")
raise SystemExit
def print_stacktrace(frame, level=0):
print(
"%2d: %s@%s:%s => %s:%d"
% (
level,
" ",
frame.f_globals["__name__"],
frame.f_code.co_name,
# Keep just the filename.
"sys_settrace_" + frame.f_code.co_filename.split("sys_settrace_")[-1],
frame.f_lineno,
)
)
if frame.f_back:
print_stacktrace(frame.f_back, level + 1)
trace_count = 0
def trace_tick_handler(frame, event, arg):
global trace_count
print("### trace_handler::main event:", event)
trace_count += 1
print_stacktrace(frame)
return trace_tick_handler
def test_generator():
def make_gen():
yield 1 << 0
yield 1 << 1
yield 1 << 2
return 1 << 3
gen = make_gen()
r = 0
try:
r += gen.send(None)
while True:
r += gen.send(None)
except StopIteration as e:
print("test_generator", r, e)
gen = make_gen()
r = 0
for i in gen:
r += i
print(r)
sys.settrace(trace_tick_handler)
test_generator()
sys.settrace(None)
print("Total traces executed: ", trace_count)

View File

@@ -0,0 +1,195 @@
### trace_handler::main event: call
0: @__main__:test_generator => sys_settrace_generator.py:41
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:42
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:48
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:49
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:50
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:52
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: call
0: @__main__:make_gen => sys_settrace_generator.py:42
1: @__main__:test_generator => sys_settrace_generator.py:52
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:make_gen => sys_settrace_generator.py:43
1: @__main__:test_generator => sys_settrace_generator.py:52
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: return
0: @__main__:make_gen => sys_settrace_generator.py:43
1: @__main__:test_generator => sys_settrace_generator.py:52
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:56
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: call
0: @__main__:make_gen => sys_settrace_generator.py:43
1: @__main__:test_generator => sys_settrace_generator.py:56
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:make_gen => sys_settrace_generator.py:43
1: @__main__:test_generator => sys_settrace_generator.py:56
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:make_gen => sys_settrace_generator.py:44
1: @__main__:test_generator => sys_settrace_generator.py:56
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: return
0: @__main__:make_gen => sys_settrace_generator.py:44
1: @__main__:test_generator => sys_settrace_generator.py:56
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: call
0: @__main__:make_gen => sys_settrace_generator.py:44
1: @__main__:test_generator => sys_settrace_generator.py:56
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:make_gen => sys_settrace_generator.py:44
1: @__main__:test_generator => sys_settrace_generator.py:56
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:make_gen => sys_settrace_generator.py:45
1: @__main__:test_generator => sys_settrace_generator.py:56
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: return
0: @__main__:make_gen => sys_settrace_generator.py:45
1: @__main__:test_generator => sys_settrace_generator.py:56
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: call
0: @__main__:make_gen => sys_settrace_generator.py:45
1: @__main__:test_generator => sys_settrace_generator.py:56
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:make_gen => sys_settrace_generator.py:45
1: @__main__:test_generator => sys_settrace_generator.py:56
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:make_gen => sys_settrace_generator.py:46
1: @__main__:test_generator => sys_settrace_generator.py:56
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: return
0: @__main__:make_gen => sys_settrace_generator.py:46
1: @__main__:test_generator => sys_settrace_generator.py:56
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: exception
0: @__main__:test_generator => sys_settrace_generator.py:56
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:58
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:59
1: @__main__:<module> => sys_settrace_generator.py:69
test_generator 7 8
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:61
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:62
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:63
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: call
0: @__main__:make_gen => sys_settrace_generator.py:42
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:make_gen => sys_settrace_generator.py:43
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: return
0: @__main__:make_gen => sys_settrace_generator.py:43
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:63
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:64
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:63
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: call
0: @__main__:make_gen => sys_settrace_generator.py:43
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:make_gen => sys_settrace_generator.py:43
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:make_gen => sys_settrace_generator.py:44
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: return
0: @__main__:make_gen => sys_settrace_generator.py:44
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:63
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:64
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:63
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: call
0: @__main__:make_gen => sys_settrace_generator.py:44
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:make_gen => sys_settrace_generator.py:44
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:make_gen => sys_settrace_generator.py:45
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: return
0: @__main__:make_gen => sys_settrace_generator.py:45
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:63
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:64
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:63
1: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: call
0: @__main__:make_gen => sys_settrace_generator.py:45
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:make_gen => sys_settrace_generator.py:45
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:make_gen => sys_settrace_generator.py:46
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: return
0: @__main__:make_gen => sys_settrace_generator.py:46
1: @__main__:test_generator => sys_settrace_generator.py:63
2: @__main__:<module> => sys_settrace_generator.py:69
### trace_handler::main event: line
0: @__main__:test_generator => sys_settrace_generator.py:65
1: @__main__:<module> => sys_settrace_generator.py:69
7
### trace_handler::main event: return
0: @__main__:test_generator => sys_settrace_generator.py:65
1: @__main__:<module> => sys_settrace_generator.py:69
Total traces executed: 54

View File

@@ -0,0 +1,60 @@
# test sys.settrace with while and for loops
import sys
try:
sys.settrace
except AttributeError:
print("SKIP")
raise SystemExit
def print_stacktrace(frame, level=0):
print(
"%2d: %s@%s:%s => %s:%d"
% (
level,
" ",
frame.f_globals["__name__"],
frame.f_code.co_name,
# Keep just the filename.
"sys_settrace_" + frame.f_code.co_filename.split("sys_settrace_")[-1],
frame.f_lineno,
)
)
if frame.f_back:
print_stacktrace(frame.f_back, level + 1)
trace_count = 0
def trace_tick_handler(frame, event, arg):
global trace_count
print("### trace_handler::main event:", event)
trace_count += 1
print_stacktrace(frame)
return trace_tick_handler
def test_loop():
# for loop
r = 0
for i in range(3):
r += i
print("test_for_loop", r)
# while loop
r = 0
i = 0
while i < 3:
r += i
i += 1
print("test_while_loop", i)
sys.settrace(trace_tick_handler)
test_loop()
sys.settrace(None)
print("Total traces executed: ", trace_count)

View File

@@ -0,0 +1,72 @@
### trace_handler::main event: call
0: @__main__:test_loop => sys_settrace_loop.py:41
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:43
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:44
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:45
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:44
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:45
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:44
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:45
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:44
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:45
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:46
1: @__main__:<module> => sys_settrace_loop.py:58
test_for_loop 3
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:49
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:50
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:51
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:53
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:52
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:53
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:52
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:53
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:52
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:53
1: @__main__:<module> => sys_settrace_loop.py:58
### trace_handler::main event: line
0: @__main__:test_loop => sys_settrace_loop.py:54
1: @__main__:<module> => sys_settrace_loop.py:58
test_while_loop 3
### trace_handler::main event: return
0: @__main__:test_loop => sys_settrace_loop.py:54
1: @__main__:<module> => sys_settrace_loop.py:58
Total traces executed: 23

View File

@@ -0,0 +1,92 @@
print("Now comes the language constructions tests.")
# function
def test_func():
def test_sub_func():
print("test_function")
test_sub_func()
# closure
def test_closure(msg):
def make_closure():
print(msg)
return make_closure
# exception
def test_exception():
try:
raise Exception("test_exception")
except Exception:
pass
finally:
pass
# listcomp
def test_listcomp():
print("test_listcomp", [x for x in range(3)])
# lambda
def test_lambda():
func_obj_1 = lambda a, b: a + b
print(func_obj_1(10, 20))
# import
def test_import():
from sys_settrace_subdir import sys_settrace_importme
sys_settrace_importme.dummy()
sys_settrace_importme.saysomething()
# class
class TLClass:
def method():
pass
pass
def test_class():
class TestClass:
__anynum = -9
def method(self):
print("test_class_method")
self.__anynum += 1
def prprty_getter(self):
return self.__anynum
def prprty_setter(self, what):
self.__anynum = what
prprty = property(prprty_getter, prprty_setter)
cls = TestClass()
cls.method()
print("test_class_property", cls.prprty)
cls.prprty = 12
print("test_class_property", cls.prprty)
def run_tests():
test_func()
test_closure_inst = test_closure("test_closure")
test_closure_inst()
test_exception()
test_listcomp()
test_lambda()
test_class()
test_import()
print("And it's done!")

View File

@@ -0,0 +1,28 @@
print("Yep, I got imported.")
try:
x = const(1)
except NameError:
print("const not defined")
const = lambda x: x
_CNT01 = "CONST01"
_CNT02 = const(123)
A123 = const(123)
a123 = const(123)
def dummy():
return False
def saysomething():
print("There, I said it.")
def neverexecuted():
print("Never got here!")
print("Yep, got here")