|
1 | | -use core::{ |
2 | | - mem::MaybeUninit, |
3 | | - slice::{from_raw_parts, from_raw_parts_mut}, |
4 | | - str::from_utf8_unchecked, |
5 | | -}; |
| 1 | +use core::{slice::from_raw_parts, str::from_utf8_unchecked}; |
6 | 2 | use pinocchio::{ |
7 | | - account_info::AccountInfo, memory::sol_memcpy, program_error::ProgramError, pubkey::Pubkey, |
| 3 | + account_info::AccountInfo, program_error::ProgramError, pubkey::Pubkey, syscalls::sol_memcpy_, |
8 | 4 | ProgramResult, |
9 | 5 | }; |
10 | 6 | use spl_token_interface::{ |
@@ -71,9 +67,6 @@ pub use transfer::process_transfer; |
71 | 67 | pub use transfer_checked::process_transfer_checked; |
72 | 68 | pub use ui_amount_to_amount::process_ui_amount_to_amount; |
73 | 69 |
|
74 | | -/// An uninitialized byte. |
75 | | -const UNINIT_BYTE: MaybeUninit<u8> = MaybeUninit::uninit(); |
76 | | - |
77 | 70 | /// Maximum number of digits in a formatted `u64`. |
78 | 71 | /// |
79 | 72 | /// The maximum number of digits is equal to the maximum number |
@@ -164,41 +157,26 @@ fn try_ui_amount_into_amount(ui_amount: &str, decimals: u8) -> Result<u64, Progr |
164 | 157 | return Err(ProgramError::InvalidArgument); |
165 | 158 | } |
166 | 159 |
|
167 | | - let mut digits = [UNINIT_BYTE; MAX_FORMATTED_DIGITS]; |
168 | | - // SAFETY: `digits` is an array of `MaybeUninit<u8>`, which has the same |
169 | | - // memory layout as `u8`. |
170 | | - let slice: &mut [u8] = |
171 | | - unsafe { from_raw_parts_mut(digits.as_mut_ptr() as *mut _, MAX_FORMATTED_DIGITS) }; |
| 160 | + let mut digits = [b'0'; MAX_FORMATTED_DIGITS]; |
172 | 161 |
|
173 | 162 | // SAFETY: the total length of `amount_str` and `after_decimal` is less than |
174 | 163 | // `MAX_FORMATTED_DIGITS`. |
175 | 164 | unsafe { |
176 | | - sol_memcpy(slice, amount_str.as_bytes(), length); |
| 165 | + sol_memcpy_(digits.as_mut_ptr(), amount_str.as_ptr(), length as u64); |
177 | 166 |
|
178 | | - sol_memcpy( |
179 | | - &mut slice[length..], |
180 | | - after_decimal.as_bytes(), |
181 | | - after_decimal.len(), |
| 167 | + sol_memcpy_( |
| 168 | + digits.as_mut_ptr().add(length), |
| 169 | + after_decimal.as_ptr(), |
| 170 | + after_decimal.len() as u64, |
182 | 171 | ); |
183 | 172 | } |
184 | 173 |
|
185 | | - let length = amount_str.len() + after_decimal.len(); |
186 | 174 | let remaining = decimals.saturating_sub(after_decimal.len()); |
187 | | - |
188 | | - // SAFETY: `digits` is an array of `MaybeUninit<u8>`, which has the same memory |
189 | | - // layout as `u8`. |
190 | | - let ptr = unsafe { digits.as_mut_ptr().add(length) }; |
191 | | - |
192 | | - for offset in 0..remaining { |
193 | | - // SAFETY: `ptr` is within the bounds of `digits`. |
194 | | - unsafe { |
195 | | - (ptr.add(offset) as *mut u8).write(b'0'); |
196 | | - } |
197 | | - } |
| 175 | + let length = amount_str.len() + after_decimal.len() + remaining; |
198 | 176 |
|
199 | 177 | // SAFETY: `digits` only contains valid UTF-8 bytes. |
200 | 178 | unsafe { |
201 | | - from_utf8_unchecked(from_raw_parts(digits.as_ptr() as _, length + remaining)) |
| 179 | + from_utf8_unchecked(from_raw_parts(digits.as_ptr(), length)) |
202 | 180 | .parse::<u64>() |
203 | 181 | .map_err(|_| ProgramError::InvalidArgument) |
204 | 182 | } |
|
0 commit comments