コード例 #1
0
        public void field(MetadataVarType type)
        {
            int size;

            switch (type)
            {
            case MetadataVarType.byte1:
                size = 1;
                break;

            case MetadataVarType.byte2:
                size = 2;
                break;

            case MetadataVarType.byte4:
                size = 4;
                break;

            case MetadataVarType.stringIndex:
                size = (heapOffsetSizes & 1) != 0 ? 4 : 2;
                break;

            case MetadataVarType.guidIndex:
                size = (heapOffsetSizes & 2) != 0 ? 4 : 2;
                break;

            case MetadataVarType.blobIndex:
                size = (heapOffsetSizes & 4) != 0 ? 4 : 2;
                break;

            case MetadataVarType.resolutionScope:
                size = getSize(14, new MetadataIndex[] { MetadataIndex.iModule, MetadataIndex.iModuleRef, MetadataIndex.iAssemblyRef, MetadataIndex.iTypeRef });
                break;

            case MetadataVarType.typeDefOrRef:
                size = getSize(14, new MetadataIndex[] { MetadataIndex.iTypeDef, MetadataIndex.iTypeRef, MetadataIndex.iTypeSpec });
                break;

            case MetadataVarType.memberRefParent:
                size = getSize(13, new MetadataIndex[] { MetadataIndex.iTypeDef, MetadataIndex.iTypeRef, MetadataIndex.iModuleRef, MetadataIndex.iMethodDef, MetadataIndex.iTypeSpec });
                break;

            case MetadataVarType.hasConstant:
                size = getSize(14, new MetadataIndex[] { MetadataIndex.iField, MetadataIndex.iParam, MetadataIndex.iProperty });
                break;

            case MetadataVarType.hasCustomAttribute:
                size = getSize(11, new MetadataIndex[] {
                    MetadataIndex.iMethodDef, MetadataIndex.iField, MetadataIndex.iTypeRef,
                    MetadataIndex.iTypeDef, MetadataIndex.iParam, MetadataIndex.iInterfaceImpl,
                    MetadataIndex.iMemberRef, MetadataIndex.iModule /*TODO:, MetadataIndex.iPermission*/,
                    MetadataIndex.iProperty, MetadataIndex.iEvent, MetadataIndex.iStandAloneSig,
                    MetadataIndex.iModuleRef, MetadataIndex.iTypeSpec, MetadataIndex.iAssembly,
                    MetadataIndex.iAssemblyRef, MetadataIndex.iFile, MetadataIndex.iExportedType,
                    MetadataIndex.iManifestResource,
                });
                break;

            case MetadataVarType.customAttributeType:
                size = getSize(13, new MetadataIndex[] { MetadataIndex.iMethodDef, MetadataIndex.iMemberRef });                 // others aren't used
                break;

            case MetadataVarType.hasFieldMarshal:
                size = getSize(15, new MetadataIndex[] { MetadataIndex.iField, MetadataIndex.iParam });
                break;

            case MetadataVarType.hasDeclSecurity:
                size = getSize(14, new MetadataIndex[] { MetadataIndex.iTypeDef, MetadataIndex.iMethodDef, MetadataIndex.iAssembly });
                break;

            case MetadataVarType.hasSemantics:
                size = getSize(15, new MetadataIndex[] { MetadataIndex.iEvent, MetadataIndex.iProperty });
                break;

            case MetadataVarType.methodDefOrRef:
                size = getSize(15, new MetadataIndex[] { MetadataIndex.iMethodDef, MetadataIndex.iMemberRef });
                break;

            case MetadataVarType.memberForwarded:
                size = getSize(15, new MetadataIndex[] { MetadataIndex.iField, MetadataIndex.iMethodDef });
                break;

            case MetadataVarType.implementation:
                size = getSize(14, new MetadataIndex[] { MetadataIndex.iFile, MetadataIndex.iAssemblyRef, MetadataIndex.iExportedType });
                break;

            case MetadataVarType.typeOrMethodDef:
                size = getSize(15, new MetadataIndex[] { MetadataIndex.iTypeDef, MetadataIndex.iMethodDef });
                break;

            case MetadataVarType.fieldIndex:
                size = getSize(MetadataIndex.iField);
                break;

            case MetadataVarType.methodDefIndex:
                size = getSize(MetadataIndex.iMethodDef);
                break;

            case MetadataVarType.paramIndex:
                size = getSize(MetadataIndex.iParam);
                break;

            case MetadataVarType.typeDefIndex:
                size = getSize(MetadataIndex.iTypeDef);
                break;

            case MetadataVarType.eventIndex:
                size = getSize(MetadataIndex.iEvent);
                break;

            case MetadataVarType.propertyIndex:
                size = getSize(MetadataIndex.iProperty);
                break;

            case MetadataVarType.moduleRefIndex:
                size = getSize(MetadataIndex.iModuleRef);
                break;

            case MetadataVarType.assemblyRefIndex:
                size = getSize(MetadataIndex.iAssemblyRef);
                break;

            case MetadataVarType.genericParamIndex:
                size = getSize(MetadataIndex.iGenericParam);
                break;

            default:
                throw new ApplicationException("Unknown type");
            }

            var field = new MetadataField();

            field.offset = offset;
            field.size   = size;
            fields.Add(field);
            offset += size;
        }
