@@ -99,6 +99,25 @@ def prepare_array_de_serialization(site, t):
9999 dimsizes_expr = expr .mkLit (site , dimsizes_lit , TPtr (TInt (32 , False )))
100100 return (base , dims , sizeof_base , dimsizes_expr )
101101
102+ def mkSubRefLit (site , expr , sub , typ , op ):
103+ real_etype = safe_realtype_shallow (expr .ctype ())
104+
105+ if isinstance (real_etype , TPtr ):
106+ if op == '.' :
107+ raise ENOSTRUCT (site , expr )
108+ basetype = real_etype .base
109+ real_basetype = safe_realtype (basetype )
110+ else :
111+ if op == '->' :
112+ raise ENOPTR (site , expr )
113+ real_basetype = safe_realtype (etype )
114+
115+ real_basetype = real_basetype .resolve ()
116+
117+ return ctree .StructMember (site , expr , sub ,
118+ conv_const (real_basetype .const , typ ), op )
119+
120+
102121# This works on the assumption that args do not need to be hard-cast
103122# to fit the actual fun signature
104123def apply_c_fun (site , fun , args , rettype ):
@@ -354,7 +373,7 @@ def map_dmltype_to_attrtype(site, dmltype):
354373 return 'f'
355374 if isinstance (real_type , TStruct ):
356375 return '[%s]' % "" .join ([map_dmltype_to_attrtype (site , mt )
357- for mt in real_type .members . values () ])
376+ for ( _ , mt ) in real_type .members ])
358377 if isinstance (real_type , TArray ):
359378 assert real_type .size .constant
360379 arr_attr_type = map_dmltype_to_attrtype (site , real_type .base )
@@ -375,7 +394,7 @@ def mark_for_serialization(site, dmltype):
375394 '''
376395 real_type = safe_realtype (dmltype )
377396 if isinstance (real_type , TStruct ):
378- for mt in real_type .members . values () :
397+ for ( _ , mt ) in real_type .members :
379398 mark_for_serialization (site , mt )
380399 elif isinstance (real_type , TArray ):
381400 # Can only serialize constant-size arrays
@@ -496,9 +515,12 @@ def generate_serialize(real_type):
496515 in_arg_decl .toc ()
497516 out_arg_decl .toc ()
498517 if isinstance (real_type , TStruct ):
499- sources = ((ctree .mkSubRef (site , in_arg , name , "->" ),
500- safe_realtype (typ ))
501- for (name , typ ) in real_type .members .items ())
518+ sources = (
519+ (mkSubRefLit (
520+ site , in_arg , name or TStruct .anon_member_cident (i ),
521+ typ , "->" ),
522+ safe_realtype (typ ))
523+ for (i , (name , typ )) in enumerate (real_type .members ))
502524 serialize_sources_to_list (site , sources , out_arg )
503525 elif isinstance (real_type , TVector ):
504526 raise ICE (site , "TODO: serialize vector" )
@@ -619,9 +641,12 @@ def error_out(exc, msg):
619641 else ctree .mkCast (site , tmp_out_ref , TPtr (void )))
620642 cleanup .append (ctree .mkDelete (site , cleanup_ref ))
621643 tmp_out_decl .toc ()
622- targets = tuple ((ctree .mkSubRef (site , tmp_out_ref , name , "->" ),
623- conv_const (real_type .const , safe_realtype (typ )))
624- for (name , typ ) in real_type .members .items ())
644+ targets = tuple (
645+ (mkSubRefLit (
646+ site , tmp_out_ref ,
647+ name or TStruct .anon_member_cident (i ), typ , "->" ),
648+ conv_const (real_type .const , safe_realtype (typ )))
649+ for (i , (name , typ )) in enumerate (real_type .members ))
625650 def error_out_at_index (_i , exc , msg ):
626651 return error_out (exc , msg )
627652 deserialize_list_to_targets (site , in_arg , targets ,
0 commit comments