@@ -275,9 +275,8 @@ def attr_get(self, ri, var, first):
275275 def _setter_lines (self , ri , member , presence ):
276276 raise Exception (f"Setter not implemented for class type { self .type } " )
277277
278- def setter (self , ri , space , direction , deref = False , ref = None ):
278+ def setter (self , ri , space , direction , deref = False , ref = None , var = "req" ):
279279 ref = (ref if ref else []) + [self .c_name ]
280- var = "req"
281280 member = f"{ var } ->{ '.' .join (ref )} "
282281
283282 local_vars = []
@@ -332,7 +331,7 @@ def attr_put(self, ri, var):
332331 def attr_get (self , ri , var , first ):
333332 pass
334333
335- def setter (self , ri , space , direction , deref = False , ref = None ):
334+ def setter (self , ri , space , direction , deref = False , ref = None , var = None ):
336335 pass
337336
338337
@@ -355,7 +354,7 @@ def attr_get(self, ri, var, first):
355354 def attr_policy (self , cw ):
356355 pass
357356
358- def setter (self , ri , space , direction , deref = False , ref = None ):
357+ def setter (self , ri , space , direction , deref = False , ref = None , var = None ):
359358 pass
360359
361360
@@ -695,13 +694,14 @@ def _attr_get(self, ri, var):
695694 f"parg.data = &{ var } ->{ self .c_name } ;" ]
696695 return get_lines , init_lines , None
697696
698- def setter (self , ri , space , direction , deref = False , ref = None ):
697+ def setter (self , ri , space , direction , deref = False , ref = None , var = "req" ):
699698 ref = (ref if ref else []) + [self .c_name ]
700699
701700 for _ , attr in ri .family .pure_nested_structs [self .nested_attrs ].member_list ():
702701 if attr .is_recursive ():
703702 continue
704- attr .setter (ri , self .nested_attrs , direction , deref = deref , ref = ref )
703+ attr .setter (ri , self .nested_attrs , direction , deref = deref , ref = ref ,
704+ var = var )
705705
706706
707707class TypeMultiAttr (Type ):
@@ -1879,7 +1879,9 @@ def rdir(direction):
18791879def op_prefix (ri , direction , deref = False ):
18801880 suffix = f"_{ ri .type_name } "
18811881
1882- if not ri .op_mode or ri .op_mode == 'do' :
1882+ if not ri .op_mode :
1883+ pass
1884+ elif ri .op_mode == 'do' :
18831885 suffix += f"{ direction_to_suffix [direction ]} "
18841886 else :
18851887 if direction == 'request' :
@@ -2470,11 +2472,22 @@ def free_arg_name(direction):
24702472 return 'obj'
24712473
24722474
2473- def print_alloc_wrapper (ri , direction ):
2475+ def print_alloc_wrapper (ri , direction , struct = None ):
24742476 name = op_prefix (ri , direction )
2475- ri .cw .write_func_prot (f'static inline struct { name } *' , f"{ name } _alloc" , [f"void" ])
2477+ struct_name = name
2478+ if ri .type_name_conflict :
2479+ struct_name += '_'
2480+
2481+ args = ["void" ]
2482+ cnt = "1"
2483+ if struct and struct .in_multi_val :
2484+ args = ["unsigned int n" ]
2485+ cnt = "n"
2486+
2487+ ri .cw .write_func_prot (f'static inline struct { struct_name } *' ,
2488+ f"{ name } _alloc" , args )
24762489 ri .cw .block_start ()
2477- ri .cw .p (f'return calloc(1 , sizeof(struct { name } ));' )
2490+ ri .cw .p (f'return calloc({ cnt } , sizeof(struct { struct_name } ));' )
24782491 ri .cw .block_end ()
24792492
24802493
@@ -2544,6 +2557,19 @@ def print_type(ri, direction):
25442557def print_type_full (ri , struct ):
25452558 _print_type (ri , "" , struct )
25462559
2560+ if struct .request and struct .in_multi_val :
2561+ print_alloc_wrapper (ri , "" , struct )
2562+ ri .cw .nl ()
2563+ free_rsp_nested_prototype (ri )
2564+ ri .cw .nl ()
2565+
2566+ # Name conflicts are too hard to deal with with the current code base,
2567+ # they are very rare so don't bother printing setters in that case.
2568+ if ri .ku_space == 'user' and not ri .type_name_conflict :
2569+ for _ , attr in struct .member_list ():
2570+ attr .setter (ri , ri .attr_set , "" , var = "obj" )
2571+ ri .cw .nl ()
2572+
25472573
25482574def print_type_helpers (ri , direction , deref = False ):
25492575 print_free_prototype (ri , direction )
@@ -3515,9 +3541,6 @@ def main():
35153541 for attr_set , struct in parsed .pure_nested_structs .items ():
35163542 ri = RenderInfo (cw , parsed , args .mode , "" , "" , attr_set )
35173543 print_type_full (ri , struct )
3518- if struct .request and struct .in_multi_val :
3519- free_rsp_nested_prototype (ri )
3520- cw .nl ()
35213544
35223545 for op_name , op in parsed .ops .items ():
35233546 cw .p (f"/* ============== { op .enum_name } ============== */" )
0 commit comments