public SharpAssemblyReturnType(SharpAssembly_ assembly, TypeRef[] typeRefTable, uint index)
 {
     underlyingClass = SharpAssemblyClass.FromTypeRef(assembly, index);
     if (underlyingClass != null) {
         FullyQualifiedName = underlyingClass.FullyQualifiedName;
     } else {
         FullyQualifiedName = assembly.Reader.GetStringFromHeap(typeRefTable[index].Nspace) + "." +
                                                     assembly.Reader.GetStringFromHeap(typeRefTable[index].Name);
         Runtime.LoggingService.Info("SharpAssemblyReturnType from TypeRef: TypeRef not resolved!");
     }
     declaredin = assembly.GetRefAssemblyFor(index);
 }
        public void GetDataType(SharpAssembly_ asm, ref uint offset)
        {
            AssemblyReader assembly = asm.Reader;
            string fullyQualifiedName = "";
            DataType dt = (DataType)assembly.LoadBlob(ref offset);
            switch (dt) {
                case DataType.Void:
                case DataType.Boolean:
                case DataType.Char:
                case DataType.SByte:
                case DataType.Byte:
                case DataType.Int16:
                case DataType.UInt16:
                case DataType.Int32:
                case DataType.UInt32:
                case DataType.Int64:
                case DataType.UInt64:
                case DataType.Single:
                case DataType.Double:
                case DataType.String:
                case DataType.Object:
                case DataType.IntPtr:
                case DataType.UIntPtr:
                    fullyQualifiedName = "System." + dt.ToString();

                    // TODO : underlyingClass
                    declaredin = asm.GetReference("mscorlib");
                    break;

                case DataType.SZArray:
                    GetDataType(asm, ref offset);
                    arrayRanks.Add(0);
                    break;

                case DataType.Array:
                    GetDataType(asm, ref offset);
                    int rank      = assembly.LoadBlob(ref offset);
                    int num_sizes = assembly.LoadBlob(ref offset);
                    int[] sizes   = new int[num_sizes];
                    for (int i = 0; i < num_sizes; ++i) {
                        sizes[i] = assembly.LoadBlob(ref offset);
                    }
                    int num_lowerBounds = assembly.LoadBlob(ref offset);
                    int[] lowerBounds   = new int[num_lowerBounds];
                    for (int i = 0; i < num_lowerBounds; ++i) {
                        lowerBounds[i] = assembly.LoadBlob(ref offset);
                    }
                    arrayRanks.Add(rank - 1);
                    break;

                case DataType.ValueType:
                case DataType.Class:
                    uint idx = (uint)assembly.LoadBlob(ref offset);
                    bool isTypeRef = (idx & 1) == 1;
                    uint  index    = (idx >> 2);

                    TypeDef[] typeDefTable = asm.Tables.TypeDef;
                    TypeRef[] typeRefTable = asm.Tables.TypeRef;

                    if (isTypeRef) {
                        underlyingClass = SharpAssemblyClass.FromTypeRef(asm, index);
                        if (underlyingClass != null) {
                            fullyQualifiedName = underlyingClass.FullyQualifiedName;
                        } else {
                            fullyQualifiedName = assembly.GetStringFromHeap(typeRefTable[index].Nspace) + "." +
                                                                        assembly.GetStringFromHeap(typeRefTable[index].Name);
                            Runtime.LoggingService.Info("GetDataType: TypeRef not resolved!");
                        }
                        declaredin = asm.GetRefAssemblyFor(index);
                    } else {
                        underlyingClass = SharpAssemblyClass.FromTypeDef(asm, index);
                        if (underlyingClass != null) {
                            fullyQualifiedName = underlyingClass.FullyQualifiedName;
                        } else {
                            fullyQualifiedName = assembly.GetStringFromHeap(typeDefTable[index].NSpace) + "." +
                                                                    assembly.GetStringFromHeap(typeDefTable[index].Name);
                        }
                        declaredin = asm;
                    }

                    break;

                case DataType.Ptr:
                    GetDataType(asm, ref offset);
                    ++pointerNestingLevel;
                    break;
                case DataType.ByRef:
                    GetDataType(asm, ref offset);
                    fullyQualifiedName += "&";
                    break;

                case DataType.TypeReference:
                    fullyQualifiedName = "typedref";
                    break;

                case DataType.Pinned:
                    GetDataType(asm, ref offset);
                    //fullyQualifiedName += " pinned";
                    break;

                case DataType.CModOpt:
                case DataType.CModReq:
                    GetDataType(asm, ref offset);
                    break;

                default:
                    Runtime.LoggingService.Info("NOT supported: " + dt.ToString());
                    fullyQualifiedName += " NOT_SUPPORTED [" + dt.ToString() + "]";
                    break;
            }
            base.FullyQualifiedName = fullyQualifiedName;
        }