344 {
345 int num =
count << 1;
346 if (num < 0)
347 {
348 throw new ArgumentOutOfRangeException("count", SR.ArgumentOutOfRange_GetByteCountOverflow);
349 }
350 char* charStart =
chars;
352 char c = '\0';
353 bool flag = false;
354 EncoderFallbackBuffer encoderFallbackBuffer = null;
355 if (encoder != null)
356 {
357 c = encoder._charLeftOver;
358 if (c > '\0')
359 {
360 num += 2;
361 }
362 if (encoder.InternalHasFallbackBuffer)
363 {
364 encoderFallbackBuffer = encoder.FallbackBuffer;
365 if (encoderFallbackBuffer.Remaining > 0)
366 {
368 }
369 encoderFallbackBuffer.InternalInitialize(charStart, ptr, encoder, setEncoder: false);
370 }
371 }
372 while (true)
373 {
374 char num2 = encoderFallbackBuffer?.InternalGetNextChar() ?? '\0';
375 char c2 = num2;
376 char* chars2;
377 if (num2 != 0 ||
chars < ptr)
378 {
379 if (c2 == '\0')
380 {
381 if ((
bigEndian ^ BitConverter.IsLittleEndian) && ((ulong)
chars & 7uL) == 0
L && c ==
'\0')
382 {
383 ulong* ptr2 = (ulong*)(ptr - 3);
384 ulong* ptr3;
385 for (ptr3 = (ulong*)
chars; ptr3 < ptr2; ptr3++)
386 {
387 if ((0x8000800080008000uL & *ptr3) == 0
L)
388 {
389 continue;
390 }
391 ulong num3 = (0xF800F800F800F800uL & *ptr3) ^ 0xD800D800D800D800uL;
392 if ((num3 & 0xFFFF000000000000uL) == 0
L || (num3 & 0xFFFF00000000
L) == 0
L || (num3 & 0xFFFF0000u) == 0
L || (num3 & 0xFFFF) == 0
L)
393 {
394 long num4 = -287953294993589248
L & (long)(*ptr3);
395 if (!BitConverter.IsLittleEndian)
396 {
397 }
398 if (num4 != -2593835887162763264
L)
399 {
400 break;
401 }
402 }
403 }
406 {
407 goto IL_0295;
408 }
409 }
412 }
413 else
414 {
415 num += 2;
416 }
417 if (c2 >= '\ud800' && c2 <= '\udfff')
418 {
419 if (c2 <= '\udbff')
420 {
421 if (c > '\0')
422 {
424 num -= 2;
425 if (encoderFallbackBuffer == null)
426 {
427 encoderFallbackBuffer = ((encoder !=
null) ? encoder.FallbackBuffer :
encoderFallback.CreateFallbackBuffer());
428 encoderFallbackBuffer.InternalInitialize(charStart, ptr, encoder, setEncoder: false);
429 }
431 encoderFallbackBuffer.InternalFallback(c, ref chars2);
433 c = '\0';
434 }
435 else
436 {
437 c = c2;
438 }
439 }
440 else if (c == '\0')
441 {
442 num -= 2;
443 if (encoderFallbackBuffer == null)
444 {
445 encoderFallbackBuffer = ((encoder !=
null) ? encoder.FallbackBuffer :
encoderFallback.CreateFallbackBuffer());
446 encoderFallbackBuffer.InternalInitialize(charStart, ptr, encoder, setEncoder: false);
447 }
449 encoderFallbackBuffer.InternalFallback(c2, ref chars2);
451 }
452 else
453 {
454 c = '\0';
455 }
456 }
457 else if (c > '\0')
458 {
460 if (encoderFallbackBuffer == null)
461 {
462 encoderFallbackBuffer = ((encoder !=
null) ? encoder.FallbackBuffer :
encoderFallback.CreateFallbackBuffer());
463 encoderFallbackBuffer.InternalInitialize(charStart, ptr, encoder, setEncoder: false);
464 }
466 encoderFallbackBuffer.InternalFallback(c, ref chars2);
468 num -= 2;
469 c = '\0';
470 }
471 continue;
472 }
473 goto IL_0295;
474 IL_0295:
475 if (c <= '\0')
476 {
477 break;
478 }
479 num -= 2;
480 if (encoder != null && !encoder.MustFlush)
481 {
482 break;
483 }
484 if (flag)
485 {
486 throw new ArgumentException(SR.Format(SR.Argument_RecursiveFallback, c),
"chars");
487 }
488 if (encoderFallbackBuffer == null)
489 {
490 encoderFallbackBuffer = ((encoder !=
null) ? encoder.FallbackBuffer :
encoderFallback.CreateFallbackBuffer());
491 encoderFallbackBuffer.InternalInitialize(charStart, ptr, encoder, setEncoder: false);
492 }
494 encoderFallbackBuffer.InternalFallback(c, ref chars2);
496 c = '\0';
497 flag = true;
498 }
499 return num;
500 }
EncoderFallback encoderFallback
virtual string EncodingName