blob: dd49d9475812fe2eeae3afcd6ec7d147233b7e6f [file] [edit]
-- Test cases for nested vecs
[case testVecNestedConvertToList]
from librt.vecs import vec
from mypy_extensions import i64
def to_list(v: vec[vec[i64]]) -> list[vec[i64]]:
return list(v)
[out]
def to_list(v):
v :: vec[vec[i64]]
r0 :: object
r1 :: list
L0:
r0 = box(vec[vec[i64]], v)
r1 = PySequence_List(r0)
return r1
[case testVecNestedConvertToTuple]
from librt.vecs import vec
from mypy_extensions import i64
def to_tuple(v: vec[vec[i64]]) -> tuple[vec[i64], ...]:
return tuple(v)
[out]
def to_tuple(v):
v :: vec[vec[i64]]
r0 :: object
r1 :: tuple
L0:
r0 = box(vec[vec[i64]], v)
r1 = PySequence_Tuple(r0)
return r1
[case testVecNestedConvertToSequenceEvaluatesArgOnce]
from librt.vecs import vec
from mypy_extensions import i64
def make() -> vec[vec[i64]]:
return vec[vec[i64]]()
def to_list() -> list[vec[i64]]:
return list(make())
def to_tuple() -> tuple[vec[i64], ...]:
return tuple(make())
[out]
def make():
r0 :: vec[vec[i64]]
L0:
r0 = VecNestedApi.alloc(0, 0, 2, 1)
return r0
def to_list():
r0 :: vec[vec[i64]]
r1 :: object
r2 :: list
L0:
r0 = make()
r1 = box(vec[vec[i64]], r0)
r2 = PySequence_List(r1)
return r2
def to_tuple():
r0 :: vec[vec[i64]]
r1 :: object
r2 :: tuple
L0:
r0 = make()
r1 = box(vec[vec[i64]], r0)
r2 = PySequence_Tuple(r1)
return r2
[case testVecNestedCreateEmpty]
from librt.vecs import vec, append
from mypy_extensions import i64
def f() -> vec[vec[str]]:
return vec[vec[str]]()
def g() -> vec[vec[i64]]:
return vec[vec[i64]]()
[out]
def f():
r0 :: object
r1 :: ptr
r2 :: vec[vec[str]]
L0:
r0 = load_address PyUnicode_Type
r1 = r0
r2 = VecNestedApi.alloc(0, 0, r1, 1)
return r2
def g():
r0 :: vec[vec[i64]]
L0:
r0 = VecNestedApi.alloc(0, 0, 2, 1)
return r0
[case testVecNestedAppend]
from librt.vecs import vec, append
def f(v: vec[vec[str]], vv: vec[str]) -> vec[vec[str]]:
return append(v, vv)
[out]
def f(v, vv):
v :: vec[vec[str]]
vv :: vec[str]
r0 :: native_int
r1 :: ptr
r2, r3 :: VecNestedBufItem{len:native_int, items:ptr}
r4 :: vec[vec[str]]
L0:
r0 = vv.len
r1 = vv.items
r2 = set_element undef VecNestedBufItem, len, r0
r3 = set_element r2, items, r1
r4 = VecNestedApi.append(v, r3)
keep_alive vv
return r4
[case testVecNestedVecI64Append]
from librt.vecs import vec, append
from mypy_extensions import i64
def f(v: vec[vec[i64]], vv: vec[i64]) -> vec[vec[i64]]:
return append(v, vv)
[out]
def f(v, vv):
v :: vec[vec[i64]]
vv :: vec[i64]
r0 :: native_int
r1 :: ptr
r2, r3 :: VecNestedBufItem{len:native_int, items:ptr}
r4 :: vec[vec[i64]]
L0:
r0 = vv.len
r1 = vv.items
r2 = set_element undef VecNestedBufItem, len, r0
r3 = set_element r2, items, r1
r4 = VecNestedApi.append(v, r3)
keep_alive vv
return r4
[case testVecNestedExtend]
from librt.vecs import vec, extend
from typing import Iterable
def f(v: vec[vec[str]], it: Iterable[vec[str]]) -> vec[vec[str]]:
return extend(v, it)
[out]
def f(v, it):
v :: vec[vec[str]]
it :: object
r0 :: vec[vec[str]]
L0:
r0 = VecNestedApi.extend(v, it)
return r0
[case testVecNestedExtendVec]
from librt.vecs import vec, extend
def f(v: vec[vec[str]], v2: vec[vec[str]]) -> vec[vec[str]]:
return extend(v, v2)
[out]
def f(v, v2):
v, v2, r0 :: vec[vec[str]]
L0:
r0 = VecNestedApi.extend_vec(v, v2)
return r0
[case testVecNestedLen_64bit]
from librt.vecs import vec
from mypy_extensions import i64
from typing import Optional
def f(v: vec[vec[str]]) -> i64:
return len(v)
def g(v: vec[vec[i64]]) -> i64:
return len(v)
[out]
def f(v):
v :: vec[vec[str]]
r0 :: native_int
L0:
r0 = v.len
return r0
def g(v):
v :: vec[vec[i64]]
r0 :: native_int
L0:
r0 = v.len
return r0
[case testVecNestedGetItem_64bit]
from librt.vecs import vec
from mypy_extensions import i64
def f(v: vec[vec[str]], n: i64) -> vec[str]:
return v[n]
[out]
def f(v, n):
v :: vec[vec[str]]
n :: i64
r0 :: native_int
r1 :: bit
r2 :: i64
r3 :: bit
r4 :: bool
r5 :: i64
r6 :: vec[str]
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 = vec_get_item_unsafe[vec[str]] v, r5
return r6
[case testVecNestedI64GetItem_64bit]
from librt.vecs import vec
from mypy_extensions import i64
def f(v: vec[vec[i64]], n: i64) -> vec[i64]:
return v[n]
[out]
def f(v, n):
v :: vec[vec[i64]]
n :: i64
r0 :: native_int
r1 :: bit
r2 :: i64
r3 :: bit
r4 :: bool
r5 :: i64
r6 :: vec[i64]
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 = vec_get_item_unsafe[vec[i64]] v, r5
return r6
[case testVecNestedI64GetItemWithBorrow_64bit]
from librt.vecs import vec
from mypy_extensions import i64
def f(v: vec[vec[i64]], n: i64) -> i64:
return v[n][n]
[out]
def f(v, n):
v :: vec[vec[i64]]
n :: i64
r0 :: native_int
r1 :: bit
r2 :: i64
r3 :: bit
r4 :: bool
r5 :: i64
r6 :: vec[i64]
r7 :: native_int
r8 :: bit
r9 :: i64
r10 :: bit
r11 :: bool
r12, r13 :: i64
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 = vec_get_item_unsafe_borrow[vec[i64]] v, r5
r7 = r6.len
r8 = n < r7 :: unsigned
if r8 goto L9 else goto L6 :: bool
L6:
r9 = n + r7
r10 = r9 < r7 :: unsigned
if r10 goto L8 else goto L7 :: bool
L7:
r11 = raise IndexError
unreachable
L8:
r12 = r9
goto L10
L9:
r12 = n
L10:
r13 = vec_get_item_unsafe[i64] r6, r12
keep_alive v, r5
return r13
[case testVecNestedStrGetItemWithBorrow_64bit]
from librt.vecs import vec
from mypy_extensions import i64
class C:
v: vec[vec[str]]
def f(self, n: i64) -> str:
# The intermediate vec is borrowed, but the result must be owned.
return self.v[n][n]
[out]
def C.f(self, n):
self :: __main__.C
n :: i64
r0 :: vec[vec[str]]
r1 :: native_int
r2 :: bit
r3 :: i64
r4 :: bit
r5 :: bool
r6 :: i64
r7 :: vec[str]
r8 :: native_int
r9 :: bit
r10 :: i64
r11 :: bit
r12 :: bool
r13 :: i64
r14 :: str
L0:
r0 = borrow self.v
r1 = r0.len
r2 = n < r1 :: unsigned
if r2 goto L4 else goto L1 :: bool
L1:
r3 = n + 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 = n
L5:
r7 = vec_get_item_unsafe_borrow[vec[str]] r0, r6
r8 = r7.len
r9 = n < r8 :: unsigned
if r9 goto L9 else goto L6 :: bool
L6:
r10 = n + r8
r11 = r10 < r8 :: unsigned
if r11 goto L8 else goto L7 :: bool
L7:
r12 = raise IndexError
unreachable
L8:
r13 = r10
goto L10
L9:
r13 = n
L10:
r14 = vec_get_item_unsafe[str] r7, r13
keep_alive self, r0, r6
return r14
[case testVecDoublyNestedGetItem_64bit]
from librt.vecs import vec
from mypy_extensions import i64
def f(v: vec[vec[vec[str]]], n: i64) -> vec[vec[str]]:
return v[n]
[out]
def f(v, n):
v :: vec[vec[vec[str]]]
n :: i64
r0 :: native_int
r1 :: bit
r2 :: i64
r3 :: bit
r4 :: bool
r5 :: i64
r6 :: vec[vec[str]]
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 = vec_get_item_unsafe[vec[vec[str]]] v, r5
return r6
[case testVecNestedCreateWithCap_64bit]
from librt.vecs import vec
from mypy_extensions import i64
def cap_str() -> vec[vec[str]]:
return vec[vec[str]](capacity=5)
def cap_i64() -> vec[vec[i64]]:
return vec[vec[i64]](capacity=5)
def cap_variable(n: i64) -> vec[vec[str]]:
return vec[vec[str]](capacity=n)
[out]
def cap_str():
r0 :: object
r1 :: ptr
r2 :: vec[vec[str]]
L0:
r0 = load_address PyUnicode_Type
r1 = r0
r2 = VecNestedApi.alloc(0, 5, r1, 1)
return r2
def cap_i64():
r0 :: vec[vec[i64]]
L0:
r0 = VecNestedApi.alloc(0, 5, 2, 1)
return r0
def cap_variable(n):
n :: i64
r0 :: object
r1 :: ptr
r2 :: vec[vec[str]]
L0:
r0 = load_address PyUnicode_Type
r1 = r0
r2 = VecNestedApi.alloc(0, n, r1, 1)
return r2