@@ -364,10 +364,17 @@ def transform_call_expr(builder: IRBuilder, expr: CallExpr) -> Value:
364364 ):
365365 item_type = builder .type_to_rtype (analyzed .types [0 ])
366366 vec_type = RVec (item_type )
367- if len (expr .args ) == 0 :
368- return vec_create (builder .builder , vec_type , 0 , expr .line )
369- elif len (expr .args ) == 1 and expr .arg_kinds == [ARG_POS ]:
370- return translate_vec_create_from_iterable (builder , vec_type , expr .args [0 ])
367+ capacity = _get_vec_capacity (builder , expr )
368+ if len (expr .args ) == 0 or (len (expr .args ) == 1 and expr .arg_kinds == [ARG_NAMED ]):
369+ # vec[T]() or vec[T](capacity=N)
370+ return vec_create (builder .builder , vec_type , 0 , expr .line , capacity = capacity )
371+ elif (len (expr .args ) == 1 and expr .arg_kinds == [ARG_POS ]) or (
372+ len (expr .args ) == 2 and expr .arg_kinds == [ARG_POS , ARG_NAMED ]
373+ ):
374+ # vec[T](items) or vec[T](items, capacity=N)
375+ return translate_vec_create_from_iterable (
376+ builder , vec_type , expr .args [0 ], capacity = capacity
377+ )
371378 callee = analyzed .expr # Unwrap type application
372379
373380 if isinstance (callee , MemberExpr ):
@@ -561,8 +568,16 @@ def translate_super_method_call(builder: IRBuilder, expr: CallExpr, callee: Supe
561568 return builder .builder .call (decl , arg_values , arg_kinds , arg_names , expr .line )
562569
563570
571+ def _get_vec_capacity (builder : IRBuilder , expr : CallExpr ) -> Value | None :
572+ """Extract the 'capacity' keyword argument value from a vec() call, or None."""
573+ for i , (kind , name ) in enumerate (zip (expr .arg_kinds , expr .arg_names )):
574+ if kind == ARG_NAMED and name == "capacity" :
575+ return builder .accept (expr .args [i ])
576+ return None
577+
578+
564579def translate_vec_create_from_iterable (
565- builder : IRBuilder , vec_type : RVec , arg : Expression
580+ builder : IRBuilder , vec_type : RVec , arg : Expression , * , capacity : Value | None = None
566581) -> Value :
567582 line = arg .line
568583 item_type = vec_type .item_type
@@ -581,28 +596,35 @@ def translate_vec_create_from_iterable(
581596 if is_int64_rprimitive (other_type ) or is_int_rprimitive (other_type ):
582597 length = builder .accept (other )
583598 init = builder .accept (lst .items [0 ])
584- return vec_create_initialized (builder .builder , vec_type , length , init , line )
599+ return vec_create_initialized (
600+ builder .builder , vec_type , length , init , line , capacity = capacity
601+ )
585602 assert False , other_type
586603 if isinstance (arg , ListExpr ):
587604 items = []
588605 for item in arg .items :
589606 value = builder .accept (item )
590607 items .append (builder .coerce (value , item_type , line ))
591- return vec_create_from_values (builder .builder , vec_type , items , line )
608+ return vec_create_from_values (builder .builder , vec_type , items , line , capacity = capacity )
592609 if isinstance (arg , ListComprehension ):
593- return translate_vec_comprehension (builder , vec_type , arg .generator )
594- return vec_from_iterable (builder , vec_type , arg , line )
610+ return translate_vec_comprehension (builder , vec_type , arg .generator , capacity = capacity )
611+ return vec_from_iterable (builder , vec_type , arg , line , capacity = capacity )
595612
596613
597614def vec_from_iterable (
598- builder : IRBuilder , vec_type : RVec , iterable : Expression , line : int
615+ builder : IRBuilder ,
616+ vec_type : RVec ,
617+ iterable : Expression ,
618+ line : int ,
619+ * ,
620+ capacity : Value | None = None ,
599621) -> Value :
600622 """Construct a vec from an arbitrary iterable."""
601623 # Translate it as a vec comprehension vec[t]([<name> for <name> in
602624 # iterable]). This way we can use various special casing supported
603625 # by for loops and comprehensions.
604626 vec = Register (vec_type )
605- builder .assign (vec , vec_create (builder .builder , vec_type , 0 , line ), line )
627+ builder .assign (vec , vec_create (builder .builder , vec_type , 0 , line , capacity = capacity ), line )
606628 name = f"___tmp_{ line } "
607629 var = Var (name )
608630 reg = builder .add_local (var , vec_type .item_type )
0 commit comments