Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ EmitNumericConversion()

static void System.Linq.Expressions.Compiler.ILGen.EmitNumericConversion ( this ILGenerator il,
Type typeFrom,
Type typeTo,
bool isChecked )
inlinestaticprivate

Definition at line 494 of file ILGen.cs.

495 {
496 TypeCode typeCode = typeTo.GetTypeCode();
497 TypeCode typeCode2 = typeFrom.GetTypeCode();
498 if (typeCode == typeCode2)
499 {
500 return;
501 }
502 bool flag = typeCode2.IsUnsigned();
503 OpCode opcode;
504 switch (typeCode)
505 {
506 case TypeCode.Single:
507 if (flag)
508 {
509 il.Emit(OpCodes.Conv_R_Un);
510 }
511 opcode = OpCodes.Conv_R4;
512 break;
513 case TypeCode.Double:
514 if (flag)
515 {
516 il.Emit(OpCodes.Conv_R_Un);
517 }
518 opcode = OpCodes.Conv_R8;
519 break;
520 case TypeCode.Decimal:
521 {
522 MethodInfo meth = typeCode2 switch
523 {
524 TypeCode.Byte => CachedReflectionInfo.Decimal_op_Implicit_Byte,
525 TypeCode.SByte => CachedReflectionInfo.Decimal_op_Implicit_SByte,
526 TypeCode.Int16 => CachedReflectionInfo.Decimal_op_Implicit_Int16,
527 TypeCode.UInt16 => CachedReflectionInfo.Decimal_op_Implicit_UInt16,
528 TypeCode.Int32 => CachedReflectionInfo.Decimal_op_Implicit_Int32,
529 TypeCode.UInt32 => CachedReflectionInfo.Decimal_op_Implicit_UInt32,
530 TypeCode.Int64 => CachedReflectionInfo.Decimal_op_Implicit_Int64,
531 TypeCode.UInt64 => CachedReflectionInfo.Decimal_op_Implicit_UInt64,
532 TypeCode.Char => CachedReflectionInfo.Decimal_op_Implicit_Char,
533 _ => throw ContractUtils.Unreachable,
534 };
535 il.Emit(OpCodes.Call, meth);
536 return;
537 }
538 case TypeCode.SByte:
539 if (isChecked)
540 {
541 opcode = (flag ? OpCodes.Conv_Ovf_I1_Un : OpCodes.Conv_Ovf_I1);
542 break;
543 }
544 if (typeCode2 == TypeCode.Byte)
545 {
546 return;
547 }
548 opcode = OpCodes.Conv_I1;
549 break;
550 case TypeCode.Byte:
551 if (isChecked)
552 {
553 opcode = (flag ? OpCodes.Conv_Ovf_U1_Un : OpCodes.Conv_Ovf_U1);
554 break;
555 }
556 if (typeCode2 == TypeCode.SByte)
557 {
558 return;
559 }
560 opcode = OpCodes.Conv_U1;
561 break;
562 case TypeCode.Int16:
563 switch (typeCode2)
564 {
565 case TypeCode.SByte:
566 case TypeCode.Byte:
567 return;
568 case TypeCode.Char:
569 case TypeCode.UInt16:
570 if (!isChecked)
571 {
572 return;
573 }
574 break;
575 }
576 opcode = ((!isChecked) ? OpCodes.Conv_I2 : (flag ? OpCodes.Conv_Ovf_I2_Un : OpCodes.Conv_Ovf_I2));
577 break;
578 case TypeCode.Char:
579 case TypeCode.UInt16:
580 switch (typeCode2)
581 {
582 case TypeCode.Char:
583 case TypeCode.Byte:
584 case TypeCode.UInt16:
585 return;
586 case TypeCode.SByte:
587 case TypeCode.Int16:
588 if (!isChecked)
589 {
590 return;
591 }
592 break;
593 }
594 opcode = ((!isChecked) ? OpCodes.Conv_U2 : (flag ? OpCodes.Conv_Ovf_U2_Un : OpCodes.Conv_Ovf_U2));
595 break;
596 case TypeCode.Int32:
597 switch (typeCode2)
598 {
599 case TypeCode.SByte:
600 case TypeCode.Byte:
601 case TypeCode.Int16:
602 case TypeCode.UInt16:
603 return;
604 case TypeCode.UInt32:
605 if (!isChecked)
606 {
607 return;
608 }
609 break;
610 }
611 opcode = ((!isChecked) ? OpCodes.Conv_I4 : (flag ? OpCodes.Conv_Ovf_I4_Un : OpCodes.Conv_Ovf_I4));
612 break;
613 case TypeCode.UInt32:
614 switch (typeCode2)
615 {
616 case TypeCode.Char:
617 case TypeCode.Byte:
618 case TypeCode.UInt16:
619 return;
620 case TypeCode.SByte:
621 case TypeCode.Int16:
622 case TypeCode.Int32:
623 if (!isChecked)
624 {
625 return;
626 }
627 break;
628 }
629 opcode = ((!isChecked) ? OpCodes.Conv_U4 : (flag ? OpCodes.Conv_Ovf_U4_Un : OpCodes.Conv_Ovf_U4));
630 break;
631 case TypeCode.Int64:
632 if (!isChecked && typeCode2 == TypeCode.UInt64)
633 {
634 return;
635 }
636 opcode = ((!isChecked) ? (flag ? OpCodes.Conv_U8 : OpCodes.Conv_I8) : (flag ? OpCodes.Conv_Ovf_I8_Un : OpCodes.Conv_Ovf_I8));
637 break;
638 case TypeCode.UInt64:
639 if (!isChecked && typeCode2 == TypeCode.Int64)
640 {
641 return;
642 }
643 opcode = ((!isChecked) ? ((flag || typeCode2.IsFloatingPoint()) ? OpCodes.Conv_U8 : OpCodes.Conv_I8) : ((flag || typeCode2.IsFloatingPoint()) ? OpCodes.Conv_Ovf_U8_Un : OpCodes.Conv_Ovf_U8));
644 break;
645 default:
647 }
648 il.Emit(opcode);
649 }
static readonly OpCode Conv_I4
Definition OpCodes.cs:213
static readonly OpCode Conv_R_Un
Definition OpCodes.cs:239
static readonly OpCode Conv_I2
Definition OpCodes.cs:211
static readonly OpCode Conv_Ovf_U1
Definition OpCodes.cs:333
static readonly OpCode Conv_Ovf_I1
Definition OpCodes.cs:331
static readonly OpCode Conv_I1
Definition OpCodes.cs:209
static readonly OpCode Conv_U1
Definition OpCodes.cs:357
static readonly OpCode Conv_U4
Definition OpCodes.cs:221
static readonly OpCode Conv_R4
Definition OpCodes.cs:217
static readonly OpCode Conv_U2
Definition OpCodes.cs:355
static readonly OpCode Call
Definition OpCodes.cs:83
static readonly OpCode Conv_R8
Definition OpCodes.cs:219
static readonly OpCode Conv_U8
Definition OpCodes.cs:223
static readonly OpCode Conv_I8
Definition OpCodes.cs:215

