Skip to content

Commit 0190cd2

Browse files
committed
WIP one more
1 parent bd4fc74 commit 0190cd2

1 file changed

Lines changed: 12 additions & 2 deletions

File tree

mypyc/irbuild/vec.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -498,11 +498,20 @@ def vec_contains(builder: LowLevelIRBuilder, vec: Value, target: Value, line: in
498498

499499
step = step_size(item_type)
500500
len_val = vec_len_native(builder, vec)
501-
items_start = vec_items(builder, vec)
502-
items_end = builder.int_add(items_start, builder.int_mul(len_val, step))
503501

504502
true, end = BasicBlock(), BasicBlock()
505503

504+
# Guard against computing &buf->items when buf is NULL (empty vec).
505+
search_body = BasicBlock()
506+
search_done = BasicBlock()
507+
zero = Integer(0, c_pyssize_t_rprimitive)
508+
len_check = builder.add(ComparisonOp(len_val, zero, ComparisonOp.SGT, line=line))
509+
builder.add(Branch(len_check, search_body, search_done, Branch.BOOL))
510+
builder.activate_block(search_body)
511+
512+
items_start = vec_items(builder, vec)
513+
items_end = builder.int_add(items_start, builder.int_mul(len_val, step))
514+
506515
for_loop = builder.begin_for(
507516
items_start, items_end, Integer(step, c_pyssize_t_rprimitive), signed=False
508517
)
@@ -514,6 +523,7 @@ def vec_contains(builder: LowLevelIRBuilder, vec: Value, target: Value, line: in
514523
for_loop.finish()
515524

516525
builder.keep_alive([vec], line)
526+
builder.goto_and_activate(search_done)
517527

518528
res = Register(bool_rprimitive)
519529
builder.assign(res, Integer(0, bool_rprimitive))

0 commit comments

Comments
 (0)