| [case testI64Basics] |
| from mypy_extensions import i64 |
| |
| def f() -> i64: |
| x: i64 = 5 |
| y = x |
| return y |
| [out] |
| def f(): |
| x, y :: i64 |
| L0: |
| x = 5 |
| y = x |
| return y |
| |
| [case testI64Compare] |
| from mypy_extensions import i64 |
| |
| def min(x: i64, y: i64) -> i64: |
| if x < y: |
| return x |
| else: |
| return y |
| |
| def all_comparisons(x: i64) -> int: |
| if x == 2: |
| y = 10 |
| elif 3 != x: |
| y = 11 |
| elif x > 4: |
| y = 12 |
| elif 6 >= x: |
| y = 13 |
| elif x < 5: |
| y = 14 |
| elif 6 <= x: |
| y = 15 |
| else: |
| y = 16 |
| return y |
| [out] |
| def min(x, y): |
| x, y :: i64 |
| r0 :: bit |
| L0: |
| r0 = x < y :: signed |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| return x |
| L2: |
| return y |
| L3: |
| unreachable |
| def all_comparisons(x): |
| x :: i64 |
| r0 :: bit |
| y :: int |
| r1, r2, r3, r4, r5 :: bit |
| L0: |
| r0 = x == 2 |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| y = 20 |
| goto L18 |
| L2: |
| r1 = 3 != x |
| if r1 goto L3 else goto L4 :: bool |
| L3: |
| y = 22 |
| goto L17 |
| L4: |
| r2 = x > 4 :: signed |
| if r2 goto L5 else goto L6 :: bool |
| L5: |
| y = 24 |
| goto L16 |
| L6: |
| r3 = 6 >= x :: signed |
| if r3 goto L7 else goto L8 :: bool |
| L7: |
| y = 26 |
| goto L15 |
| L8: |
| r4 = x < 5 :: signed |
| if r4 goto L9 else goto L10 :: bool |
| L9: |
| y = 28 |
| goto L14 |
| L10: |
| r5 = 6 <= x :: signed |
| if r5 goto L11 else goto L12 :: bool |
| L11: |
| y = 30 |
| goto L13 |
| L12: |
| y = 32 |
| L13: |
| L14: |
| L15: |
| L16: |
| L17: |
| L18: |
| return y |
| |
| [case testI64Arithmetic] |
| from mypy_extensions import i64 |
| |
| def f(x: i64, y: i64) -> i64: |
| z = x + y |
| return y - z |
| [out] |
| def f(x, y): |
| x, y, r0, z, r1 :: i64 |
| L0: |
| r0 = x + y |
| z = r0 |
| r1 = y - z |
| return r1 |
| |
| [case testI64Negation] |
| from mypy_extensions import i64 |
| |
| def f() -> i64: |
| i: i64 = -3 |
| return -i |
| [out] |
| def f(): |
| i, r0 :: i64 |
| L0: |
| i = -3 |
| r0 = 0 - i |
| return r0 |
| |
| [case testI64MoreUnaryOps] |
| from mypy_extensions import i64 |
| |
| def unary(x: i64) -> i64: |
| y = ~x |
| x = +y |
| return x |
| [out] |
| def unary(x): |
| x, r0, y :: i64 |
| L0: |
| r0 = x ^ -1 |
| y = r0 |
| x = y |
| return x |
| |
| [case testI64BoxingAndUnboxing] |
| from typing import Any |
| from mypy_extensions import i64 |
| |
| def f(a: Any) -> None: |
| b: i64 = a |
| a = b |
| [out] |
| def f(a): |
| a :: object |
| r0, b :: i64 |
| r1 :: object |
| L0: |
| r0 = unbox(i64, a) |
| b = r0 |
| r1 = box(i64, b) |
| a = r1 |
| return 1 |
| |
| [case testI64ListGetSetItem] |
| from typing import List |
| from mypy_extensions import i64 |
| |
| def get(a: List[i64], i: i64) -> i64: |
| return a[i] |
| def set(a: List[i64], i: i64, x: i64) -> None: |
| a[i] = x |
| [out] |
| def get(a, i): |
| a :: list |
| i :: i64 |
| r0 :: object |
| r1 :: i64 |
| L0: |
| r0 = CPyList_GetItemInt64(a, i) |
| r1 = unbox(i64, r0) |
| return r1 |
| def set(a, i, x): |
| a :: list |
| i, x :: i64 |
| r0 :: object |
| r1 :: bit |
| L0: |
| r0 = box(i64, x) |
| r1 = CPyList_SetItemInt64(a, i, r0) |
| return 1 |
| |
| [case testI64MixedArithmetic] |
| from mypy_extensions import i64 |
| |
| def f() -> i64: |
| a: i64 = 1 |
| b = a + 2 |
| return 3 - b |
| [out] |
| def f(): |
| a, r0, b, r1 :: i64 |
| L0: |
| a = 1 |
| r0 = a + 2 |
| b = r0 |
| r1 = 3 - b |
| return r1 |
| |
| [case testI64MixedComparison] |
| from mypy_extensions import i64 |
| |
| def f(a: i64) -> i64: |
| if a < 3: |
| return 1 |
| elif 3 < a: |
| return 2 |
| return 3 |
| [out] |
| def f(a): |
| a :: i64 |
| r0, r1 :: bit |
| L0: |
| r0 = a < 3 :: signed |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| return 1 |
| L2: |
| r1 = 3 < a :: signed |
| if r1 goto L3 else goto L4 :: bool |
| L3: |
| return 2 |
| L4: |
| L5: |
| return 3 |
| |
| [case testI64InplaceOperations] |
| from mypy_extensions import i64 |
| |
| def add(a: i64) -> i64: |
| b = a |
| b += 1 |
| a += b |
| return a |
| def others(a: i64, b: i64) -> i64: |
| a -= b |
| a *= b |
| a &= b |
| a |= b |
| a ^= b |
| a <<= b |
| a >>= b |
| return a |
| [out] |
| def add(a): |
| a, b, r0, r1 :: i64 |
| L0: |
| b = a |
| r0 = b + 1 |
| b = r0 |
| r1 = a + b |
| a = r1 |
| return a |
| def others(a, b): |
| a, b, r0, r1, r2, r3, r4, r5, r6 :: i64 |
| L0: |
| r0 = a - b |
| a = r0 |
| r1 = a * b |
| a = r1 |
| r2 = a & b |
| a = r2 |
| r3 = a | b |
| a = r3 |
| r4 = a ^ b |
| a = r4 |
| r5 = a << b |
| a = r5 |
| r6 = a >> b |
| a = r6 |
| return a |
| |
| [case testI64BitwiseOps] |
| from mypy_extensions import i64 |
| |
| def forward(a: i64, b: i64) -> i64: |
| b = a & 1 |
| a = b | 2 |
| b = a ^ 3 |
| a = b << 4 |
| b = a >> 5 |
| return b |
| |
| def reverse(a: i64, b: i64) -> i64: |
| b = 1 & a |
| a = 2 | b |
| b = 3 ^ a |
| a = 4 << b |
| b = 5 >> a |
| return b |
| |
| def unary(a: i64) -> i64: |
| return ~a |
| [out] |
| def forward(a, b): |
| a, b, r0, r1, r2, r3, r4 :: i64 |
| L0: |
| r0 = a & 1 |
| b = r0 |
| r1 = b | 2 |
| a = r1 |
| r2 = a ^ 3 |
| b = r2 |
| r3 = b << 4 |
| a = r3 |
| r4 = a >> 5 |
| b = r4 |
| return b |
| def reverse(a, b): |
| a, b, r0, r1, r2, r3, r4 :: i64 |
| L0: |
| r0 = 1 & a |
| b = r0 |
| r1 = 2 | b |
| a = r1 |
| r2 = 3 ^ a |
| b = r2 |
| r3 = 4 << b |
| a = r3 |
| r4 = 5 >> a |
| b = r4 |
| return b |
| def unary(a): |
| a, r0 :: i64 |
| L0: |
| r0 = a ^ -1 |
| return r0 |
| |
| [case testI64Division] |
| from mypy_extensions import i64 |
| |
| def constant_divisor(x: i64) -> i64: |
| return x // 7 |
| def variable_divisor(x: i64, y: i64) -> i64: |
| return x // y |
| def constant_lhs(x: i64) -> i64: |
| return 27 // x |
| def divide_by_neg_one(x: i64) -> i64: |
| return x // -1 |
| def divide_by_zero(x: i64) -> i64: |
| return x // 0 |
| [out] |
| def constant_divisor(x): |
| x, r0, r1 :: i64 |
| r2, r3, r4 :: bit |
| r5 :: i64 |
| r6 :: bit |
| r7 :: i64 |
| L0: |
| r0 = x / 7 |
| r1 = r0 |
| r2 = x < 0 :: signed |
| r3 = 7 < 0 :: signed |
| r4 = r2 == r3 |
| if r4 goto L3 else goto L1 :: bool |
| L1: |
| r5 = r1 * 7 |
| r6 = r5 == x |
| if r6 goto L3 else goto L2 :: bool |
| L2: |
| r7 = r1 - 1 |
| r1 = r7 |
| L3: |
| return r1 |
| def variable_divisor(x, y): |
| x, y, r0 :: i64 |
| L0: |
| r0 = CPyInt64_Divide(x, y) |
| return r0 |
| def constant_lhs(x): |
| x, r0 :: i64 |
| L0: |
| r0 = CPyInt64_Divide(27, x) |
| return r0 |
| def divide_by_neg_one(x): |
| x, r0 :: i64 |
| L0: |
| r0 = CPyInt64_Divide(x, -1) |
| return r0 |
| def divide_by_zero(x): |
| x, r0 :: i64 |
| L0: |
| r0 = CPyInt64_Divide(x, 0) |
| return r0 |
| |
| [case testI64Mod] |
| from mypy_extensions import i64 |
| |
| def constant_divisor(x: i64) -> i64: |
| return x % 7 |
| def variable_divisor(x: i64, y: i64) -> i64: |
| return x % y |
| def constant_lhs(x: i64) -> i64: |
| return 27 % x |
| def mod_by_zero(x: i64) -> i64: |
| return x % 0 |
| [out] |
| def constant_divisor(x): |
| x, r0, r1 :: i64 |
| r2, r3, r4, r5 :: bit |
| r6 :: i64 |
| L0: |
| r0 = x % 7 |
| r1 = r0 |
| r2 = x < 0 :: signed |
| r3 = 7 < 0 :: signed |
| r4 = r2 == r3 |
| if r4 goto L3 else goto L1 :: bool |
| L1: |
| r5 = r1 == 0 |
| if r5 goto L3 else goto L2 :: bool |
| L2: |
| r6 = r1 + 7 |
| r1 = r6 |
| L3: |
| return r1 |
| def variable_divisor(x, y): |
| x, y, r0 :: i64 |
| L0: |
| r0 = CPyInt64_Remainder(x, y) |
| return r0 |
| def constant_lhs(x): |
| x, r0 :: i64 |
| L0: |
| r0 = CPyInt64_Remainder(27, x) |
| return r0 |
| def mod_by_zero(x): |
| x, r0 :: i64 |
| L0: |
| r0 = CPyInt64_Remainder(x, 0) |
| return r0 |
| |
| [case testI64InPlaceDiv] |
| from mypy_extensions import i64 |
| |
| def by_constant(x: i64) -> i64: |
| x //= 7 |
| return x |
| def by_variable(x: i64, y: i64) -> i64: |
| x //= y |
| return x |
| [out] |
| def by_constant(x): |
| x, r0, r1 :: i64 |
| r2, r3, r4 :: bit |
| r5 :: i64 |
| r6 :: bit |
| r7 :: i64 |
| L0: |
| r0 = x / 7 |
| r1 = r0 |
| r2 = x < 0 :: signed |
| r3 = 7 < 0 :: signed |
| r4 = r2 == r3 |
| if r4 goto L3 else goto L1 :: bool |
| L1: |
| r5 = r1 * 7 |
| r6 = r5 == x |
| if r6 goto L3 else goto L2 :: bool |
| L2: |
| r7 = r1 - 1 |
| r1 = r7 |
| L3: |
| x = r1 |
| return x |
| def by_variable(x, y): |
| x, y, r0 :: i64 |
| L0: |
| r0 = CPyInt64_Divide(x, y) |
| x = r0 |
| return x |
| |
| [case testI64InPlaceMod] |
| from mypy_extensions import i64 |
| |
| def by_constant(x: i64) -> i64: |
| x %= 7 |
| return x |
| def by_variable(x: i64, y: i64) -> i64: |
| x %= y |
| return x |
| [out] |
| def by_constant(x): |
| x, r0, r1 :: i64 |
| r2, r3, r4, r5 :: bit |
| r6 :: i64 |
| L0: |
| r0 = x % 7 |
| r1 = r0 |
| r2 = x < 0 :: signed |
| r3 = 7 < 0 :: signed |
| r4 = r2 == r3 |
| if r4 goto L3 else goto L1 :: bool |
| L1: |
| r5 = r1 == 0 |
| if r5 goto L3 else goto L2 :: bool |
| L2: |
| r6 = r1 + 7 |
| r1 = r6 |
| L3: |
| x = r1 |
| return x |
| def by_variable(x, y): |
| x, y, r0 :: i64 |
| L0: |
| r0 = CPyInt64_Remainder(x, y) |
| x = r0 |
| return x |
| |
| [case testI64ForRange] |
| from mypy_extensions import i64 |
| |
| def g(a: i64) -> None: pass |
| |
| def f(x: i64) -> None: |
| n: i64 # TODO: Infer the type |
| for n in range(x): |
| g(n) |
| [out] |
| def g(a): |
| a :: i64 |
| L0: |
| return 1 |
| def f(x): |
| x, r0, n :: i64 |
| r1 :: bit |
| r2 :: None |
| r3 :: i64 |
| L0: |
| r0 = 0 |
| n = r0 |
| L1: |
| r1 = r0 < x :: signed |
| if r1 goto L2 else goto L4 :: bool |
| L2: |
| r2 = g(n) |
| L3: |
| r3 = r0 + 1 |
| r0 = r3 |
| n = r3 |
| goto L1 |
| L4: |
| return 1 |
| |
| [case testI64ConvertFromInt_64bit] |
| from mypy_extensions import i64 |
| |
| def int_to_i64(a: int) -> i64: |
| return a |
| [out] |
| def int_to_i64(a): |
| a :: int |
| r0 :: native_int |
| r1 :: bit |
| r2, r3 :: i64 |
| r4 :: ptr |
| r5 :: c_ptr |
| r6 :: i64 |
| L0: |
| r0 = a & 1 |
| r1 = r0 == 0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = a >> 1 |
| r3 = r2 |
| goto L3 |
| L2: |
| r4 = a ^ 1 |
| r5 = r4 |
| r6 = CPyLong_AsInt64(r5) |
| r3 = r6 |
| keep_alive a |
| L3: |
| return r3 |
| |
| [case testI64ConvertToInt_64bit] |
| from mypy_extensions import i64 |
| |
| def i64_to_int(a: i64) -> int: |
| return a |
| [out] |
| def i64_to_int(a): |
| a :: i64 |
| r0, r1 :: bit |
| r2, r3, r4 :: int |
| L0: |
| r0 = a <= 4611686018427387903 :: signed |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| r1 = a >= -4611686018427387904 :: signed |
| if r1 goto L3 else goto L2 :: bool |
| L2: |
| r2 = CPyTagged_FromInt64(a) |
| r3 = r2 |
| goto L4 |
| L3: |
| r4 = a << 1 |
| r3 = r4 |
| L4: |
| return r3 |
| |
| [case testI64ConvertToInt_32bit] |
| from mypy_extensions import i64 |
| |
| def i64_to_int(a: i64) -> int: |
| return a |
| [out] |
| def i64_to_int(a): |
| a :: i64 |
| r0, r1 :: bit |
| r2, r3 :: int |
| r4 :: native_int |
| r5 :: int |
| L0: |
| r0 = a <= 1073741823 :: signed |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| r1 = a >= -1073741824 :: signed |
| if r1 goto L3 else goto L2 :: bool |
| L2: |
| r2 = CPyTagged_FromInt64(a) |
| r3 = r2 |
| goto L4 |
| L3: |
| r4 = truncate a: i64 to native_int |
| r5 = r4 << 1 |
| r3 = r5 |
| L4: |
| return r3 |
| |
| [case testI64Tuple] |
| from typing import Tuple |
| from mypy_extensions import i64 |
| |
| def f(x: i64, y: i64) -> Tuple[i64, i64]: |
| return x, y |
| |
| def g() -> Tuple[i64, i64]: |
| return 1, 2 |
| |
| def h() -> i64: |
| x, y = g() |
| t = g() |
| return x + y + t[0] |
| [out] |
| def f(x, y): |
| x, y :: i64 |
| r0 :: tuple[i64, i64] |
| L0: |
| r0 = (x, y) |
| return r0 |
| def g(): |
| r0 :: tuple[int, int] |
| r1 :: tuple[i64, i64] |
| L0: |
| r0 = (2, 4) |
| r1 = (1, 2) |
| return r1 |
| def h(): |
| r0 :: tuple[i64, i64] |
| r1, x, r2, y :: i64 |
| r3, t :: tuple[i64, i64] |
| r4, r5, r6 :: i64 |
| L0: |
| r0 = g() |
| r1 = r0[0] |
| x = r1 |
| r2 = r0[1] |
| y = r2 |
| r3 = g() |
| t = r3 |
| r4 = x + y |
| r5 = t[0] |
| r6 = r4 + r5 |
| return r6 |
| |
| [case testI64MixWithTagged1_64bit] |
| from mypy_extensions import i64 |
| def f(x: i64, y: int) -> i64: |
| return x + y |
| [out] |
| def f(x, y): |
| x :: i64 |
| y :: int |
| r0 :: native_int |
| r1 :: bit |
| r2, r3 :: i64 |
| r4 :: ptr |
| r5 :: c_ptr |
| r6, r7 :: i64 |
| L0: |
| r0 = y & 1 |
| r1 = r0 == 0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = y >> 1 |
| r3 = r2 |
| goto L3 |
| L2: |
| r4 = y ^ 1 |
| r5 = r4 |
| r6 = CPyLong_AsInt64(r5) |
| r3 = r6 |
| keep_alive y |
| L3: |
| r7 = x + r3 |
| return r7 |
| |
| [case testI64MixWithTagged2_64bit] |
| from mypy_extensions import i64 |
| def f(x: int, y: i64) -> i64: |
| return x + y |
| [out] |
| def f(x, y): |
| x :: int |
| y :: i64 |
| r0 :: native_int |
| r1 :: bit |
| r2, r3 :: i64 |
| r4 :: ptr |
| r5 :: c_ptr |
| r6, r7 :: i64 |
| L0: |
| r0 = x & 1 |
| r1 = r0 == 0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = x >> 1 |
| r3 = r2 |
| goto L3 |
| L2: |
| r4 = x ^ 1 |
| r5 = r4 |
| r6 = CPyLong_AsInt64(r5) |
| r3 = r6 |
| keep_alive x |
| L3: |
| r7 = r3 + y |
| return r7 |
| |
| [case testI64MixWithTaggedInPlace1_64bit] |
| from mypy_extensions import i64 |
| def f(y: i64) -> int: |
| x = 0 |
| x += y |
| return x |
| [out] |
| def f(y): |
| y :: i64 |
| x :: int |
| r0 :: native_int |
| r1 :: bit |
| r2, r3 :: i64 |
| r4 :: ptr |
| r5 :: c_ptr |
| r6, r7 :: i64 |
| r8, r9 :: bit |
| r10, r11, r12 :: int |
| L0: |
| x = 0 |
| r0 = x & 1 |
| r1 = r0 == 0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = x >> 1 |
| r3 = r2 |
| goto L3 |
| L2: |
| r4 = x ^ 1 |
| r5 = r4 |
| r6 = CPyLong_AsInt64(r5) |
| r3 = r6 |
| keep_alive x |
| L3: |
| r7 = r3 + y |
| r8 = r7 <= 4611686018427387903 :: signed |
| if r8 goto L4 else goto L5 :: bool |
| L4: |
| r9 = r7 >= -4611686018427387904 :: signed |
| if r9 goto L6 else goto L5 :: bool |
| L5: |
| r10 = CPyTagged_FromInt64(r7) |
| r11 = r10 |
| goto L7 |
| L6: |
| r12 = r7 << 1 |
| r11 = r12 |
| L7: |
| x = r11 |
| return x |
| |
| [case testI64MixWithTaggedInPlace2_64bit] |
| from mypy_extensions import i64 |
| def f(y: int) -> i64: |
| x: i64 = 0 |
| x += y |
| return x |
| [out] |
| def f(y): |
| y :: int |
| x :: i64 |
| r0 :: native_int |
| r1 :: bit |
| r2, r3 :: i64 |
| r4 :: ptr |
| r5 :: c_ptr |
| r6, r7 :: i64 |
| L0: |
| x = 0 |
| r0 = y & 1 |
| r1 = r0 == 0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = y >> 1 |
| r3 = r2 |
| goto L3 |
| L2: |
| r4 = y ^ 1 |
| r5 = r4 |
| r6 = CPyLong_AsInt64(r5) |
| r3 = r6 |
| keep_alive y |
| L3: |
| r7 = x + r3 |
| x = r7 |
| return x |
| |
| [case testI64MixedCompare1_64bit] |
| from mypy_extensions import i64 |
| def f(x: int, y: i64) -> bool: |
| return x == y |
| [out] |
| def f(x, y): |
| x :: int |
| y :: i64 |
| r0 :: native_int |
| r1 :: bit |
| r2, r3 :: i64 |
| r4 :: ptr |
| r5 :: c_ptr |
| r6 :: i64 |
| r7 :: bit |
| L0: |
| r0 = x & 1 |
| r1 = r0 == 0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = x >> 1 |
| r3 = r2 |
| goto L3 |
| L2: |
| r4 = x ^ 1 |
| r5 = r4 |
| r6 = CPyLong_AsInt64(r5) |
| r3 = r6 |
| keep_alive x |
| L3: |
| r7 = r3 == y |
| return r7 |
| |
| [case testI64MixedCompare2_64bit] |
| from mypy_extensions import i64 |
| def f(x: i64, y: int) -> bool: |
| return x == y |
| [out] |
| def f(x, y): |
| x :: i64 |
| y :: int |
| r0 :: native_int |
| r1 :: bit |
| r2, r3 :: i64 |
| r4 :: ptr |
| r5 :: c_ptr |
| r6 :: i64 |
| r7 :: bit |
| L0: |
| r0 = y & 1 |
| r1 = r0 == 0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = y >> 1 |
| r3 = r2 |
| goto L3 |
| L2: |
| r4 = y ^ 1 |
| r5 = r4 |
| r6 = CPyLong_AsInt64(r5) |
| r3 = r6 |
| keep_alive y |
| L3: |
| r7 = x == r3 |
| return r7 |
| |
| [case testI64MixedCompare_32bit] |
| from mypy_extensions import i64 |
| def f(x: int, y: i64) -> bool: |
| return x == y |
| [out] |
| def f(x, y): |
| x :: int |
| y :: i64 |
| r0 :: native_int |
| r1 :: bit |
| r2, r3, r4 :: i64 |
| r5 :: ptr |
| r6 :: c_ptr |
| r7 :: i64 |
| r8 :: bit |
| L0: |
| r0 = x & 1 |
| r1 = r0 == 0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = extend signed x: builtins.int to i64 |
| r3 = r2 >> 1 |
| r4 = r3 |
| goto L3 |
| L2: |
| r5 = x ^ 1 |
| r6 = r5 |
| r7 = CPyLong_AsInt64(r6) |
| r4 = r7 |
| keep_alive x |
| L3: |
| r8 = r4 == y |
| return r8 |
| |
| [case testI64AsBool] |
| from mypy_extensions import i64 |
| def f(x: i64) -> i64: |
| if x: |
| return 5 |
| elif not x: |
| return 6 |
| return 3 |
| [out] |
| def f(x): |
| x :: i64 |
| r0, r1 :: bit |
| L0: |
| r0 = x != 0 |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| return 5 |
| L2: |
| r1 = x != 0 |
| if r1 goto L4 else goto L3 :: bool |
| L3: |
| return 6 |
| L4: |
| L5: |
| return 3 |
| |
| [case testI64AssignMixed_64bit] |
| from mypy_extensions import i64 |
| def f(x: i64, y: int) -> i64: |
| x = y |
| return x |
| def g(x: i64, y: int) -> int: |
| y = x |
| return y |
| [out] |
| def f(x, y): |
| x :: i64 |
| y :: int |
| r0 :: native_int |
| r1 :: bit |
| r2, r3 :: i64 |
| r4 :: ptr |
| r5 :: c_ptr |
| r6 :: i64 |
| L0: |
| r0 = y & 1 |
| r1 = r0 == 0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = y >> 1 |
| r3 = r2 |
| goto L3 |
| L2: |
| r4 = y ^ 1 |
| r5 = r4 |
| r6 = CPyLong_AsInt64(r5) |
| r3 = r6 |
| keep_alive y |
| L3: |
| x = r3 |
| return x |
| def g(x, y): |
| x :: i64 |
| y :: int |
| r0, r1 :: bit |
| r2, r3, r4 :: int |
| L0: |
| r0 = x <= 4611686018427387903 :: signed |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| r1 = x >= -4611686018427387904 :: signed |
| if r1 goto L3 else goto L2 :: bool |
| L2: |
| r2 = CPyTagged_FromInt64(x) |
| r3 = r2 |
| goto L4 |
| L3: |
| r4 = x << 1 |
| r3 = r4 |
| L4: |
| y = r3 |
| return y |
| |
| [case testBorrowOverI64Arithmetic] |
| from mypy_extensions import i64 |
| |
| def add_simple(c: C) -> i64: |
| return c.x + c.y |
| |
| def inplace_add_simple(c: C) -> None: |
| c.x += c.y |
| |
| def add_borrow(d: D) -> i64: |
| return d.c.x + d.c.y |
| |
| class D: |
| c: C |
| |
| class C: |
| x: i64 |
| y: i64 |
| [out] |
| def add_simple(c): |
| c :: __main__.C |
| r0, r1, r2 :: i64 |
| L0: |
| r0 = c.x |
| r1 = c.y |
| r2 = r0 + r1 |
| return r2 |
| def inplace_add_simple(c): |
| c :: __main__.C |
| r0, r1, r2 :: i64 |
| r3 :: bool |
| L0: |
| r0 = c.x |
| r1 = c.y |
| r2 = r0 + r1 |
| c.x = r2; r3 = is_error |
| return 1 |
| def add_borrow(d): |
| d :: __main__.D |
| r0 :: __main__.C |
| r1 :: i64 |
| r2 :: __main__.C |
| r3, r4 :: i64 |
| L0: |
| r0 = borrow d.c |
| r1 = r0.x |
| r2 = borrow d.c |
| r3 = r2.y |
| r4 = r1 + r3 |
| keep_alive d, d |
| return r4 |
| |
| [case testBorrowOverI64Bitwise] |
| from mypy_extensions import i64 |
| |
| def bitwise_simple(c: C) -> i64: |
| return c.x | c.y |
| |
| def inplace_bitwide_simple(c: C) -> None: |
| c.x &= c.y |
| |
| def bitwise_borrow(d: D) -> i64: |
| return d.c.x ^ d.c.y |
| |
| class D: |
| c: C |
| |
| class C: |
| x: i64 |
| y: i64 |
| [out] |
| def bitwise_simple(c): |
| c :: __main__.C |
| r0, r1, r2 :: i64 |
| L0: |
| r0 = c.x |
| r1 = c.y |
| r2 = r0 | r1 |
| return r2 |
| def inplace_bitwide_simple(c): |
| c :: __main__.C |
| r0, r1, r2 :: i64 |
| r3 :: bool |
| L0: |
| r0 = c.x |
| r1 = c.y |
| r2 = r0 & r1 |
| c.x = r2; r3 = is_error |
| return 1 |
| def bitwise_borrow(d): |
| d :: __main__.D |
| r0 :: __main__.C |
| r1 :: i64 |
| r2 :: __main__.C |
| r3, r4 :: i64 |
| L0: |
| r0 = borrow d.c |
| r1 = r0.x |
| r2 = borrow d.c |
| r3 = r2.y |
| r4 = r1 ^ r3 |
| keep_alive d, d |
| return r4 |
| |
| [case testBorrowOverI64ListGetItem1] |
| from mypy_extensions import i64 |
| |
| def f(n: i64) -> str: |
| a = [C()] |
| return a[n].s |
| |
| class C: |
| s: str |
| [out] |
| def f(n): |
| n :: i64 |
| r0 :: __main__.C |
| r1 :: list |
| r2, r3 :: ptr |
| a :: list |
| r4 :: object |
| r5 :: __main__.C |
| r6 :: str |
| L0: |
| r0 = C() |
| r1 = PyList_New(1) |
| r2 = get_element_ptr r1 ob_item :: PyListObject |
| r3 = load_mem r2 :: ptr* |
| set_mem r3, r0 :: builtins.object* |
| keep_alive r1 |
| a = r1 |
| r4 = CPyList_GetItemInt64Borrow(a, n) |
| r5 = borrow cast(__main__.C, r4) |
| r6 = r5.s |
| keep_alive a, n, r4 |
| return r6 |
| |
| [case testBorrowOverI64ListGetItem2] |
| from typing import List |
| from mypy_extensions import i64 |
| |
| def f(a: List[i64], n: i64) -> bool: |
| if a[n] == 0: |
| return True |
| return False |
| [out] |
| def f(a, n): |
| a :: list |
| n :: i64 |
| r0 :: object |
| r1 :: i64 |
| r2 :: bit |
| L0: |
| r0 = CPyList_GetItemInt64Borrow(a, n) |
| r1 = unbox(i64, r0) |
| r2 = r1 == 0 |
| keep_alive a, n |
| if r2 goto L1 else goto L2 :: bool |
| L1: |
| return 1 |
| L2: |
| return 0 |
| |
| [case testCoerceShortIntToI64] |
| from mypy_extensions import i64 |
| from typing import List |
| |
| def f(a: List[i64], y: i64) -> bool: |
| if len(a) < y: |
| return True |
| return False |
| |
| def g(a: List[i64], y: i64) -> bool: |
| if y < len(a): |
| return True |
| return False |
| [out] |
| def f(a, y): |
| a :: list |
| y :: i64 |
| r0 :: ptr |
| r1 :: native_int |
| r2 :: short_int |
| r3 :: i64 |
| r4 :: bit |
| L0: |
| r0 = get_element_ptr a ob_size :: PyVarObject |
| r1 = load_mem r0 :: native_int* |
| keep_alive a |
| r2 = r1 << 1 |
| r3 = r2 >> 1 |
| r4 = r3 < y :: signed |
| if r4 goto L1 else goto L2 :: bool |
| L1: |
| return 1 |
| L2: |
| return 0 |
| def g(a, y): |
| a :: list |
| y :: i64 |
| r0 :: ptr |
| r1 :: native_int |
| r2 :: short_int |
| r3 :: i64 |
| r4 :: bit |
| L0: |
| r0 = get_element_ptr a ob_size :: PyVarObject |
| r1 = load_mem r0 :: native_int* |
| keep_alive a |
| r2 = r1 << 1 |
| r3 = r2 >> 1 |
| r4 = y < r3 :: signed |
| if r4 goto L1 else goto L2 :: bool |
| L1: |
| return 1 |
| L2: |
| return 0 |
| |
| [case testMultiplyListByI64_64bit] |
| from mypy_extensions import i64 |
| from typing import List |
| |
| def f(n: i64) -> List[i64]: |
| return [n] * n |
| [out] |
| def f(n): |
| n :: i64 |
| r0 :: list |
| r1 :: object |
| r2, r3 :: ptr |
| r4, r5 :: bit |
| r6, r7, r8 :: int |
| r9 :: list |
| L0: |
| r0 = PyList_New(1) |
| r1 = box(i64, n) |
| r2 = get_element_ptr r0 ob_item :: PyListObject |
| r3 = load_mem r2 :: ptr* |
| set_mem r3, r1 :: builtins.object* |
| keep_alive r0 |
| r4 = n <= 4611686018427387903 :: signed |
| if r4 goto L1 else goto L2 :: bool |
| L1: |
| r5 = n >= -4611686018427387904 :: signed |
| if r5 goto L3 else goto L2 :: bool |
| L2: |
| r6 = CPyTagged_FromInt64(n) |
| r7 = r6 |
| goto L4 |
| L3: |
| r8 = n << 1 |
| r7 = r8 |
| L4: |
| r9 = CPySequence_Multiply(r0, r7) |
| return r9 |
| |
| [case testShortIntAndI64Op] |
| from mypy_extensions import i64 |
| from typing import List |
| |
| def add_i64(a: List[i64], n: i64) -> i64: |
| return len(a) + n |
| def add_i64_2(a: List[i64], n: i64) -> i64: |
| return n + len(a) |
| def eq_i64(a: List[i64], n: i64) -> bool: |
| if len(a) == n: |
| return True |
| return False |
| def lt_i64(a: List[i64], n: i64) -> bool: |
| if n < len(a): |
| return True |
| return False |
| [out] |
| def add_i64(a, n): |
| a :: list |
| n :: i64 |
| r0 :: ptr |
| r1 :: native_int |
| r2 :: short_int |
| r3, r4 :: i64 |
| L0: |
| r0 = get_element_ptr a ob_size :: PyVarObject |
| r1 = load_mem r0 :: native_int* |
| keep_alive a |
| r2 = r1 << 1 |
| r3 = r2 >> 1 |
| r4 = r3 + n |
| return r4 |
| def add_i64_2(a, n): |
| a :: list |
| n :: i64 |
| r0 :: ptr |
| r1 :: native_int |
| r2 :: short_int |
| r3, r4 :: i64 |
| L0: |
| r0 = get_element_ptr a ob_size :: PyVarObject |
| r1 = load_mem r0 :: native_int* |
| keep_alive a |
| r2 = r1 << 1 |
| r3 = r2 >> 1 |
| r4 = n + r3 |
| return r4 |
| def eq_i64(a, n): |
| a :: list |
| n :: i64 |
| r0 :: ptr |
| r1 :: native_int |
| r2 :: short_int |
| r3 :: i64 |
| r4 :: bit |
| L0: |
| r0 = get_element_ptr a ob_size :: PyVarObject |
| r1 = load_mem r0 :: native_int* |
| keep_alive a |
| r2 = r1 << 1 |
| r3 = r2 >> 1 |
| r4 = r3 == n |
| if r4 goto L1 else goto L2 :: bool |
| L1: |
| return 1 |
| L2: |
| return 0 |
| def lt_i64(a, n): |
| a :: list |
| n :: i64 |
| r0 :: ptr |
| r1 :: native_int |
| r2 :: short_int |
| r3 :: i64 |
| r4 :: bit |
| L0: |
| r0 = get_element_ptr a ob_size :: PyVarObject |
| r1 = load_mem r0 :: native_int* |
| keep_alive a |
| r2 = r1 << 1 |
| r3 = r2 >> 1 |
| r4 = n < r3 :: signed |
| if r4 goto L1 else goto L2 :: bool |
| L1: |
| return 1 |
| L2: |
| return 0 |
| |
| [case testOptionalI64_64bit] |
| from typing import Optional |
| from mypy_extensions import i64 |
| |
| def f(x: Optional[i64]) -> i64: |
| if x is None: |
| return 1 |
| return x |
| [out] |
| def f(x): |
| x :: union[i64, None] |
| r0 :: object |
| r1 :: bit |
| r2 :: i64 |
| L0: |
| r0 = load_address _Py_NoneStruct |
| r1 = x == r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| return 1 |
| L2: |
| r2 = unbox(i64, x) |
| return r2 |
| |
| [case testI64DefaultValueSingle] |
| from mypy_extensions import i64 |
| |
| def f(x: i64, y: i64 = 0) -> i64: |
| return x + y |
| |
| def g() -> i64: |
| return f(7) + f(8, 9) |
| [out] |
| def f(x, y, __bitmap): |
| x, y :: i64 |
| __bitmap, r0 :: u32 |
| r1 :: bit |
| r2 :: i64 |
| L0: |
| r0 = __bitmap & 1 |
| r1 = r0 == 0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| y = 0 |
| L2: |
| r2 = x + y |
| return r2 |
| def g(): |
| r0, r1, r2 :: i64 |
| L0: |
| r0 = f(7, 0, 0) |
| r1 = f(8, 9, 1) |
| r2 = r0 + r1 |
| return r2 |
| |
| [case testI64DefaultValueWithMultipleArgs] |
| from mypy_extensions import i64 |
| |
| def f(a: i64, b: i64 = 1, c: int = 2, d: i64 = 3) -> i64: |
| return 0 |
| |
| def g() -> i64: |
| return f(7) + f(8, 9) + f(1, 2, 3) + f(4, 5, 6, 7) |
| [out] |
| def f(a, b, c, d, __bitmap): |
| a, b :: i64 |
| c :: int |
| d :: 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: |
| b = 1 |
| L2: |
| if is_error(c) goto L3 else goto L4 |
| L3: |
| c = 4 |
| L4: |
| r2 = __bitmap & 2 |
| r3 = r2 == 0 |
| if r3 goto L5 else goto L6 :: bool |
| L5: |
| d = 3 |
| L6: |
| return 0 |
| def g(): |
| r0 :: int |
| r1 :: i64 |
| r2 :: int |
| r3, r4, r5, r6, r7, r8 :: i64 |
| L0: |
| r0 = <error> :: int |
| r1 = f(7, 0, r0, 0, 0) |
| r2 = <error> :: int |
| r3 = f(8, 9, r2, 0, 1) |
| r4 = r1 + r3 |
| r5 = f(1, 2, 6, 0, 1) |
| r6 = r4 + r5 |
| r7 = f(4, 5, 12, 7, 3) |
| r8 = r6 + r7 |
| return r8 |
| |
| [case testI64MethodDefaultValue] |
| from mypy_extensions import i64 |
| |
| class C: |
| def m(self, x: i64 = 5) -> None: |
| pass |
| |
| def f(c: C) -> None: |
| c.m() |
| c.m(6) |
| [out] |
| def C.m(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 = 5 |
| L2: |
| return 1 |
| def f(c): |
| c :: __main__.C |
| r0, r1 :: None |
| L0: |
| r0 = c.m(0, 0) |
| r1 = c.m(6, 1) |
| return 1 |
| |
| [case testI64ExplicitConversionFromNativeInt] |
| from mypy_extensions import i64, i32, i16 |
| |
| def from_i16(x: i16) -> i64: |
| return i64(x) |
| |
| def from_i32(x: i32) -> i64: |
| return i64(x) |
| |
| def from_i64(x: i64) -> i64: |
| return i64(x) |
| [out] |
| def from_i16(x): |
| x :: i16 |
| r0 :: i64 |
| L0: |
| r0 = extend signed x: i16 to i64 |
| return r0 |
| def from_i32(x): |
| x :: i32 |
| r0 :: i64 |
| L0: |
| r0 = extend signed x: i32 to i64 |
| return r0 |
| def from_i64(x): |
| x :: i64 |
| L0: |
| return x |
| |
| [case testI64ExplicitConversionFromInt_64bit] |
| from mypy_extensions import i64 |
| |
| def f(x: int) -> i64: |
| return i64(x) |
| [out] |
| def f(x): |
| x :: int |
| r0 :: native_int |
| r1 :: bit |
| r2, r3 :: i64 |
| r4 :: ptr |
| r5 :: c_ptr |
| r6 :: i64 |
| L0: |
| r0 = x & 1 |
| r1 = r0 == 0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = x >> 1 |
| r3 = r2 |
| goto L3 |
| L2: |
| r4 = x ^ 1 |
| r5 = r4 |
| r6 = CPyLong_AsInt64(r5) |
| r3 = r6 |
| keep_alive x |
| L3: |
| return r3 |
| |
| [case testI64ExplicitConversionToInt_64bit] |
| from mypy_extensions import i64 |
| |
| def f(x: i64) -> int: |
| return int(x) |
| [out] |
| def f(x): |
| x :: i64 |
| r0, r1 :: bit |
| r2, r3, r4 :: int |
| L0: |
| r0 = x <= 4611686018427387903 :: signed |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| r1 = x >= -4611686018427387904 :: signed |
| if r1 goto L3 else goto L2 :: bool |
| L2: |
| r2 = CPyTagged_FromInt64(x) |
| r3 = r2 |
| goto L4 |
| L3: |
| r4 = x << 1 |
| r3 = r4 |
| L4: |
| return r3 |
| |
| [case testI64ExplicitConversionFromLiteral] |
| from mypy_extensions import i64 |
| |
| def f() -> None: |
| x = i64(0) |
| y = i64(11) |
| z = i64(-3) |
| [out] |
| def f(): |
| x, y, z :: i64 |
| L0: |
| x = 0 |
| y = 11 |
| z = -3 |
| return 1 |
| |
| [case testI64ForLoopOverRange] |
| from mypy_extensions import i64 |
| |
| def f() -> None: |
| for x in range(i64(4)): |
| y = x |
| [out] |
| def f(): |
| r0, x :: i64 |
| r1 :: bit |
| y, r2 :: i64 |
| L0: |
| r0 = 0 |
| x = r0 |
| L1: |
| r1 = r0 < 4 :: signed |
| if r1 goto L2 else goto L4 :: bool |
| L2: |
| y = x |
| L3: |
| r2 = r0 + 1 |
| r0 = r2 |
| x = r2 |
| goto L1 |
| L4: |
| return 1 |
| |
| [case testI64ForLoopOverRange2] |
| from mypy_extensions import i64 |
| |
| def f() -> None: |
| for x in range(0, i64(4)): |
| y = x |
| [out] |
| def f(): |
| r0, x :: i64 |
| r1 :: bit |
| y, r2 :: i64 |
| L0: |
| r0 = 0 |
| x = r0 |
| L1: |
| r1 = r0 < 4 :: signed |
| if r1 goto L2 else goto L4 :: bool |
| L2: |
| y = x |
| L3: |
| r2 = r0 + 1 |
| r0 = r2 |
| x = r2 |
| goto L1 |
| L4: |
| return 1 |
| |
| [case testI64MethodDefaultValueOverride] |
| from mypy_extensions import i64 |
| |
| class C: |
| def f(self, x: i64 = 11) -> None: pass |
| class D(C): |
| def f(self, x: i64 = 12) -> 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, __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 = 12 |
| L2: |
| return 1 |
| |
| [case testI64FinalConstants] |
| from typing_extensions import Final |
| from mypy_extensions import i64 |
| |
| A: Final = -1 |
| B: Final = -(1 + 3*2) |
| C: Final = 0 |
| D: Final = A - B |
| E: Final[i64] = 1 + 3 |
| |
| def f1() -> i64: |
| return A |
| |
| def f2() -> i64: |
| return A + B |
| |
| def f3() -> i64: |
| return C |
| |
| def f4() -> i64: |
| return D |
| |
| def f5() -> i64: |
| return E |
| [out] |
| def f1(): |
| L0: |
| return -1 |
| def f2(): |
| L0: |
| return -8 |
| def f3(): |
| L0: |
| return 0 |
| def f4(): |
| L0: |
| return 6 |
| def f5(): |
| L0: |
| return 4 |
| |
| [case testI64OperationsWithBools] |
| from mypy_extensions import i64 |
| |
| # TODO: Other mixed operations |
| |
| def add_bool_to_int(n: i64, b: bool) -> i64: |
| return n + b |
| |
| def compare_bool_to_i64(n: i64, b: bool) -> bool: |
| if n == b: |
| return b != n |
| return True |
| [out] |
| def add_bool_to_int(n, b): |
| n :: i64 |
| b :: bool |
| r0, r1 :: i64 |
| L0: |
| r0 = extend b: builtins.bool to i64 |
| r1 = n + r0 |
| return r1 |
| def compare_bool_to_i64(n, b): |
| n :: i64 |
| b :: bool |
| r0 :: i64 |
| r1 :: bit |
| r2 :: i64 |
| r3 :: bit |
| L0: |
| r0 = extend b: builtins.bool to i64 |
| r1 = n == r0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = extend b: builtins.bool to i64 |
| r3 = r2 != n |
| return r3 |
| L2: |
| return 1 |
| |
| [case testI64Cast_64bit] |
| from typing import cast |
| from mypy_extensions import i64 |
| |
| def cast_object(o: object) -> i64: |
| return cast(i64, o) |
| |
| def cast_int(x: int) -> i64: |
| return cast(i64, x) |
| [out] |
| def cast_object(o): |
| o :: object |
| r0 :: i64 |
| L0: |
| r0 = unbox(i64, o) |
| return r0 |
| def cast_int(x): |
| x :: int |
| r0 :: native_int |
| r1 :: bit |
| r2, r3 :: i64 |
| r4 :: ptr |
| r5 :: c_ptr |
| r6 :: i64 |
| L0: |
| r0 = x & 1 |
| r1 = r0 == 0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = x >> 1 |
| r3 = r2 |
| goto L3 |
| L2: |
| r4 = x ^ 1 |
| r5 = r4 |
| r6 = CPyLong_AsInt64(r5) |
| r3 = r6 |
| keep_alive x |
| L3: |
| return r3 |
| |
| [case testI64Cast_32bit] |
| from typing import cast |
| from mypy_extensions import i64 |
| |
| def cast_int(x: int) -> i64: |
| return cast(i64, x) |
| [out] |
| def cast_int(x): |
| x :: int |
| r0 :: native_int |
| r1 :: bit |
| r2, r3, r4 :: i64 |
| r5 :: ptr |
| r6 :: c_ptr |
| r7 :: i64 |
| L0: |
| r0 = x & 1 |
| r1 = r0 == 0 |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = extend signed x: builtins.int to i64 |
| r3 = r2 >> 1 |
| r4 = r3 |
| goto L3 |
| L2: |
| r5 = x ^ 1 |
| r6 = r5 |
| r7 = CPyLong_AsInt64(r6) |
| r4 = r7 |
| keep_alive x |
| L3: |
| return r4 |
| |
| [case testI64ExplicitConversionFromVariousTypes_64bit] |
| from mypy_extensions import i64 |
| |
| def bool_to_i64(b: bool) -> i64: |
| return i64(b) |
| |
| def str_to_i64(s: str) -> i64: |
| return i64(s) |
| |
| def str_to_i64_with_base(s: str) -> i64: |
| return i64(s, 2) |
| |
| class C: |
| def __int__(self) -> i64: |
| return 5 |
| |
| def instance_to_i64(c: C) -> i64: |
| return i64(c) |
| |
| def float_to_i64(x: float) -> i64: |
| return i64(x) |
| [out] |
| def bool_to_i64(b): |
| b :: bool |
| r0 :: i64 |
| L0: |
| r0 = extend b: builtins.bool to i64 |
| return r0 |
| def str_to_i64(s): |
| s :: str |
| r0 :: object |
| r1 :: i64 |
| L0: |
| r0 = CPyLong_FromStr(s) |
| r1 = unbox(i64, r0) |
| return r1 |
| def str_to_i64_with_base(s): |
| s :: str |
| r0 :: object |
| r1 :: i64 |
| L0: |
| r0 = CPyLong_FromStrWithBase(s, 4) |
| r1 = unbox(i64, r0) |
| return r1 |
| def C.__int__(self): |
| self :: __main__.C |
| L0: |
| return 5 |
| def instance_to_i64(c): |
| c :: __main__.C |
| r0 :: i64 |
| L0: |
| r0 = c.__int__() |
| return r0 |
| def float_to_i64(x): |
| x :: float |
| r0 :: int |
| r1 :: native_int |
| r2 :: bit |
| r3, r4 :: i64 |
| r5 :: ptr |
| r6 :: c_ptr |
| r7 :: i64 |
| L0: |
| r0 = CPyTagged_FromFloat(x) |
| r1 = r0 & 1 |
| r2 = r1 == 0 |
| if r2 goto L1 else goto L2 :: bool |
| L1: |
| r3 = r0 >> 1 |
| r4 = r3 |
| goto L3 |
| L2: |
| r5 = r0 ^ 1 |
| r6 = r5 |
| r7 = CPyLong_AsInt64(r6) |
| r4 = r7 |
| keep_alive r0 |
| L3: |
| return r4 |
| |
| [case testI64ExplicitConversionFromFloat_32bit] |
| from mypy_extensions import i64 |
| |
| def float_to_i64(x: float) -> i64: |
| return i64(x) |
| [out] |
| def float_to_i64(x): |
| x :: float |
| r0 :: int |
| r1 :: native_int |
| r2 :: bit |
| r3, r4, r5 :: i64 |
| r6 :: ptr |
| r7 :: c_ptr |
| r8 :: i64 |
| L0: |
| r0 = CPyTagged_FromFloat(x) |
| r1 = r0 & 1 |
| r2 = r1 == 0 |
| if r2 goto L1 else goto L2 :: bool |
| L1: |
| r3 = extend signed r0: builtins.int to i64 |
| r4 = r3 >> 1 |
| r5 = r4 |
| goto L3 |
| L2: |
| r6 = r0 ^ 1 |
| r7 = r6 |
| r8 = CPyLong_AsInt64(r7) |
| r5 = r8 |
| keep_alive r0 |
| L3: |
| return r5 |
| |
| [case testI64ConvertToFloat_64bit] |
| from mypy_extensions import i64 |
| |
| def i64_to_float(x: i64) -> float: |
| return float(x) |
| [out] |
| def i64_to_float(x): |
| x :: i64 |
| r0, r1 :: bit |
| r2, r3, r4 :: int |
| r5 :: float |
| L0: |
| r0 = x <= 4611686018427387903 :: signed |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| r1 = x >= -4611686018427387904 :: signed |
| if r1 goto L3 else goto L2 :: bool |
| L2: |
| r2 = CPyTagged_FromInt64(x) |
| r3 = r2 |
| goto L4 |
| L3: |
| r4 = x << 1 |
| r3 = r4 |
| L4: |
| r5 = CPyFloat_FromTagged(r3) |
| return r5 |
| |
| [case testI64ConvertToFloat_32bit] |
| from mypy_extensions import i64 |
| |
| def i64_to_float(x: i64) -> float: |
| return float(x) |
| [out] |
| def i64_to_float(x): |
| x :: i64 |
| r0, r1 :: bit |
| r2, r3 :: int |
| r4 :: native_int |
| r5 :: int |
| r6 :: float |
| L0: |
| r0 = x <= 1073741823 :: signed |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| r1 = x >= -1073741824 :: signed |
| if r1 goto L3 else goto L2 :: bool |
| L2: |
| r2 = CPyTagged_FromInt64(x) |
| r3 = r2 |
| goto L4 |
| L3: |
| r4 = truncate x: i64 to native_int |
| r5 = r4 << 1 |
| r3 = r5 |
| L4: |
| r6 = CPyFloat_FromTagged(r3) |
| return r6 |
| |
| [case testI64IsinstanceNarrowing] |
| from typing import Union |
| from mypy_extensions import i64 |
| |
| class C: |
| a: i64 |
| |
| def narrow1(x: Union[C, i64]) -> i64: |
| if isinstance(x, i64): |
| return x |
| return x.a |
| |
| def narrow2(x: Union[C, i64]) -> i64: |
| if isinstance(x, int): |
| return x |
| return x.a |
| [out] |
| def narrow1(x): |
| x :: union[__main__.C, i64] |
| r0 :: object |
| r1 :: i32 |
| r2 :: bit |
| r3 :: bool |
| r4 :: i64 |
| r5 :: __main__.C |
| r6 :: i64 |
| L0: |
| r0 = load_address PyLong_Type |
| r1 = PyObject_IsInstance(x, r0) |
| r2 = r1 >= 0 :: signed |
| r3 = truncate r1: i32 to builtins.bool |
| if r3 goto L1 else goto L2 :: bool |
| L1: |
| r4 = unbox(i64, x) |
| return r4 |
| L2: |
| r5 = borrow cast(__main__.C, x) |
| r6 = r5.a |
| keep_alive x |
| return r6 |
| def narrow2(x): |
| x :: union[__main__.C, i64] |
| r0 :: object |
| r1 :: i32 |
| r2 :: bit |
| r3 :: bool |
| r4 :: i64 |
| r5 :: __main__.C |
| r6 :: i64 |
| L0: |
| r0 = load_address PyLong_Type |
| r1 = PyObject_IsInstance(x, r0) |
| r2 = r1 >= 0 :: signed |
| r3 = truncate r1: i32 to builtins.bool |
| if r3 goto L1 else goto L2 :: bool |
| L1: |
| r4 = unbox(i64, x) |
| return r4 |
| L2: |
| r5 = borrow cast(__main__.C, x) |
| r6 = r5.a |
| keep_alive x |
| return r6 |
| |
| [case testI64ConvertBetweenTuples_64bit] |
| from __future__ import annotations |
| from mypy_extensions import i64 |
| |
| def f(t: tuple[int, i64, int]) -> None: |
| tt: tuple[int, i64, i64] = t |
| |
| def g(n: int) -> None: |
| t: tuple[i64, i64] = (1, n) |
| [out] |
| def f(t): |
| t :: tuple[int, i64, int] |
| r0 :: int |
| r1 :: i64 |
| r2 :: int |
| r3 :: native_int |
| r4 :: bit |
| r5, r6 :: i64 |
| r7 :: ptr |
| r8 :: c_ptr |
| r9 :: i64 |
| r10, tt :: tuple[int, i64, i64] |
| L0: |
| r0 = t[0] |
| r1 = t[1] |
| r2 = t[2] |
| r3 = r2 & 1 |
| r4 = r3 == 0 |
| if r4 goto L1 else goto L2 :: bool |
| L1: |
| r5 = r2 >> 1 |
| r6 = r5 |
| goto L3 |
| L2: |
| r7 = r2 ^ 1 |
| r8 = r7 |
| r9 = CPyLong_AsInt64(r8) |
| r6 = r9 |
| keep_alive r2 |
| L3: |
| r10 = (r0, r1, r6) |
| tt = r10 |
| return 1 |
| def g(n): |
| n :: int |
| r0 :: tuple[int, int] |
| r1 :: int |
| r2 :: native_int |
| r3 :: bit |
| r4, r5 :: i64 |
| r6 :: ptr |
| r7 :: c_ptr |
| r8 :: i64 |
| r9, t :: tuple[i64, i64] |
| L0: |
| r0 = (2, n) |
| r1 = r0[1] |
| r2 = r1 & 1 |
| r3 = r2 == 0 |
| if r3 goto L1 else goto L2 :: bool |
| L1: |
| r4 = r1 >> 1 |
| r5 = r4 |
| goto L3 |
| L2: |
| r6 = r1 ^ 1 |
| r7 = r6 |
| r8 = CPyLong_AsInt64(r7) |
| r5 = r8 |
| keep_alive r1 |
| L3: |
| r9 = (1, r5) |
| t = r9 |
| return 1 |