(
this: &This<Object<'js>>,
ctx: &Ctx<'js>,
offset: &Opt<usize>,
endian: Endian,
kind: NumberKind,
)
| 690 | (1i64 << (kind.bits() - 1)) - 1 |
| 691 | } else { |
| 692 | bit_mask |
| 693 | }; |
| 694 | let min_val = if kind.is_signed() { -max_val - 1 } else { 0 }; |
| 695 | |
| 696 | if int_val < min_val || int_val > max_val { |
| 697 | return Err(Exception::throw_range(ctx, "Value out of range")); |
| 698 | } |
| 699 | |
| 700 | let masked = int_val & bit_mask; |
| 701 | ( |
| 702 | (kind.bits() / 8) as usize, |
| 703 | shifted_bytes(masked as u64, kind.bits(), endian), |
| 704 | ) |
| 705 | }, |
| 706 | }; |
| 707 | |
| 708 | if offset >= this.0.len() || offset + byte_count > this.0.len() { |
| 709 | return Err(Exception::throw_range( |
| 710 | ctx, |
| 711 | "The specified offset is out of range", |
| 712 | )); |
| 713 | } |
| 714 | |
| 715 | let target = ObjectBytes::from(ctx, this.0.as_inner())?; |
| 716 | let mut writable_length = 0; |
| 717 | |
| 718 | if let Some((array_buffer, target_byte_length, target_byte_offset)) = |
| 719 | target.get_array_buffer()? |
| 720 | { |
| 721 | let target_bytes = |
| 722 | resolve_view_bytes(ctx, array_buffer, target_byte_length, target_byte_offset)?; |
| 723 | |
| 724 | writable_length = offset + bytes.len(); |
| 725 | target_bytes[offset..writable_length].copy_from_slice(&bytes); |
| 726 | } |
| 727 | |
| 728 | Ok(writable_length) |
| 729 | } |
| 730 | |
| 731 | fn read_buf<'js>( |
| 732 | this: &This<Object<'js>>, |
| 733 | ctx: &Ctx<'js>, |
| 734 | offset: &Opt<usize>, |
| 735 | endian: Endian, |
| 736 | kind: NumberKind, |
| 737 | ) -> Result<Value<'js>> { |
| 738 | // Retrieve the array buffer |
| 739 | let target = ObjectBytes::from(ctx, this.0.as_inner())?; |
| 740 | let Some((array_buffer, target_byte_length, target_byte_offset)) = target.get_array_buffer()? |
| 741 | else { |
| 742 | return Err(Exception::throw_message(ctx, ERROR_MSG_NOT_ARRAY_BUFFER)); |
| 743 | }; |
| 744 | let target_bytes = |
| 745 | resolve_view_bytes(ctx, array_buffer, target_byte_length, target_byte_offset)?; |
| 746 | |
| 747 | // Enforce the bounds |
| 748 | let start = offset.0.unwrap_or_default(); |
| 749 | let end = start + (kind.bits() / 8) as usize; |
no test coverage detected