@@ -176,21 +176,41 @@ namespace swiftwinrt
176
176
s ();
177
177
w.write (" _ %: " , get_swift_name (param));
178
178
if (param.out ()) w.write (" inout " );
179
- write_type (w, *param.type , type_params);
179
+ const bool is_array = param.signature .Type ().is_array () || param.signature .Type ().is_szarray ();
180
+ if (is_array && type_params.layer == projection_layer::swift)
181
+ {
182
+ // Can't allow for implicit unwrap in arrays
183
+ w.write (" [%]" , bind<write_type>(*param.type , write_type_params::swift));
184
+ }
185
+ else
186
+ {
187
+ write_type (w, *param.type , type_params);
188
+ }
180
189
}
181
190
}
182
191
static void write_function_params (writer& w, function_def const & function, write_type_params const & type_params)
183
192
{
184
193
write_function_params2 (w, function.params , type_params);
185
194
}
186
195
187
- static void write_convert_to_abi_arg (writer& w, std::string_view const & param_name, const metadata_type* type, bool is_out)
196
+ template <typename Param>
197
+ static void write_convert_to_abi_arg (writer& w, Param const & param)
188
198
{
189
199
TypeDef signature_type;
200
+ auto type = param.type ;
201
+ auto param_name = param.name ;
202
+ auto is_out = param.out ();
203
+
190
204
auto category = get_category (type, &signature_type);
191
205
192
206
auto local_name = local_swift_param_name (param_name);
193
- if (category == param_category::object_type)
207
+ if (param.is_array ())
208
+ {
209
+ // Arrays are all converted from the swift array to a c array, so they
210
+ // use the local_param_name
211
+ w.write (" count, %" , local_name);
212
+ }
213
+ else if (category == param_category::object_type)
194
214
{
195
215
if (is_out) throw std::exception (" out parameters of reference types should not be converted directly to abi types" );
196
216
@@ -286,7 +306,7 @@ namespace swiftwinrt
286
306
s ();
287
307
if (param.in ())
288
308
{
289
- write_convert_to_abi_arg (w, param_name, param. type , false );
309
+ write_convert_to_abi_arg (w, param);
290
310
}
291
311
else
292
312
{
@@ -702,43 +722,59 @@ typealias % = InterfaceWrapperBase<%>
702
722
703
723
for (auto & param : signature.params )
704
724
{
705
- if (param.signature .Type ().is_szarray ())
706
- {
707
- // TODO: WIN-32 swiftwinrt: add support for arrays
708
- w.write (" **TODO: implement szarray in write_convert_vtable_params**" );
709
- }
710
- else
725
+ std::string param_name = " $" + std::to_string (param_number);
726
+
727
+
728
+ if (param.in ())
711
729
{
712
- std::string param_name = " $ " + std::to_string (param_number );
730
+ assert (!param. out () );
713
731
714
- if (param.in ( ))
732
+ if (is_delegate ( param.type ))
715
733
{
716
- assert (!param.out ());
717
-
718
- if (is_delegate (param.type ))
734
+ w.write (" guard let % = % else { return E_INVALIDARG }\n " ,
735
+ get_swift_name (param),
736
+ bind<write_consume_type>(param.type , param_name, false ));
737
+ }
738
+ else if (param.is_array ())
739
+ {
740
+ auto array_param_name = " $" + std::to_string (param_number + 1 );
741
+ auto count_param_name = param_name;
742
+ if (is_reference_type (param.type ))
719
743
{
720
- w.write (" guard let % = % else { return E_INVALIDARG } \n " ,
744
+ w.write (" let %: [%] = .from(abiBridge: %.self, abi: (count: %, start: %)) \n " ,
721
745
get_swift_name (param),
722
- bind<write_consume_type>(param.type , param_name, false ));
746
+ bind<write_type>(*param.type , write_type_params::swift),
747
+ bind_bridge_fullname (*param.type ),
748
+ count_param_name,
749
+ array_param_name);
723
750
}
724
751
else
725
752
{
726
- w.write (" let %: % = % \n " ,
753
+ w.write (" let %: [%] = .from(abi: (count: %, start: %)) \n " ,
727
754
get_swift_name (param),
728
755
bind<write_type>(*param.type , write_type_params::swift),
729
- bind<write_consume_type>(param.type , param_name, false ));
756
+ count_param_name,
757
+ array_param_name);
730
758
}
759
+ ++param_number;
731
760
}
732
761
else
733
762
{
734
- assert (!param.in ());
735
- assert (param.out ());
736
- w.write (" var %: %%\n " ,
763
+ w.write (" let %: % = %\n " ,
737
764
get_swift_name (param),
738
765
bind<write_type>(*param.type , write_type_params::swift),
739
- bind<write_default_init_assignment>(* param.type , projection_layer::swift ));
766
+ bind<write_consume_type>( param.type , param_name, false ));
740
767
}
741
768
}
769
+ else
770
+ {
771
+ assert (!param.in ());
772
+ assert (param.out ());
773
+ w.write (" var %: %%\n " ,
774
+ get_swift_name (param),
775
+ bind<write_type>(*param.type , write_type_params::swift),
776
+ bind<write_default_init_assignment>(*param.type , projection_layer::swift));
777
+ }
742
778
++param_number;
743
779
}
744
780
}
@@ -1628,7 +1664,21 @@ vtable);
1628
1664
1629
1665
if (param.in ())
1630
1666
{
1631
- if (category == param_category::string_type)
1667
+ if (param.is_array ())
1668
+ {
1669
+ if (is_reference_type (param.type ))
1670
+ {
1671
+ w.write (" try %.toABI(abiBridge: %.self) { (count, %) in\n " , param_name, bind_bridge_name (*param.type ), local_param_name);
1672
+ }
1673
+ else
1674
+ {
1675
+ w.write (" try %.toABI { (count, %) in\n " , param_name, local_param_name);
1676
+ }
1677
+
1678
+ guard.push_indent ();
1679
+ guard.push (" }\n " );
1680
+ }
1681
+ else if (category == param_category::string_type)
1632
1682
{
1633
1683
w.write (" let % = try! HString(%)\n " ,
1634
1684
local_param_name,
@@ -2418,7 +2468,7 @@ public init<Composable: ComposableImpl>(
2418
2468
}));
2419
2469
2420
2470
if (compose)
2421
- {
2471
+ {
2422
2472
w.write (" @_spi(WinRTInternal)\n " );
2423
2473
w.write (" public typealias Composable = %\n " , composableName);
2424
2474
}
@@ -2736,8 +2786,11 @@ override % func _getABI<T>() -> UnsafeMutablePointer<T>? {
2736
2786
}
2737
2787
2738
2788
// assigns return or out parameters in vtable methods
2739
- static void do_write_abi_val_assignment (writer& w, const metadata_type* type, std::string_view const & param_name, std::string_view const & return_param_name)
2789
+ template <typename T>
2790
+ static void do_write_abi_val_assignment (writer& w, T const & return_type, std::string_view return_param_name)
2740
2791
{
2792
+ auto type = return_type.type ;
2793
+ auto param_name = get_swift_member_name (return_type.name );
2741
2794
TypeDef signature_type{};
2742
2795
auto category = get_category (type, &signature_type);
2743
2796
@@ -2768,7 +2821,9 @@ override % func _getABI<T>() -> UnsafeMutablePointer<T>? {
2768
2821
2769
2822
w.write (" %?.initialize(to: %)\n " ,
2770
2823
return_param_name,
2771
- bind<write_convert_to_abi_arg>(param_name, type, true )
2824
+ bind ([&](writer& w) {
2825
+ write_convert_to_abi_arg (w, return_type);
2826
+ })
2772
2827
);
2773
2828
}
2774
2829
@@ -2781,15 +2836,15 @@ override % func _getABI<T>() -> UnsafeMutablePointer<T>? {
2781
2836
{
2782
2837
auto return_param_name = " $" + std::to_string (param_number);
2783
2838
auto param_name = get_swift_name (param);
2784
- do_write_abi_val_assignment (w, param. type , std::string_view (param_name) , return_param_name);
2839
+ do_write_abi_val_assignment (w, param, return_param_name);
2785
2840
}
2786
2841
param_number++;
2787
2842
}
2788
2843
2789
2844
if (signature.return_type )
2790
2845
{
2791
2846
auto return_param_name = " $" + std::to_string (signature.params .size () + 1 );
2792
- do_write_abi_val_assignment (w, signature.return_type .value (). type , signature. return_type . value (). name , return_param_name);
2847
+ do_write_abi_val_assignment (w, signature.return_type .value (), return_param_name);
2793
2848
}
2794
2849
}
2795
2850
0 commit comments