@@ -507,7 +507,7 @@ class CFieldInfo:
507507def _process_struct (klass , / , * , align , layout , endian , pack ):
508508 fields = []
509509 anonymous = []
510- if issubclass (klass , ( Structure , LittleEndianStructure , BigEndianStructure ) ):
510+ if issubclass (klass , Structure ):
511511 fields .extend (klass ._fields_ )
512512 anonymous .extend (klass ._anonymous_ )
513513
@@ -540,28 +540,16 @@ def _process_struct(klass, /, *, align, layout, endian, pack):
540540 else :
541541 raise ValueError (f"expected 'big', 'little', or 'native', but got { endian !r} " )
542542
543- # These fields don't apply correctly when set later.
544- # As a workaround, we have this weird _StructData thing to set the attributes
545- # in advance.
546- class _StructData :
547- pass
548-
549- if align is not None :
550- _StructData ._align_ = align
551-
552- if layout is not None :
553- _StructData ._layout_ = layout
554-
555- if pack is not None :
556- _StructData ._pack_ = pack
557-
558- for attr , value in klass .__dict__ .items ():
559- if attr != "__dict__" :
560- setattr (_StructData , attr , value )
561-
562- class _Struct (_StructData , endian_class ):
563- _fields_ = fields
564- _anonymous_ = anonymous
543+ class _Struct (endian_class ):
544+ vars ().update (vars (klass ))
545+ if align is not None :
546+ _align_ = align
547+ if layout is not None :
548+ _layout_ = layout
549+ if pack is not None :
550+ _pack_ = pack
551+ _fields_ = fields
552+ _anonymous_ = anonymous
565553
566554 _Struct .__name__ = klass .__name__
567555 _Struct .__qualname__ = klass .__qualname__
0 commit comments