503 {
504 char c = '\0';
505 bool flag = false;
510 EncoderFallbackBuffer encoderFallbackBuffer = null;
511 if (encoder != null)
512 {
513 c = encoder._charLeftOver;
514 if (encoder.InternalHasFallbackBuffer)
515 {
516 encoderFallbackBuffer = encoder.FallbackBuffer;
517 if (encoderFallbackBuffer.Remaining > 0 && encoder._throwOnOverflow)
518 {
520 }
521 encoderFallbackBuffer.InternalInitialize(ptr4, ptr2, encoder, setEncoder: false);
522 }
523 }
524 while (true)
525 {
526 char num = encoderFallbackBuffer?.InternalGetNextChar() ?? '\0';
527 char c2 = num;
528 char* chars2;
529 if (num != 0 ||
chars < ptr2)
530 {
531 if (c2 == '\0')
532 {
533 if ((
bigEndian ^ BitConverter.IsLittleEndian) && ((ulong)
chars & 7uL) == 0
L && c ==
'\0')
534 {
536 ulong* ptr6 = (ulong*)
chars;
537 ulong* ptr7 = (ulong*)
bytes;
538 while (ptr6 < ptr5)
539 {
540 if ((0x8000800080008000uL & *ptr6) != 0
L)
541 {
542 ulong num2 = (0xF800F800F800F800uL & *ptr6) ^ 0xD800D800D800D800uL;
543 if ((num2 & 0xFFFF000000000000uL) == 0
L || (num2 & 0xFFFF00000000
L) == 0
L || (num2 & 0xFFFF0000u) == 0
L || (num2 & 0xFFFF) == 0
L)
544 {
545 long num3 = -287953294993589248
L & (long)(*ptr6);
546 if (!BitConverter.IsLittleEndian)
547 {
548 }
549 if (num3 != -2593835887162763264
L)
550 {
551 break;
552 }
553 }
554 }
555 Unsafe.WriteUnaligned(ptr7, *ptr6);
556 ptr6++;
557 ptr7++;
558 }
562 {
563 goto IL_039f;
564 }
565 }
568 }
569 if (c2 >= '\ud800' && c2 <= '\udfff')
570 {
571 if (c2 <= '\udbff')
572 {
573 if (c > '\0')
574 {
576 if (encoderFallbackBuffer == null)
577 {
578 encoderFallbackBuffer = ((encoder !=
null) ? encoder.FallbackBuffer :
encoderFallback.CreateFallbackBuffer());
579 encoderFallbackBuffer.InternalInitialize(ptr4, ptr2, encoder, setEncoder: true);
580 }
582 encoderFallbackBuffer.InternalFallback(c, ref chars2);
584 c = '\0';
585 }
586 else
587 {
588 c = c2;
589 }
590 continue;
591 }
592 if (c == '\0')
593 {
594 if (encoderFallbackBuffer == null)
595 {
596 encoderFallbackBuffer = ((encoder !=
null) ? encoder.FallbackBuffer :
encoderFallback.CreateFallbackBuffer());
597 encoderFallbackBuffer.InternalInitialize(ptr4, ptr2, encoder, setEncoder: true);
598 }
600 encoderFallbackBuffer.InternalFallback(c2, ref chars2);
602 continue;
603 }
604 if (
bytes + 3 >= ptr)
605 {
606 if (encoderFallbackBuffer != null && encoderFallbackBuffer.bFallingBack)
607 {
608 encoderFallbackBuffer.MovePrevious();
609 encoderFallbackBuffer.MovePrevious();
610 }
611 else
612 {
614 }
616 c = '\0';
617 goto IL_039f;
618 }
620 {
621 *(
bytes++) = (
byte)((int)c >> 8);
622 *(
bytes++) = (
byte)c;
623 }
624 else
625 {
626 *(
bytes++) = (
byte)c;
627 *(
bytes++) = (
byte)((int)c >> 8);
628 }
629 c = '\0';
630 }
631 else if (c > '\0')
632 {
634 if (encoderFallbackBuffer == null)
635 {
636 encoderFallbackBuffer = ((encoder !=
null) ? encoder.FallbackBuffer :
encoderFallback.CreateFallbackBuffer());
637 encoderFallbackBuffer.InternalInitialize(ptr4, ptr2, encoder, setEncoder: true);
638 }
640 encoderFallbackBuffer.InternalFallback(c, ref chars2);
642 c = '\0';
643 continue;
644 }
646 {
648 {
649 *(
bytes++) = (
byte)((int)c2 >> 8);
650 *(
bytes++) = (
byte)c2;
651 }
652 else
653 {
654 *(
bytes++) = (
byte)c2;
655 *(
bytes++) = (
byte)((int)c2 >> 8);
656 }
657 continue;
658 }
659 if (encoderFallbackBuffer != null && encoderFallbackBuffer.bFallingBack)
660 {
661 encoderFallbackBuffer.MovePrevious();
662 }
663 else
664 {
666 }
668 }
669 goto IL_039f;
670 IL_039f:
671 if (c <= '\0' || (encoder != null && !encoder.MustFlush))
672 {
673 break;
674 }
675 if (flag)
676 {
677 throw new ArgumentException(SR.Format(SR.Argument_RecursiveFallback, c),
"chars");
678 }
679 if (encoderFallbackBuffer == null)
680 {
681 encoderFallbackBuffer = ((encoder !=
null) ? encoder.FallbackBuffer :
encoderFallback.CreateFallbackBuffer());
682 encoderFallbackBuffer.InternalInitialize(ptr4, ptr2, encoder, setEncoder: true);
683 }
685 encoderFallbackBuffer.InternalFallback(c, ref chars2);
687 c = '\0';
688 flag = true;
689 }
690 if (encoder != null)
691 {
692 encoder._charLeftOver = c;
693 encoder._charsUsed = (int)(
chars - ptr4);
694 }
695 return (
int)(
bytes - ptr3);
696 }
EncoderFallback encoderFallback
void ThrowBytesOverflow()
virtual string EncodingName