Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ReflectionAwareILGen.cs
Go to the documentation of this file.
6using System.Text;
7
9
10internal sealed class ReflectionAwareILGen
11{
13 {
14 }
15
16 [RequiresUnreferencedCode("calls GetTypeDesc")]
17 internal void WriteReflectionInit(TypeScope scope)
18 {
19 foreach (Type type in scope.Types)
20 {
21 scope.GetTypeDesc(type);
22 }
23 }
24
25 internal void ILGenForEnumLongValue(CodeGenerator ilg, string variable)
26 {
28 ilg.Ldarg(arg);
29 ilg.ConvertValue(arg.ArgType, typeof(long));
30 }
31
32 internal string GetStringForTypeof(string typeFullName)
33 {
34 return "typeof(" + typeFullName + ")";
35 }
36
37 internal string GetStringForMember(string obj, string memberName, TypeDesc typeDesc)
38 {
39 return obj + ".@" + memberName;
40 }
41
43 {
44 return GetSourceForMember(obj, member, member.MemberInfo, typeDesc, ilg);
45 }
46
51
53 {
54 ilg.Ldc(Enum.Parse(type, memberName, ignoreCase: false));
55 }
56
58 {
59 return arrayName + "[" + subscript + "]";
60 }
61
62 internal string GetStringForMethod(string obj, string typeFullName, string memberName)
63 {
64 return obj + "." + memberName + "(";
65 }
66
67 [RequiresUnreferencedCode("calls ILGenForCreateInstance")]
69 {
71 {
72 ConstructorInfo constructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
73 if (constructor != null)
74 {
75 ilg.New(constructor);
76 return;
77 }
79 ilg.Ldloca(tempLocal);
80 ilg.InitObj(type);
81 ilg.Ldloc(tempLocal);
82 }
83 else
84 {
86 }
87 }
88
89 [RequiresUnreferencedCode("calls GetType")]
91 {
92 if (type == typeof(DBNull))
93 {
94 FieldInfo field = type.GetField("Value", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
95 ilg.LoadMember(field);
96 return;
97 }
98 if (type.FullName == "System.Xml.Linq.XElement")
99 {
100 Type type2 = type.Assembly.GetType("System.Xml.Linq.XName");
101 if (type2 != null)
102 {
103 MethodInfo method = type2.GetMethod("op_Implicit", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(string) });
104 ConstructorInfo constructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { type2 });
105 if (method != null && constructor != null)
106 {
107 ilg.Ldstr("default");
108 ilg.Call(method);
109 ilg.New(constructor);
110 return;
111 }
112 }
113 }
114 Label label = ilg.DefineLabel();
115 Label label2 = ilg.DefineLabel();
116 ilg.Ldc(type);
117 MethodInfo method2 = typeof(IntrospectionExtensions).GetMethod("GetTypeInfo", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(Type) });
118 ilg.Call(method2);
120 MethodInfo method3 = typeof(TypeInfo).GetMethod("get_DeclaredConstructors");
121 MethodInfo method4 = typeof(IEnumerable<>).MakeGenericType(typeof(ConstructorInfo)).GetMethod("GetEnumerator");
122 ilg.Call(method3);
123 ilg.Call(method4);
124 ilg.Stloc(localBuilder);
125 ilg.WhileBegin();
126 MethodInfo method5 = typeof(IEnumerator).GetMethod("get_Current");
127 ilg.Ldloc(localBuilder);
128 ilg.Call(method5);
130 ilg.Stloc(localBuilder2);
131 ilg.Ldloc(localBuilder2);
132 MethodInfo method6 = typeof(ConstructorInfo).GetMethod("get_IsStatic");
133 ilg.Call(method6);
134 ilg.Brtrue(label2);
135 ilg.Ldloc(localBuilder2);
136 MethodInfo method7 = typeof(ConstructorInfo).GetMethod("GetParameters");
137 ilg.Call(method7);
138 ilg.Ldlen();
139 ilg.Ldc(0);
140 ilg.Cne();
141 ilg.Brtrue(label2);
142 MethodInfo method8 = typeof(ConstructorInfo).GetMethod("Invoke", new Type[1] { typeof(object[]) });
143 ilg.Ldloc(localBuilder2);
144 ilg.Load(null);
145 ilg.Call(method8);
146 ilg.Br(label);
147 ilg.MarkLabel(label2);
149 MethodInfo method9 = typeof(IEnumerator).GetMethod("MoveNext", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
150 ilg.Ldloc(localBuilder);
151 ilg.Call(method9);
152 ilg.WhileEndCondition();
153 ilg.WhileEnd();
154 MethodInfo method10 = typeof(Activator).GetMethod("CreateInstance", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { typeof(Type) });
155 ilg.Ldc(type);
156 ilg.Call(method10);
157 ilg.MarkLabel(label);
158 if (cast != null)
159 {
160 ilg.ConvertValue(method10.ReturnType, cast);
161 }
162 }
163
164 [RequiresUnreferencedCode("calls LoadMember")]
166 {
167 Type type = initValue.Type;
168 LocalBuilder localBuilder = initValue.ILG.DeclareOrGetLocal(type, variableName);
169 if (initValue.Source != null)
170 {
171 if (initValue == "null")
172 {
173 initValue.ILG.Load(null);
174 }
175 else if (initValue.Arg.StartsWith("o.@", StringComparison.Ordinal))
176 {
177 initValue.ILG.LoadMember(initValue.ILG.GetLocal("o"), initValue.MemberInfo);
178 }
179 else if (initValue.Source.EndsWith(']'))
180 {
181 initValue.Load(initValue.Type);
182 }
183 else if (initValue.Source == "fixup.Source" || initValue.Source == "e.Current")
184 {
185 string[] array = initValue.Source.Split('.');
186 object variable = initValue.ILG.GetVariable(array[0]);
187 PropertyInfo property = initValue.ILG.GetVariableType(variable).GetProperty(array[1]);
188 initValue.ILG.LoadMember(variable, property);
189 initValue.ILG.ConvertValue(property.PropertyType, localBuilder.LocalType);
190 }
191 else
192 {
193 object variable2 = initValue.ILG.GetVariable(initValue.Arg);
194 initValue.ILG.Load(variable2);
195 initValue.ILG.ConvertValue(initValue.ILG.GetVariableType(variable2), localBuilder.LocalType);
196 }
197 initValue.ILG.Stloc(localBuilder);
198 }
199 }
200
201 [RequiresUnreferencedCode("calls ILGenForCreateInstance")]
208
209 [RequiresUnreferencedCode("calls Load")]
211 {
212 source.Load(typeof(object));
213 ilg.IsInst(type);
214 ilg.Load(null);
215 ilg.Cne();
216 }
217
218 [RequiresUnreferencedCode("calls Load")]
220 {
221 Type type = ((typeName == arrayTypeDesc.CSharpName) ? arrayTypeDesc.Type : arrayTypeDesc.Type.MakeArrayType());
222 LocalBuilder localBuilder = initValue.ILG.DeclareOrGetLocal(type, variableName);
223 if (initValue != null)
224 {
225 initValue.Load(localBuilder.LocalType);
226 initValue.ILG.Stloc(localBuilder);
227 }
228 }
229
230 internal void WriteTypeCompare(string variable, Type type, CodeGenerator ilg)
231 {
232 ilg.Ldloc(typeof(Type), variable);
233 ilg.Ldc(type);
234 ilg.Ceq();
235 }
236
238 {
239 ilg.Ldloc(typeof(Type), variable);
240 ilg.Ldc(arrayType);
241 ilg.Ceq();
242 }
243
244 [return: NotNullIfNotNull("value")]
245 internal static string GetQuotedCSharpString(string value)
246 {
247 if (value == null)
248 {
249 return null;
250 }
252 stringBuilder.Append("@\"");
254 stringBuilder.Append('"');
255 return stringBuilder.ToString();
256 }
257
258 [return: NotNullIfNotNull("value")]
259 internal static string GetCSharpString(string value)
260 {
261 if (value == null)
262 {
263 return null;
264 }
266 foreach (char c in value)
267 {
268 if (c < ' ')
269 {
270 switch (c)
271 {
272 case '\r':
273 stringBuilder.Append("\\r");
274 continue;
275 case '\n':
276 stringBuilder.Append("\\n");
277 continue;
278 case '\t':
279 stringBuilder.Append("\\t");
280 continue;
281 }
282 byte b = (byte)c;
283 stringBuilder.Append("\\x");
286 }
287 else if (c == '"')
288 {
289 stringBuilder.Append("\"\"");
290 }
291 else
292 {
293 stringBuilder.Append(c);
294 }
295 }
296 return stringBuilder.ToString();
297 }
298}
static object Parse(Type enumType, string value)
Definition Enum.cs:368
static char ToCharUpper(int value)
static readonly Type[] EmptyTypes
Definition Type.cs:19
void ConvertValue(Type source, Type target)
LocalBuilder DeclareLocal(Type type, string name)
LocalBuilder DeclareOrGetLocal(Type type, string name)
void New(ConstructorInfo constructorInfo)
Type LoadMember(object obj, MemberInfo memberInfo)
void Call(MethodInfo methodInfo)
void Stloc(Type type, string name)
void Ldloca(LocalBuilder localBuilder)
void Ldloc(LocalBuilder localBuilder)
void ILGenForCreateInstance(CodeGenerator ilg, Type type, bool ctorInaccessible, bool cast)
string GetStringForMember(string obj, string memberName, TypeDesc typeDesc)
void ILGenForCreateInstance(CodeGenerator ilg, Type type, Type cast, bool nonPublic)
void WriteTypeCompare(string variable, Type type, CodeGenerator ilg)
string GetStringForArrayMember(string arrayName, string subscript, TypeDesc arrayTypeDesc)
SourceInfo GetSourceForMember(string obj, MemberMapping member, TypeDesc typeDesc, CodeGenerator ilg)
void WriteCreateInstance(string source, bool ctorInaccessible, Type type, CodeGenerator ilg)
string GetStringForMethod(string obj, string typeFullName, string memberName)
void WriteArrayTypeCompare(string variable, Type arrayType, CodeGenerator ilg)
void WriteInstanceOf(SourceInfo source, Type type, CodeGenerator ilg)
void WriteArrayLocalDecl(string typeName, string variableName, SourceInfo initValue, TypeDesc arrayTypeDesc)
void ILGenForEnumMember(CodeGenerator ilg, Type type, string memberName)
void ILGenForEnumLongValue(CodeGenerator ilg, string variable)
void WriteLocalDecl(string variableName, SourceInfo initValue)
SourceInfo GetSourceForMember(string obj, MemberMapping member, MemberInfo memberInfo, TypeDesc typeDesc, CodeGenerator ilg)