@@ -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 ) ]
@@ -428,6 +429,9 @@ impl Cpp {
428429 if self . dependencies . needs_memory {
429430 self . include ( "<memory>" ) ;
430431 }
432+ if self . dependencies . needs_array {
433+ self . include ( "<array>" ) ;
434+ }
431435 if self . dependencies . needs_bit {
432436 self . include ( "<bit>" ) ;
433437 }
@@ -1698,7 +1702,13 @@ impl CppInterfaceGenerator<'_> {
16981702 TypeDefKind :: Future ( _) => todo ! ( ) ,
16991703 TypeDefKind :: Stream ( _) => todo ! ( ) ,
17001704 TypeDefKind :: Type ( ty) => self . type_name ( ty, from_namespace, flavor) ,
1701- TypeDefKind :: FixedSizeList ( _, _) => todo ! ( ) ,
1705+ TypeDefKind :: FixedSizeList ( ty, size) => {
1706+ self . r#gen . dependencies . needs_array = true ;
1707+ format ! (
1708+ "std::array<{}, {size}>" ,
1709+ self . type_name( ty, from_namespace, flavor)
1710+ )
1711+ }
17021712 TypeDefKind :: Map ( _, _) => todo ! ( ) ,
17031713 TypeDefKind :: Unknown => todo ! ( ) ,
17041714 } ,
@@ -2532,7 +2542,7 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
25322542 "auto base = {ptr} + i * {size};\n " ,
25332543 size = size. format( POINTER_SIZE_EXPRESSION )
25342544 ) ) ;
2535- self . push_str ( & format ! ( "auto&& IterElem = {val}[i];\n " ) ) ;
2545+ self . push_str ( & format ! ( "auto&& iter_elem = {val}[i];\n " ) ) ;
25362546 self . push_str ( & format ! ( "{}\n " , body. 0 ) ) ;
25372547 self . push_str ( "}\n " ) ;
25382548 if realloc. is_none ( ) {
@@ -2648,7 +2658,94 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
26482658 results. push ( move_if_necessary ( & result) ) ;
26492659 }
26502660 }
2651- abi:: Instruction :: IterElem { .. } => results. push ( "IterElem" . to_string ( ) ) ,
2661+ abi:: Instruction :: FixedLengthListLift {
2662+ element,
2663+ size,
2664+ id : _,
2665+ } => {
2666+ let tmp = self . tmp ( ) ;
2667+ let result = format ! ( "result{tmp}" ) ;
2668+ let typename = self
2669+ . r#gen
2670+ . type_name ( element, & self . namespace , Flavor :: InStruct ) ;
2671+ self . push_str ( & format ! ( "std::array<{typename}, {size}> {result} = {{" , ) ) ;
2672+ for a in operands. drain ( 0 ..( * size as usize ) ) {
2673+ self . push_str ( & a) ;
2674+ self . push_str ( ", " ) ;
2675+ }
2676+ self . push_str ( "};\n " ) ;
2677+ results. push ( result) ;
2678+ }
2679+ abi:: Instruction :: FixedLengthListLiftFromMemory {
2680+ element,
2681+ size : elemsize,
2682+ id : _,
2683+ } => {
2684+ let body = self . blocks . pop ( ) . unwrap ( ) ;
2685+ let tmp = self . tmp ( ) ;
2686+ let vec = format ! ( "array{tmp}" ) ;
2687+ let source = operands[ 0 ] . clone ( ) ;
2688+ let size = self . r#gen . sizes . size ( element) ;
2689+ let size_str = size. format ( POINTER_SIZE_EXPRESSION ) ;
2690+ let typename = self
2691+ . r#gen
2692+ . type_name ( element, & self . namespace , Flavor :: InStruct ) ;
2693+ let ptr_type = self . r#gen . r#gen . opts . ptr_type ( ) ;
2694+ self . push_str ( & format ! ( "std::array<{typename}, {elemsize}> {vec};\n " ) ) ;
2695+ self . push_str ( & format ! (
2696+ "{{
2697+ {ptr_type} outer_base = {source};\n "
2698+ ) ) ;
2699+ let source: String = "outer_base" . into ( ) ;
2700+ // let vec: String = "outer_vec".into();
2701+ self . push_str ( & format ! ( "for (unsigned i = 0; i<{elemsize}; ++i) {{\n " , ) ) ;
2702+ self . push_str ( & format ! ( "{ptr_type} base = {source} + i * {size_str};\n " ) ) ;
2703+ self . push_str ( & body. 0 ) ;
2704+ self . push_str ( & format ! ( "{vec}[i] = {};" , body. 1 [ 0 ] ) ) ;
2705+ self . push_str ( "\n }\n }\n " ) ;
2706+ results. push ( vec) ;
2707+ }
2708+ abi:: Instruction :: FixedLengthListLower {
2709+ element : _,
2710+ size,
2711+ id : _,
2712+ } => {
2713+ for i in 0 ..( * size as usize ) {
2714+ results. push ( format ! ( "{}[{i}]" , operands[ 0 ] ) ) ;
2715+ }
2716+ }
2717+ abi:: Instruction :: FixedLengthListLowerToMemory {
2718+ element,
2719+ size : elemsize,
2720+ id : _,
2721+ } => {
2722+ let body = self . blocks . pop ( ) . unwrap ( ) ;
2723+ let vec = operands[ 0 ] . clone ( ) ;
2724+ let target = operands[ 1 ] . clone ( ) ;
2725+ let size = self . r#gen . sizes . size ( element) ;
2726+ let size_str = size. format ( POINTER_SIZE_EXPRESSION ) ;
2727+ let typename = self
2728+ . r#gen
2729+ . type_name ( element, & self . namespace , Flavor :: InStruct ) ;
2730+ let ptr_type = self . r#gen . r#gen . opts . ptr_type ( ) ;
2731+ self . push_str ( & format ! (
2732+ "{{
2733+ {ptr_type} outer_base = {target};\n "
2734+ ) ) ;
2735+ let target: String = "outer_base" . into ( ) ;
2736+ self . push_str ( & format ! (
2737+ "std::array<{typename}, {elemsize}>& outer_vec = {vec};\n "
2738+ ) ) ;
2739+ let vec: String = "outer_vec" . into ( ) ;
2740+ self . push_str ( & format ! ( "for (unsigned i = 0; i<{vec}.size(); ++i) {{\n " , ) ) ;
2741+ self . push_str ( & format ! (
2742+ "{ptr_type} base = {target} + i * {size_str};
2743+ {typename}& iter_elem = {vec}[i];\n "
2744+ ) ) ;
2745+ self . push_str ( & body. 0 ) ;
2746+ self . push_str ( "\n }\n }\n " ) ;
2747+ }
2748+ abi:: Instruction :: IterElem { .. } => results. push ( "iter_elem" . to_string ( ) ) ,
26522749 abi:: Instruction :: IterBasePointer => results. push ( "base" . to_string ( ) ) ,
26532750 abi:: Instruction :: RecordLower { record, .. } => {
26542751 let op = & operands[ 0 ] ;
@@ -3254,7 +3351,7 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
32543351 self . src . push_str ( ">(" ) ;
32553352 }
32563353 if * amt == 1 {
3257- if operands[ 0 ] . starts_with ( "std::move(" ) {
3354+ if operands[ 0 ] . starts_with ( "std::move(" ) && !operands [ 0 ] . contains ( '.' ) {
32583355 // remove the std::move due to return value optimization (and complex rules about when std::move harms)
32593356 self . src . push_str ( & operands[ 0 ] [ 9 ..] ) ;
32603357 } else {
0 commit comments