| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303 |
- [case testGetAttribute]
- class A:
- x: int
- def f(a: A) -> int:
- return a.x
- [out]
- def f(a):
- a :: __main__.A
- r0 :: int
- L0:
- r0 = a.x
- return r0
- [case testSetAttribute]
- class A:
- x: int
- def f(a: A) -> None:
- a.x = 1
- [out]
- def f(a):
- a :: __main__.A
- r0 :: bool
- L0:
- a.x = 2; r0 = is_error
- return 1
- [case testUserClassInList]
- class C:
- x: int
- def f() -> int:
- c = C()
- c.x = 5
- a = [c]
- d = a[0]
- return d.x + 1
- [out]
- def f():
- r0, c :: __main__.C
- r1 :: bool
- r2 :: list
- r3, r4 :: ptr
- a :: list
- r5 :: object
- r6, d :: __main__.C
- r7, r8 :: int
- L0:
- r0 = C()
- c = r0
- c.x = 10; r1 = is_error
- r2 = PyList_New(1)
- r3 = get_element_ptr r2 ob_item :: PyListObject
- r4 = load_mem r3 :: ptr*
- set_mem r4, c :: builtins.object*
- keep_alive r2
- a = r2
- r5 = CPyList_GetItemShort(a, 0)
- r6 = cast(__main__.C, r5)
- d = r6
- r7 = borrow d.x
- r8 = CPyTagged_Add(r7, 2)
- keep_alive d
- return r8
- [case testMethodCall]
- class A:
- def f(self, x: int, y: str) -> int:
- return x + 10
- def g(a: A) -> None:
- a.f(1, 'hi')
- [out]
- def A.f(self, x, y):
- self :: __main__.A
- x :: int
- y :: str
- r0 :: int
- L0:
- r0 = CPyTagged_Add(x, 20)
- return r0
- def g(a):
- a :: __main__.A
- r0 :: str
- r1 :: int
- L0:
- r0 = 'hi'
- r1 = a.f(2, r0)
- return 1
- [case testForwardUse]
- def g(a: A) -> int:
- return a.n
- class A:
- n : int
- [out]
- def g(a):
- a :: __main__.A
- r0 :: int
- L0:
- r0 = a.n
- return r0
- [case testOptionalMember]
- from typing import Optional
- class Node:
- next: Optional[Node]
- def length(self) -> int:
- if self.next is not None:
- return 1 + self.next.length()
- return 1
- [out]
- def Node.length(self):
- self :: __main__.Node
- r0 :: union[__main__.Node, None]
- r1 :: object
- r2 :: bit
- r3 :: union[__main__.Node, None]
- r4 :: __main__.Node
- r5, r6 :: int
- L0:
- r0 = borrow self.next
- r1 = load_address _Py_NoneStruct
- r2 = r0 != r1
- keep_alive self
- if r2 goto L1 else goto L2 :: bool
- L1:
- r3 = self.next
- r4 = cast(__main__.Node, r3)
- r5 = r4.length()
- r6 = CPyTagged_Add(2, r5)
- return r6
- L2:
- return 2
- [case testSubclass]
- class A:
- def __init__(self) -> None:
- self.x = 10
- class B(A):
- def __init__(self) -> None:
- self.x = 20
- self.y = 30
- [out]
- def A.__init__(self):
- self :: __main__.A
- L0:
- self.x = 20
- return 1
- def B.__init__(self):
- self :: __main__.B
- L0:
- self.x = 40
- self.y = 60
- return 1
- [case testAttrLvalue]
- class O(object):
- def __init__(self) -> None:
- self.x = 1
- def increment(o: O) -> O:
- o.x += 1
- return o
- [out]
- def O.__init__(self):
- self :: __main__.O
- L0:
- self.x = 2
- return 1
- def increment(o):
- o :: __main__.O
- r0, r1 :: int
- r2 :: bool
- L0:
- r0 = borrow o.x
- r1 = CPyTagged_Add(r0, 2)
- o.x = r1; r2 = is_error
- return o
- [case testSubclass_toplevel]
- from typing import TypeVar, Generic
- from mypy_extensions import trait
- T = TypeVar('T')
- class C:
- pass
- @trait
- class S:
- pass
- class D(C, S, Generic[T]):
- pass
- [out]
- def __top_level__():
- r0, r1 :: object
- r2 :: bit
- r3 :: str
- r4, r5 :: object
- r6 :: str
- r7 :: dict
- r8, r9 :: object
- r10 :: str
- r11 :: dict
- r12 :: object
- r13 :: str
- r14 :: dict
- r15 :: str
- r16, r17 :: object
- r18 :: dict
- r19 :: str
- r20 :: int32
- r21 :: bit
- r22 :: object
- r23 :: str
- r24, r25 :: object
- r26 :: bool
- r27 :: str
- r28 :: tuple
- r29 :: int32
- r30 :: bit
- r31 :: dict
- r32 :: str
- r33 :: int32
- r34 :: bit
- r35 :: object
- r36 :: str
- r37, r38 :: object
- r39 :: str
- r40 :: tuple
- r41 :: int32
- r42 :: bit
- r43 :: dict
- r44 :: str
- r45 :: int32
- r46 :: bit
- r47, r48 :: object
- r49 :: dict
- r50 :: str
- r51 :: object
- r52 :: dict
- r53 :: str
- r54, r55 :: object
- r56 :: tuple
- r57 :: str
- r58, r59 :: object
- r60 :: bool
- r61, r62 :: str
- r63 :: tuple
- r64 :: int32
- r65 :: bit
- r66 :: dict
- r67 :: str
- r68 :: int32
- r69 :: bit
- L0:
- r0 = builtins :: module
- r1 = load_address _Py_NoneStruct
- r2 = r0 != r1
- if r2 goto L2 else goto L1 :: bool
- L1:
- r3 = 'builtins'
- r4 = PyImport_Import(r3)
- builtins = r4 :: module
- L2:
- r5 = ('TypeVar', 'Generic')
- r6 = 'typing'
- r7 = __main__.globals :: static
- r8 = CPyImport_ImportFromMany(r6, r5, r5, r7)
- typing = r8 :: module
- r9 = ('trait',)
- r10 = 'mypy_extensions'
- r11 = __main__.globals :: static
- r12 = CPyImport_ImportFromMany(r10, r9, r9, r11)
- mypy_extensions = r12 :: module
- r13 = 'T'
- r14 = __main__.globals :: static
- r15 = 'TypeVar'
- r16 = CPyDict_GetItem(r14, r15)
- r17 = PyObject_CallFunctionObjArgs(r16, r13, 0)
- r18 = __main__.globals :: static
- r19 = 'T'
- r20 = CPyDict_SetItem(r18, r19, r17)
- r21 = r20 >= 0 :: signed
- r22 = <error> :: object
- r23 = '__main__'
- r24 = __main__.C_template :: type
- r25 = CPyType_FromTemplate(r24, r22, r23)
- r26 = C_trait_vtable_setup()
- r27 = '__mypyc_attrs__'
- r28 = PyTuple_Pack(0)
- r29 = PyObject_SetAttr(r25, r27, r28)
- r30 = r29 >= 0 :: signed
- __main__.C = r25 :: type
- r31 = __main__.globals :: static
- r32 = 'C'
- r33 = CPyDict_SetItem(r31, r32, r25)
- r34 = r33 >= 0 :: signed
- r35 = <error> :: object
- r36 = '__main__'
- r37 = __main__.S_template :: type
- r38 = CPyType_FromTemplate(r37, r35, r36)
- r39 = '__mypyc_attrs__'
- r40 = PyTuple_Pack(0)
- r41 = PyObject_SetAttr(r38, r39, r40)
- r42 = r41 >= 0 :: signed
- __main__.S = r38 :: type
- r43 = __main__.globals :: static
- r44 = 'S'
- r45 = CPyDict_SetItem(r43, r44, r38)
- r46 = r45 >= 0 :: signed
- r47 = __main__.C :: type
- r48 = __main__.S :: type
- r49 = __main__.globals :: static
- r50 = 'Generic'
- r51 = CPyDict_GetItem(r49, r50)
- r52 = __main__.globals :: static
- r53 = 'T'
- r54 = CPyDict_GetItem(r52, r53)
- r55 = PyObject_GetItem(r51, r54)
- r56 = PyTuple_Pack(3, r47, r48, r55)
- r57 = '__main__'
- r58 = __main__.D_template :: type
- r59 = CPyType_FromTemplate(r58, r56, r57)
- r60 = D_trait_vtable_setup()
- r61 = '__mypyc_attrs__'
- r62 = '__dict__'
- r63 = PyTuple_Pack(1, r62)
- r64 = PyObject_SetAttr(r59, r61, r63)
- r65 = r64 >= 0 :: signed
- __main__.D = r59 :: type
- r66 = __main__.globals :: static
- r67 = 'D'
- r68 = CPyDict_SetItem(r66, r67, r59)
- r69 = r68 >= 0 :: signed
- return 1
- [case testIsInstance]
- class A: pass
- class B(A): pass
- def f(x: A) -> B:
- if isinstance(x, B):
- return x
- return B()
- [out]
- def f(x):
- x :: __main__.A
- r0 :: object
- r1 :: ptr
- r2 :: object
- r3 :: bit
- r4, r5 :: __main__.B
- L0:
- r0 = __main__.B :: type
- r1 = get_element_ptr x ob_type :: PyObject
- r2 = load_mem r1 :: builtins.object*
- keep_alive x
- r3 = r2 == r0
- if r3 goto L1 else goto L2 :: bool
- L1:
- r4 = cast(__main__.B, x)
- return r4
- L2:
- r5 = B()
- return r5
- [case testIsInstanceTuple]
- from typing import Union
- class R: pass
- class A(R): pass
- class B(R): pass
- class C(R): pass
- def f(x: R) -> Union[A, B]:
- if isinstance(x, (A, B)):
- return x
- return A()
- [out]
- def f(x):
- x :: __main__.R
- r0 :: object
- r1 :: ptr
- r2 :: object
- r3 :: bit
- r4 :: bool
- r5 :: object
- r6 :: ptr
- r7 :: object
- r8 :: bit
- r9 :: union[__main__.A, __main__.B]
- r10 :: __main__.A
- L0:
- r0 = __main__.A :: type
- r1 = get_element_ptr x ob_type :: PyObject
- r2 = load_mem r1 :: builtins.object*
- keep_alive x
- r3 = r2 == r0
- if r3 goto L1 else goto L2 :: bool
- L1:
- r4 = r3
- goto L3
- L2:
- r5 = __main__.B :: type
- r6 = get_element_ptr x ob_type :: PyObject
- r7 = load_mem r6 :: builtins.object*
- keep_alive x
- r8 = r7 == r5
- r4 = r8
- L3:
- if r4 goto L4 else goto L5 :: bool
- L4:
- r9 = cast(union[__main__.A, __main__.B], x)
- return r9
- L5:
- r10 = A()
- return r10
- [case testIsInstanceFewSubclasses]
- class R: pass
- class A(R): pass
- def f(x: object) -> R:
- if isinstance(x, R):
- return x
- return A()
- [out]
- def f(x):
- x, r0 :: object
- r1 :: ptr
- r2 :: object
- r3 :: bit
- r4 :: bool
- r5 :: object
- r6 :: ptr
- r7 :: object
- r8 :: bit
- r9 :: __main__.R
- r10 :: __main__.A
- L0:
- r0 = __main__.A :: type
- r1 = get_element_ptr x ob_type :: PyObject
- r2 = load_mem r1 :: builtins.object*
- keep_alive x
- r3 = r2 == r0
- if r3 goto L1 else goto L2 :: bool
- L1:
- r4 = r3
- goto L3
- L2:
- r5 = __main__.R :: type
- r6 = get_element_ptr x ob_type :: PyObject
- r7 = load_mem r6 :: builtins.object*
- keep_alive x
- r8 = r7 == r5
- r4 = r8
- L3:
- if r4 goto L4 else goto L5 :: bool
- L4:
- r9 = cast(__main__.R, x)
- return r9
- L5:
- r10 = A()
- return r10
- [case testIsInstanceFewSubclassesTrait]
- from mypy_extensions import trait
- class B: pass
- @trait
- class R: pass
- class A(B, R): pass
- class C(B, R): pass
- def f(x: object) -> R:
- if isinstance(x, R):
- return x
- return A()
- [out]
- def f(x):
- x, r0 :: object
- r1 :: ptr
- r2 :: object
- r3 :: bit
- r4 :: bool
- r5 :: object
- r6 :: ptr
- r7 :: object
- r8 :: bit
- r9 :: __main__.R
- r10 :: __main__.A
- L0:
- r0 = __main__.A :: type
- r1 = get_element_ptr x ob_type :: PyObject
- r2 = load_mem r1 :: builtins.object*
- keep_alive x
- r3 = r2 == r0
- if r3 goto L1 else goto L2 :: bool
- L1:
- r4 = r3
- goto L3
- L2:
- r5 = __main__.C :: type
- r6 = get_element_ptr x ob_type :: PyObject
- r7 = load_mem r6 :: builtins.object*
- keep_alive x
- r8 = r7 == r5
- r4 = r8
- L3:
- if r4 goto L4 else goto L5 :: bool
- L4:
- r9 = cast(__main__.R, x)
- return r9
- L5:
- r10 = A()
- return r10
- [case testIsInstanceManySubclasses]
- class R: pass
- class A(R): pass
- class B(R): pass
- class C(R): pass
- def f(x: object) -> R:
- if isinstance(x, R):
- return x
- return B()
- [out]
- def f(x):
- x, r0 :: object
- r1 :: bool
- r2 :: __main__.R
- r3 :: __main__.B
- L0:
- r0 = __main__.R :: type
- r1 = CPy_TypeCheck(x, r0)
- if r1 goto L1 else goto L2 :: bool
- L1:
- r2 = cast(__main__.R, x)
- return r2
- L2:
- r3 = B()
- return r3
- [case testFakeSuper]
- class A:
- def __init__(self, x: int) -> None:
- self.x = x
- class B(A):
- def __init__(self, x: int, y: int) -> None:
- A.__init__(self, x)
- self.y = y
- [out]
- def A.__init__(self, x):
- self :: __main__.A
- x :: int
- L0:
- self.x = x
- return 1
- def B.__init__(self, x, y):
- self :: __main__.B
- x, y :: int
- r0 :: None
- L0:
- r0 = A.__init__(self, x)
- self.y = y
- return 1
- [case testClassMethod]
- class C:
- @staticmethod
- def foo(x: int) -> int: return 10 + x
- @classmethod
- def bar(cls, x: int) -> int: return 10 + x
- def lol() -> int:
- return C.foo(1) + C.bar(2)
- [out]
- def C.foo(x):
- x, r0 :: int
- L0:
- r0 = CPyTagged_Add(20, x)
- return r0
- def C.bar(cls, x):
- cls :: object
- x, r0 :: int
- L0:
- r0 = CPyTagged_Add(20, x)
- return r0
- def lol():
- r0 :: int
- r1 :: object
- r2, r3 :: int
- L0:
- r0 = C.foo(2)
- r1 = __main__.C :: type
- r2 = C.bar(r1, 4)
- r3 = CPyTagged_Add(r0, r2)
- return r3
- [case testCallClassMethodViaCls]
- class C:
- @classmethod
- def f(cls, x: int) -> int:
- return cls.g(x)
- @classmethod
- def g(cls, x: int) -> int:
- return x
- class D:
- @classmethod
- def f(cls, x: int) -> int:
- # TODO: This could aso be optimized, since g is not ever overridden
- return cls.g(x)
- @classmethod
- def g(cls, x: int) -> int:
- return x
- class DD(D):
- pass
- [out]
- def C.f(cls, x):
- cls :: object
- x :: int
- r0 :: object
- r1 :: int
- L0:
- r0 = __main__.C :: type
- r1 = C.g(r0, x)
- return r1
- def C.g(cls, x):
- cls :: object
- x :: int
- L0:
- return x
- def D.f(cls, x):
- cls :: object
- x :: int
- r0 :: str
- r1, r2 :: object
- r3 :: int
- L0:
- r0 = 'g'
- r1 = box(int, x)
- r2 = CPyObject_CallMethodObjArgs(cls, r0, r1, 0)
- r3 = unbox(int, r2)
- return r3
- def D.g(cls, x):
- cls :: object
- x :: int
- L0:
- return x
- [case testCannotAssignToClsArgument]
- from typing import Any, cast
- class C:
- @classmethod
- def m(cls) -> None:
- cls = cast(Any, D) # E: Cannot assign to the first argument of classmethod
- cls, x = cast(Any, D), 1 # E: Cannot assign to the first argument of classmethod
- cls, x = cast(Any, [1, 2]) # E: Cannot assign to the first argument of classmethod
- cls.m()
- class D:
- pass
- [case testSuper1]
- class A:
- def __init__(self, x: int) -> None:
- self.x = x
- class B(A):
- def __init__(self, x: int, y: int) -> None:
- super().__init__(x)
- self.y = y
- [out]
- def A.__init__(self, x):
- self :: __main__.A
- x :: int
- L0:
- self.x = x
- return 1
- def B.__init__(self, x, y):
- self :: __main__.B
- x, y :: int
- r0 :: None
- L0:
- r0 = A.__init__(self, x)
- self.y = y
- return 1
- [case testSuper2]
- from mypy_extensions import trait
- @trait
- class T:
- def foo(self) -> None: pass
- class X(T):
- def foo(self) -> None:
- super().foo()
- [out]
- def T.foo(self):
- self :: __main__.T
- L0:
- return 1
- def X.foo(self):
- self :: __main__.X
- r0 :: None
- L0:
- r0 = T.foo(self)
- return 1
- [case testSuperCallToObjectInitIsOmitted]
- class C:
- def __init__(self) -> None:
- super().__init__()
- class D: pass
- class E(D):
- def __init__(self) -> None:
- super().__init__()
- class F(C):
- def __init__(self) -> None:
- super().__init__()
- class DictSubclass(dict):
- def __init__(self) -> None:
- super().__init__()
- [out]
- def C.__init__(self):
- self :: __main__.C
- L0:
- return 1
- def E.__init__(self):
- self :: __main__.E
- L0:
- return 1
- def F.__init__(self):
- self :: __main__.F
- r0 :: None
- L0:
- r0 = C.__init__(self)
- return 1
- def DictSubclass.__init__(self):
- self :: dict
- r0 :: object
- r1 :: str
- r2, r3, r4 :: object
- r5 :: str
- r6, r7 :: object
- L0:
- r0 = builtins :: module
- r1 = 'super'
- r2 = CPyObject_GetAttr(r0, r1)
- r3 = __main__.DictSubclass :: type
- r4 = PyObject_CallFunctionObjArgs(r2, r3, self, 0)
- r5 = '__init__'
- r6 = CPyObject_GetAttr(r4, r5)
- r7 = PyObject_CallFunctionObjArgs(r6, 0)
- return 1
- [case testClassVariable]
- from typing import ClassVar
- class A:
- x = 10 # type: ClassVar[int]
- def f() -> int:
- return A.x
- [out]
- def f():
- r0 :: object
- r1 :: str
- r2 :: object
- r3 :: int
- L0:
- r0 = __main__.A :: type
- r1 = 'x'
- r2 = CPyObject_GetAttr(r0, r1)
- r3 = unbox(int, r2)
- return r3
- [case testNoEqDefined]
- class A:
- pass
- def f(a: A, b: A) -> bool:
- return a == b
- def f2(a: A, b: A) -> bool:
- return a != b
- [out]
- def f(a, b):
- a, b :: __main__.A
- r0 :: bit
- L0:
- r0 = a == b
- return r0
- def f2(a, b):
- a, b :: __main__.A
- r0 :: bit
- L0:
- r0 = a != b
- return r0
- [case testEqDefined]
- class Base:
- def __eq__(self, other: object) -> bool:
- return False
- class Derived(Base):
- def __eq__(self, other: object) -> bool:
- return True
- def f(a: Base, b: Base) -> bool:
- return a == b
- def f2(a: Base, b: Base) -> bool:
- return a != b
- def fOpt(a: Derived, b: Derived) -> bool:
- return a == b
- def fOpt2(a: Derived, b: Derived) -> bool:
- return a != b
- [out]
- def Base.__eq__(self, other):
- self :: __main__.Base
- other, r0 :: object
- L0:
- r0 = box(bool, 0)
- return r0
- def Base.__ne__(__mypyc_self__, rhs):
- __mypyc_self__ :: __main__.Base
- rhs, r0, r1 :: object
- r2 :: bit
- r3 :: int32
- r4 :: bit
- r5 :: bool
- r6 :: object
- L0:
- r0 = __mypyc_self__.__eq__(rhs)
- r1 = load_address _Py_NotImplementedStruct
- r2 = r0 == r1
- if r2 goto L2 else goto L1 :: bool
- L1:
- r3 = PyObject_Not(r0)
- r4 = r3 >= 0 :: signed
- r5 = truncate r3: int32 to builtins.bool
- r6 = box(bool, r5)
- return r6
- L2:
- return r1
- def Derived.__eq__(self, other):
- self :: __main__.Derived
- other, r0 :: object
- L0:
- r0 = box(bool, 1)
- return r0
- def f(a, b):
- a, b :: __main__.Base
- r0 :: object
- r1 :: bool
- L0:
- r0 = PyObject_RichCompare(a, b, 2)
- r1 = unbox(bool, r0)
- return r1
- def f2(a, b):
- a, b :: __main__.Base
- r0 :: object
- r1 :: bool
- L0:
- r0 = PyObject_RichCompare(a, b, 3)
- r1 = unbox(bool, r0)
- return r1
- def fOpt(a, b):
- a, b :: __main__.Derived
- r0 :: object
- r1 :: bool
- L0:
- r0 = a.__eq__(b)
- r1 = unbox(bool, r0)
- return r1
- def fOpt2(a, b):
- a, b :: __main__.Derived
- r0 :: object
- r1 :: bool
- L0:
- r0 = a.__ne__(b)
- r1 = unbox(bool, r0)
- return r1
- [case testEqDefinedLater]
- def f(a: 'Base', b: 'Base') -> bool:
- return a == b
- def f2(a: 'Base', b: 'Base') -> bool:
- return a != b
- def fOpt(a: 'Derived', b: 'Derived') -> bool:
- return a == b
- def fOpt2(a: 'Derived', b: 'Derived') -> bool:
- return a != b
- class Base:
- pass
- class Derived(Base):
- def __eq__(self, other: object) -> bool:
- return True
- [out]
- def f(a, b):
- a, b :: __main__.Base
- r0 :: object
- r1 :: bool
- L0:
- r0 = PyObject_RichCompare(a, b, 2)
- r1 = unbox(bool, r0)
- return r1
- def f2(a, b):
- a, b :: __main__.Base
- r0 :: object
- r1 :: bool
- L0:
- r0 = PyObject_RichCompare(a, b, 3)
- r1 = unbox(bool, r0)
- return r1
- def fOpt(a, b):
- a, b :: __main__.Derived
- r0 :: object
- r1 :: bool
- L0:
- r0 = a.__eq__(b)
- r1 = unbox(bool, r0)
- return r1
- def fOpt2(a, b):
- a, b :: __main__.Derived
- r0 :: str
- r1 :: object
- r2 :: bool
- L0:
- r0 = '__ne__'
- r1 = CPyObject_CallMethodObjArgs(a, r0, b, 0)
- r2 = unbox(bool, r1)
- return r2
- def Derived.__eq__(self, other):
- self :: __main__.Derived
- other, r0 :: object
- L0:
- r0 = box(bool, 1)
- return r0
- def Derived.__ne__(__mypyc_self__, rhs):
- __mypyc_self__ :: __main__.Derived
- rhs, r0, r1 :: object
- r2 :: bit
- r3 :: int32
- r4 :: bit
- r5 :: bool
- r6 :: object
- L0:
- r0 = __mypyc_self__.__eq__(rhs)
- r1 = load_address _Py_NotImplementedStruct
- r2 = r0 == r1
- if r2 goto L2 else goto L1 :: bool
- L1:
- r3 = PyObject_Not(r0)
- r4 = r3 >= 0 :: signed
- r5 = truncate r3: int32 to builtins.bool
- r6 = box(bool, r5)
- return r6
- L2:
- return r1
- [case testDefaultVars]
- from typing import ClassVar, Optional
- class A:
- x = 10
- def lol(self) -> None:
- self.x = 100
- LOL = 'lol'
- class B(A):
- y = LOL
- z: Optional[str] = None
- b = True
- bogus = None # type: int
- [out]
- def A.lol(self):
- self :: __main__.A
- r0 :: bool
- L0:
- self.x = 200; r0 = is_error
- return 1
- def A.__mypyc_defaults_setup(__mypyc_self__):
- __mypyc_self__ :: __main__.A
- L0:
- __mypyc_self__.x = 20
- return 1
- def B.__mypyc_defaults_setup(__mypyc_self__):
- __mypyc_self__ :: __main__.B
- r0 :: dict
- r1 :: str
- r2 :: object
- r3 :: str
- r4 :: object
- L0:
- __mypyc_self__.x = 20
- r0 = __main__.globals :: static
- r1 = 'LOL'
- r2 = CPyDict_GetItem(r0, r1)
- r3 = cast(str, r2)
- __mypyc_self__.y = r3
- r4 = box(None, 1)
- __mypyc_self__.z = r4
- __mypyc_self__.b = 1
- return 1
- [case testSubclassDictSpecalized]
- from typing import Dict
- class WelpDict(Dict[str, int]):
- pass
- def foo(x: WelpDict) -> None:
- # we care that the specalized op gets used
- x.update(x)
- [out]
- def foo(x):
- x :: dict
- r0 :: int32
- r1 :: bit
- L0:
- r0 = CPyDict_Update(x, x)
- r1 = r0 >= 0 :: signed
- return 1
- [case testNoSpuriousLinearity]
- # Make sure that the non-trait MRO linearity check isn't affected by processing order
- class A(B): pass
- class B(C): pass
- class C: pass
- [out]
- [case testDeletableSemanticAnalysis]
- class Err1:
- __deletable__ = 'x' # E: "__deletable__" must be initialized with a list or tuple expression
- class Err2:
- __deletable__ = [
- 1 # E: Invalid "__deletable__" item; string literal expected
- ]
- class Err3:
- __deletable__ = ['x', ['y'], 'z'] # E: Invalid "__deletable__" item; string literal expected
- class Err4:
- __deletable__ = (1,) # E: Invalid "__deletable__" item; string literal expected
- a = ['x']
- class Err5:
- __deletable__ = a # E: "__deletable__" must be initialized with a list or tuple expression
- class Ok1:
- __deletable__ = ('x',)
- x: int
- class Ok2:
- __deletable__ = ['x']
- x: int
- [case testInvalidDeletableAttribute]
- class NotDeletable:
- __deletable__ = ['x']
- x: int
- y: int
- def g(o: NotDeletable) -> None:
- del o.x
- del o.y # E: "y" cannot be deleted \
- # N: Using "__deletable__ = ['<attr>']" in the class body enables "del obj.<attr>"
- class Base:
- x: int
- class Deriv(Base):
- __deletable__ = ['x'] # E: Attribute "x" not defined in "Deriv" (defined in "Base")
- class UndefinedDeletable:
- __deletable__ = ['x'] # E: Attribute "x" not defined
- class DeletableProperty:
- __deletable__ = ['prop'] # E: Cannot make property "prop" deletable
- @property
- def prop(self) -> int:
- return 5
- [case testFinalDeletable]
- from typing import Final
- class DeletableFinal1:
- x: Final[int] # E: Deletable attribute cannot be final
- __deletable__ = ['x']
- def __init__(self, x: int) -> None:
- self.x = x
- class DeletableFinal2:
- X: Final = 0 # E: Deletable attribute cannot be final
- __deletable__ = ['X']
- [case testNeedAnnotateClassVar]
- from typing import Final, ClassVar, Type
- class C:
- a = 'A'
- b: str = 'B'
- f: Final = 'F'
- c: ClassVar = 'C'
- class D(C):
- pass
- def f() -> None:
- C.a # E: Cannot access instance attribute "a" through class object \
- # N: (Hint: Use "x: Final = ..." or "x: ClassVar = ..." to define a class attribute)
- C.b # E: Cannot access instance attribute "b" through class object \
- # N: (Hint: Use "x: Final = ..." or "x: ClassVar = ..." to define a class attribute)
- C.f
- C.c
- D.a # E: Cannot access instance attribute "a" through class object \
- # N: (Hint: Use "x: Final = ..." or "x: ClassVar = ..." to define a class attribute)
- D.b # E: Cannot access instance attribute "b" through class object \
- # N: (Hint: Use "x: Final = ..." or "x: ClassVar = ..." to define a class attribute)
- D.f
- D.c
- def g(c: Type[C], d: Type[D]) -> None:
- c.a # E: Cannot access instance attribute "a" through class object \
- # N: (Hint: Use "x: Final = ..." or "x: ClassVar = ..." to define a class attribute)
- c.f
- c.c
- d.a # E: Cannot access instance attribute "a" through class object \
- # N: (Hint: Use "x: Final = ..." or "x: ClassVar = ..." to define a class attribute)
- d.f
- d.c
- [case testSetAttributeWithDefaultInInit]
- class C:
- s = ''
- def __init__(self, s: str) -> None:
- self.s = s
- [out]
- def C.__init__(self, s):
- self :: __main__.C
- s :: str
- r0 :: bool
- L0:
- self.s = s; r0 = is_error
- return 1
- def C.__mypyc_defaults_setup(__mypyc_self__):
- __mypyc_self__ :: __main__.C
- r0 :: str
- L0:
- r0 = ''
- __mypyc_self__.s = r0
- return 1
- [case testBorrowAttribute]
- def f(d: D) -> int:
- return d.c.x
- class C:
- x: int
- class D:
- c: C
- [out]
- def f(d):
- d :: __main__.D
- r0 :: __main__.C
- r1 :: int
- L0:
- r0 = borrow d.c
- r1 = r0.x
- keep_alive d
- return r1
- [case testNoBorrowOverPropertyAccess]
- class C:
- d: D
- class D:
- @property
- def e(self) -> E:
- return E()
- class E:
- x: int
- def f(c: C) -> int:
- return c.d.e.x
- [out]
- def D.e(self):
- self :: __main__.D
- r0 :: __main__.E
- L0:
- r0 = E()
- return r0
- def f(c):
- c :: __main__.C
- r0 :: __main__.D
- r1 :: __main__.E
- r2 :: int
- L0:
- r0 = c.d
- r1 = r0.e
- r2 = r1.x
- return r2
- [case testBorrowResultOfCustomGetItemInIfStatement]
- from typing import List
- class C:
- def __getitem__(self, x: int) -> List[int]:
- return []
- def f(x: C) -> None:
- # In this case the keep_alive must come before the branch, as otherwise
- # reference count transform will get confused.
- if x[1][0] == 2:
- y = 1
- else:
- y = 2
- [out]
- def C.__getitem__(self, x):
- self :: __main__.C
- x :: int
- r0 :: list
- L0:
- r0 = PyList_New(0)
- return r0
- def f(x):
- x :: __main__.C
- r0 :: list
- r1 :: object
- r2 :: int
- r3 :: bit
- y :: int
- L0:
- r0 = x.__getitem__(2)
- r1 = CPyList_GetItemShortBorrow(r0, 0)
- r2 = unbox(int, r1)
- r3 = r2 == 4
- keep_alive r0
- if r3 goto L1 else goto L2 :: bool
- L1:
- y = 2
- goto L3
- L2:
- y = 4
- L3:
- return 1
- [case testIncompatibleDefinitionOfAttributeInSubclass]
- from mypy_extensions import trait
- class Base:
- x: int
- class Bad1(Base):
- x: bool # E: Type of "x" is incompatible with definition in class "Base"
- class Good1(Base):
- x: int
- class Good2(Base):
- x: int = 0
- class Good3(Base):
- x = 0
- class Good4(Base):
- def __init__(self) -> None:
- self.x = 0
- class Good5(Base):
- def __init__(self) -> None:
- self.x: int = 0
- class Base2(Base):
- pass
- class Bad2(Base2):
- x: bool = False # E: Type of "x" is incompatible with definition in class "Base"
- class Bad3(Base):
- x = False # E: Type of "x" is incompatible with definition in class "Base"
- @trait
- class T:
- y: object
- class E(T):
- y: str # E: Type of "y" is incompatible with definition in trait "T"
|