43 internal const byte DEFAULT = 0x00;
44 internal const byte VARARG = 0x05;
45 internal const byte GENERIC = 0x10;
46 internal const byte HASTHIS = 0x20;
47 internal const byte EXPLICITTHIS = 0x40;
48 internal const byte FIELD = 0x06;
49 internal const byte LOCAL_SIG = 0x07;
50 internal const byte PROPERTY = 0x08;
51 internal const byte GENERICINST = 0x0A;
52 internal const byte SENTINEL = 0x41;
53 internal const byte ELEMENT_TYPE_VOID = 0x01;
54 internal const byte ELEMENT_TYPE_BOOLEAN = 0x02;
55 internal const byte ELEMENT_TYPE_CHAR = 0x03;
56 internal const byte ELEMENT_TYPE_I1 = 0x04;
57 internal const byte ELEMENT_TYPE_U1 = 0x05;
58 internal const byte ELEMENT_TYPE_I2 = 0x06;
59 internal const byte ELEMENT_TYPE_U2 = 0x07;
60 internal const byte ELEMENT_TYPE_I4 = 0x08;
61 internal const byte ELEMENT_TYPE_U4 = 0x09;
62 internal const byte ELEMENT_TYPE_I8 = 0x0a;
63 internal const byte ELEMENT_TYPE_U8 = 0x0b;
64 internal const byte ELEMENT_TYPE_R4 = 0x0c;
65 internal const byte ELEMENT_TYPE_R8 = 0x0d;
66 internal const byte ELEMENT_TYPE_STRING = 0x0e;
67 internal const byte ELEMENT_TYPE_PTR = 0x0f;
68 internal const byte ELEMENT_TYPE_BYREF = 0x10;
69 internal const byte ELEMENT_TYPE_VALUETYPE = 0x11;
70 internal const byte ELEMENT_TYPE_CLASS = 0x12;
71 internal const byte ELEMENT_TYPE_VAR = 0x13;
72 internal const byte ELEMENT_TYPE_ARRAY = 0x14;
73 internal const byte ELEMENT_TYPE_GENERICINST = 0x15;
74 internal const byte ELEMENT_TYPE_TYPEDBYREF = 0x16;
75 internal const byte ELEMENT_TYPE_I = 0x18;
76 internal const byte ELEMENT_TYPE_U = 0x19;
77 internal const byte ELEMENT_TYPE_FNPTR = 0x1b;
78 internal const byte ELEMENT_TYPE_OBJECT = 0x1c;
79 internal const byte ELEMENT_TYPE_SZARRAY = 0x1d;
80 internal const byte ELEMENT_TYPE_MVAR = 0x1e;
81 internal const byte ELEMENT_TYPE_CMOD_REQD = 0x1f;
82 internal const byte ELEMENT_TYPE_CMOD_OPT = 0x20;
83 internal const byte ELEMENT_TYPE_PINNED = 0x45;
85 internal abstract void Write(ModuleBuilder module,
ByteBuffer bb);
90 switch (br.ReadByte())
92 case ELEMENT_TYPE_CLASS:
93 type = ReadTypeDefOrRefEncoded(module, br, context).MarkNotValueType();
95 case ELEMENT_TYPE_VALUETYPE:
96 type = ReadTypeDefOrRefEncoded(module, br, context).MarkValueType();
99 throw new BadImageFormatException();
102 if (!type.__IsMissing && !type.IsGenericTypeDefinition)
103 throw new BadImageFormatException();
105 int genArgCount = br.ReadCompressedUInt();
106 var args =
new Type[genArgCount];
107 CustomModifiers[] mods =
null;
108 for (
int i = 0; i < genArgCount; i++)
111 var cm = CustomModifiers.Read(module, br, context);
114 mods ??=
new CustomModifiers[genArgCount];
118 args[i] =
ReadType(module, br, context);
127 CustomModifiers.Skip(br);
130 return ReadType(module, br, context);
135 __StandAloneMethodSig sig =
MethodSignature.ReadStandAloneMethodSig(module, br, context);
136 if (module.Universe.EnableFunctionPointers)
143 return module.Universe.System_IntPtr;
149 if (br.ReadByte() != GENERICINST)
150 throw new BadImageFormatException();
152 var args =
new Type[br.ReadCompressedUInt()];
153 for (
int i = 0; i < args.Length; i++)
155 CustomModifiers.Skip(br);
156 args[i] =
ReadType(module, br, context);
164 var num = br.ReadCompressedUInt();
168 var arr =
new int[num];
169 for (var i = 0; i < num; i++)
170 arr[i] = br.ReadCompressedUInt();
175 private static int[] ReadArrayBounds(
ByteReader br)
177 var num = br.ReadCompressedUInt();
181 var arr =
new int[num];
182 for (var i = 0; i < num; i++)
183 arr[i] = br.ReadCompressedInt();
190 if (br.PeekByte() == ELEMENT_TYPE_VOID)
193 return module.Universe.System_Void;
197 return ReadType(module, br, context);
204 CustomModifiers mods;
205 switch (br.ReadByte())
207 case ELEMENT_TYPE_CLASS:
208 return ReadTypeDefOrRefEncoded(module, br, context).MarkNotValueType();
209 case ELEMENT_TYPE_VALUETYPE:
210 return ReadTypeDefOrRefEncoded(module, br, context).MarkValueType();
211 case ELEMENT_TYPE_BOOLEAN:
212 return module.Universe.System_Boolean;
213 case ELEMENT_TYPE_CHAR:
214 return module.Universe.System_Char;
215 case ELEMENT_TYPE_I1:
216 return module.Universe.System_SByte;
217 case ELEMENT_TYPE_U1:
218 return module.Universe.System_Byte;
219 case ELEMENT_TYPE_I2:
220 return module.Universe.System_Int16;
221 case ELEMENT_TYPE_U2:
222 return module.Universe.System_UInt16;
223 case ELEMENT_TYPE_I4:
224 return module.Universe.System_Int32;
225 case ELEMENT_TYPE_U4:
226 return module.Universe.System_UInt32;
227 case ELEMENT_TYPE_I8:
228 return module.Universe.System_Int64;
229 case ELEMENT_TYPE_U8:
230 return module.Universe.System_UInt64;
231 case ELEMENT_TYPE_R4:
232 return module.Universe.System_Single;
233 case ELEMENT_TYPE_R8:
234 return module.Universe.System_Double;
236 return module.Universe.System_IntPtr;
238 return module.Universe.System_UIntPtr;
239 case ELEMENT_TYPE_STRING:
240 return module.Universe.System_String;
241 case ELEMENT_TYPE_OBJECT:
242 return module.Universe.System_Object;
243 case ELEMENT_TYPE_VAR:
245 case ELEMENT_TYPE_MVAR:
247 case ELEMENT_TYPE_GENERICINST:
248 return ReadGenericInst(module, br, context);
249 case ELEMENT_TYPE_SZARRAY:
250 mods = CustomModifiers.Read(module, br, context);
251 return ReadType(module, br, context).__MakeArrayType(mods);
252 case ELEMENT_TYPE_ARRAY:
253 mods = CustomModifiers.Read(module, br, context);
254 return ReadType(module, br, context).__MakeArrayType(br.ReadCompressedUInt(), ReadArraySizes(br), ReadArrayBounds(br), mods);
255 case ELEMENT_TYPE_PTR:
256 mods = CustomModifiers.Read(module, br, context);
257 return ReadTypeOrVoid(module, br, context).__MakePointerType(mods);
258 case ELEMENT_TYPE_FNPTR:
259 return ReadFunctionPointer(module, br, context);
261 throw new BadImageFormatException();
267 if (br.Length < 2 || br.ReadByte() != LOCAL_SIG)
268 throw new BadImageFormatException(
"Invalid local variable signature");
270 var count = br.ReadCompressedUInt();
271 for (
int i = 0; i < count; i++)
273 if (br.PeekByte() == ELEMENT_TYPE_TYPEDBYREF)
276 list.Add(
new LocalVariableInfo(i, module.Universe.System_TypedReference,
false));
280 var mods1 = CustomModifiers.Read(module, br, context);
282 if (br.PeekByte() == ELEMENT_TYPE_PINNED)
288 var mods2 = CustomModifiers.Read(module, br, context);
289 var type = ReadTypeOrByRef(module, br, context);
290 list.Add(
new LocalVariableInfo(i, type, pinned, mods2));
297 if (br.PeekByte() == ELEMENT_TYPE_BYREF)
302 var mods = CustomModifiers.Read(module, br, context);
304 return ReadTypeOrVoid(module, br, context).__MakeByRefType(mods);
308 return ReadType(module, br, context);
314 switch (br.PeekByte())
316 case ELEMENT_TYPE_VOID:
318 return module.Universe.System_Void;
319 case ELEMENT_TYPE_TYPEDBYREF:
321 return module.Universe.System_TypedReference;
323 return ReadTypeOrByRef(module, br, context);
329 switch (br.PeekByte())
331 case ELEMENT_TYPE_TYPEDBYREF:
333 return module.Universe.System_TypedReference;
335 return ReadTypeOrByRef(module, br, context);
341 while (type.HasElementType)
343 byte sigElementType = type.SigElementType;
344 bb.Write(sigElementType);
345 if (sigElementType == ELEMENT_TYPE_ARRAY)
349 WriteType(module, bb, type.GetElementType());
350 bb.WriteCompressedUInt(type.GetArrayRank());
352 var sizes = type.__GetArraySizes();
353 bb.WriteCompressedUInt(sizes.Length);
354 for (
int i = 0; i < sizes.Length; i++)
355 bb.WriteCompressedUInt(sizes[i]);
357 var lobounds = type.__GetArrayLowerBounds();
358 bb.WriteCompressedUInt(lobounds.Length);
359 for (
int i = 0; i < lobounds.Length; i++)
360 bb.WriteCompressedInt(lobounds[i]);
365 type = type.GetElementType();
368 if (type.__IsBuiltIn)
370 bb.Write(type.SigElementType);
372 else if (type.IsGenericParameter)
374 bb.Write(type.SigElementType);
375 bb.WriteCompressedUInt(type.GenericParameterPosition);
377 else if (!type.__IsMissing && type.IsGenericType)
379 WriteGenericSignature(module, bb, type);
381 else if (type.IsFunctionPointer)
383 bb.Write(ELEMENT_TYPE_FNPTR);
384 WriteStandAloneMethodSig(module, bb, type.__MethodSignature);
388 if (type.IsValueType)
389 bb.Write(ELEMENT_TYPE_VALUETYPE);
391 bb.Write(ELEMENT_TYPE_CLASS);
393 bb.WriteTypeDefOrRefEncoded(module.GetTypeToken(type).Token);
397 static void WriteGenericSignature(ModuleBuilder module,
ByteBuffer bb, Type type)
399 var typeArguments = type.GetGenericArguments();
400 var customModifiers = type.__GetGenericArgumentsCustomModifiers();
401 if (!type.IsGenericTypeDefinition)
402 type = type.GetGenericTypeDefinition();
404 bb.Write(ELEMENT_TYPE_GENERICINST);
405 if (type.IsValueType)
406 bb.Write(ELEMENT_TYPE_VALUETYPE);
408 bb.Write(ELEMENT_TYPE_CLASS);
410 bb.WriteTypeDefOrRefEncoded(module.GetTypeToken(type).Token);
411 bb.WriteCompressedUInt(typeArguments.Length);
412 for (var i = 0; i < typeArguments.Length; i++)
421 foreach (var entry
in modifiers)
423 bb.Write(entry.IsRequired ? ELEMENT_TYPE_CMOD_REQD : ELEMENT_TYPE_CMOD_OPT);
424 bb.WriteTypeDefOrRefEncoded(module.GetTypeTokenForMemberRef(entry.Type));
430 var encoded = br.ReadCompressedUInt();
431 return (encoded & 3)
switch
433 0 => module.ResolveType((
TypeDefTable.Index << 24) + (encoded >> 2),
null,
null),
434 1 => module.ResolveType((
TypeRefTable.Index << 24) + (encoded >> 2),
null,
null),
435 2 => module.ResolveType((
TypeSpecTable.Index << 24) + (encoded >> 2), context),
436 _ =>
throw new BadImageFormatException(),
440 internal static void WriteStandAloneMethodSig(ModuleBuilder module,
ByteBuffer bb, __StandAloneMethodSig sig)
444 switch (sig.UnmanagedCallingConvention)
447 bb.Write((
byte)0x01);
451 bb.Write((
byte)0x02);
454 bb.Write((
byte)0x03);
457 bb.Write((
byte)0x04);
460 throw new ArgumentOutOfRangeException(
"callingConvention");
465 var callingConvention = sig.CallingConvention;
467 if ((callingConvention & CallingConventions.HasThis) != 0)
469 if ((callingConvention & CallingConventions.ExplicitThis) != 0)
470 flags |= EXPLICITTHIS;
471 if ((callingConvention & CallingConventions.VarArgs) != 0)
477 var parameterTypes = sig.ParameterTypes;
478 var optionalParameterTypes = sig.OptionalParameterTypes;
479 bb.WriteCompressedUInt(parameterTypes.Length + optionalParameterTypes.Length);
484 foreach (var t
in parameterTypes)
491 if (optionalParameterTypes.Length > 0)
494 foreach (var t
in optionalParameterTypes)
502 internal static void WriteTypeSpec(ModuleBuilder module,
ByteBuffer bb,
Type type)
507 internal static void WriteMethodSpec(ModuleBuilder module,
ByteBuffer bb,
Type[] genArgs)
509 bb.Write(GENERICINST);
510 bb.WriteCompressedUInt(genArgs.Length);
511 foreach (var arg
in genArgs)
519 var paramCount = br.ReadCompressedUInt();
520 CustomModifiers.Skip(br);
522 for (
int i = 0; i < paramCount; i++)
524 if (br.PeekByte() == SENTINEL)
527 var types =
new Type[paramCount - i];
528 customModifiers =
new CustomModifiers[types.Length];
529 for (
int j = 0; j < types.Length; j++)
531 customModifiers[j] = CustomModifiers.Read(module, br, context);
532 types[j] =
ReadType(module, br, context);
538 CustomModifiers.Skip(br);
542 customModifiers = Array.Empty<CustomModifiers>();
543 return Type.EmptyTypes;
548 if (types ==
null || types.Length == 0)
549 return Type.EmptyTypes;
551 var expanded =
new Type[types.Length];
552 for (var i = 0; i < types.Length; i++)
558 internal static void WriteSignatureHelper(ModuleBuilder module,
ByteBuffer bb,
byte flags, ushort paramCount, List<Type> args)
562 bb.WriteCompressedUInt(paramCount);
564 foreach (var type
in args)
567 bb.Write(ELEMENT_TYPE_VOID);
569 bb.Write(type.SigElementType);