| 551 | |
| 552 | #[pymethod] |
| 553 | fn to_bytes(&self, args: IntToByteArgs, vm: &VirtualMachine) -> PyResult<PyBytes> { |
| 554 | let signed = args.signed.map_or(false, Into::into); |
| 555 | let byte_len = args.length; |
| 556 | |
| 557 | let value = self.as_bigint(); |
| 558 | match value.sign() { |
| 559 | Sign::Minus if !signed => { |
| 560 | return Err(vm.new_overflow_error("can't convert negative int to unsigned")); |
| 561 | } |
| 562 | Sign::NoSign => return Ok(vec![0u8; byte_len].into()), |
| 563 | _ => {} |
| 564 | } |
| 565 | |
| 566 | let mut origin_bytes = match (args.byteorder, signed) { |
| 567 | (ArgByteOrder::Big, true) => value.to_signed_bytes_be(), |
| 568 | (ArgByteOrder::Big, false) => value.to_bytes_be().1, |
| 569 | (ArgByteOrder::Little, true) => value.to_signed_bytes_le(), |
| 570 | (ArgByteOrder::Little, false) => value.to_bytes_le().1, |
| 571 | }; |
| 572 | |
| 573 | let origin_len = origin_bytes.len(); |
| 574 | if origin_len > byte_len { |
| 575 | return Err(vm.new_overflow_error("int too big to convert")); |
| 576 | } |
| 577 | |
| 578 | let mut append_bytes = match value.sign() { |
| 579 | Sign::Minus => vec![255u8; byte_len - origin_len], |
| 580 | _ => vec![0u8; byte_len - origin_len], |
| 581 | }; |
| 582 | |
| 583 | let bytes = match args.byteorder { |
| 584 | ArgByteOrder::Big => { |
| 585 | let mut bytes = append_bytes; |
| 586 | bytes.append(&mut origin_bytes); |
| 587 | bytes |
| 588 | } |
| 589 | ArgByteOrder::Little => { |
| 590 | let mut bytes = origin_bytes; |
| 591 | bytes.append(&mut append_bytes); |
| 592 | bytes |
| 593 | } |
| 594 | }; |
| 595 | Ok(bytes.into()) |
| 596 | } |
| 597 | |
| 598 | #[pygetset] |
| 599 | fn real(zelf: PyRef<Self>, vm: &VirtualMachine) -> PyRefExact<Self> { |