blob: c0d4325e38fccc99a9ddcff4e9dce8770c8fba5f [file] [edit]
-- Test cases for packed/specialized vec item types other than i64, such as
-- vec[i32] and vec[float]. Since many of the code paths are the same as for
-- vec[i64], only test a subset of functionality.
--
-- vec[i64] test cases are in irbuild-vec-i64.test.
[case testVecMiscCreateEmpty]
from librt.vecs import vec
from mypy_extensions import i32, i16, u8
def create_float() -> vec[float]:
return vec[float]()
def create_i32() -> vec[i32]:
return vec[i32]()
def create_i16() -> vec[i16]:
return vec[i16]()
def create_u8() -> vec[u8]:
return vec[u8]()
def create_bool() -> vec[bool]:
return vec[bool]()
[out]
def create_float():
r0 :: vec[float]
L0:
r0 = VecFloatApi.alloc(0, 0)
return r0
def create_i32():
r0 :: vec[i32]
L0:
r0 = VecI32Api.alloc(0, 0)
return r0
def create_i16():
r0 :: vec[i16]
L0:
r0 = VecI16Api.alloc(0, 0)
return r0
def create_u8():
r0 :: vec[u8]
L0:
r0 = VecU8Api.alloc(0, 0)
return r0
def create_bool():
r0 :: vec[bool]
L0:
r0 = VecBoolApi.alloc(0, 0)
return r0
[case testVecMiscCreateFromList]
from librt.vecs import vec
from mypy_extensions import i64, i32
def create_i32() -> vec[i32]:
return vec[i32]([1, -5])
[out]
def create_i32():
r0 :: vec[i32]
r1, r2, r3 :: ptr
L0:
r0 = VecI32Api.alloc(2, 2)
r1 = r0.items
set_mem r1, 1 :: i32*
r2 = r1 + 4
set_mem r2, -5 :: i32*
r3 = r2 + 4
keep_alive r0
return r0
[case testVecMiscLen_64bit]
from librt.vecs import vec
from mypy_extensions import i64, i32
def len_i32(v: vec[i32]) -> i64:
return len(v)
[out]
def len_i32(v):
v :: vec[i32]
r0 :: native_int
L0:
r0 = v.len
return r0
[case testVecMiscAppend]
from librt.vecs import vec, append
from mypy_extensions import i32
def append_float(v: vec[float]) -> vec[float]:
return append(v, 1.5)
def append_i32(v: vec[i32]) -> vec[i32]:
return append(v, 123)
[out]
def append_float(v):
v, r0 :: vec[float]
L0:
r0 = VecFloatApi.append(v, 1.5)
return r0
def append_i32(v):
v, r0 :: vec[i32]
L0:
r0 = VecI32Api.append(v, 123)
return r0
[case testVecMiscGetItem_64bit]
from librt.vecs import vec
from mypy_extensions import i64
def get_item_bool(v: vec[bool], i: i64) -> bool:
return v[i]
[out]
def get_item_bool(v, i):
v :: vec[bool]
i :: i64
r0 :: native_int
r1 :: bit
r2 :: i64
r3 :: bit
r4 :: bool
r5 :: i64
r6 :: ptr
r7 :: i64
r8 :: ptr
r9 :: bool
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.items
r7 = r5 * 1
r8 = r6 + r7
r9 = load_mem r8 :: builtins.bool*
keep_alive v
return r9
[case testVecMiscPop]
from librt.vecs import vec, pop
from mypy_extensions import i64
def pop_float(v: vec[float], i: i64) -> float:
v, x = pop(v)
return x
[out]
def pop_float(v, i):
v :: vec[float]
i :: i64
r0 :: tuple[vec[float], float]
r1 :: vec[float]
r2 :: float
r3 :: vec[float]
r4, x :: float
L0:
r0 = VecFloatApi.pop(v, -1)
r1 = borrow r0[0]
r2 = borrow r0[1]
keep_alive steal r0
r3 = unborrow r1
v = r3
r4 = unborrow r2
x = r4
return x
[case testVecMiscRemove]
from librt.vecs import vec, remove
def remove_float(v: vec[float]) -> vec[float]:
return remove(v, 1.5)
[out]
def remove_float(v):
v, r0 :: vec[float]
L0:
r0 = VecFloatApi.remove(v, 1.5)
return r0
[case testVecMiscSlice]
from librt.vecs import vec, remove
from mypy_extensions import i64
def remove_float(v: vec[float], x: i64, y: i64) -> vec[float]:
return v[x:y]
[out]
def remove_float(v, x, y):
v :: vec[float]
x, y :: i64
r0 :: vec[float]
L0:
r0 = VecFloatApi.slice(v, x, y)
return r0
[case testVecMiscForLoop]
from librt.vecs import vec, remove
from mypy_extensions import i64, i16
def for_bool(v: vec[i16]) -> i16:
s: i16 = 0
for x in v:
s += x
return s
[out]
def for_bool(v):
v :: vec[i16]
s :: i16
r0, r1 :: native_int
r2 :: bit
r3 :: ptr
r4 :: native_int
r5 :: ptr
r6, x, r7 :: i16
r8 :: native_int
L0:
s = 0
r0 = 0
L1:
r1 = v.len
r2 = r0 < r1 :: signed
if r2 goto L2 else goto L4 :: bool
L2:
r3 = v.items
r4 = r0 * 2
r5 = r3 + r4
r6 = load_mem r5 :: i16*
x = r6
keep_alive v
r7 = s + x
s = r7
L3:
r8 = r0 + 1
r0 = r8
goto L1
L4:
return s
[case testVecMiscNestedGetItem_64bit]
from librt.vecs import vec
from mypy_extensions import i64, i32
def get_item_nested(v: vec[vec[i32]], i: i64) -> vec[i32]:
return v[i]
[out]
def get_item_nested(v, i):
v :: vec[vec[i32]]
i :: i64
r0 :: native_int
r1 :: bit
r2 :: i64
r3 :: bit
r4 :: bool
r5 :: i64
r6 :: ptr
r7 :: i64
r8 :: ptr
r9 :: vec[i32]
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.items
r7 = r5 * 16
r8 = r6 + r7
r9 = load_mem r8 :: vec[i32]*
keep_alive v
return r9
[case testVecMiscNestedPop_64bit]
from librt.vecs import vec, pop
from mypy_extensions import i64, i32
def get_item_nested(v: vec[vec[i32]], i: i64) -> vec[i32]:
v, x = pop(v, i)
return x
[out]
def get_item_nested(v, i):
v :: vec[vec[i32]]
i :: i64
r0 :: tuple[vec[vec[i32]], VecNestedBufItem{len:native_int, items:ptr}]
r1, r2 :: vec[vec[i32]]
r3, r4 :: VecNestedBufItem{len:native_int, items:ptr}
r5 :: native_int
r6 :: ptr
r7, r8 :: vec[i32]
r9 :: tuple[vec[vec[i32]], vec[i32]]
r10 :: vec[vec[i32]]
r11 :: vec[i32]
r12 :: vec[vec[i32]]
r13, x :: vec[i32]
L0:
r0 = VecNestedApi.pop(v, i)
r1 = borrow r0[0]
r2 = unborrow r1
r3 = borrow r0[1]
r4 = unborrow r3
r5 = r4.len
r6 = r4.items
r7 = set_element undef vec[i32], len, r5
r8 = set_element r7, items, r6
r9 = (r2, r8)
keep_alive steal r0
r10 = borrow r9[0]
r11 = borrow r9[1]
keep_alive steal r9
r12 = unborrow r10
v = r12
r13 = unborrow r11
x = r13
return x
[case testVecU8ToBytes]
from librt.vecs import vec
from mypy_extensions import u8
def to_bytes(v: vec[u8]) -> bytes:
return bytes(v)
[out]
def to_bytes(v):
v :: vec[u8]
r0 :: bytes
L0:
r0 = CPyVecU8_ToBytes(v)
return r0