@@ -430,10 +430,14 @@ fn write_cxx_function_shim<'a>(out: &mut OutFile<'a>, efn: &'a ExternFn) {
430
430
out. builtin . rust_str_repr = true ;
431
431
write ! ( out, "::rust::impl<::rust::Str>::repr(" ) ;
432
432
}
433
- Some ( Type :: SliceRefU8 ( _ ) ) if !indirect_return => {
433
+ Some ( Type :: SliceRefU8 ( ty ) ) if !indirect_return && ty . mutability . is_none ( ) => {
434
434
out. builtin . rust_slice_repr = true ;
435
435
write ! ( out, "::rust::impl<::rust::Slice<const uint8_t>>::repr(" )
436
436
}
437
+ Some ( Type :: SliceRefU8 ( _) ) if !indirect_return => {
438
+ out. builtin . rust_slice_repr = true ;
439
+ write ! ( out, "::rust::impl<::rust::Slice<uint8_t>>::repr(" )
440
+ }
437
441
_ => { }
438
442
}
439
443
match & efn. receiver {
@@ -468,12 +472,19 @@ fn write_cxx_function_shim<'a>(out: &mut OutFile<'a>, efn: &'a ExternFn) {
468
472
out. builtin . unsafe_bitcopy = true ;
469
473
write_type ( out, & arg. ty ) ;
470
474
write ! ( out, "(::rust::unsafe_bitcopy, *{})" , arg. ident) ;
471
- } else if let Type :: SliceRefU8 ( _) = arg. ty {
472
- write ! (
473
- out,
474
- "::rust::Slice<const uint8_t>(static_cast<const uint8_t *>({0}.ptr), {0}.len)" ,
475
- arg. ident,
476
- ) ;
475
+ } else if let Type :: SliceRefU8 ( ref ty) = arg. ty {
476
+ match ty. mutability {
477
+ None => write ! (
478
+ out,
479
+ "::rust::Slice<const uint8_t>(static_cast<const uint8_t *>({0}.ptr), {0}.len)" ,
480
+ arg. ident,
481
+ ) ,
482
+ Some ( _) => write ! (
483
+ out,
484
+ "::rust::Slice<uint8_t>(static_cast<uint8_t *>({0}.ptr), {0}.len)" ,
485
+ arg. ident,
486
+ )
487
+ }
477
488
} else if out. types . needs_indirect_abi ( & arg. ty ) {
478
489
out. include . utility = true ;
479
490
write ! ( out, "::std::move(*{})" , arg. ident) ;
@@ -712,9 +723,13 @@ fn write_rust_function_shim_impl(
712
723
out. builtin . rust_str_repr = true ;
713
724
write ! ( out, "::rust::impl<::rust::Str>::repr(" ) ;
714
725
}
715
- Type :: SliceRefU8 ( _ ) => {
726
+ Type :: SliceRefU8 ( ty ) => {
716
727
out. builtin . rust_slice_repr = true ;
717
- write ! ( out, "::rust::impl<::rust::Slice<const uint8_t>>::repr(" ) ;
728
+ if ty. mutability . is_none ( ) {
729
+ write ! ( out, "::rust::impl<::rust::Slice<const uint8_t>>::repr(" ) ;
730
+ } else {
731
+ write ! ( out, "::rust::impl<::rust::Slice<uint8_t>>::repr(" ) ;
732
+ }
718
733
}
719
734
ty if out. types . needs_indirect_abi ( ty) => write ! ( out, "&" ) ,
720
735
_ => { }
@@ -884,9 +899,12 @@ fn write_type(out: &mut OutFile, ty: &Type) {
884
899
Type :: Str ( _) => {
885
900
write ! ( out, "::rust::Str" ) ;
886
901
}
887
- Type :: SliceRefU8 ( _ ) => {
902
+ Type :: SliceRefU8 ( ty ) if ty . mutability . is_none ( ) => {
888
903
write ! ( out, "::rust::Slice<const uint8_t>" ) ;
889
904
}
905
+ Type :: SliceRefU8 ( _) => {
906
+ write ! ( out, "::rust::Slice<uint8_t>" ) ;
907
+ }
890
908
Type :: Fn ( f) => {
891
909
write ! ( out, "::rust::{}<" , if f. throws { "TryFn" } else { "Fn" } ) ;
892
910
match & f. ret {
0 commit comments