Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
CodeGenerator.cs
Go to the documentation of this file.
7
9
10internal sealed class CodeGenerator
11{
12 private enum CodeGenTrace
13 {
14 None,
15 Save,
16 Tron
17 }
18
20
21 private static MethodInfo s_objectEquals;
22
24
26
27 private static MethodInfo s_stringFormat;
28
30
32
34
36
38
40
42
44
45 private readonly CodeGenTrace _codeGenTrace;
46
48
49 private static readonly MethodInfo s_stringLength = typeof(string).GetProperty("Length").GetMethod;
50
52 {
53 get
54 {
55 if (s_getTypeFromHandle == null)
56 {
57 s_getTypeFromHandle = typeof(Type).GetMethod("GetTypeFromHandle");
58 }
60 }
61 }
62
63 private static MethodInfo ObjectEquals
64 {
65 get
66 {
67 if (s_objectEquals == null)
68 {
69 s_objectEquals = typeof(object).GetMethod("Equals", BindingFlags.Static | BindingFlags.Public);
70 }
71 return s_objectEquals;
72 }
73 }
74
76 {
77 get
78 {
79 if (s_arraySetValue == null)
80 {
81 s_arraySetValue = typeof(Array).GetMethod("SetValue", new Type[2]
82 {
83 typeof(object),
84 typeof(int)
85 });
86 }
87 return s_arraySetValue;
88 }
89 }
90
92 {
93 get
94 {
95 if (s_objectToString == null)
96 {
97 s_objectToString = typeof(object).GetMethod("ToString", Type.EmptyTypes);
98 }
99 return s_objectToString;
100 }
101 }
102
104 {
105 get
106 {
107 if (s_stringFormat == null)
108 {
109 s_stringFormat = typeof(string).GetMethod("Format", new Type[2]
110 {
111 typeof(string),
112 typeof(object[])
113 });
114 }
115 return s_stringFormat;
116 }
117 }
118
120 {
121 get
122 {
123 if (s_serializationModule == null)
124 {
126 }
128 }
129 }
130
132
133 internal CodeGenerator()
134 {
136 }
137
145
147 {
149 ParameterInfo[] parameters = invokeMethod.GetParameters();
150 Type[] array = new Type[parameters.Length];
151 for (int i = 0; i < parameters.Length; i++)
152 {
153 array[i] = parameters[i].ParameterType;
154 }
157 }
158
165
166 private void InitILGeneration(string methodName, Type[] argTypes)
167 {
171 for (int i = 0; i < argTypes.Length; i++)
172 {
173 _argList.Add(new ArgBuilder(i, argTypes[i]));
174 }
175 if (_codeGenTrace != 0)
176 {
177 EmitSourceLabel("Begin method " + methodName + " {");
178 }
179 }
180
182 {
184 if (_codeGenTrace != 0)
185 {
186 EmitSourceLabel("} End method");
187 }
188 Ret();
189 Delegate @delegate = null;
191 _dynamicMethod = null;
192 _delegateType = null;
193 _ilGen = null;
194 _blockStack = null;
195 _argList = null;
196 return @delegate;
197 }
198
199 internal ArgBuilder GetArg(int index)
200 {
201 return _argList[index];
202 }
203
204 internal Type GetVariableType(object var)
205 {
206 if (var is ArgBuilder)
207 {
208 return ((ArgBuilder)var).ArgType;
209 }
210 if (var is LocalBuilder)
211 {
212 return ((LocalBuilder)var).LocalType;
213 }
214 return var.GetType();
215 }
216
217 internal LocalBuilder DeclareLocal(Type type, string name, object initialValue)
218 {
222 return localBuilder;
223 }
224
225 internal LocalBuilder DeclareLocal(Type type, string name)
226 {
227 return DeclareLocal(type, name, isPinned: false);
228 }
229
230 internal LocalBuilder DeclareLocal(Type type, string name, bool isPinned)
231 {
233 if (_codeGenTrace != 0)
234 {
236 EmitSourceComment("Declare local '" + name + "' of type " + type);
237 }
238 return localBuilder;
239 }
240
241 internal void Set(LocalBuilder local, object value)
242 {
243 Load(value);
244 Store(local);
245 }
246
247 internal object For(LocalBuilder local, object start, object end)
248 {
250 if (forState.Index != null)
251 {
252 Load(start);
253 Stloc(forState.Index);
254 Br(forState.TestLabel);
255 }
256 MarkLabel(forState.BeginLabel);
258 return forState;
259 }
260
261 internal void EndFor()
262 {
263 object obj = _blockStack.Pop();
265 if (forState == null)
266 {
268 }
269 if (forState.Index != null)
270 {
271 Ldloc(forState.Index);
272 Ldc(1);
273 Add();
274 Stloc(forState.Index);
275 MarkLabel(forState.TestLabel);
276 Ldloc(forState.Index);
277 Load(forState.End);
279 {
280 Ldlen();
281 }
282 Blt(forState.BeginLabel);
283 }
284 else
285 {
286 Br(forState.BeginLabel);
287 }
288 if (forState.RequiresEndLabel)
289 {
290 MarkLabel(forState.EndLabel);
291 }
292 }
293
294 internal void Break(object forState)
295 {
297 }
298
299 internal void IfFalseBreak(object forState)
300 {
302 }
303
305 {
306 foreach (object item in _blockStack)
307 {
309 {
310 if (!forState.RequiresEndLabel)
311 {
314 }
315 if (_codeGenTrace != 0)
316 {
317 EmitSourceInstruction(branchInstruction.ToString() + " " + forState.EndLabel.GetHashCode());
318 }
320 break;
321 }
322 }
323 }
324
335
337 {
338 object obj = _blockStack.Pop();
340 if (forState == null)
341 {
343 }
344 MarkLabel(forState.TestLabel);
345 object end = forState.End;
346 Call(end, moveNextMethod);
347 Brtrue(forState.BeginLabel);
348 if (forState.RequiresEndLabel)
349 {
350 MarkLabel(forState.EndLabel);
351 }
352 }
353
354 internal void IfNotDefaultValue(object value)
355 {
357 TypeCode typeCode = variableType.GetTypeCode();
358 if ((typeCode == TypeCode.Object && variableType.IsValueType) || typeCode == TypeCode.DateTime || typeCode == TypeCode.Decimal)
359 {
362 Load(value);
365 IfNot();
366 }
367 else
368 {
370 Load(value);
371 If(Cmp.NotEqualTo);
372 }
373 }
374
375 internal void If()
376 {
377 InternalIf(negate: false);
378 }
379
380 internal void IfNot()
381 {
382 InternalIf(negate: true);
383 }
384
386 {
387 return cmp switch
388 {
394 _ => OpCodes.Blt,
395 };
396 }
397
398 internal void If(Cmp cmpOp)
399 {
400 IfState ifState = new IfState();
405 }
406
407 internal void If(object value1, Cmp cmpOp, object value2)
408 {
409 Load(value1);
410 Load(value2);
411 If(cmpOp);
412 }
413
414 internal void Else()
415 {
417 Br(ifState.EndIf);
418 MarkLabel(ifState.ElseBegin);
421 }
422
423 internal void ElseIf(object value1, Cmp cmpOp, object value2)
424 {
426 Br(ifState.EndIf);
427 MarkLabel(ifState.ElseBegin);
428 Load(value1);
429 Load(value2);
433 }
434
435 internal void EndIf()
436 {
438 if (!ifState.ElseBegin.Equals(ifState.EndIf))
439 {
440 MarkLabel(ifState.ElseBegin);
441 }
442 MarkLabel(ifState.EndIf);
443 }
444
452
459
460 internal void Call(object thisObj, MethodInfo methodInfo, object param1)
461 {
466 }
467
468 internal void Call(object thisObj, MethodInfo methodInfo, object param1, object param2)
469 {
475 }
476
477 internal void Call(object thisObj, MethodInfo methodInfo, object param1, object param2, object param3)
478 {
485 }
486
487 internal void Call(object thisObj, MethodInfo methodInfo, object param1, object param2, object param3, object param4)
488 {
496 }
497
498 internal void Call(object thisObj, MethodInfo methodInfo, object param1, object param2, object param3, object param4, object param5)
499 {
508 }
509
510 internal void Call(object thisObj, MethodInfo methodInfo, object param1, object param2, object param3, object param4, object param5, object param6)
511 {
521 }
522
524 {
525 if (methodInfo.IsVirtual && !methodInfo.DeclaringType.IsValueType)
526 {
527 if (_codeGenTrace != 0)
528 {
529 EmitSourceInstruction("Callvirt " + methodInfo.ToString() + " on type " + methodInfo.DeclaringType.ToString());
530 }
532 }
533 else if (methodInfo.IsStatic)
534 {
535 if (_codeGenTrace != 0)
536 {
537 EmitSourceInstruction("Static Call " + methodInfo.ToString() + " on type " + methodInfo.DeclaringType.ToString());
538 }
540 }
541 else
542 {
543 if (_codeGenTrace != 0)
544 {
545 EmitSourceInstruction("Call " + methodInfo.ToString() + " on type " + methodInfo.DeclaringType.ToString());
546 }
548 }
549 }
550
551 internal void Call(ConstructorInfo ctor)
552 {
553 if (_codeGenTrace != 0)
554 {
555 EmitSourceInstruction("Call " + ctor.ToString() + " on type " + ctor.DeclaringType.ToString());
556 }
558 }
559
561 {
562 if (_codeGenTrace != 0)
563 {
564 EmitSourceInstruction("Newobj " + constructorInfo.ToString() + " on type " + constructorInfo.DeclaringType.ToString());
565 }
567 }
568
569 internal void InitObj(Type valueType)
570 {
571 if (_codeGenTrace != 0)
572 {
573 EmitSourceInstruction("Initobj " + valueType);
574 }
576 }
577
578 internal void NewArray(Type elementType, object len)
579 {
580 Load(len);
581 if (_codeGenTrace != 0)
582 {
584 }
586 }
587
588 internal void LoadArrayElement(object obj, object arrayIndex)
589 {
591 Load(obj);
594 {
597 }
598 else
599 {
601 }
602 }
603
604 internal void StoreArrayElement(object obj, object arrayIndex, object value)
605 {
608 {
610 return;
611 }
612 Type elementType = variableType.GetElementType();
613 Load(obj);
616 {
618 }
619 Load(value);
622 {
624 }
625 else
626 {
628 }
629 }
630
631 private static bool IsStruct(Type objType)
632 {
633 if (objType.IsValueType)
634 {
635 return !objType.IsPrimitive;
636 }
637 return false;
638 }
639
641 {
642 Type type = null;
644 {
646 type = fieldInfo.FieldType;
647 if (fieldInfo.IsStatic)
648 {
649 if (_codeGenTrace != 0)
650 {
651 EmitSourceInstruction("Ldsfld " + fieldInfo?.ToString() + " on type " + fieldInfo.DeclaringType);
652 }
654 }
655 else
656 {
657 if (_codeGenTrace != 0)
658 {
659 EmitSourceInstruction("Ldfld " + fieldInfo?.ToString() + " on type " + fieldInfo.DeclaringType);
660 }
662 }
663 }
664 else if (memberInfo is PropertyInfo propertyInfo)
665 {
666 type = propertyInfo.PropertyType;
667 if (propertyInfo != null)
668 {
669 MethodInfo getMethod = propertyInfo.GetMethod;
670 if (getMethod == null)
671 {
673 }
675 }
676 }
677 else
678 {
679 if (!(memberInfo is MethodInfo))
680 {
682 }
684 type = methodInfo.ReturnType;
686 }
688 return type;
689 }
690
692 {
694 {
696 if (fieldInfo.IsStatic)
697 {
698 if (_codeGenTrace != 0)
699 {
700 EmitSourceInstruction("Stsfld " + fieldInfo?.ToString() + " on type " + fieldInfo.DeclaringType);
701 }
703 }
704 else
705 {
706 if (_codeGenTrace != 0)
707 {
708 EmitSourceInstruction("Stfld " + fieldInfo?.ToString() + " on type " + fieldInfo.DeclaringType);
709 }
711 }
712 }
713 else if (memberInfo is PropertyInfo)
714 {
715 PropertyInfo propertyInfo = memberInfo as PropertyInfo;
716 if (propertyInfo != null)
717 {
718 MethodInfo setMethod = propertyInfo.SetMethod;
719 if (setMethod == null)
720 {
722 }
724 }
725 }
726 else
727 {
728 if (!(memberInfo is MethodInfo))
729 {
731 }
733 }
734 }
735
737 {
738 if (type.IsValueType)
739 {
740 switch (type.GetTypeCode())
741 {
742 case TypeCode.Boolean:
743 Ldc(boolVar: false);
744 return;
745 case TypeCode.Char:
746 case TypeCode.SByte:
747 case TypeCode.Byte:
748 case TypeCode.Int16:
749 case TypeCode.UInt16:
750 case TypeCode.Int32:
751 case TypeCode.UInt32:
752 Ldc(0);
753 return;
754 case TypeCode.Int64:
755 case TypeCode.UInt64:
756 Ldc(0L);
757 return;
758 case TypeCode.Single:
759 Ldc(0f);
760 return;
761 case TypeCode.Double:
762 Ldc(0.0);
763 return;
764 }
767 InitObj(type);
768 Load(obj);
769 }
770 else
771 {
772 Load(null);
773 }
774 }
775
776 internal void Load(object obj)
777 {
778 if (obj == null)
779 {
780 if (_codeGenTrace != 0)
781 {
782 EmitSourceInstruction("Ldnull");
783 }
785 }
786 else if (obj is ArgBuilder)
787 {
789 }
790 else if (obj is LocalBuilder)
791 {
793 }
794 else
795 {
796 Ldc(obj);
797 }
798 }
799
814
815 internal void Dec(object var)
816 {
817 Load(var);
818 Load(1);
819 Subtract();
820 Store(var);
821 }
822
823 internal void LoadAddress(object obj)
824 {
825 if (obj is ArgBuilder)
826 {
828 }
829 else if (obj is LocalBuilder)
830 {
832 }
833 else
834 {
835 Load(obj);
836 }
837 }
838
839 internal void ConvertAddress(Type source, Type target)
840 {
841 InternalConvert(source, target, isAddress: true);
842 }
843
844 internal void ConvertValue(Type source, Type target)
845 {
846 InternalConvert(source, target, isAddress: false);
847 }
848
849 internal void Castclass(Type target)
850 {
851 if (_codeGenTrace != 0)
852 {
853 EmitSourceInstruction("Castclass " + target);
854 }
855 _ilGen.Emit(OpCodes.Castclass, target);
856 }
857
858 internal void Box(Type type)
859 {
860 if (_codeGenTrace != 0)
861 {
862 EmitSourceInstruction("Box " + type);
863 }
865 }
866
867 internal void Unbox(Type type)
868 {
869 if (_codeGenTrace != 0)
870 {
871 EmitSourceInstruction("Unbox " + type);
872 }
874 }
875
896
897 internal void Ldobj(Type type)
898 {
899 OpCode ldindOpCode = GetLdindOpCode(type.GetTypeCode());
900 if (!ldindOpCode.Equals(OpCodes.Nop))
901 {
902 if (_codeGenTrace != 0)
903 {
905 }
907 }
908 else
909 {
910 if (_codeGenTrace != 0)
911 {
912 EmitSourceInstruction("Ldobj " + type);
913 }
915 }
916 }
917
918 internal void Stobj(Type type)
919 {
920 if (_codeGenTrace != 0)
921 {
922 EmitSourceInstruction("Stobj " + type);
923 }
925 }
926
927 internal void Ceq()
928 {
929 if (_codeGenTrace != 0)
930 {
932 }
934 }
935
936 internal void Throw()
937 {
938 if (_codeGenTrace != 0)
939 {
940 EmitSourceInstruction("Throw");
941 }
943 }
944
945 internal void Ldtoken(Type t)
946 {
947 if (_codeGenTrace != 0)
948 {
949 EmitSourceInstruction("Ldtoken " + t);
950 }
952 }
953
954 internal void Ldc(object o)
955 {
956 Type type = o.GetType();
957 if (o is Type)
958 {
959 Ldtoken((Type)o);
961 return;
962 }
963 if (type.IsEnum)
964 {
965 if (_codeGenTrace != 0)
966 {
967 EmitSourceComment("Ldc " + o.GetType()?.ToString() + "." + o);
968 }
970 return;
971 }
972 switch (type.GetTypeCode())
973 {
974 case TypeCode.Boolean:
975 Ldc((bool)o);
976 break;
977 case TypeCode.Char:
979 case TypeCode.SByte:
980 case TypeCode.Byte:
981 case TypeCode.Int16:
982 case TypeCode.UInt16:
984 break;
985 case TypeCode.Int32:
986 Ldc((int)o);
987 break;
988 case TypeCode.UInt32:
989 Ldc((int)(uint)o);
990 break;
991 case TypeCode.UInt64:
992 Ldc((long)(ulong)o);
993 break;
994 case TypeCode.Int64:
995 Ldc((long)o);
996 break;
997 case TypeCode.Single:
998 Ldc((float)o);
999 break;
1000 case TypeCode.Double:
1001 Ldc((double)o);
1002 break;
1003 case TypeCode.String:
1004 Ldstr((string)o);
1005 break;
1006 default:
1008 }
1009 }
1010
1011 internal void Ldc(bool boolVar)
1012 {
1013 if (boolVar)
1014 {
1015 if (_codeGenTrace != 0)
1016 {
1017 EmitSourceInstruction("Ldc.i4 1");
1018 }
1020 }
1021 else
1022 {
1023 if (_codeGenTrace != 0)
1024 {
1025 EmitSourceInstruction("Ldc.i4 0");
1026 }
1028 }
1029 }
1030
1031 internal void Ldc(int intVar)
1032 {
1033 if (_codeGenTrace != 0)
1034 {
1035 EmitSourceInstruction("Ldc.i4 " + intVar);
1036 }
1038 }
1039
1040 internal void Ldc(long l)
1041 {
1042 if (_codeGenTrace != 0)
1043 {
1044 EmitSourceInstruction("Ldc.i8 " + l);
1045 }
1047 }
1048
1049 internal void Ldc(float f)
1050 {
1051 if (_codeGenTrace != 0)
1052 {
1053 EmitSourceInstruction("Ldc.r4 " + f);
1054 }
1056 }
1057
1058 internal void Ldc(double d)
1059 {
1060 if (_codeGenTrace != 0)
1061 {
1062 EmitSourceInstruction("Ldc.r8 " + d);
1063 }
1065 }
1066
1067 internal void Ldstr(string strVar)
1068 {
1069 if (_codeGenTrace != 0)
1070 {
1071 EmitSourceInstruction("Ldstr " + strVar);
1072 }
1074 }
1075
1077 {
1078 if (localBuilder.LocalType.IsValueType)
1079 {
1081 }
1082 else
1083 {
1085 }
1086 }
1087
1089 {
1090 if (_codeGenTrace != 0)
1091 {
1093 }
1095 EmitStackTop(localBuilder.LocalType);
1096 }
1097
1098 internal void Stloc(LocalBuilder local)
1099 {
1100 if (_codeGenTrace != 0)
1101 {
1103 }
1104 EmitStackTop(local.LocalType);
1106 }
1107
1109 {
1110 if (_codeGenTrace != 0)
1111 {
1113 }
1115 EmitStackTop(localBuilder.LocalType);
1116 }
1117
1119 {
1120 if (argBuilder.ArgType.IsValueType)
1121 {
1123 }
1124 else
1125 {
1127 }
1128 }
1129
1130 internal void Ldarg(ArgBuilder arg)
1131 {
1132 Ldarg(arg.Index);
1133 }
1134
1135 internal void Starg(ArgBuilder arg)
1136 {
1137 Starg(arg.Index);
1138 }
1139
1140 internal void Ldarg(int slot)
1141 {
1142 if (_codeGenTrace != 0)
1143 {
1144 EmitSourceInstruction("Ldarg " + slot);
1145 }
1147 }
1148
1149 internal void Starg(int slot)
1150 {
1151 if (_codeGenTrace != 0)
1152 {
1153 EmitSourceInstruction("Starg " + slot);
1154 }
1156 }
1157
1159 {
1160 Ldarga(argBuilder.Index);
1161 }
1162
1163 internal void Ldarga(int slot)
1164 {
1165 if (_codeGenTrace != 0)
1166 {
1167 EmitSourceInstruction("Ldarga " + slot);
1168 }
1170 }
1171
1172 internal void Ldlen()
1173 {
1174 if (_codeGenTrace != 0)
1175 {
1176 EmitSourceInstruction("Ldlen");
1177 }
1179 if (_codeGenTrace != 0)
1180 {
1181 EmitSourceInstruction("Conv.i4");
1182 }
1184 }
1185
1207
1227
1229 {
1231 if (_codeGenTrace != 0)
1232 {
1233 EmitSourceInstruction(ldelema.ToString());
1234 }
1237 }
1238
1260
1280
1282 {
1283 return _ilGen.DefineLabel();
1284 }
1285
1286 internal void MarkLabel(Label label)
1287 {
1289 if (_codeGenTrace != 0)
1290 {
1291 EmitSourceLabel(label.GetHashCode() + ":");
1292 }
1293 }
1294
1295 internal void Add()
1296 {
1297 if (_codeGenTrace != 0)
1298 {
1299 EmitSourceInstruction("Add");
1300 }
1302 }
1303
1304 internal void Subtract()
1305 {
1306 if (_codeGenTrace != 0)
1307 {
1308 EmitSourceInstruction("Sub");
1309 }
1311 }
1312
1313 internal void And()
1314 {
1315 if (_codeGenTrace != 0)
1316 {
1317 EmitSourceInstruction("And");
1318 }
1320 }
1321
1322 internal void Or()
1323 {
1324 if (_codeGenTrace != 0)
1325 {
1327 }
1329 }
1330
1331 internal void Not()
1332 {
1333 if (_codeGenTrace != 0)
1334 {
1335 EmitSourceInstruction("Not");
1336 }
1338 }
1339
1340 internal void Ret()
1341 {
1342 if (_codeGenTrace != 0)
1343 {
1344 EmitSourceInstruction("Ret");
1345 }
1347 }
1348
1349 internal void Br(Label label)
1350 {
1351 if (_codeGenTrace != 0)
1352 {
1353 EmitSourceInstruction("Br " + label.GetHashCode());
1354 }
1356 }
1357
1358 internal void Blt(Label label)
1359 {
1360 if (_codeGenTrace != 0)
1361 {
1362 EmitSourceInstruction("Blt " + label.GetHashCode());
1363 }
1365 }
1366
1367 internal void Brfalse(Label label)
1368 {
1369 if (_codeGenTrace != 0)
1370 {
1371 EmitSourceInstruction("Brfalse " + label.GetHashCode());
1372 }
1374 }
1375
1376 internal void Brtrue(Label label)
1377 {
1378 if (_codeGenTrace != 0)
1379 {
1380 EmitSourceInstruction("Brtrue " + label.GetHashCode());
1381 }
1383 }
1384
1385 internal void Pop()
1386 {
1387 if (_codeGenTrace != 0)
1388 {
1389 EmitSourceInstruction("Pop");
1390 }
1392 }
1393
1394 internal void Dup()
1395 {
1396 if (_codeGenTrace != 0)
1397 {
1398 EmitSourceInstruction("Dup");
1399 }
1401 }
1402
1404 {
1405 if (thisObj != null && !methodInfo.IsStatic)
1406 {
1409 }
1410 }
1411
1413 {
1414 Load(arg);
1415 if (arg != null)
1416 {
1417 ConvertValue(GetVariableType(arg), methodInfo.GetParameters()[oneBasedArgIndex - 1].ParameterType);
1418 }
1419 }
1420
1421 private void InternalIf(bool negate)
1422 {
1423 IfState ifState = new IfState();
1426 if (negate)
1427 {
1428 Brtrue(ifState.ElseBegin);
1429 }
1430 else
1431 {
1432 Brfalse(ifState.ElseBegin);
1433 }
1435 }
1436
1456
1457 private void InternalConvert(Type source, Type target, bool isAddress)
1458 {
1459 if (target == source)
1460 {
1461 return;
1462 }
1463 if (target.IsValueType)
1464 {
1465 if (source.IsValueType)
1466 {
1468 if (convOpCode.Equals(OpCodes.Nop))
1469 {
1471 }
1472 if (_codeGenTrace != 0)
1473 {
1475 }
1477 }
1478 else
1479 {
1480 if (!source.IsAssignableFrom(target))
1481 {
1483 }
1484 Unbox(target);
1485 if (!isAddress)
1486 {
1487 Ldobj(target);
1488 }
1489 }
1490 }
1491 else if (target.IsAssignableFrom(source))
1492 {
1493 if (source.IsValueType)
1494 {
1495 if (isAddress)
1496 {
1497 Ldobj(source);
1498 }
1499 Box(source);
1500 }
1501 }
1502 else if (source.IsAssignableFrom(target))
1503 {
1504 Castclass(target);
1505 }
1506 else
1507 {
1508 if (!target.IsInterface && !source.IsInterface)
1509 {
1511 }
1512 Castclass(target);
1513 }
1514 }
1515
1517 {
1518 object obj = _blockStack.Pop();
1520 if (ifState == null)
1521 {
1523 }
1524 return ifState;
1525 }
1526
1532
1533 internal void EmitSourceInstruction(string line)
1534 {
1535 }
1536
1537 internal void EmitSourceLabel(string line)
1538 {
1539 }
1540
1541 internal void EmitSourceComment(string comment)
1542 {
1543 }
1544
1546 {
1547 _ = _codeGenTrace;
1548 _ = 2;
1549 }
1550
1551 internal Label[] Switch(int labelCount)
1552 {
1554 Label[] array = new Label[labelCount];
1555 for (int i = 0; i < array.Length; i++)
1556 {
1557 array[i] = DefineLabel();
1558 }
1560 Br(switchState.DefaultLabel);
1562 return array;
1563 }
1564
1565 internal void Case(Label caseLabel1, string caseLabelName)
1566 {
1567 if (_codeGenTrace != 0)
1568 {
1569 EmitSourceInstruction("case " + caseLabelName + "{");
1570 }
1572 }
1573
1574 internal void EndCase()
1575 {
1576 object obj = _blockStack.Peek();
1578 if (switchState == null)
1579 {
1581 }
1582 Br(switchState.EndOfSwitchLabel);
1583 if (_codeGenTrace != 0)
1584 {
1585 EmitSourceInstruction("} //end case ");
1586 }
1587 }
1588
1589 internal void EndSwitch()
1590 {
1591 object obj = _blockStack.Pop();
1593 if (switchState == null)
1594 {
1596 }
1597 if (_codeGenTrace != 0)
1598 {
1599 EmitSourceInstruction("} //end switch");
1600 }
1601 if (!switchState.DefaultDefined)
1602 {
1603 MarkLabel(switchState.DefaultLabel);
1604 }
1605 MarkLabel(switchState.EndOfSwitchLabel);
1606 }
1607
1609 {
1611 Br(ifState.EndIf);
1612 MarkLabel(ifState.ElseBegin);
1613 Load(strLocal);
1615 Load(0);
1617 _ilGen.Emit(GetBranchCode(Cmp.EqualTo), ifState.ElseBegin);
1619 }
1620
1622 {
1623 Load(strLocal);
1625 Load(0);
1626 If(Cmp.NotEqualTo);
1627 }
1628
1629 internal void BeginWhileCondition()
1630 {
1634 }
1635
1636 internal void BeginWhileBody(Cmp cmpOp)
1637 {
1639 If(cmpOp);
1641 }
1642
1643 internal void EndWhile()
1644 {
1646 Br(label);
1647 EndIf();
1648 }
1649
1650 internal void CallStringFormat(string msg, params object[] values)
1651 {
1652 NewArray(typeof(object), values.Length);
1653 if (_stringFormatArray == null)
1654 {
1655 _stringFormatArray = DeclareLocal(typeof(object[]), "stringFormatArray");
1656 }
1658 for (int i = 0; i < values.Length; i++)
1659 {
1661 }
1662 Load(msg);
1665 }
1666
1667 internal void ToString(Type type)
1668 {
1669 if (type != Globals.TypeOfString)
1670 {
1671 if (type.IsValueType)
1672 {
1673 Box(type);
1674 }
1676 }
1677 }
1678}
void Add(TKey key, TValue value)
static int ToInt32(object? value)
Definition Convert.cs:1320
static ? object ChangeType(object? value, TypeCode typeCode)
Definition Convert.cs:229
static Type GetUnderlyingType(Type enumType)
Definition Enum.cs:309
static CultureInfo InvariantCulture
override Delegate CreateDelegate(Type delegateType)
virtual LocalBuilder DeclareLocal(Type localType)
virtual void MarkLabel(Label loc)
virtual void Emit(OpCode opcode)
static readonly OpCode Castclass
Definition OpCodes.cs:235
static readonly OpCode Ldloca
Definition OpCodes.cs:427
static readonly OpCode Ldelem_I2
Definition OpCodes.cs:291
static readonly OpCode Ldelem_U2
Definition OpCodes.cs:293
static readonly OpCode Unbox
Definition OpCodes.cs:241
static readonly OpCode Brfalse
Definition OpCodes.cs:117
static readonly OpCode Conv_I4
Definition OpCodes.cs:213
static readonly OpCode Ldc_I8
Definition OpCodes.cs:71
static readonly OpCode Blt
Definition OpCodes.cs:129
static readonly OpCode Callvirt
Definition OpCodes.cs:225
static readonly OpCode Ldind_I1
Definition OpCodes.cs:143
static readonly OpCode Brtrue
Definition OpCodes.cs:119
static readonly OpCode Conv_I2
Definition OpCodes.cs:211
static readonly OpCode Or
Definition OpCodes.cs:195
static readonly OpCode Stloc
Definition OpCodes.cs:429
static readonly OpCode Ldind_R4
Definition OpCodes.cs:159
static readonly OpCode Ldind_I2
Definition OpCodes.cs:147
static readonly OpCode Newobj
Definition OpCodes.cs:233
static readonly OpCode Ldind_I4
Definition OpCodes.cs:151
static readonly OpCode Ldind_U2
Definition OpCodes.cs:149
static readonly OpCode Bgt
Definition OpCodes.cs:125
static readonly OpCode Conv_I1
Definition OpCodes.cs:209
static readonly OpCode Ldind_U4
Definition OpCodes.cs:153
static readonly OpCode Ldelem_U4
Definition OpCodes.cs:297
static readonly OpCode Add
Definition OpCodes.cs:179
static readonly OpCode Ldind_R8
Definition OpCodes.cs:161
static readonly OpCode Ble
Definition OpCodes.cs:127
static readonly OpCode Ldind_I8
Definition OpCodes.cs:155
static readonly OpCode Ldobj
Definition OpCodes.cs:229
static readonly OpCode Ldc_I4
Definition OpCodes.cs:69
static readonly OpCode Beq
Definition OpCodes.cs:121
static readonly OpCode Stelem_Ref
Definition OpCodes.cs:323
static readonly OpCode Stsfld
Definition OpCodes.cs:255
static readonly OpCode And
Definition OpCodes.cs:193
static readonly OpCode Br
Definition OpCodes.cs:115
static readonly OpCode Initobj
Definition OpCodes.cs:441
static readonly OpCode Conv_U1
Definition OpCodes.cs:357
static readonly OpCode Stelem_I4
Definition OpCodes.cs:315
static readonly OpCode Bne_Un
Definition OpCodes.cs:131
static readonly OpCode Ceq
Definition OpCodes.cs:405
static readonly OpCode Ldfld
Definition OpCodes.cs:245
static readonly OpCode Ldarga
Definition OpCodes.cs:421
static readonly OpCode Bge
Definition OpCodes.cs:123
static readonly OpCode Conv_U4
Definition OpCodes.cs:221
static readonly OpCode Ldelem_Ref
Definition OpCodes.cs:307
static readonly OpCode Ldc_I4_1
Definition OpCodes.cs:51
static readonly OpCode Sub
Definition OpCodes.cs:181
static readonly OpCode Ldc_I4_0
Definition OpCodes.cs:49
static readonly OpCode Stelem_I8
Definition OpCodes.cs:317
static readonly OpCode Throw
Definition OpCodes.cs:243
static readonly OpCode Ldstr
Definition OpCodes.cs:231
static readonly OpCode Conv_R4
Definition OpCodes.cs:217
static readonly OpCode Pop
Definition OpCodes.cs:79
static readonly OpCode Conv_U2
Definition OpCodes.cs:355
static readonly OpCode Ldelema
Definition OpCodes.cs:285
static readonly OpCode Stobj
Definition OpCodes.cs:257
static readonly OpCode Ldind_U1
Definition OpCodes.cs:145
static readonly OpCode Ldsfld
Definition OpCodes.cs:251
static readonly OpCode Stelem_I1
Definition OpCodes.cs:311
static readonly OpCode Ldelem_I4
Definition OpCodes.cs:295
static readonly OpCode Ldelem_R4
Definition OpCodes.cs:303
static readonly OpCode Ldelem_U1
Definition OpCodes.cs:289
static readonly OpCode Ldtoken
Definition OpCodes.cs:353
static readonly OpCode Switch
Definition OpCodes.cs:141
static readonly OpCode Call
Definition OpCodes.cs:83
static readonly OpCode Stelem_R4
Definition OpCodes.cs:319
static readonly OpCode Conv_R8
Definition OpCodes.cs:219
static readonly OpCode Nop
Definition OpCodes.cs:5
static readonly OpCode Ret
Definition OpCodes.cs:87
static readonly OpCode Ldloc
Definition OpCodes.cs:425
static readonly OpCode Ldnull
Definition OpCodes.cs:45
static readonly OpCode Ldc_R4
Definition OpCodes.cs:73
static readonly OpCode Starg
Definition OpCodes.cs:423
static readonly OpCode Box
Definition OpCodes.cs:279
static readonly OpCode Ldind_Ref
Definition OpCodes.cs:163
static readonly OpCode Not
Definition OpCodes.cs:207
static readonly OpCode Ldc_R8
Definition OpCodes.cs:75
static readonly OpCode Stelem_I2
Definition OpCodes.cs:313
static readonly OpCode Stelem_R8
Definition OpCodes.cs:321
static readonly OpCode Dup
Definition OpCodes.cs:77
static readonly OpCode Stfld
Definition OpCodes.cs:249
static readonly OpCode Newarr
Definition OpCodes.cs:281
static readonly OpCode Ldarg
Definition OpCodes.cs:419
static readonly OpCode Ldelem_I1
Definition OpCodes.cs:287
static readonly OpCode Conv_I8
Definition OpCodes.cs:215
static readonly OpCode Ldlen
Definition OpCodes.cs:283
static readonly OpCode Ldelem_R8
Definition OpCodes.cs:305
static readonly OpCode Ldelem_I8
Definition OpCodes.cs:299
virtual ? MethodInfo SetMethod
void LoadArrayElement(object obj, object arrayIndex)
void LdlocAddress(LocalBuilder localBuilder)
void Ldloca(LocalBuilder localBuilder)
void Ldloc(LocalBuilder localBuilder)
void EndForEach(MethodInfo moveNextMethod)
void ElseIf(object value1, Cmp cmpOp, object value2)
void NewArray(Type elementType, object len)
void Call(object thisObj, MethodInfo methodInfo)
void IfNotIsEmptyString(LocalBuilder strLocal)
readonly Dictionary< LocalBuilder, string > _localNames
void BeginMethod(string methodName, Type delegateType, bool allowPrivateMemberAccess)
void BeginMethod(DynamicMethod dynamicMethod, Type delegateType, string methodName, Type[] argTypes, bool allowPrivateMemberAccess)
void ElseIfIsEmptyString(LocalBuilder strLocal)
void Call(object thisObj, MethodInfo methodInfo, object param1, object param2)
void InitILGeneration(string methodName, Type[] argTypes)
Type LoadMember(MemberInfo memberInfo)
void VerifyParameterCount(MethodInfo methodInfo, int expectedCount)
void Call(object thisObj, MethodInfo methodInfo, object param1, object param2, object param3, object param4, object param5)
LocalBuilder DeclareLocal(Type type, string name, bool isPinned)
void CallStringFormat(string msg, params object[] values)
void LoadThis(object thisObj, MethodInfo methodInfo)
static readonly MethodInfo s_stringLength
void StoreMember(MemberInfo memberInfo)
void InternalBreakFor(object userForState, OpCode branchInstruction)
void Case(Label caseLabel1, string caseLabelName)
void BeginMethod(Type returnType, string methodName, Type[] argTypes, bool allowPrivateMemberAccess)
void Set(LocalBuilder local, object value)
object For(LocalBuilder local, object start, object end)
LocalBuilder DeclareLocal(Type type, string name)
void LoadParam(object arg, int oneBasedArgIndex, MethodBase methodInfo)
LocalBuilder DeclareLocal(Type type, string name, object initialValue)
void Call(object thisObj, MethodInfo methodInfo, object param1)
void StoreArrayElement(object obj, object arrayIndex, object value)
void Call(object thisObj, MethodInfo methodInfo, object param1, object param2, object param3, object param4, object param5, object param6)
void LdargAddress(ArgBuilder argBuilder)
void Call(object thisObj, MethodInfo methodInfo, object param1, object param2, object param3)
void InternalConvert(Type source, Type target, bool isAddress)
void Call(object thisObj, MethodInfo methodInfo, object param1, object param2, object param3, object param4)
void If(object value1, Cmp cmpOp, object value2)
void ConvertAddress(Type source, Type target)
void ForEach(LocalBuilder local, Type elementType, Type enumeratorType, LocalBuilder enumerator, MethodInfo getCurrentMethod)
void ConvertValue(Type source, Type target)
void New(ConstructorInfo constructorInfo)
static string GetClrTypeFullName(Type type)
static SerializationException CreateSerializationException(string errorMessage)
static string ArrayTypeIsNotSupported_GeneratingCode
Definition SR.cs:18
static string UnknownConstantType
Definition SR.cs:294
static string NoGetMethodForProperty
Definition SR.cs:216
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string CharIsInvalidPrimitive
Definition SR.cs:28
static string NoSetMethodForProperty
Definition SR.cs:218
static string IsNotAssignableFrom
Definition SR.cs:176
static string ExpectingEnd
Definition SR.cs:108
static string ParameterCountMismatch
Definition SR.cs:226
static string CannotLoadMemberType
Definition SR.cs:22
static string CanOnlyStoreIntoArgOrLocGot0
Definition SR.cs:26
static string NoConversionPossibleTo
Definition SR.cs:212
Definition SR.cs:7
Type? GetElementType()
bool IsInterface
Definition Type.cs:30
virtual bool IsAssignableFrom([NotNullWhen(true)] Type? c)
Definition Type.cs:1561
bool IsValueType
Definition Type.cs:234
bool IsArray
Definition Type.cs:71
static TypeCode GetTypeCode(Type? type)
Definition Type.cs:919
static readonly Type[] EmptyTypes
Definition Type.cs:19
TypeCode
Definition TypeCode.cs:4