blob: c7757cd155bc53a9e07f99c52d77e326463ce98a [file] [log] [blame] [edit]
-- Test cases for vec[i64]. These also partially cover other unboxed item types,
-- which use a similar runtime representation.
[case testVecI64CreateEmpty]
from librt.vecs import vec, append
from mypy_extensions import i64
def f() -> vec[i64]:
return vec[i64]()
[out]
def f():
r0 :: vec[i64]
L0:
r0 = VecI64Api.alloc(0, 0)
return r0
[case testVecI64Len_64bit]
from librt.vecs import vec
from mypy_extensions import i64
def f(v: vec[i64]) -> i64:
l = len(v)
return l
[out]
def f(v):
v :: vec[i64]
r0 :: native_int
l :: i64
L0:
r0 = v.len
l = r0
return l
[case testVecI64Len_32bit]
from librt.vecs import vec
from mypy_extensions import i64
def f(v: vec[i64]) -> i64:
l = len(v)
return l
[out]
def f(v):
v :: vec[i64]
r0 :: native_int
r1, l :: i64
L0:
r0 = v.len
r1 = extend signed r0: native_int to i64
l = r1
return l
[case testVecI64GetItem_64bit]
from librt.vecs import vec
from mypy_extensions import i64
def f(v: vec[i64], i: i64) -> i64:
return v[i]
[out]
def f(v, i):
v :: vec[i64]
i :: i64
r0 :: native_int
r1 :: bit
r2 :: i64
r3 :: bit
r4 :: bool
r5 :: i64
r6 :: object
r7 :: ptr
r8 :: i64
r9 :: ptr
r10 :: i64
L0:
r0 = v.len
r1 = i < r0 :: unsigned
if r1 goto L4 else goto L1 :: bool
L1:
r2 = i + r0
r3 = r2 < r0 :: unsigned
if r3 goto L3 else goto L2 :: bool
L2:
r4 = raise IndexError
unreachable
L3:
r5 = r2
goto L5
L4:
r5 = i
L5:
r6 = v.buf
r7 = get_element_ptr r6 items :: VecI64BufObject
r8 = r5 * 8
r9 = r7 + r8
r10 = load_mem r9 :: i64*
keep_alive v
return r10
[case testVecI64GetItem_32bit]
# The IR is quite verbose, but it's acceptable since 32-bit targets are not common any more
from librt.vecs import vec
from mypy_extensions import i64
def f(v: vec[i64], i: i64) -> i64:
return v[i]
[out]
def f(v, i):
v :: vec[i64]
i :: i64
r0 :: native_int
r1 :: i64
r2 :: bit
r3 :: i64
r4 :: bit
r5 :: bool
r6 :: i64
r7, r8 :: bit
r9 :: native_int
r10 :: object
r11 :: ptr
r12 :: native_int
r13 :: ptr
r14 :: i64
L0:
r0 = v.len
r1 = extend signed r0: native_int to i64
r2 = i < r1 :: unsigned
if r2 goto L4 else goto L1 :: bool
L1:
r3 = i + r1
r4 = r3 < r1 :: unsigned
if r4 goto L3 else goto L2 :: bool
L2:
r5 = raise IndexError
unreachable
L3:
r6 = r3
goto L5
L4:
r6 = i
L5:
r7 = r6 < 2147483648 :: signed
if r7 goto L6 else goto L8 :: bool
L6:
r8 = r6 >= -2147483648 :: signed
if r8 goto L7 else goto L8 :: bool
L7:
r9 = truncate r6: i64 to native_int
goto L9
L8:
CPyInt32_Overflow()
unreachable
L9:
r10 = v.buf
r11 = get_element_ptr r10 items :: VecI64BufObject
r12 = r9 * 8
r13 = r11 + r12
r14 = load_mem r13 :: i64*
keep_alive v
return r14
[case testVecI64Append]
from librt.vecs import vec, append
from mypy_extensions import i64
def f(v: vec[i64], i: i64) -> vec[i64]:
return append(v, i)
[out]
def f(v, i):
v :: vec[i64]
i :: i64
r0 :: vec[i64]
L0:
r0 = VecI64Api.append(v, i)
return r0
[case testVecI64SetItem_64bit]
from librt.vecs import vec
from mypy_extensions import i64
def f(v: vec[i64], i: i64, x: i64) -> None:
v[i] = x
[out]
def f(v, i, x):
v :: vec[i64]
i, x :: i64
r0 :: native_int
r1 :: bit
r2 :: i64
r3 :: bit
r4 :: bool
r5 :: i64
r6 :: object
r7 :: ptr
r8 :: i64
r9 :: ptr
L0:
r0 = v.len
r1 = i < r0 :: unsigned
if r1 goto L4 else goto L1 :: bool
L1:
r2 = i + r0
r3 = r2 < r0 :: unsigned
if r3 goto L3 else goto L2 :: bool
L2:
r4 = raise IndexError
unreachable
L3:
r5 = r2
goto L5
L4:
r5 = i
L5:
r6 = v.buf
r7 = get_element_ptr r6 items :: VecI64BufObject
r8 = r5 * 8
r9 = r7 + r8
set_mem r9, x :: i64*
keep_alive v
return 1
[case testVecI64ConstructFromListExpr]
from librt.vecs import vec
from mypy_extensions import i64
def f() -> vec[i64]:
return vec[i64]([1, 5, 14])
[out]
def f():
r0 :: vec[i64]
r1 :: object
r2, r3, r4, r5 :: ptr
L0:
r0 = VecI64Api.alloc(3, 3)
r1 = r0.buf
r2 = get_element_ptr r1 items :: VecI64BufObject
set_mem r2, 1 :: i64*
r3 = r2 + 8
set_mem r3, 5 :: i64*
r4 = r3 + 8
set_mem r4, 14 :: i64*
r5 = r4 + 8
keep_alive r0
return r0
[case testVecI64ConstructFromListMultiply_64bit]
from librt.vecs import vec
from mypy_extensions import i64
def f(n: i64) -> vec[i64]:
return vec[i64]([3] * n)
[out]
def f(n):
n :: i64
r0 :: vec[i64]
r1 :: object
r2 :: ptr
r3 :: i64
r4, r5 :: ptr
r6 :: bit
r7 :: ptr
L0:
r0 = VecI64Api.alloc(n, n)
r1 = r0.buf
r2 = get_element_ptr r1 items :: VecI64BufObject
r3 = n * 8
r4 = r2 + r3
r5 = r2
L1:
r6 = r5 < r4 :: unsigned
if r6 goto L2 else goto L3 :: bool
L2:
set_mem r5, 3 :: i64*
r7 = r5 + 8
r5 = r7
goto L1
L3:
keep_alive r0
return r0
[case testVecI64ConstructFromListMultiply2]
from librt.vecs import vec
from mypy_extensions import i64
def f(n: i64, x: i64) -> vec[i64]:
return vec[i64]([x] * 3)
[out]
def f(n, x):
n, x :: i64
r0 :: vec[i64]
r1 :: object
r2 :: ptr
r3 :: native_int
r4, r5 :: ptr
r6 :: bit
r7 :: ptr
L0:
r0 = VecI64Api.alloc(3, 3)
r1 = r0.buf
r2 = get_element_ptr r1 items :: VecI64BufObject
r3 = 3 * 8
r4 = r2 + r3
r5 = r2
L1:
r6 = r5 < r4 :: unsigned
if r6 goto L2 else goto L3 :: bool
L2:
set_mem r5, x :: i64*
r7 = r5 + 8
r5 = r7
goto L1
L3:
keep_alive r0
return r0
[case testVecI64ConstructFromListComprehension]
from librt.vecs import vec
from mypy_extensions import i64
def f(n: i64) -> vec[i64]:
# TODO: Can we pre-allocate a vec with capacity 5?
return vec[i64]([x + 1 for x in range(i64(5))])
[out]
def f(n):
n :: i64
r0, r1 :: vec[i64]
r2, x :: i64
r3 :: bit
r4 :: i64
r5 :: vec[i64]
r6 :: i64
L0:
r0 = VecI64Api.alloc(0, 0)
r1 = r0
r2 = 0
x = r2
L1:
r3 = r2 < 5 :: signed
if r3 goto L2 else goto L4 :: bool
L2:
r4 = x + 1
r5 = VecI64Api.append(r1, r4)
r1 = r5
L3:
r6 = r2 + 1
r2 = r6
x = r6
goto L1
L4:
return r1
[case testVecI64FastComprehensionFromList]
from librt.vecs import vec
from mypy_extensions import i64
from typing import List
def f(n: i64, l: List[i64]) -> vec[i64]:
return vec[i64]([x + 1 for x in l])
[out]
def f(n, l):
n :: i64
l :: list
r0 :: native_int
r1 :: vec[i64]
r2, r3 :: native_int
r4 :: bit
r5 :: object
r6, x, r7 :: i64
r8 :: object
r9 :: ptr
r10 :: native_int
r11 :: ptr
r12 :: native_int
L0:
r0 = var_object_size l
r1 = VecI64Api.alloc(r0, r0)
r2 = 0
L1:
r3 = var_object_size l
r4 = r2 < r3 :: signed
if r4 goto L2 else goto L4 :: bool
L2:
r5 = list_get_item_unsafe l, r2
r6 = unbox(i64, r5)
x = r6
r7 = x + 1
r8 = r1.buf
r9 = get_element_ptr r8 items :: VecI64BufObject
r10 = r2 * 8
r11 = r9 + r10
set_mem r11, r7 :: i64*
keep_alive r1
L3:
r12 = r2 + 1
r2 = r12
goto L1
L4:
return r1
[case testVecI64FastComprehensionFromVec]
from librt.vecs import vec
from mypy_extensions import i64
from typing import List
def f(n: i64, v: vec[i64]) -> vec[i64]:
return vec[i64]([x + 1 for x in v])
[out]
def f(n, v):
n :: i64
v :: vec[i64]
r0 :: native_int
r1 :: vec[i64]
r2, r3 :: native_int
r4 :: bit
r5 :: object
r6 :: ptr
r7 :: native_int
r8 :: ptr
r9, x, r10 :: i64
r11 :: object
r12 :: ptr
r13 :: native_int
r14 :: ptr
r15 :: native_int
L0:
r0 = v.len
r1 = VecI64Api.alloc(r0, r0)
r2 = 0
L1:
r3 = v.len
r4 = r2 < r3 :: signed
if r4 goto L2 else goto L4 :: bool
L2:
r5 = v.buf
r6 = get_element_ptr r5 items :: VecI64BufObject
r7 = r2 * 8
r8 = r6 + r7
r9 = load_mem r8 :: i64*
x = r9
keep_alive v
r10 = x + 1
r11 = r1.buf
r12 = get_element_ptr r11 items :: VecI64BufObject
r13 = r2 * 8
r14 = r12 + r13
set_mem r14, r10 :: i64*
keep_alive r1
L3:
r15 = r2 + 1
r2 = r15
goto L1
L4:
return r1
[case testVecI64ConstructFromRange]
from librt.vecs import vec, pop
from mypy_extensions import i64
def f() -> vec[i64]:
# TODO: Can we pre-allocate a vec with capacity 7?
return vec[i64](range(7))
[out]
def f():
r0, r1 :: vec[i64]
r2 :: short_int
r3, ___tmp_6 :: i64
r4 :: bit
r5 :: vec[i64]
r6 :: short_int
r7 :: i64
L0:
r0 = VecI64Api.alloc(0, 0)
r1 = r0
r2 = 0
r3 = r2 >> 1
___tmp_6 = r3
L1:
r4 = int_lt r2, 14
if r4 goto L2 else goto L4 :: bool
L2:
r5 = VecI64Api.append(r1, ___tmp_6)
r1 = r5
L3:
r6 = r2 + 2
r2 = r6
r7 = r6 >> 1
___tmp_6 = r7
goto L1
L4:
return r1
[case testVecI64ForLoop]
from librt.vecs import vec
from mypy_extensions import i64
def f(v: vec[i64]) -> i64:
t: i64 = 0
for x in v:
t += 1
return t
[out]
def f(v):
v :: vec[i64]
t :: i64
r0, r1 :: native_int
r2 :: bit
r3 :: object
r4 :: ptr
r5 :: native_int
r6 :: ptr
r7, x, r8 :: i64
r9 :: native_int
L0:
t = 0
r0 = 0
L1:
r1 = v.len
r2 = r0 < r1 :: signed
if r2 goto L2 else goto L4 :: bool
L2:
r3 = v.buf
r4 = get_element_ptr r3 items :: VecI64BufObject
r5 = r0 * 8
r6 = r4 + r5
r7 = load_mem r6 :: i64*
x = r7
keep_alive v
r8 = t + 1
t = r8
L3:
r9 = r0 + 1
r0 = r9
goto L1
L4:
return t
[case testVecI64Contains]
from librt.vecs import vec
from mypy_extensions import i64
def contains(v: vec[i64], n: i64) -> bool:
return n in v
[out]
def contains(v, n):
v :: vec[i64]
n :: i64
r0 :: native_int
r1 :: object
r2 :: ptr
r3 :: native_int
r4, r5 :: ptr
r6 :: bit
r7 :: i64
r8 :: bit
r9 :: ptr
r10 :: bool
L0:
r0 = v.len
r1 = v.buf
r2 = get_element_ptr r1 items :: VecI64BufObject
r3 = r0 * 8
r4 = r2 + r3
r5 = r2
L1:
r6 = r5 < r4 :: unsigned
if r6 goto L2 else goto L4 :: bool
L2:
r7 = load_mem r5 :: i64*
r8 = r7 == n
if r8 goto L5 else goto L3 :: bool
L3:
r9 = r5 + 8
r5 = r9
goto L1
L4:
keep_alive v
r10 = 0
goto L6
L5:
r10 = 1
L6:
return r10
[case testVecI64GetItemWithInt_64bit]
from librt.vecs import vec
from mypy_extensions import i64
def f(v: vec[i64]) -> i64:
return v[0]
[out]
def f(v):
v :: vec[i64]
r0 :: native_int
r1 :: bit
r2 :: i64
r3 :: bit
r4 :: bool
r5 :: i64
r6 :: object
r7 :: ptr
r8 :: i64
r9 :: ptr
r10 :: i64
L0:
r0 = v.len
r1 = 0 < r0 :: unsigned
if r1 goto L4 else goto L1 :: bool
L1:
r2 = 0 + r0
r3 = r2 < r0 :: unsigned
if r3 goto L3 else goto L2 :: bool
L2:
r4 = raise IndexError
unreachable
L3:
r5 = r2
goto L5
L4:
r5 = 0
L5:
r6 = v.buf
r7 = get_element_ptr r6 items :: VecI64BufObject
r8 = r5 * 8
r9 = r7 + r8
r10 = load_mem r9 :: i64*
keep_alive v
return r10
[case testVecI64Slicing_64bit]
from librt.vecs import vec
from mypy_extensions import i64
def f(v: vec[i64], n: i64, m: i64) -> None:
a = v[:]
b = v[n:]
c = v[n:m]
d = v[:m]
e = v[1:-2]
[out]
def f(v, n, m):
v :: vec[i64]
n, m :: i64
r0, a, r1, b, r2, c, r3, d, r4, e :: vec[i64]
L0:
r0 = VecI64Api.slice(v, 0, 4611686018427387903)
a = r0
r1 = VecI64Api.slice(v, n, 4611686018427387903)
b = r1
r2 = VecI64Api.slice(v, n, m)
c = r2
r3 = VecI64Api.slice(v, 0, m)
d = r3
r4 = VecI64Api.slice(v, 1, -2)
e = r4
return 1
[case testVecI64Remove]
from librt.vecs import vec, remove
from mypy_extensions import i64
def rem(v: vec[i64], n: i64) -> None:
v = remove(v, n)
[out]
def rem(v, n):
v :: vec[i64]
n :: i64
r0 :: vec[i64]
L0:
r0 = VecI64Api.remove(v, n)
v = r0
return 1
[case testVecI64PopLast]
from typing import Tuple
from librt.vecs import vec, pop
from mypy_extensions import i64
def pop_last(v: vec[i64]) -> Tuple[vec[i64], i64]:
return pop(v)
[out]
def pop_last(v):
v :: vec[i64]
r0 :: tuple[vec[i64], i64]
L0:
r0 = VecI64Api.pop(v, -1)
return r0
[case testVecI64PopNth_64bit]
from typing import Tuple
from librt.vecs import vec, pop
from mypy_extensions import i64
def pop_nth(v: vec[i64], n: i64) -> Tuple[vec[i64], i64]:
return pop(v, n)
[out]
def pop_nth(v, n):
v :: vec[i64]
n :: i64
r0 :: tuple[vec[i64], i64]
L0:
r0 = VecI64Api.pop(v, n)
return r0
[case testVecI64InPlaceOp_64bit]
from librt.vecs import vec, remove
from mypy_extensions import i64
def inplace(v: vec[i64], n: i64, m: i64) -> None:
v[n] += m
[out]
def inplace(v, n, m):
v :: vec[i64]
n, m :: i64
r0 :: native_int
r1 :: bit
r2 :: i64
r3 :: bit
r4 :: bool
r5 :: i64
r6 :: object
r7 :: ptr
r8 :: i64
r9 :: ptr
r10, r11 :: i64
r12 :: native_int
r13 :: bit
r14 :: i64
r15 :: bit
r16 :: bool
r17 :: i64
r18 :: object
r19 :: ptr
r20 :: i64
r21 :: ptr
L0:
r0 = v.len
r1 = n < r0 :: unsigned
if r1 goto L4 else goto L1 :: bool
L1:
r2 = n + r0
r3 = r2 < r0 :: unsigned
if r3 goto L3 else goto L2 :: bool
L2:
r4 = raise IndexError
unreachable
L3:
r5 = r2
goto L5
L4:
r5 = n
L5:
r6 = v.buf
r7 = get_element_ptr r6 items :: VecI64BufObject
r8 = r5 * 8
r9 = r7 + r8
r10 = load_mem r9 :: i64*
keep_alive v
r11 = r10 + m
r12 = v.len
r13 = n < r12 :: unsigned
if r13 goto L9 else goto L6 :: bool
L6:
r14 = n + r12
r15 = r14 < r12 :: unsigned
if r15 goto L8 else goto L7 :: bool
L7:
r16 = raise IndexError
unreachable
L8:
r17 = r14
goto L10
L9:
r17 = n
L10:
r18 = v.buf
r19 = get_element_ptr r18 items :: VecI64BufObject
r20 = r17 * 8
r21 = r19 + r20
set_mem r21, r11 :: i64*
keep_alive v
return 1
[case testVecI64Narrow]
from librt.vecs import vec
from mypy_extensions import i64
from typing import Optional, Union
def f(x: Optional[vec[i64]]) -> None:
if x is not None:
len(x)
def g(x: Union[vec[i64], str]) -> None:
if isinstance(x, vec):
len(x)
[out]
def f(x):
x :: union[vec[i64], None]
r0 :: object
r1 :: bit
r2 :: vec[i64]
r3 :: native_int
L0:
r0 = load_address _Py_NoneStruct
r1 = x != r0
if r1 goto L1 else goto L2 :: bool
L1:
r2 = unbox(vec[i64], x)
r3 = r2.len
L2:
return 1
def g(x):
x :: union[vec[i64], str]
r0 :: bit
r1 :: vec[i64]
r2 :: native_int
L0:
r0 = CPyVec_Check(x)
if r0 goto L1 else goto L2 :: bool
L1:
r1 = unbox(vec[i64], x)
r2 = r1.len
L2:
return 1