| -- 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 :: object |
| r2, r3, r4 :: ptr |
| L0: |
| r0 = VecI32Api.alloc(2, 2) |
| r1 = r0.buf |
| r2 = get_element_ptr r1 items :: VecI32BufObject |
| set_mem r2, 1 :: i32* |
| r3 = r2 + 4 |
| set_mem r3, -5 :: i32* |
| r4 = r3 + 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 :: object |
| r7 :: ptr |
| r8 :: i64 |
| r9 :: ptr |
| r10 :: 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.buf |
| r7 = get_element_ptr r6 items :: VecBoolBufObject |
| r8 = r5 * 1 |
| r9 = r7 + r8 |
| r10 = load_mem r9 :: builtins.bool* |
| keep_alive v |
| return r10 |
| |
| [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 :: object |
| r4 :: ptr |
| r5 :: native_int |
| r6 :: ptr |
| r7, x, r8 :: i16 |
| r9 :: 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.buf |
| r4 = get_element_ptr r3 items :: VecI16BufObject |
| r5 = r0 * 2 |
| r6 = r4 + r5 |
| r7 = load_mem r6 :: i16* |
| x = r7 |
| keep_alive v |
| r8 = s + x |
| s = r8 |
| L3: |
| r9 = r0 + 1 |
| r0 = r9 |
| 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 :: object |
| r7 :: ptr |
| r8 :: i64 |
| r9 :: ptr |
| r10 :: 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.buf |
| r7 = get_element_ptr r6 items :: VecNestedBufObject |
| r8 = r5 * 16 |
| r9 = r7 + r8 |
| r10 = load_mem r9 :: vec[i32]* |
| keep_alive v |
| return r10 |
| |
| [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, buf:object_nrc}] |
| r1, r2 :: vec[vec[i32]] |
| r3, r4 :: VecNestedBufItem{len:native_int, buf:object_nrc} |
| r5 :: vec[i32] |
| r6 :: tuple[vec[vec[i32]], vec[i32]] |
| r7 :: vec[vec[i32]] |
| r8 :: vec[i32] |
| r9 :: vec[vec[i32]] |
| r10, x :: vec[i32] |
| L0: |
| r0 = VecNestedApi.pop(v, i) |
| r1 = borrow r0[0] |
| r2 = unborrow r1 |
| r3 = borrow r0[1] |
| r4 = unborrow r3 |
| r5 = VecI32Api.convert_from_nested(r4) |
| r6 = (r2, r5) |
| keep_alive steal r0 |
| r7 = borrow r6[0] |
| r8 = borrow r6[1] |
| keep_alive steal r6 |
| r9 = unborrow r7 |
| v = r9 |
| r10 = unborrow r8 |
| x = r10 |
| return x |