@@ -74,6 +74,7 @@ struct Includes {
7474 // needs wit types
7575 needs_wit : bool ,
7676 needs_memory : bool ,
77+ needs_array : bool ,
7778}
7879
7980#[ derive( Default ) ]
@@ -415,6 +416,9 @@ impl Cpp {
415416 if self . dependencies . needs_memory {
416417 self . include ( "<memory>" ) ;
417418 }
419+ if self . dependencies . needs_array {
420+ self . include ( "<array>" ) ;
421+ }
418422 if self . dependencies . needs_bit {
419423 self . include ( "<bit>" ) ;
420424 }
@@ -1667,7 +1671,13 @@ impl CppInterfaceGenerator<'_> {
16671671 TypeDefKind :: Future ( _) => todo ! ( ) ,
16681672 TypeDefKind :: Stream ( _) => todo ! ( ) ,
16691673 TypeDefKind :: Type ( ty) => self . type_name ( ty, from_namespace, flavor) ,
1670- TypeDefKind :: FixedSizeList ( _, _) => todo ! ( ) ,
1674+ TypeDefKind :: FixedSizeList ( ty, size) => {
1675+ self . r#gen . dependencies . needs_array = true ;
1676+ format ! (
1677+ "std::array<{}, {size}>" ,
1678+ self . type_name( ty, from_namespace, flavor)
1679+ )
1680+ }
16711681 TypeDefKind :: Unknown => todo ! ( ) ,
16721682 } ,
16731683 Type :: ErrorContext => todo ! ( ) ,
@@ -2616,7 +2626,57 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
26162626 results. push ( move_if_necessary ( & result) ) ;
26172627 }
26182628 }
2619- abi:: Instruction :: IterElem { .. } => results. push ( "IterElem" . to_string ( ) ) ,
2629+ abi:: Instruction :: FixedSizeListLift {
2630+ element,
2631+ size,
2632+ id : _,
2633+ } => {
2634+ let tmp = self . tmp ( ) ;
2635+ let result = format ! ( "result{tmp}" ) ;
2636+ let typename = self
2637+ . r#gen
2638+ . type_name ( element, & self . namespace , Flavor :: InStruct ) ;
2639+ self . push_str ( & format ! ( "std::array<{typename}, {size}> {result} = {{" , ) ) ;
2640+ for a in operands. drain ( 0 ..( * size as usize ) ) {
2641+ self . push_str ( & a) ;
2642+ self . push_str ( ", " ) ;
2643+ }
2644+ self . push_str ( "};\n " ) ;
2645+ results. push ( result) ;
2646+ }
2647+ abi:: Instruction :: FixedSizeListLower { .. } => todo ! ( ) ,
2648+ abi:: Instruction :: FixedSizeListLowerMemory {
2649+ element,
2650+ size : elemsize,
2651+ id : _,
2652+ } => {
2653+ let body = self . blocks . pop ( ) . unwrap ( ) ;
2654+ let vec = operands[ 0 ] . clone ( ) ;
2655+ let target = operands[ 1 ] . clone ( ) ;
2656+ let size = self . r#gen . sizes . size ( element) ;
2657+ let size_str = size. format ( POINTER_SIZE_EXPRESSION ) ;
2658+ let typename = self
2659+ . r#gen
2660+ . type_name ( element, & self . namespace , Flavor :: InStruct ) ;
2661+ let ptr_type = self . r#gen . r#gen . opts . ptr_type ( ) ;
2662+ self . push_str ( & format ! (
2663+ "{{
2664+ {ptr_type} outer_base = {target};\n "
2665+ ) ) ;
2666+ let target: String = "outer_base" . into ( ) ;
2667+ self . push_str ( & format ! (
2668+ "std::array<{typename}, {elemsize}>& outer_vec = {vec};\n "
2669+ ) ) ;
2670+ let vec: String = "outer_vec" . into ( ) ;
2671+ self . push_str ( & format ! ( "for (unsigned i = 0; i<{vec}.size(); ++i) {{\n " , ) ) ;
2672+ self . push_str ( & format ! (
2673+ "{ptr_type} base = {target} + i * {size_str};
2674+ {typename}& iter_elem = {vec}[i];\n "
2675+ ) ) ;
2676+ self . push_str ( & body. 0 ) ;
2677+ self . push_str ( "\n }\n }\n " ) ;
2678+ }
2679+ abi:: Instruction :: IterElem { .. } => results. push ( "iter_elem" . to_string ( ) ) ,
26202680 abi:: Instruction :: IterBasePointer => results. push ( "base" . to_string ( ) ) ,
26212681 abi:: Instruction :: RecordLower { record, .. } => {
26222682 let op = & operands[ 0 ] ;
@@ -3222,7 +3282,7 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
32223282 self . src . push_str ( ">(" ) ;
32233283 }
32243284 if * amt == 1 {
3225- if operands[ 0 ] . starts_with ( "std::move(" ) {
3285+ if operands[ 0 ] . starts_with ( "std::move(" ) && !operands [ 0 ] . contains ( '.' ) {
32263286 // remove the std::move due to return value optimization (and complex rules about when std::move harms)
32273287 self . src . push_str ( & operands[ 0 ] [ 9 ..] ) ;
32283288 } else {
0 commit comments