| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861 |
- [case testNestedFunctions]
- from typing import Callable
- def a() -> Callable[[], object]:
- def inner() -> object:
- return None
- return inner
- def b() -> Callable[[], Callable[[], str]]:
- def first() -> Callable[[], str]:
- def second() -> str:
- return 'b.first.second: nested function'
- return second
- return first
- def c(num: float) -> Callable[[str], str]:
- def inner(s: str) -> str:
- return s + '!'
- return inner
- def d(num: float) -> str:
- def inner(s: str) -> str:
- return s + '?'
- a = inner('one')
- b = inner('two')
- return a
- def inner() -> str:
- return 'inner: normal function'
- def first() -> str:
- return 'first: normal function'
- def second() -> str:
- return 'second: normal function'
- [out]
- def inner_a_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def inner_a_obj.__call__(__mypyc_self__):
- __mypyc_self__ :: __main__.inner_a_obj
- r0 :: __main__.a_env
- r1, inner, r2 :: object
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.inner
- inner = r1
- r2 = box(None, 1)
- return r2
- def a():
- r0 :: __main__.a_env
- r1 :: __main__.inner_a_obj
- r2, r3 :: bool
- r4 :: object
- L0:
- r0 = a_env()
- r1 = inner_a_obj()
- r1.__mypyc_env__ = r0; r2 = is_error
- r0.inner = r1; r3 = is_error
- r4 = r0.inner
- return r4
- def second_b_first_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def second_b_first_obj.__call__(__mypyc_self__):
- __mypyc_self__ :: __main__.second_b_first_obj
- r0 :: __main__.first_b_env
- r1 :: __main__.b_env
- r2, second :: object
- r3 :: str
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.__mypyc_env__
- r2 = r0.second
- second = r2
- r3 = 'b.first.second: nested function'
- return r3
- def first_b_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def first_b_obj.__call__(__mypyc_self__):
- __mypyc_self__ :: __main__.first_b_obj
- r0 :: __main__.b_env
- r1, first :: object
- r2 :: __main__.first_b_env
- r3 :: bool
- r4 :: __main__.second_b_first_obj
- r5, r6 :: bool
- r7 :: object
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.first
- first = r1
- r2 = first_b_env()
- r2.__mypyc_env__ = r0; r3 = is_error
- r4 = second_b_first_obj()
- r4.__mypyc_env__ = r2; r5 = is_error
- r2.second = r4; r6 = is_error
- r7 = r2.second
- return r7
- def b():
- r0 :: __main__.b_env
- r1 :: __main__.first_b_obj
- r2, r3 :: bool
- r4 :: object
- L0:
- r0 = b_env()
- r1 = first_b_obj()
- r1.__mypyc_env__ = r0; r2 = is_error
- r0.first = r1; r3 = is_error
- r4 = r0.first
- return r4
- def inner_c_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def inner_c_obj.__call__(__mypyc_self__, s):
- __mypyc_self__ :: __main__.inner_c_obj
- s :: str
- r0 :: __main__.c_env
- r1, inner :: object
- r2, r3 :: str
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.inner
- inner = r1
- r2 = '!'
- r3 = PyUnicode_Concat(s, r2)
- return r3
- def c(num):
- num :: float
- r0 :: __main__.c_env
- r1 :: __main__.inner_c_obj
- r2, r3 :: bool
- r4 :: object
- L0:
- r0 = c_env()
- r1 = inner_c_obj()
- r1.__mypyc_env__ = r0; r2 = is_error
- r0.inner = r1; r3 = is_error
- r4 = r0.inner
- return r4
- def inner_d_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def inner_d_obj.__call__(__mypyc_self__, s):
- __mypyc_self__ :: __main__.inner_d_obj
- s :: str
- r0 :: __main__.d_env
- r1, inner :: object
- r2, r3 :: str
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.inner
- inner = r1
- r2 = '?'
- r3 = PyUnicode_Concat(s, r2)
- return r3
- def d(num):
- num :: float
- r0 :: __main__.d_env
- r1 :: __main__.inner_d_obj
- r2, r3 :: bool
- r4 :: str
- r5, r6 :: object
- r7, a, r8 :: str
- r9, r10 :: object
- r11, b :: str
- L0:
- r0 = d_env()
- r1 = inner_d_obj()
- r1.__mypyc_env__ = r0; r2 = is_error
- r0.inner = r1; r3 = is_error
- r4 = 'one'
- r5 = r0.inner
- r6 = PyObject_CallFunctionObjArgs(r5, r4, 0)
- r7 = cast(str, r6)
- a = r7
- r8 = 'two'
- r9 = r0.inner
- r10 = PyObject_CallFunctionObjArgs(r9, r8, 0)
- r11 = cast(str, r10)
- b = r11
- return a
- def inner():
- r0 :: str
- L0:
- r0 = 'inner: normal function'
- return r0
- def first():
- r0 :: str
- L0:
- r0 = 'first: normal function'
- return r0
- def second():
- r0 :: str
- L0:
- r0 = 'second: normal function'
- return r0
- [case testFreeVars]
- from typing import Callable
- def a(num: int) -> int:
- def inner() -> int:
- return num
- return inner()
- def b() -> int:
- num = 3
- def inner() -> int:
- nonlocal num
- num = 4
- foo = 6
- return num
- return inner() + num
- def c(flag: bool) -> str:
- if flag:
- def inner() -> str:
- return 'f.inner: first definition'
- else:
- def inner() -> str:
- return 'f.inner: second definition'
- return inner()
- [out]
- def inner_a_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def inner_a_obj.__call__(__mypyc_self__):
- __mypyc_self__ :: __main__.inner_a_obj
- r0 :: __main__.a_env
- r1, inner :: object
- r2 :: int
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.inner
- inner = r1
- r2 = r0.num
- return r2
- def a(num):
- num :: int
- r0 :: __main__.a_env
- r1 :: bool
- r2 :: __main__.inner_a_obj
- r3, r4 :: bool
- r5, r6 :: object
- r7 :: int
- L0:
- r0 = a_env()
- r0.num = num; r1 = is_error
- r2 = inner_a_obj()
- r2.__mypyc_env__ = r0; r3 = is_error
- r0.inner = r2; r4 = is_error
- r5 = r0.inner
- r6 = PyObject_CallFunctionObjArgs(r5, 0)
- r7 = unbox(int, r6)
- return r7
- def inner_b_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def inner_b_obj.__call__(__mypyc_self__):
- __mypyc_self__ :: __main__.inner_b_obj
- r0 :: __main__.b_env
- r1, inner :: object
- r2 :: bool
- foo, r3 :: int
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.inner
- inner = r1
- r0.num = 8; r2 = is_error
- foo = 12
- r3 = r0.num
- return r3
- def b():
- r0 :: __main__.b_env
- r1 :: bool
- r2 :: __main__.inner_b_obj
- r3, r4 :: bool
- r5, r6 :: object
- r7, r8, r9 :: int
- L0:
- r0 = b_env()
- r0.num = 6; r1 = is_error
- r2 = inner_b_obj()
- r2.__mypyc_env__ = r0; r3 = is_error
- r0.inner = r2; r4 = is_error
- r5 = r0.inner
- r6 = PyObject_CallFunctionObjArgs(r5, 0)
- r7 = unbox(int, r6)
- r8 = r0.num
- r9 = CPyTagged_Add(r7, r8)
- return r9
- def inner_c_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def inner_c_obj.__call__(__mypyc_self__):
- __mypyc_self__ :: __main__.inner_c_obj
- r0 :: __main__.c_env
- r1, inner :: object
- r2 :: str
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.inner
- inner = r1
- r2 = 'f.inner: first definition'
- return r2
- def inner_c_obj_0.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def inner_c_obj_0.__call__(__mypyc_self__):
- __mypyc_self__ :: __main__.inner_c_obj_0
- r0 :: __main__.c_env
- r1, inner :: object
- r2 :: str
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.inner
- inner = r1
- r2 = 'f.inner: second definition'
- return r2
- def c(flag):
- flag :: bool
- r0 :: __main__.c_env
- r1 :: __main__.inner_c_obj
- r2, r3 :: bool
- r4 :: __main__.inner_c_obj_0
- r5, r6 :: bool
- r7, r8 :: object
- r9 :: str
- L0:
- r0 = c_env()
- if flag goto L1 else goto L2 :: bool
- L1:
- r1 = inner_c_obj()
- r1.__mypyc_env__ = r0; r2 = is_error
- r0.inner = r1; r3 = is_error
- goto L3
- L2:
- r4 = inner_c_obj_0()
- r4.__mypyc_env__ = r0; r5 = is_error
- r0.inner = r4; r6 = is_error
- L3:
- r7 = r0.inner
- r8 = PyObject_CallFunctionObjArgs(r7, 0)
- r9 = cast(str, r8)
- return r9
- [case testSpecialNested]
- def a() -> int:
- x = 1
- def b() -> int:
- x += 1
- def c() -> int:
- return x
- return c()
- return b()
- [out]
- def c_a_b_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def c_a_b_obj.__call__(__mypyc_self__):
- __mypyc_self__ :: __main__.c_a_b_obj
- r0 :: __main__.b_a_env
- r1 :: __main__.a_env
- r2, c :: object
- r3 :: int
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.__mypyc_env__
- r2 = r0.c
- c = r2
- r3 = r1.x
- return r3
- def b_a_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def b_a_obj.__call__(__mypyc_self__):
- __mypyc_self__ :: __main__.b_a_obj
- r0 :: __main__.a_env
- r1, b :: object
- r2 :: __main__.b_a_env
- r3 :: bool
- r4, r5 :: int
- r6 :: bool
- r7 :: __main__.c_a_b_obj
- r8, r9 :: bool
- r10, r11 :: object
- r12 :: int
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.b
- b = r1
- r2 = b_a_env()
- r2.__mypyc_env__ = r0; r3 = is_error
- r4 = r0.x
- r5 = CPyTagged_Add(r4, 2)
- r0.x = r5; r6 = is_error
- r7 = c_a_b_obj()
- r7.__mypyc_env__ = r2; r8 = is_error
- r2.c = r7; r9 = is_error
- r10 = r2.c
- r11 = PyObject_CallFunctionObjArgs(r10, 0)
- r12 = unbox(int, r11)
- return r12
- def a():
- r0 :: __main__.a_env
- r1 :: bool
- r2 :: __main__.b_a_obj
- r3, r4 :: bool
- r5, r6 :: object
- r7 :: int
- L0:
- r0 = a_env()
- r0.x = 2; r1 = is_error
- r2 = b_a_obj()
- r2.__mypyc_env__ = r0; r3 = is_error
- r0.b = r2; r4 = is_error
- r5 = r0.b
- r6 = PyObject_CallFunctionObjArgs(r5, 0)
- r7 = unbox(int, r6)
- return r7
- [case testNestedFunctionInsideStatements]
- def f(flag: bool) -> str:
- if flag:
- def inner() -> str:
- return 'f.inner: first definition'
- else:
- def inner() -> str:
- return 'f.inner: second definition'
- return inner()
- [out]
- def inner_f_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def inner_f_obj.__call__(__mypyc_self__):
- __mypyc_self__ :: __main__.inner_f_obj
- r0 :: __main__.f_env
- r1, inner :: object
- r2 :: str
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.inner
- inner = r1
- r2 = 'f.inner: first definition'
- return r2
- def inner_f_obj_0.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def inner_f_obj_0.__call__(__mypyc_self__):
- __mypyc_self__ :: __main__.inner_f_obj_0
- r0 :: __main__.f_env
- r1, inner :: object
- r2 :: str
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.inner
- inner = r1
- r2 = 'f.inner: second definition'
- return r2
- def f(flag):
- flag :: bool
- r0 :: __main__.f_env
- r1 :: __main__.inner_f_obj
- r2, r3 :: bool
- r4 :: __main__.inner_f_obj_0
- r5, r6 :: bool
- r7, r8 :: object
- r9 :: str
- L0:
- r0 = f_env()
- if flag goto L1 else goto L2 :: bool
- L1:
- r1 = inner_f_obj()
- r1.__mypyc_env__ = r0; r2 = is_error
- r0.inner = r1; r3 = is_error
- goto L3
- L2:
- r4 = inner_f_obj_0()
- r4.__mypyc_env__ = r0; r5 = is_error
- r0.inner = r4; r6 = is_error
- L3:
- r7 = r0.inner
- r8 = PyObject_CallFunctionObjArgs(r7, 0)
- r9 = cast(str, r8)
- return r9
- [case testNestedFunctionsCallEachOther]
- from typing import Callable, List
- def f(a: int) -> int:
- def foo() -> int:
- return a + 1
- def bar() -> int:
- return foo()
- def baz(n: int) -> int:
- if n == 0:
- return 0
- return n + baz(n - 1)
- return bar() + baz(a)
- [out]
- def foo_f_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def foo_f_obj.__call__(__mypyc_self__):
- __mypyc_self__ :: __main__.foo_f_obj
- r0 :: __main__.f_env
- r1, foo :: object
- r2, r3 :: int
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.foo
- foo = r1
- r2 = r0.a
- r3 = CPyTagged_Add(r2, 2)
- return r3
- def bar_f_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def bar_f_obj.__call__(__mypyc_self__):
- __mypyc_self__ :: __main__.bar_f_obj
- r0 :: __main__.f_env
- r1, bar, r2, r3 :: object
- r4 :: int
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.bar
- bar = r1
- r2 = r0.foo
- r3 = PyObject_CallFunctionObjArgs(r2, 0)
- r4 = unbox(int, r3)
- return r4
- def baz_f_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def baz_f_obj.__call__(__mypyc_self__, n):
- __mypyc_self__ :: __main__.baz_f_obj
- n :: int
- r0 :: __main__.f_env
- r1, baz :: object
- r2 :: bit
- r3 :: int
- r4, r5 :: object
- r6, r7 :: int
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.baz
- baz = r1
- r2 = n == 0
- if r2 goto L1 else goto L2 :: bool
- L1:
- return 0
- L2:
- r3 = CPyTagged_Subtract(n, 2)
- r4 = box(int, r3)
- r5 = PyObject_CallFunctionObjArgs(baz, r4, 0)
- r6 = unbox(int, r5)
- r7 = CPyTagged_Add(n, r6)
- return r7
- def f(a):
- a :: int
- r0 :: __main__.f_env
- r1 :: bool
- r2 :: __main__.foo_f_obj
- r3, r4 :: bool
- r5 :: __main__.bar_f_obj
- r6, r7 :: bool
- r8 :: __main__.baz_f_obj
- r9, r10 :: bool
- r11, r12 :: object
- r13, r14 :: int
- r15, r16, r17 :: object
- r18, r19 :: int
- L0:
- r0 = f_env()
- r0.a = a; r1 = is_error
- r2 = foo_f_obj()
- r2.__mypyc_env__ = r0; r3 = is_error
- r0.foo = r2; r4 = is_error
- r5 = bar_f_obj()
- r5.__mypyc_env__ = r0; r6 = is_error
- r0.bar = r5; r7 = is_error
- r8 = baz_f_obj()
- r8.__mypyc_env__ = r0; r9 = is_error
- r0.baz = r8; r10 = is_error
- r11 = r0.bar
- r12 = PyObject_CallFunctionObjArgs(r11, 0)
- r13 = unbox(int, r12)
- r14 = r0.a
- r15 = r0.baz
- r16 = box(int, r14)
- r17 = PyObject_CallFunctionObjArgs(r15, r16, 0)
- r18 = unbox(int, r17)
- r19 = CPyTagged_Add(r13, r18)
- return r19
- [case testLambdas]
- def f(x: int, y: int) -> None:
- s = lambda a, b: a + b
- t = lambda a, b: s(a, b)
- return t(x, y)
- [out]
- def __mypyc_lambda__0_f_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def __mypyc_lambda__0_f_obj.__call__(__mypyc_self__, a, b):
- __mypyc_self__ :: __main__.__mypyc_lambda__0_f_obj
- a, b :: object
- r0 :: __main__.f_env
- r1 :: object
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = PyNumber_Add(a, b)
- return r1
- def __mypyc_lambda__1_f_obj.__get__(__mypyc_self__, instance, owner):
- __mypyc_self__, instance, owner, r0 :: object
- r1 :: bit
- r2 :: object
- L0:
- r0 = load_address _Py_NoneStruct
- r1 = instance == r0
- if r1 goto L1 else goto L2 :: bool
- L1:
- return __mypyc_self__
- L2:
- r2 = PyMethod_New(__mypyc_self__, instance)
- return r2
- def __mypyc_lambda__1_f_obj.__call__(__mypyc_self__, a, b):
- __mypyc_self__ :: __main__.__mypyc_lambda__1_f_obj
- a, b :: object
- r0 :: __main__.f_env
- r1, r2 :: object
- L0:
- r0 = __mypyc_self__.__mypyc_env__
- r1 = r0.s
- r2 = PyObject_CallFunctionObjArgs(r1, a, b, 0)
- return r2
- def f(x, y):
- x, y :: int
- r0 :: __main__.f_env
- r1 :: __main__.__mypyc_lambda__0_f_obj
- r2, r3 :: bool
- r4 :: __main__.__mypyc_lambda__1_f_obj
- r5 :: bool
- t, r6, r7, r8 :: object
- r9 :: None
- L0:
- r0 = f_env()
- r1 = __mypyc_lambda__0_f_obj()
- r1.__mypyc_env__ = r0; r2 = is_error
- r0.s = r1; r3 = is_error
- r4 = __mypyc_lambda__1_f_obj()
- r4.__mypyc_env__ = r0; r5 = is_error
- t = r4
- r6 = box(int, x)
- r7 = box(int, y)
- r8 = PyObject_CallFunctionObjArgs(t, r6, r7, 0)
- r9 = unbox(None, r8)
- return r9
- [case testRecursiveFunction]
- from typing import Callable
- def baz(n: int) -> int:
- if n == 0:
- return 0
- return n + baz(n - 1)
- [out]
- def baz(n):
- n :: int
- r0 :: bit
- r1, r2, r3 :: int
- L0:
- r0 = n == 0
- if r0 goto L1 else goto L2 :: bool
- L1:
- return 0
- L2:
- r1 = CPyTagged_Subtract(n, 2)
- r2 = baz(r1)
- r3 = CPyTagged_Add(n, r2)
- return r3
|