diff --git a/crates/utils/src/helpers.cairo b/crates/utils/src/helpers.cairo index 826ae240f..2eb94f6b2 100644 --- a/crates/utils/src/helpers.cairo +++ b/crates/utils/src/helpers.cairo @@ -528,42 +528,43 @@ impl U256Impl of U256Trait { #[generate_trait] impl ByteArrayExt of ByteArrayExTrait { fn from_bytes(mut bytes: Span) -> ByteArray { - //TODO(eni): optimize deserialization of Span to ByteArray; - // we can just deserialize bytes by chunks of 31, skipping pending_word - // checks let mut arr: ByteArray = Default::default(); - let (mut q, mut r) = DivRem::div_rem(bytes.len(), 31_u32.try_into().unwrap()); + let (mut nb_full_words, mut pending_word_len) = DivRem::div_rem( + bytes.len(), 31_u32.try_into().unwrap() + ); + let mut i = 0; loop { - if q == 0 { + if i == nb_full_words { break; }; let mut word: felt252 = 0; - let mut i = 0; + let mut j = 0; loop { - if i == 31 { + if j == 31 { break; }; word = word * POW_256_1.into() + (*bytes.pop_front().unwrap()).into(); - i += 1; + j += 1; }; - arr.data.append(word.try_into().unwrap()); - q -= 1; + arr.data.append(word.try_into().unwrap()); + i += 1; }; - if r == 0 { + if pending_word_len == 0 { return arr; }; - arr.pending_word_len = r; let mut pending_word: felt252 = 0; + let mut i = 0; loop { - if r == 0 { + if i == pending_word_len { break; }; pending_word = pending_word * POW_256_1.into() + (*bytes.pop_front().unwrap()).into(); - r -= 1; + i += 1; }; + arr.pending_word_len = pending_word_len; arr.pending_word = pending_word; arr }