| 461 | string: String, |
| 462 | args: Rest<Value<'js>>, |
| 463 | ) -> Result<usize> { |
| 464 | let (offset, length, encoding) = get_write_parameters(&ctx, &args, this.0.len())?; |
| 465 | |
| 466 | let target = ObjectBytes::from(&ctx, this.0.as_inner())?; |
| 467 | |
| 468 | let mut writable_length = 0; |
| 469 | |
| 470 | if let Some((array_buffer, target_byte_length, target_byte_offset)) = |
| 471 | target.get_array_buffer()? |
| 472 | { |
| 473 | let target_bytes = |
| 474 | resolve_view_bytes(&ctx, array_buffer, target_byte_length, target_byte_offset)?; |
| 475 | |
| 476 | let encoder = Encoder::from_str(&encoding).or_throw(&ctx)?; |
| 477 | |
| 478 | if encoder.as_label() == "utf-8" { |
| 479 | let (source_slice, valid_length) = safe_byte_slice(&string, length.min(string.len())); |
| 480 | writable_length = valid_length; |
| 481 | target_bytes[offset..offset + writable_length].copy_from_slice(source_slice); |
| 482 | } else { |
| 483 | let decode_bytes = encoder.decode_from_string(string).or_throw(&ctx)?; |
| 484 | writable_length = length.min(decode_bytes.len()); |
| 485 | target_bytes[offset..offset + writable_length] |
| 486 | .copy_from_slice(&decode_bytes[..writable_length]); |
| 487 | }; |
| 488 | } |
| 489 | |
| 490 | Ok(writable_length) |
| 491 | } |
| 492 | |
| 493 | fn get_write_parameters<'js>( |
| 494 | ctx: &Ctx<'js>, |