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

◆ AddOneArgTypeHelperWorker()

void System.Reflection.Emit.SignatureHelper.AddOneArgTypeHelperWorker ( Type clsArgument,
bool lastWasGenericInst )
inlineprivate

Definition at line 291 of file SignatureHelper.cs.

292 {
293 if (clsArgument.IsGenericParameter)
294 {
295 if (clsArgument.DeclaringMethod != null)
296 {
297 AddElementType(CorElementType.ELEMENT_TYPE_MVAR);
298 }
299 else
300 {
301 AddElementType(CorElementType.ELEMENT_TYPE_VAR);
302 }
303 AddData(clsArgument.GenericParameterPosition);
304 return;
305 }
306 if (clsArgument.IsGenericType && (!clsArgument.IsGenericTypeDefinition || !lastWasGenericInst))
307 {
308 AddElementType(CorElementType.ELEMENT_TYPE_GENERICINST);
309 AddOneArgTypeHelperWorker(clsArgument.GetGenericTypeDefinition(), lastWasGenericInst: true);
310 Type[] genericArguments = clsArgument.GetGenericArguments();
311 AddData(genericArguments.Length);
312 Type[] array = genericArguments;
313 foreach (Type clsArgument2 in array)
314 {
315 AddOneArgTypeHelper(clsArgument2);
316 }
317 return;
318 }
319 if (clsArgument is TypeBuilder)
320 {
321 TypeBuilder typeBuilder = (TypeBuilder)clsArgument;
322 int clsToken = ((!typeBuilder.Module.Equals(m_module)) ? m_module.GetTypeToken(clsArgument) : typeBuilder.TypeToken);
323 if (clsArgument.IsValueType)
324 {
325 InternalAddTypeToken(clsToken, CorElementType.ELEMENT_TYPE_VALUETYPE);
326 }
327 else
328 {
329 InternalAddTypeToken(clsToken, CorElementType.ELEMENT_TYPE_CLASS);
330 }
331 return;
332 }
333 if (clsArgument is EnumBuilder)
334 {
335 TypeBuilder typeBuilder2 = ((EnumBuilder)clsArgument).m_typeBuilder;
336 int clsToken2 = ((!typeBuilder2.Module.Equals(m_module)) ? m_module.GetTypeToken(clsArgument) : typeBuilder2.TypeToken);
337 if (clsArgument.IsValueType)
338 {
339 InternalAddTypeToken(clsToken2, CorElementType.ELEMENT_TYPE_VALUETYPE);
340 }
341 else
342 {
343 InternalAddTypeToken(clsToken2, CorElementType.ELEMENT_TYPE_CLASS);
344 }
345 return;
346 }
347 if (clsArgument.IsByRef)
348 {
349 AddElementType(CorElementType.ELEMENT_TYPE_BYREF);
350 clsArgument = clsArgument.GetElementType();
351 AddOneArgTypeHelper(clsArgument);
352 return;
353 }
354 if (clsArgument.IsPointer)
355 {
356 AddElementType(CorElementType.ELEMENT_TYPE_PTR);
357 AddOneArgTypeHelper(clsArgument.GetElementType());
358 return;
359 }
360 if (clsArgument.IsArray)
361 {
362 if (clsArgument.IsSZArray)
363 {
364 AddElementType(CorElementType.ELEMENT_TYPE_SZARRAY);
365 AddOneArgTypeHelper(clsArgument.GetElementType());
366 return;
367 }
368 AddElementType(CorElementType.ELEMENT_TYPE_ARRAY);
369 AddOneArgTypeHelper(clsArgument.GetElementType());
370 int arrayRank = clsArgument.GetArrayRank();
371 AddData(arrayRank);
372 AddData(0);
373 AddData(arrayRank);
374 for (int j = 0; j < arrayRank; j++)
375 {
376 AddData(0);
377 }
378 return;
379 }
380 CorElementType corElementType = CorElementType.ELEMENT_TYPE_MAX;
381 if (clsArgument is RuntimeType)
382 {
383 corElementType = RuntimeTypeHandle.GetCorElementType((RuntimeType)clsArgument);
384 if (corElementType == CorElementType.ELEMENT_TYPE_CLASS)
385 {
386 if (clsArgument == typeof(object))
387 {
388 corElementType = CorElementType.ELEMENT_TYPE_OBJECT;
389 }
390 else if (clsArgument == typeof(string))
391 {
392 corElementType = CorElementType.ELEMENT_TYPE_STRING;
393 }
394 }
395 }
396 if (IsSimpleType(corElementType))
397 {
398 AddElementType(corElementType);
399 }
400 else if (m_module == null)
401 {
402 InternalAddRuntimeType(clsArgument);
403 }
404 else if (clsArgument.IsValueType)
405 {
406 InternalAddTypeToken(m_module.GetTypeToken(clsArgument), CorElementType.ELEMENT_TYPE_VALUETYPE);
407 }
408 else
409 {
410 InternalAddTypeToken(m_module.GetTypeToken(clsArgument), CorElementType.ELEMENT_TYPE_CLASS);
411 }
412 }
unsafe void InternalAddRuntimeType(Type type)
static bool IsSimpleType(CorElementType type)
void InternalAddTypeToken(int clsToken, CorElementType CorType)
void AddOneArgTypeHelperWorker(Type clsArgument, bool lastWasGenericInst)
void AddOneArgTypeHelper(Type argument, bool pinned)
void AddElementType(CorElementType cvt)

References System.Reflection.Emit.SignatureHelper.AddData(), System.Reflection.Emit.SignatureHelper.AddElementType(), System.Reflection.Emit.SignatureHelper.AddOneArgTypeHelper(), System.Reflection.Emit.SignatureHelper.AddOneArgTypeHelperWorker(), System.array, System.Type.DeclaringMethod, System.Reflection.Module.Equals(), System.Type.GenericParameterPosition, System.Type.GetArrayRank(), System.RuntimeTypeHandle.GetCorElementType(), System.Type.GetElementType(), System.Type.GetGenericArguments(), System.Type.GetGenericTypeDefinition(), System.Reflection.Emit.ModuleBuilder.GetTypeToken(), System.Reflection.Emit.SignatureHelper.InternalAddRuntimeType(), System.Reflection.Emit.SignatureHelper.InternalAddTypeToken(), System.Type.IsArray, System.Type.IsByRef, System.Type.IsGenericParameter, System.Type.IsGenericType, System.Type.IsGenericTypeDefinition, System.Type.IsPointer, System.Reflection.Emit.SignatureHelper.IsSimpleType(), System.Type.IsSZArray, System.Type.IsValueType, System.Reflection.Emit.SignatureHelper.m_module, System.Reflection.Emit.TypeBuilder.Module, and System.Reflection.Emit.TypeBuilder.TypeToken.

Referenced by System.Reflection.Emit.SignatureHelper.AddOneArgTypeHelper(), and System.Reflection.Emit.SignatureHelper.AddOneArgTypeHelperWorker().