@@ -415,12 +415,12 @@ func _convertInOutToPointerArgument<
415
415
return ToPointer ( from)
416
416
}
417
417
418
- #if !$Embedded
419
418
420
419
/// Derive a pointer argument from a value array parameter.
421
420
///
422
421
/// This always produces a non-null pointer, even if the array doesn't have any
423
422
/// storage.
423
+ #if !$Embedded
424
424
@_transparent
425
425
public // COMPILER_INTRINSIC
426
426
func _convertConstArrayToPointerArgument<
@@ -439,10 +439,31 @@ func _convertConstArrayToPointerArgument<
439
439
}
440
440
return ( owner, validPointer)
441
441
}
442
+ #else
443
+ @_transparent
444
+ public // COMPILER_INTRINSIC
445
+ func _convertConstArrayToPointerArgument<
446
+ FromElement,
447
+ ToPointer: _Pointer
448
+ > ( _ arr: [ FromElement ] ) -> ( Builtin . NativeObject ? , ToPointer ) {
449
+ let ( owner, opaquePointer) = arr. _cPointerArgs ( )
450
+
451
+ let validPointer : ToPointer
452
+ if let addr = opaquePointer {
453
+ validPointer = ToPointer ( addr. _rawValue)
454
+ } else {
455
+ let lastAlignedValue = ~ ( MemoryLayout < FromElement > . alignment - 1 )
456
+ let lastAlignedPointer = UnsafeRawPointer ( bitPattern: lastAlignedValue) !
457
+ validPointer = ToPointer ( lastAlignedPointer. _rawValue)
458
+ }
459
+ return ( owner, validPointer)
460
+ }
461
+ #endif
442
462
443
463
/// Derive a pointer argument from an inout array parameter.
444
464
///
445
465
/// This always produces a non-null pointer, even if the array's length is 0.
466
+ #if !$Embedded
446
467
@_transparent
447
468
public // COMPILER_INTRINSIC
448
469
func _convertMutableArrayToPointerArgument<
@@ -458,8 +479,26 @@ func _convertMutableArrayToPointerArgument<
458
479
459
480
return _convertConstArrayToPointerArgument ( a)
460
481
}
482
+ #else
483
+ @_transparent
484
+ public // COMPILER_INTRINSIC
485
+ func _convertMutableArrayToPointerArgument<
486
+ FromElement,
487
+ ToPointer: _Pointer
488
+ > ( _ a: inout [ FromElement ] ) -> ( Builtin . NativeObject ? , ToPointer ) {
489
+ // TODO: Putting a canary at the end of the array in checked builds might
490
+ // be a good idea
491
+
492
+ // Call reserve to force contiguous storage.
493
+ a. reserveCapacity ( 0 )
494
+ _debugPrecondition ( a. _baseAddressIfContiguous != nil || a. isEmpty)
495
+
496
+ return _convertConstArrayToPointerArgument ( a)
497
+ }
498
+ #endif
461
499
462
500
/// Derive a UTF-8 pointer argument from a value string parameter.
501
+ #if !$Embedded
463
502
@_transparent
464
503
public // COMPILER_INTRINSIC
465
504
func _convertConstStringToUTF8PointerArgument<
@@ -468,25 +507,12 @@ func _convertConstStringToUTF8PointerArgument<
468
507
let utf8 = Array ( str. utf8CString)
469
508
return _convertConstArrayToPointerArgument ( utf8)
470
509
}
471
-
472
510
#else
473
-
474
- @_unavailableInEmbedded public
475
- func _convertConstArrayToPointerArgument< FromElement, ToPointer: _Pointer > (
476
- _ arr: [ FromElement ] ) -> ( Builtin . NativeObject ? , ToPointer ) {
477
- fatalError ( " unreachable in embedded Swift (marked as unavailable) " )
478
- }
479
-
480
- @_unavailableInEmbedded public
481
- func _convertMutableArrayToPointerArgument< FromElement, ToPointer: _Pointer > (
482
- _ a: inout [ FromElement ] ) -> ( Builtin . NativeObject ? , ToPointer ) {
483
- fatalError ( " unreachable in embedded Swift (marked as unavailable) " )
484
- }
485
-
486
- @_unavailableInEmbedded public
511
+ @_transparent
512
+ @_unavailableInEmbedded
513
+ public
487
514
func _convertConstStringToUTF8PointerArgument< ToPointer: _Pointer > (
488
515
_ str: String ) -> ( Builtin . NativeObject ? , ToPointer ) {
489
516
fatalError ( " unreachable in embedded Swift (marked as unavailable) " )
490
517
}
491
-
492
518
#endif
0 commit comments