byte[] compressedUInt = compressUInt(blobArrWithLengthStripped.length);
byte[] byteArr = new byte[blobArrWithLengthStripped.length + compressedUInt.length];
System.arraycopy(compressedUInt, 0, byteArr, 0, compressedUInt.length);
System.arraycopy(blobArrWithLengthStripped, 0, byteArr, compressedUInt.length, blobArrWithLengthStripped.length);
ByteBuffer buf = ByteBuffer.wrap(byteArr);
Sig sig = pefile.new Sig(buf);
int desc = sig.readByte();
switch (desc) {
// GENERICINST (CLASS | VALUETYPE) TypeDefOrRefEncodred GenArgCount Type*
case Signature.ELEMENT_TYPE_GENERICINST: // i.e. 0x15
int b = sig.readByte(); // i.e. (0x12 | 0x11)
/* TODO don't ignore b as done above */
Type instantiatedType = getTypeDefOrRef(sig.decodeInt()); // TypeDefOrRefEncoded
int numberOfTypeArgs = sig.decodeInt(); // GenArgCount
Type[] typeArgs = new Type[numberOfTypeArgs];
for (int iarg = 0; iarg < numberOfTypeArgs; iarg++) {
typeArgs[iarg] = sig.decodeType(); // Type*
}
type = new ConstructedType(instantiatedType, typeArgs);
break;
/* Miguel says: Actually the following grammar rule production is not among those for a TypeSpecBlob
but I've found it in assemblies compiled from C# 3.0.
See also duplicate code in PEFile.java */
case Signature.ELEMENT_TYPE_VAR:
int typeArgAsZeroBased = sig.decodeInt();
type = new Type.TMVarUsage(typeArgAsZeroBased, true);
break;
/* Miguel says: Actually the following grammar rule production is not among those for a TypeSpecBlob
but I've found it in assemblies compiled from C# 3.0.
See also duplicate code in PEFile.java */
case Signature.ELEMENT_TYPE_MVAR:
typeArgAsZeroBased = sig.decodeInt();
type = new Type.TMVarUsage(typeArgAsZeroBased, false);
break;
case Signature.ELEMENT_TYPE_SZARRAY: // Single-dim array with 0 lower bound.
sig.skipCustomMods();
type = Type.mkArray(sig.decodeType(), 1);
break;
case Signature.ELEMENT_TYPE_ARRAY:
// <type> <rank> <boundsCount> <bound1> ... <loCount> <lo1> ...
// ArrayShape defined in 23.2.13 ArrayShape
Type elem = sig.decodeType();
int rank = sig.decodeInt();
int numSizes = sig.decodeInt();
for (int i = 0; i < numSizes; i++)
sig.decodeInt(); // TODO don't ignore
int numLoBounds = sig.decodeInt();
for (int i = 0; i < numLoBounds; i++)
sig.decodeInt(); // TODO don't ignore
type = Type.mkArray(elem, rank);
break;
default:
// TODO remaining grammar productions in 23.2.14 are for PTR and FNPTR only