コード例 #2
0
ファイル: MetadataTypeBuilder.cs プロジェクト: n017/NETDeob
        public void field(MetadataVarType type)
        {
            int size;
            switch (type) {
            case MetadataVarType.byte1:
                size = 1;
                break;
            case MetadataVarType.byte2:
                size = 2;
                break;
            case MetadataVarType.byte4:
                size = 4;
                break;
            case MetadataVarType.stringIndex:
                size = (heapOffsetSizes & 1) != 0 ? 4 : 2;
                break;
            case MetadataVarType.guidIndex:
                size = (heapOffsetSizes & 2) != 0 ? 4 : 2;
                break;
            case MetadataVarType.blobIndex:
                size = (heapOffsetSizes & 4) != 0 ? 4 : 2;
                break;
            case MetadataVarType.resolutionScope:
                size = getSize(14, new MetadataIndex[] { MetadataIndex.iModule, MetadataIndex.iModuleRef, MetadataIndex.iAssemblyRef, MetadataIndex.iTypeRef });
                break;
            case MetadataVarType.typeDefOrRef:
                size = getSize(14, new MetadataIndex[] { MetadataIndex.iTypeDef, MetadataIndex.iTypeRef, MetadataIndex.iTypeSpec });
                break;
            case MetadataVarType.memberRefParent:
                size = getSize(13, new MetadataIndex[] { MetadataIndex.iTypeDef, MetadataIndex.iTypeRef, MetadataIndex.iModuleRef, MetadataIndex.iMethodDef, MetadataIndex.iTypeSpec });
                break;
            case MetadataVarType.hasConstant:
                size = getSize(14, new MetadataIndex[] { MetadataIndex.iField, MetadataIndex.iParam, MetadataIndex.iProperty });
                break;
            case MetadataVarType.hasCustomAttribute:
                size = getSize(11, new MetadataIndex[] {
                    MetadataIndex.iMethodDef, MetadataIndex.iField, MetadataIndex.iTypeRef,
                    MetadataIndex.iTypeDef, MetadataIndex.iParam, MetadataIndex.iInterfaceImpl,
                    MetadataIndex.iMemberRef, MetadataIndex.iModule /*TODO:, MetadataIndex.iPermission*/,
                    MetadataIndex.iProperty, MetadataIndex.iEvent, MetadataIndex.iStandAloneSig,
                    MetadataIndex.iModuleRef, MetadataIndex.iTypeSpec, MetadataIndex.iAssembly,
                    MetadataIndex.iAssemblyRef, MetadataIndex.iFile, MetadataIndex.iExportedType,
                    MetadataIndex.iManifestResource,
                });
                break;
            case MetadataVarType.customAttributeType:
                size = getSize(13, new MetadataIndex[] { MetadataIndex.iMethodDef, MetadataIndex.iMemberRef });	// others aren't used
                break;
            case MetadataVarType.hasFieldMarshal:
                size = getSize(15, new MetadataIndex[] { MetadataIndex.iField, MetadataIndex.iParam });
                break;
            case MetadataVarType.hasDeclSecurity:
                size = getSize(14, new MetadataIndex[] { MetadataIndex.iTypeDef, MetadataIndex.iMethodDef, MetadataIndex.iAssembly });
                break;
            case MetadataVarType.hasSemantics:
                size = getSize(15, new MetadataIndex[] { MetadataIndex.iEvent, MetadataIndex.iProperty });
                break;
            case MetadataVarType.methodDefOrRef:
                size = getSize(15, new MetadataIndex[] { MetadataIndex.iMethodDef, MetadataIndex.iMemberRef });
                break;
            case MetadataVarType.memberForwarded:
                size = getSize(15, new MetadataIndex[] { MetadataIndex.iField, MetadataIndex.iMethodDef });
                break;
            case MetadataVarType.implementation:
                size = getSize(14, new MetadataIndex[] { MetadataIndex.iFile, MetadataIndex.iAssemblyRef, MetadataIndex.iExportedType });
                break;
            case MetadataVarType.typeOrMethodDef:
                size = getSize(15, new MetadataIndex[] { MetadataIndex.iTypeDef, MetadataIndex.iMethodDef });
                break;
            case MetadataVarType.fieldIndex:
                size = getSize(MetadataIndex.iField);
                break;
            case MetadataVarType.methodDefIndex:
                size = getSize(MetadataIndex.iMethodDef);
                break;
            case MetadataVarType.paramIndex:
                size = getSize(MetadataIndex.iParam);
                break;
            case MetadataVarType.typeDefIndex:
                size = getSize(MetadataIndex.iTypeDef);
                break;
            case MetadataVarType.eventIndex:
                size = getSize(MetadataIndex.iEvent);
                break;
            case MetadataVarType.propertyIndex:
                size = getSize(MetadataIndex.iProperty);
                break;
            case MetadataVarType.moduleRefIndex:
                size = getSize(MetadataIndex.iModuleRef);
                break;
            case MetadataVarType.assemblyRefIndex:
                size = getSize(MetadataIndex.iAssemblyRef);
                break;
            case MetadataVarType.genericParamIndex:
                size = getSize(MetadataIndex.iGenericParam);
                break;
            default:
                throw new ApplicationException("Unknown type");
            }

            var field = new MetadataField();
            field.offset = offset;
            field.size = size;
            fields.Add(field);
            offset += size;
        }