| [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 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 :: None |
| r3 :: object |
| L0: |
| r0 = __mypyc_self__.__mypyc_env__ |
| r1 = r0.inner |
| inner = r1 |
| r2 = None |
| r3 = box(None, r2) |
| return r3 |
| 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 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 = unicode_3 :: static ('b.first.second: nested function') |
| return r3 |
| def first_b_obj.__get__(__mypyc_self__, instance, owner): |
| __mypyc_self__, instance, owner, r0 :: object |
| r1 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 = unicode_4 :: static ('!') |
| r3 = 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 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 = unicode_5 :: static ('?') |
| r3 = 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 = unicode_6 :: static ('one') |
| r5 = r0.inner |
| r6 = py_call(r5, r4) |
| r7 = cast(str, r6) |
| a = r7 |
| r8 = unicode_7 :: static ('two') |
| r9 = r0.inner |
| r10 = py_call(r9, r8) |
| r11 = cast(str, r10) |
| b = r11 |
| return a |
| def inner(): |
| r0 :: str |
| L0: |
| r0 = unicode_8 :: static ('inner: normal function') |
| return r0 |
| def first(): |
| r0 :: str |
| L0: |
| r0 = unicode_9 :: static ('first: normal function') |
| return r0 |
| def second(): |
| r0 :: str |
| L0: |
| r0 = unicode_10 :: static ('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 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 = py_call(r5) |
| r7 = unbox(int, r6) |
| return r7 |
| def inner_b_obj.__get__(__mypyc_self__, instance, owner): |
| __mypyc_self__, instance, owner, r0 :: object |
| r1 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 :: short_int |
| r3 :: bool |
| r4 :: short_int |
| foo, r5 :: int |
| L0: |
| r0 = __mypyc_self__.__mypyc_env__ |
| r1 = r0.inner |
| inner = r1 |
| r2 = 4 |
| r0.num = r2; r3 = is_error |
| r4 = 6 |
| foo = r4 |
| r5 = r0.num |
| return r5 |
| def b(): |
| r0 :: __main__.b_env |
| r1 :: short_int |
| r2 :: bool |
| r3 :: __main__.inner_b_obj |
| r4, r5 :: bool |
| r6, r7 :: object |
| r8, r9, r10 :: int |
| L0: |
| r0 = b_env() |
| r1 = 3 |
| r0.num = r1; r2 = is_error |
| r3 = inner_b_obj() |
| r3.__mypyc_env__ = r0; r4 = is_error |
| r0.inner = r3; r5 = is_error |
| r6 = r0.inner |
| r7 = py_call(r6) |
| r8 = unbox(int, r7) |
| r9 = r0.num |
| r10 = r8 + r9 :: int |
| return r10 |
| def inner_c_obj.__get__(__mypyc_self__, instance, owner): |
| __mypyc_self__, instance, owner, r0 :: object |
| r1 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 = unicode_3 :: static ('f.inner: first definition') |
| return r2 |
| def inner_c_obj_0.__get__(__mypyc_self__, instance, owner): |
| __mypyc_self__, instance, owner, r0 :: object |
| r1 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 = unicode_4 :: static ('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 = py_call(r7) |
| 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 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 :: int |
| r5 :: short_int |
| r6 :: int |
| r7 :: bool |
| r8 :: __main__.c_a_b_obj |
| r9, r10 :: bool |
| r11, r12 :: object |
| r13 :: 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 = 1 |
| r6 = r4 += r5 :: int |
| r0.x = r6; r7 = is_error |
| r8 = c_a_b_obj() |
| r8.__mypyc_env__ = r2; r9 = is_error |
| r2.c = r8; r10 = is_error |
| r11 = r2.c |
| r12 = py_call(r11) |
| r13 = unbox(int, r12) |
| return r13 |
| def a(): |
| r0 :: __main__.a_env |
| r1 :: short_int |
| r2 :: bool |
| r3 :: __main__.b_a_obj |
| r4, r5 :: bool |
| r6, r7 :: object |
| r8 :: int |
| L0: |
| r0 = a_env() |
| r1 = 1 |
| r0.x = r1; r2 = is_error |
| r3 = b_a_obj() |
| r3.__mypyc_env__ = r0; r4 = is_error |
| r0.b = r3; r5 = is_error |
| r6 = r0.b |
| r7 = py_call(r6) |
| r8 = unbox(int, r7) |
| return r8 |
| |
| [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 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 = unicode_1 :: static ('f.inner: first definition') |
| return r2 |
| def inner_f_obj_0.__get__(__mypyc_self__, instance, owner): |
| __mypyc_self__, instance, owner, r0 :: object |
| r1 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 = unicode_2 :: static ('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 = py_call(r7) |
| 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 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 :: int |
| r3 :: short_int |
| r4 :: int |
| L0: |
| r0 = __mypyc_self__.__mypyc_env__ |
| r1 = r0.foo |
| foo = r1 |
| r2 = r0.a |
| r3 = 1 |
| r4 = r2 + r3 :: int |
| return r4 |
| def bar_f_obj.__get__(__mypyc_self__, instance, owner): |
| __mypyc_self__, instance, owner, r0 :: object |
| r1 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 = py_call(r2) |
| r4 = unbox(int, r3) |
| return r4 |
| def baz_f_obj.__get__(__mypyc_self__, instance, owner): |
| __mypyc_self__, instance, owner, r0 :: object |
| r1 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 :: short_int |
| r3 :: bool |
| r4, r5 :: short_int |
| r6 :: int |
| r7, r8 :: object |
| r9, r10 :: int |
| L0: |
| r0 = __mypyc_self__.__mypyc_env__ |
| r1 = r0.baz |
| baz = r1 |
| r2 = 0 |
| r3 = n == r2 :: int |
| if r3 goto L1 else goto L2 :: bool |
| L1: |
| r4 = 0 |
| return r4 |
| L2: |
| r5 = 1 |
| r6 = n - r5 :: int |
| r7 = box(int, r6) |
| r8 = py_call(baz, r7) |
| r9 = unbox(int, r8) |
| r10 = n + r9 :: int |
| return r10 |
| 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 = py_call(r11) |
| r13 = unbox(int, r12) |
| r14 = r0.a |
| r15 = r0.baz |
| r16 = box(int, r14) |
| r17 = py_call(r15, r16) |
| r18 = unbox(int, r17) |
| r19 = r13 + r18 :: int |
| return r19 |
| |
| [case testLambdas] |
| def f(x: int, y: int) -> None: |
| s = lambda a, b: a + b |
| return s(x, y) |
| |
| [out] |
| def __mypyc_lambda__0_f_obj.__get__(__mypyc_self__, instance, owner): |
| __mypyc_self__, instance, owner, r0 :: object |
| r1 :: bool |
| r2 :: object |
| L0: |
| r0 = builtins.None :: object |
| r1 = instance is r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return __mypyc_self__ |
| L2: |
| r2 = method_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 = a + b |
| return r1 |
| def f(x, y): |
| x, y :: int |
| r0 :: __main__.f_env |
| r1 :: __main__.__mypyc_lambda__0_f_obj |
| r2 :: bool |
| s, r3, r4, r5 :: object |
| r6 :: None |
| L0: |
| r0 = f_env() |
| r1 = __mypyc_lambda__0_f_obj() |
| r1.__mypyc_env__ = r0; r2 = is_error |
| s = r1 |
| r3 = box(int, x) |
| r4 = box(int, y) |
| r5 = py_call(s, r3, r4) |
| r6 = unbox(None, r5) |
| return r6 |
| |
| [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 :: short_int |
| r1 :: bool |
| r2, r3 :: short_int |
| r4, r5, r6 :: int |
| L0: |
| r0 = 0 |
| r1 = n == r0 :: int |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = 0 |
| return r2 |
| L2: |
| r3 = 1 |
| r4 = n - r3 :: int |
| r5 = baz(r4) |
| r6 = n + r5 :: int |
| return r6 |