| # Test cases for glue methods. | |
| # | |
| # These are used when subclass method signature has a different representation | |
| # compared to the base class. | |
| [case testSubclassSpecialize2] | |
| class A: | |
| def foo(self, x: int) -> object: | |
| return str(x) | |
| class B(A): | |
| def foo(self, x: object) -> object: | |
| return x | |
| class C(B): | |
| def foo(self, x: object) -> int: | |
| return id(x) | |
| def use_a(x: A, y: int) -> object: | |
| return x.foo(y) | |
| def use_b(x: B, y: object) -> object: | |
| return x.foo(y) | |
| def use_c(x: C, y: object) -> int: | |
| return x.foo(y) | |
| [out] | |
| def A.foo(self, x): | |
| self :: __main__.A | |
| x :: int | |
| r0 :: str | |
| L0: | |
| r0 = CPyTagged_Str(x) | |
| return r0 | |
| def B.foo(self, x): | |
| self :: __main__.B | |
| x :: object | |
| L0: | |
| return x | |
| def B.foo__A_glue(self, x): | |
| self :: __main__.B | |
| x :: int | |
| r0, r1 :: object | |
| L0: | |
| r0 = box(int, x) | |
| r1 = B.foo(self, r0) | |
| return r1 | |
| def C.foo(self, x): | |
| self :: __main__.C | |
| x :: object | |
| r0 :: int | |
| L0: | |
| r0 = CPyTagged_Id(x) | |
| return r0 | |
| def C.foo__B_glue(self, x): | |
| self :: __main__.C | |
| x :: object | |
| r0 :: int | |
| r1 :: object | |
| L0: | |
| r0 = C.foo(self, x) | |
| r1 = box(int, r0) | |
| return r1 | |
| def C.foo__A_glue(self, x): | |
| self :: __main__.C | |
| x :: int | |
| r0 :: object | |
| r1 :: int | |
| r2 :: object | |
| L0: | |
| r0 = box(int, x) | |
| r1 = C.foo(self, r0) | |
| r2 = box(int, r1) | |
| return r2 | |
| def use_a(x, y): | |
| x :: __main__.A | |
| y :: int | |
| r0 :: object | |
| L0: | |
| r0 = x.foo(y) | |
| return r0 | |
| def use_b(x, y): | |
| x :: __main__.B | |
| y, r0 :: object | |
| L0: | |
| r0 = x.foo(y) | |
| return r0 | |
| def use_c(x, y): | |
| x :: __main__.C | |
| y :: object | |
| r0 :: int | |
| L0: | |
| r0 = x.foo(y) | |
| return r0 | |
| [case testPropertyDerivedGen_withgil] | |
| from typing import Callable | |
| class BaseProperty: | |
| @property | |
| def value(self) -> object: | |
| return self._incrementer | |
| @property | |
| def bad_value(self) -> object: | |
| return self._incrementer | |
| @property | |
| def next(self) -> BaseProperty: | |
| return BaseProperty(self._incrementer + 1) | |
| def __init__(self, value: int) -> None: | |
| self._incrementer = value | |
| class DerivedProperty(BaseProperty): | |
| @property | |
| def value(self) -> int: | |
| return self._incrementer | |
| @property | |
| def bad_value(self) -> object: | |
| return self._incrementer | |
| @property | |
| def next(self) -> DerivedProperty: | |
| return DerivedProperty(self._incr_func, self._incr_func(self.value)) | |
| def __init__(self, incr_func: Callable[[int], int], value: int) -> None: | |
| BaseProperty.__init__(self, value) | |
| self._incr_func = incr_func | |
| class AgainProperty(DerivedProperty): | |
| @property | |
| def next(self) -> AgainProperty: | |
| return AgainProperty(self._incr_func, self._incr_func(self._incr_func(self.value))) | |
| @property | |
| def bad_value(self) -> int: | |
| return self._incrementer | |
| [out] | |
| def BaseProperty.value(self): | |
| self :: __main__.BaseProperty | |
| r0 :: int | |
| r1 :: object | |
| L0: | |
| r0 = self._incrementer | |
| r1 = box(int, r0) | |
| return r1 | |
| def BaseProperty.bad_value(self): | |
| self :: __main__.BaseProperty | |
| r0 :: int | |
| r1 :: object | |
| L0: | |
| r0 = self._incrementer | |
| r1 = box(int, r0) | |
| return r1 | |
| def BaseProperty.next(self): | |
| self :: __main__.BaseProperty | |
| r0, r1 :: int | |
| r2 :: __main__.BaseProperty | |
| L0: | |
| r0 = borrow self._incrementer | |
| r1 = CPyTagged_Add(r0, 2) | |
| keep_alive self | |
| r2 = BaseProperty(r1) | |
| return r2 | |
| def BaseProperty.__init__(self, value): | |
| self :: __main__.BaseProperty | |
| value :: int | |
| L0: | |
| self._incrementer = value | |
| return 1 | |
| def DerivedProperty.value(self): | |
| self :: __main__.DerivedProperty | |
| r0 :: int | |
| L0: | |
| r0 = self._incrementer | |
| return r0 | |
| def DerivedProperty.value__BaseProperty_glue(__mypyc_self__): | |
| __mypyc_self__ :: __main__.DerivedProperty | |
| r0 :: int | |
| r1 :: object | |
| L0: | |
| r0 = __mypyc_self__.value | |
| r1 = box(int, r0) | |
| return r1 | |
| def DerivedProperty.bad_value(self): | |
| self :: __main__.DerivedProperty | |
| r0 :: int | |
| r1 :: object | |
| L0: | |
| r0 = self._incrementer | |
| r1 = box(int, r0) | |
| return r1 | |
| def DerivedProperty.next(self): | |
| self :: __main__.DerivedProperty | |
| r0 :: object | |
| r1 :: int | |
| r2, r3 :: object | |
| r4 :: object[1] | |
| r5 :: object_ptr | |
| r6 :: object | |
| r7 :: int | |
| r8 :: __main__.DerivedProperty | |
| L0: | |
| r0 = self._incr_func | |
| r1 = self.value | |
| r2 = self._incr_func | |
| r3 = box(int, r1) | |
| r4 = [r3] | |
| r5 = load_address r4 | |
| r6 = PyObject_Vectorcall(r2, r5, 1, 0) | |
| keep_alive r3 | |
| r7 = unbox(int, r6) | |
| r8 = DerivedProperty(r0, r7) | |
| return r8 | |
| def DerivedProperty.next__BaseProperty_glue(__mypyc_self__): | |
| __mypyc_self__, r0 :: __main__.DerivedProperty | |
| L0: | |
| r0 = __mypyc_self__.next | |
| return r0 | |
| def DerivedProperty.__init__(self, incr_func, value): | |
| self :: __main__.DerivedProperty | |
| incr_func :: object | |
| value :: int | |
| r0 :: None | |
| L0: | |
| r0 = BaseProperty.__init__(self, value) | |
| self._incr_func = incr_func | |
| return 1 | |
| def AgainProperty.next(self): | |
| self :: __main__.AgainProperty | |
| r0 :: object | |
| r1 :: int | |
| r2, r3 :: object | |
| r4 :: object[1] | |
| r5 :: object_ptr | |
| r6 :: object | |
| r7 :: int | |
| r8, r9 :: object | |
| r10 :: object[1] | |
| r11 :: object_ptr | |
| r12 :: object | |
| r13 :: int | |
| r14 :: __main__.AgainProperty | |
| L0: | |
| r0 = self._incr_func | |
| r1 = self.value | |
| r2 = self._incr_func | |
| r3 = box(int, r1) | |
| r4 = [r3] | |
| r5 = load_address r4 | |
| r6 = PyObject_Vectorcall(r2, r5, 1, 0) | |
| keep_alive r3 | |
| r7 = unbox(int, r6) | |
| r8 = self._incr_func | |
| r9 = box(int, r7) | |
| r10 = [r9] | |
| r11 = load_address r10 | |
| r12 = PyObject_Vectorcall(r8, r11, 1, 0) | |
| keep_alive r9 | |
| r13 = unbox(int, r12) | |
| r14 = AgainProperty(r0, r13) | |
| return r14 | |
| def AgainProperty.next__DerivedProperty_glue(__mypyc_self__): | |
| __mypyc_self__, r0 :: __main__.AgainProperty | |
| L0: | |
| r0 = __mypyc_self__.next | |
| return r0 | |
| def AgainProperty.next__BaseProperty_glue(__mypyc_self__): | |
| __mypyc_self__, r0 :: __main__.AgainProperty | |
| L0: | |
| r0 = __mypyc_self__.next | |
| return r0 | |
| def AgainProperty.bad_value(self): | |
| self :: __main__.AgainProperty | |
| r0 :: int | |
| L0: | |
| r0 = self._incrementer | |
| return r0 | |
| def AgainProperty.bad_value__DerivedProperty_glue(__mypyc_self__): | |
| __mypyc_self__ :: __main__.AgainProperty | |
| r0 :: int | |
| r1 :: object | |
| L0: | |
| r0 = __mypyc_self__.bad_value | |
| r1 = box(int, r0) | |
| return r1 | |
| def AgainProperty.bad_value__BaseProperty_glue(__mypyc_self__): | |
| __mypyc_self__ :: __main__.AgainProperty | |
| r0 :: int | |
| r1 :: object | |
| L0: | |
| r0 = __mypyc_self__.bad_value | |
| r1 = box(int, r0) | |
| return r1 | |
| [case testPropertyTraitSubclassing] | |
| from mypy_extensions import trait | |
| @trait | |
| class SubclassedTrait: | |
| @property | |
| def this(self) -> SubclassedTrait: | |
| return self | |
| @property | |
| def boxed(self) -> object: | |
| return 3 | |
| class DerivingObject(SubclassedTrait): | |
| @property | |
| def this(self) -> DerivingObject: | |
| return self | |
| @property | |
| def boxed(self) -> int: | |
| return 5 | |
| [out] | |
| def SubclassedTrait.this(self): | |
| self :: __main__.SubclassedTrait | |
| L0: | |
| return self | |
| def SubclassedTrait.boxed(self): | |
| self :: __main__.SubclassedTrait | |
| r0 :: object | |
| L0: | |
| r0 = object 3 | |
| return r0 | |
| def DerivingObject.this(self): | |
| self :: __main__.DerivingObject | |
| L0: | |
| return self | |
| def DerivingObject.this__SubclassedTrait_glue(__mypyc_self__): | |
| __mypyc_self__, r0 :: __main__.DerivingObject | |
| L0: | |
| r0 = __mypyc_self__.this | |
| return r0 | |
| def DerivingObject.boxed(self): | |
| self :: __main__.DerivingObject | |
| L0: | |
| return 10 | |
| def DerivingObject.boxed__SubclassedTrait_glue(__mypyc_self__): | |
| __mypyc_self__ :: __main__.DerivingObject | |
| r0 :: int | |
| r1 :: object | |
| L0: | |
| r0 = __mypyc_self__.boxed | |
| r1 = box(int, r0) | |
| return r1 | |
| [case testI64GlueWithExtraDefaultArg] | |
| from mypy_extensions import i64 | |
| class C: | |
| def f(self) -> None: pass | |
| class D(C): | |
| def f(self, x: i64 = 44) -> None: pass | |
| [out] | |
| def C.f(self): | |
| self :: __main__.C | |
| L0: | |
| return 1 | |
| def D.f(self, x, __bitmap): | |
| self :: __main__.D | |
| x :: i64 | |
| __bitmap, r0 :: u32 | |
| r1 :: bit | |
| L0: | |
| r0 = __bitmap & 1 | |
| r1 = r0 == 0 | |
| if r1 goto L1 else goto L2 :: bool | |
| L1: | |
| x = 44 | |
| L2: | |
| return 1 | |
| def D.f__C_glue(self): | |
| self :: __main__.D | |
| r0 :: None | |
| L0: | |
| r0 = D.f(self, 0, 0) | |
| return r0 | |
| [case testI64GlueWithSecondDefaultArg] | |
| from mypy_extensions import i64 | |
| class C: | |
| def f(self, x: i64 = 11) -> None: pass | |
| class D(C): | |
| def f(self, x: i64 = 12, y: i64 = 13) -> None: pass | |
| [out] | |
| def C.f(self, x, __bitmap): | |
| self :: __main__.C | |
| x :: i64 | |
| __bitmap, r0 :: u32 | |
| r1 :: bit | |
| L0: | |
| r0 = __bitmap & 1 | |
| r1 = r0 == 0 | |
| if r1 goto L1 else goto L2 :: bool | |
| L1: | |
| x = 11 | |
| L2: | |
| return 1 | |
| def D.f(self, x, y, __bitmap): | |
| self :: __main__.D | |
| x, y :: i64 | |
| __bitmap, r0 :: u32 | |
| r1 :: bit | |
| r2 :: u32 | |
| r3 :: bit | |
| L0: | |
| r0 = __bitmap & 1 | |
| r1 = r0 == 0 | |
| if r1 goto L1 else goto L2 :: bool | |
| L1: | |
| x = 12 | |
| L2: | |
| r2 = __bitmap & 2 | |
| r3 = r2 == 0 | |
| if r3 goto L3 else goto L4 :: bool | |
| L3: | |
| y = 13 | |
| L4: | |
| return 1 | |
| def D.f__C_glue(self, x, __bitmap): | |
| self :: __main__.D | |
| x :: i64 | |
| __bitmap :: u32 | |
| r0 :: None | |
| L0: | |
| r0 = D.f(self, x, 0, __bitmap) | |
| return r0 | |
| [case testI64GlueWithInvalidOverride] | |
| from mypy_extensions import i64 | |
| class C: | |
| def f(self, x: i64, y: i64 = 5) -> None: pass | |
| def ff(self, x: int) -> None: pass | |
| class CC(C): | |
| def f(self, x: i64 = 12, y: i64 = 5) -> None: pass # Line 7 | |
| def ff(self, x: int = 12) -> None: pass | |
| class D: | |
| def f(self, x: int) -> None: pass | |
| class DD(D): | |
| def f(self, x: i64) -> None: pass # Line 13 | |
| class E: | |
| def f(self, x: i64) -> None: pass | |
| class EE(E): | |
| def f(self, x: int) -> None: pass # Line 18 | |
| [out] | |
| main:7: error: An argument with type "i64" cannot be given a default value in a method override | |
| main:13: error: Incompatible argument type "i64" (base class has type "int") | |
| main:18: error: Incompatible argument type "int" (base class has type "i64") | |
| [case testPropertySetterShadowGlue] | |
| import mypy_extensions | |
| @mypy_extensions.mypyc_attr(allow_interpreted_subclasses=True) | |
| class Base: | |
| _x: str = "" | |
| @property | |
| def x(self) -> str: | |
| return self._x | |
| @x.setter | |
| def x(self, v: str) -> None: | |
| self._x = v | |
| [out] | |
| def Base.x(self): | |
| self :: __main__.Base | |
| r0 :: str | |
| L0: | |
| r0 = self._x | |
| return r0 | |
| def Base.x__Base_glue(__mypyc_self__): | |
| __mypyc_self__ :: __main__.Base | |
| r0 :: str | |
| r1 :: object | |
| r2 :: str | |
| L0: | |
| r0 = 'x' | |
| r1 = CPyObject_GetAttr(__mypyc_self__, r0) | |
| r2 = cast(str, r1) | |
| return r2 | |
| def Base.__mypyc_setter__x(self, v): | |
| self :: __main__.Base | |
| v :: str | |
| r0 :: bool | |
| L0: | |
| self._x = v; r0 = is_error | |
| return 1 | |
| def Base.__mypyc_setter__x__Base_glue(self, v): | |
| self :: __main__.Base | |
| v, r0 :: str | |
| r1 :: i32 | |
| r2 :: bit | |
| L0: | |
| r0 = 'x' | |
| r1 = PyObject_SetAttr(self, r0, v) | |
| r2 = r1 >= 0 :: signed | |
| return 1 | |
| def Base.__mypyc_defaults_setup(__mypyc_self__): | |
| __mypyc_self__ :: __main__.Base | |
| r0 :: str | |
| L0: | |
| r0 = '' | |
| __mypyc_self__._x = r0 | |
| return 1 |