Rollup merge of #126787 - Strophox:get-bytes, r=RalfJung · rust-lang/rust@9498d5c (original) (raw)

`@@ -40,9 +40,16 @@ pub trait AllocBytes: Clone + fmt::Debug + Deref<Target = [u8]> + DerefMut<Targe

`

40

40

`/// Gives direct access to the raw underlying storage.

`

41

41

`///

`

42

42

`/// Crucially this pointer is compatible with:

`

43

``

`-

/// - other pointers retunred by this method, and

`

``

43

`+

/// - other pointers returned by this method, and

`

44

44

`` /// - references returned from deref(), as long as there was no write.

``

45

45

`fn as_mut_ptr(&mut self) -> *mut u8;

`

``

46

+

``

47

`+

/// Gives direct access to the raw underlying storage.

`

``

48

`+

///

`

``

49

`+

/// Crucially this pointer is compatible with:

`

``

50

`+

/// - other pointers returned by this method, and

`

``

51

`` +

/// - references returned from deref(), as long as there was no write.

``

``

52

`+

fn as_ptr(&self) -> *const u8;

`

46

53

`}

`

47

54

``

48

55

`` /// Default bytes for Allocation is a Box<u8>.

``

`@@ -62,6 +69,11 @@ impl AllocBytes for Box<[u8]> {

`

62

69

`// Carefully avoiding any intermediate references.

`

63

70

` ptr::addr_of_mut!(**self).cast()

`

64

71

`}

`

``

72

+

``

73

`+

fn as_ptr(&self) -> *const u8 {

`

``

74

`+

// Carefully avoiding any intermediate references.

`

``

75

`+

ptr::addr_of!(**self).cast()

`

``

76

`+

}

`

65

77

`}

`

66

78

``

67

79

`/// This type represents an Allocation in the Miri/CTFE core engine.

`

`@@ -490,19 +502,27 @@ impl<Prov: Provenance, Extra, Bytes: AllocBytes> Allocation<Prov, Extra, Bytes>

`

490

502

`self.provenance.clear(range, cx)?;

`

491

503

``

492

504

`assert!(range.end().bytes_usize() <= self.bytes.len()); // need to do our own bounds-check

`

493

``

`` -

// Cruciall, we go via AllocBytes::as_mut_ptr, not AllocBytes::deref_mut.

``

``

505

`` +

// Crucially, we go via AllocBytes::as_mut_ptr, not AllocBytes::deref_mut.

``

494

506

`let begin_ptr = self.bytes.as_mut_ptr().wrapping_add(range.start.bytes_usize());

`

495

507

`let len = range.end().bytes_usize() - range.start.bytes_usize();

`

496

508

`Ok(ptr::slice_from_raw_parts_mut(begin_ptr, len))

`

497

509

`}

`

498

510

``

499

511

`/// This gives direct mutable access to the entire buffer, just exposing their internal state

`

500

``

`` -

/// without reseting anything. Directly exposes AllocBytes::as_mut_ptr. Only works if

``

``

512

`` +

/// without resetting anything. Directly exposes AllocBytes::as_mut_ptr. Only works if

``

501

513

`` /// OFFSET_IS_ADDR is true.

``

502

514

`pub fn get_bytes_unchecked_raw_mut(&mut self) -> *mut u8 {

`

503

515

`assert!(Prov::OFFSET_IS_ADDR);

`

504

516

`self.bytes.as_mut_ptr()

`

505

517

`}

`

``

518

+

``

519

`+

/// This gives direct immutable access to the entire buffer, just exposing their internal state

`

``

520

`` +

/// without resetting anything. Directly exposes AllocBytes::as_ptr. Only works if

``

``

521

`` +

/// OFFSET_IS_ADDR is true.

``

``

522

`+

pub fn get_bytes_unchecked_raw(&self) -> *const u8 {

`

``

523

`+

assert!(Prov::OFFSET_IS_ADDR);

`

``

524

`+

self.bytes.as_ptr()

`

``

525

`+

}

`

506

526

`}

`

507

527

``

508

528

`/// Reading and writing.

`