References System.Reflection.Emit.OpCodes.Call, System.Reflection.Emit.OpCodes.Conv_I1, System.Reflection.Emit.OpCodes.Conv_I2, System.Reflection.Emit.OpCodes.Conv_I4, System.Reflection.Emit.OpCodes.Conv_I8, System.Reflection.Emit.OpCodes.Conv_Ovf_I1, System.Reflection.Emit.OpCodes.Conv_Ovf_I2, System.Reflection.Emit.OpCodes.Conv_Ovf_I4, System.Reflection.Emit.OpCodes.Conv_Ovf_I8, System.Reflection.Emit.OpCodes.Conv_Ovf_U1, System.Reflection.Emit.OpCodes.Conv_Ovf_U2, System.Reflection.Emit.OpCodes.Conv_Ovf_U4, System.Reflection.Emit.OpCodes.Conv_Ovf_U8, System.Reflection.Emit.OpCodes.Conv_Ovf_U8_Un, System.Reflection.Emit.OpCodes.Conv_R4, System.Reflection.Emit.OpCodes.Conv_R8, System.Reflection.Emit.OpCodes.Conv_R_Un, System.Reflection.Emit.OpCodes.Conv_U1, System.Reflection.Emit.OpCodes.Conv_U2, System.Reflection.Emit.OpCodes.Conv_U4, System.Reflection.Emit.OpCodes.Conv_U8, System.Linq.Expressions.CachedReflectionInfo.Decimal_op_Implicit_Byte, System.Linq.Expressions.CachedReflectionInfo.Decimal_op_Implicit_Char, System.Linq.Expressions.CachedReflectionInfo.Decimal_op_Implicit_Int16, System.Linq.Expressions.CachedReflectionInfo.Decimal_op_Implicit_Int32, System.Linq.Expressions.CachedReflectionInfo.Decimal_op_Implicit_Int64, System.Linq.Expressions.CachedReflectionInfo.Decimal_op_Implicit_SByte, System.Linq.Expressions.CachedReflectionInfo.Decimal_op_Implicit_UInt16, System.Linq.Expressions.CachedReflectionInfo.Decimal_op_Implicit_UInt32, System.Linq.Expressions.CachedReflectionInfo.Decimal_op_Implicit_UInt64, System.Reflection.Emit.ILGenerator.Emit(), System.Type.GetTypeCode(), and System.Dynamic.Utils.ContractUtils.Unreachable.