blob: 1060ee63c57df58574d01f4af0033bdc30efd5ef [file] [log] [blame] [edit]
[case testNativeCallsUsedInDispatchFunction]
from functools import singledispatch
@singledispatch
def f(arg) -> bool:
return False
@f.register
def g(arg: int) -> bool:
return True
[out]
def __mypyc_singledispatch_main_function_f__(arg):
arg :: object
L0:
return 0
def f_obj.__init__(__mypyc_self__):
__mypyc_self__ :: __main__.f_obj
r0, r1 :: dict
r2 :: str
r3 :: i32
r4 :: bit
L0:
r0 = PyDict_New()
__mypyc_self__.registry = r0
r1 = PyDict_New()
r2 = 'dispatch_cache'
r3 = PyObject_SetAttr(__mypyc_self__, r2, r1)
r4 = r3 >= 0 :: signed
return 1
def f_obj.__call__(__mypyc_self__, arg):
__mypyc_self__ :: __main__.f_obj
arg :: object
r0 :: ptr
r1 :: object
r2 :: dict
r3, r4 :: object
r5 :: bit
r6, r7 :: object
r8 :: str
r9 :: object
r10 :: dict
r11 :: object[2]
r12 :: object_ptr
r13 :: object
r14 :: i32
r15 :: bit
r16 :: object
r17 :: ptr
r18 :: object
r19 :: bit
r20 :: int
r21 :: bit
r22 :: int
r23 :: bool
r24 :: object[1]
r25 :: object_ptr
r26 :: object
r27 :: bool
L0:
r0 = get_element_ptr arg ob_type :: PyObject
r1 = borrow load_mem r0 :: builtins.object*
keep_alive arg
r2 = __mypyc_self__.dispatch_cache
r3 = CPyDict_GetWithNone(r2, r1)
r4 = load_address _Py_NoneStruct
r5 = r3 != r4
if r5 goto L1 else goto L2 :: bool
L1:
r6 = r3
goto L3
L2:
r7 = functools :: module
r8 = '_find_impl'
r9 = CPyObject_GetAttr(r7, r8)
r10 = __mypyc_self__.registry
r11 = [r1, r10]
r12 = load_address r11
r13 = PyObject_Vectorcall(r9, r12, 2, 0)
keep_alive r1, r10
r14 = PyDict_SetItem(r2, r1, r13)
r15 = r14 >= 0 :: signed
r6 = r13
L3:
r16 = load_address PyLong_Type
r17 = get_element_ptr r6 ob_type :: PyObject
r18 = borrow load_mem r17 :: builtins.object*
keep_alive r6
r19 = r18 == r16
if r19 goto L4 else goto L7 :: bool
L4:
r20 = unbox(int, r6)
r21 = int_eq r20, 0
if r21 goto L5 else goto L6 :: bool
L5:
r22 = unbox(int, arg)
r23 = g(r22)
return r23
L6:
unreachable
L7:
r24 = [arg]
r25 = load_address r24
r26 = PyObject_Vectorcall(r6, r25, 1, 0)
keep_alive arg
r27 = unbox(bool, r26)
return r27
def 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 f_obj.register(__mypyc_self__, cls, func):
__mypyc_self__ :: __main__.f_obj
cls, func, r0 :: object
L0:
r0 = CPySingledispatch_RegisterFunction(__mypyc_self__, cls, func)
return r0
def f(arg):
arg :: object
r0 :: dict
r1 :: str
r2 :: object
r3 :: bool
L0:
r0 = __main__.globals :: static
r1 = 'f'
r2 = CPyDict_GetItem(r0, r1)
r3 = f_obj.__call__(r2, arg)
return r3
def g(arg):
arg :: int
L0:
return 1
[case testCallsToSingledispatchFunctionsAreNative]
from functools import singledispatch
@singledispatch
def f(x: object) -> None:
pass
def test():
f('a')
[out]
def __mypyc_singledispatch_main_function_f__(x):
x :: object
L0:
return 1
def f_obj.__init__(__mypyc_self__):
__mypyc_self__ :: __main__.f_obj
r0, r1 :: dict
r2 :: str
r3 :: i32
r4 :: bit
L0:
r0 = PyDict_New()
__mypyc_self__.registry = r0
r1 = PyDict_New()
r2 = 'dispatch_cache'
r3 = PyObject_SetAttr(__mypyc_self__, r2, r1)
r4 = r3 >= 0 :: signed
return 1
def f_obj.__call__(__mypyc_self__, x):
__mypyc_self__ :: __main__.f_obj
x :: object
r0 :: ptr
r1 :: object
r2 :: dict
r3, r4 :: object
r5 :: bit
r6, r7 :: object
r8 :: str
r9 :: object
r10 :: dict
r11 :: object[2]
r12 :: object_ptr
r13 :: object
r14 :: i32
r15 :: bit
r16 :: object
r17 :: ptr
r18 :: object
r19 :: bit
r20 :: int
r21 :: object[1]
r22 :: object_ptr
r23 :: object
r24 :: None
L0:
r0 = get_element_ptr x ob_type :: PyObject
r1 = borrow load_mem r0 :: builtins.object*
keep_alive x
r2 = __mypyc_self__.dispatch_cache
r3 = CPyDict_GetWithNone(r2, r1)
r4 = load_address _Py_NoneStruct
r5 = r3 != r4
if r5 goto L1 else goto L2 :: bool
L1:
r6 = r3
goto L3
L2:
r7 = functools :: module
r8 = '_find_impl'
r9 = CPyObject_GetAttr(r7, r8)
r10 = __mypyc_self__.registry
r11 = [r1, r10]
r12 = load_address r11
r13 = PyObject_Vectorcall(r9, r12, 2, 0)
keep_alive r1, r10
r14 = PyDict_SetItem(r2, r1, r13)
r15 = r14 >= 0 :: signed
r6 = r13
L3:
r16 = load_address PyLong_Type
r17 = get_element_ptr r6 ob_type :: PyObject
r18 = borrow load_mem r17 :: builtins.object*
keep_alive r6
r19 = r18 == r16
if r19 goto L4 else goto L5 :: bool
L4:
r20 = unbox(int, r6)
unreachable
L5:
r21 = [x]
r22 = load_address r21
r23 = PyObject_Vectorcall(r6, r22, 1, 0)
keep_alive x
r24 = unbox(None, r23)
return r24
def 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 f_obj.register(__mypyc_self__, cls, func):
__mypyc_self__ :: __main__.f_obj
cls, func, r0 :: object
L0:
r0 = CPySingledispatch_RegisterFunction(__mypyc_self__, cls, func)
return r0
def f(x):
x :: object
r0 :: dict
r1 :: str
r2 :: object
r3 :: None
L0:
r0 = __main__.globals :: static
r1 = 'f'
r2 = CPyDict_GetItem(r0, r1)
r3 = f_obj.__call__(r2, x)
return r3
def test():
r0 :: str
r1 :: None
r2 :: object
L0:
r0 = 'a'
r1 = f(r0)
r2 = box(None, 1)
return r2
[case registerNestedFunctionError]
from functools import singledispatch
from typing import Any, overload
def dec(x: Any) -> Any:
return x
def f() -> None:
@singledispatch # E: Nested singledispatch functions not supported
def singledispatch_in_func(x: Any) -> None:
pass
@dec
def g() -> None:
@singledispatch # E: Nested singledispatch functions not supported
def singledispatch_in_decorated(x: Any) -> None:
pass
@overload
def h(x: int) -> None:
pass
@overload
def h(x: str) -> None:
pass
def h(x: Any) -> None:
@singledispatch # E: Nested singledispatch functions not supported
def singledispatch_in_overload(x: Any) -> None:
pass
@singledispatch
def outside(x: Any) -> None:
pass
def i() -> None:
@outside.register # E: Registering nested functions not supported
def register_in_func(x: int) -> None:
pass
@dec
def j() -> None:
@outside.register # E: Registering nested functions not supported
def register_in_decorated(x: int) -> None:
pass
@overload
def k(x: int) -> None:
pass
@overload
def k(x: str) -> None:
pass
def k(x: Any) -> None:
@outside.register # E: Registering nested functions not supported
def register_in_overload(x: int) -> None:
pass