forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			650 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			650 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
//
 | 
						|
// Author:
 | 
						|
//   Jb Evain (jbevain@gmail.com)
 | 
						|
//
 | 
						|
// Copyright (c) 2008 - 2015 Jb Evain
 | 
						|
// Copyright (c) 2008 - 2011 Novell, Inc.
 | 
						|
//
 | 
						|
// Licensed under the MIT/X11 license.
 | 
						|
//
 | 
						|
 | 
						|
using MonoFN.Cecil.Metadata;
 | 
						|
using System;
 | 
						|
 | 
						|
namespace MonoFN.Cecil {
 | 
						|
 | 
						|
	static partial class Mixin {
 | 
						|
 | 
						|
		public const int TableCount = 58;
 | 
						|
		public const int CodedIndexCount = 14;
 | 
						|
 | 
						|
		public static uint ReadCompressedUInt32 (this byte [] data, ref int position)
 | 
						|
		{
 | 
						|
			uint integer;
 | 
						|
			if ((data [position] & 0x80) == 0) {
 | 
						|
				integer = data [position];
 | 
						|
				position++;
 | 
						|
			} else if ((data [position] & 0x40) == 0) {
 | 
						|
				integer = (uint)(data [position] & ~0x80) << 8;
 | 
						|
				integer |= data [position + 1];
 | 
						|
				position += 2;
 | 
						|
			} else {
 | 
						|
				integer = (uint)(data [position] & ~0xc0) << 24;
 | 
						|
				integer |= (uint)data [position + 1] << 16;
 | 
						|
				integer |= (uint)data [position + 2] << 8;
 | 
						|
				integer |= (uint)data [position + 3];
 | 
						|
				position += 4;
 | 
						|
			}
 | 
						|
			return integer;
 | 
						|
		}
 | 
						|
 | 
						|
		public static MetadataToken GetMetadataToken (this CodedIndex self, uint data)
 | 
						|
		{
 | 
						|
			uint rid;
 | 
						|
			TokenType token_type;
 | 
						|
			switch (self) {
 | 
						|
			case CodedIndex.TypeDefOrRef:
 | 
						|
				rid = data >> 2;
 | 
						|
				switch (data & 3) {
 | 
						|
				case 0:
 | 
						|
					token_type = TokenType.TypeDef; goto ret;
 | 
						|
				case 1:
 | 
						|
					token_type = TokenType.TypeRef; goto ret;
 | 
						|
				case 2:
 | 
						|
					token_type = TokenType.TypeSpec; goto ret;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.HasConstant:
 | 
						|
				rid = data >> 2;
 | 
						|
				switch (data & 3) {
 | 
						|
				case 0:
 | 
						|
					token_type = TokenType.Field; goto ret;
 | 
						|
				case 1:
 | 
						|
					token_type = TokenType.Param; goto ret;
 | 
						|
				case 2:
 | 
						|
					token_type = TokenType.Property; goto ret;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.HasCustomAttribute:
 | 
						|
				rid = data >> 5;
 | 
						|
				switch (data & 31) {
 | 
						|
				case 0:
 | 
						|
					token_type = TokenType.Method; goto ret;
 | 
						|
				case 1:
 | 
						|
					token_type = TokenType.Field; goto ret;
 | 
						|
				case 2:
 | 
						|
					token_type = TokenType.TypeRef; goto ret;
 | 
						|
				case 3:
 | 
						|
					token_type = TokenType.TypeDef; goto ret;
 | 
						|
				case 4:
 | 
						|
					token_type = TokenType.Param; goto ret;
 | 
						|
				case 5:
 | 
						|
					token_type = TokenType.InterfaceImpl; goto ret;
 | 
						|
				case 6:
 | 
						|
					token_type = TokenType.MemberRef; goto ret;
 | 
						|
				case 7:
 | 
						|
					token_type = TokenType.Module; goto ret;
 | 
						|
				case 8:
 | 
						|
					token_type = TokenType.Permission; goto ret;
 | 
						|
				case 9:
 | 
						|
					token_type = TokenType.Property; goto ret;
 | 
						|
				case 10:
 | 
						|
					token_type = TokenType.Event; goto ret;
 | 
						|
				case 11:
 | 
						|
					token_type = TokenType.Signature; goto ret;
 | 
						|
				case 12:
 | 
						|
					token_type = TokenType.ModuleRef; goto ret;
 | 
						|
				case 13:
 | 
						|
					token_type = TokenType.TypeSpec; goto ret;
 | 
						|
				case 14:
 | 
						|
					token_type = TokenType.Assembly; goto ret;
 | 
						|
				case 15:
 | 
						|
					token_type = TokenType.AssemblyRef; goto ret;
 | 
						|
				case 16:
 | 
						|
					token_type = TokenType.File; goto ret;
 | 
						|
				case 17:
 | 
						|
					token_type = TokenType.ExportedType; goto ret;
 | 
						|
				case 18:
 | 
						|
					token_type = TokenType.ManifestResource; goto ret;
 | 
						|
				case 19:
 | 
						|
					token_type = TokenType.GenericParam; goto ret;
 | 
						|
				case 20:
 | 
						|
					token_type = TokenType.GenericParamConstraint; goto ret;
 | 
						|
				case 21:
 | 
						|
					token_type = TokenType.MethodSpec; goto ret;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.HasFieldMarshal:
 | 
						|
				rid = data >> 1;
 | 
						|
				switch (data & 1) {
 | 
						|
				case 0:
 | 
						|
					token_type = TokenType.Field; goto ret;
 | 
						|
				case 1:
 | 
						|
					token_type = TokenType.Param; goto ret;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.HasDeclSecurity:
 | 
						|
				rid = data >> 2;
 | 
						|
				switch (data & 3) {
 | 
						|
				case 0:
 | 
						|
					token_type = TokenType.TypeDef; goto ret;
 | 
						|
				case 1:
 | 
						|
					token_type = TokenType.Method; goto ret;
 | 
						|
				case 2:
 | 
						|
					token_type = TokenType.Assembly; goto ret;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.MemberRefParent:
 | 
						|
				rid = data >> 3;
 | 
						|
				switch (data & 7) {
 | 
						|
				case 0:
 | 
						|
					token_type = TokenType.TypeDef; goto ret;
 | 
						|
				case 1:
 | 
						|
					token_type = TokenType.TypeRef; goto ret;
 | 
						|
				case 2:
 | 
						|
					token_type = TokenType.ModuleRef; goto ret;
 | 
						|
				case 3:
 | 
						|
					token_type = TokenType.Method; goto ret;
 | 
						|
				case 4:
 | 
						|
					token_type = TokenType.TypeSpec; goto ret;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.HasSemantics:
 | 
						|
				rid = data >> 1;
 | 
						|
				switch (data & 1) {
 | 
						|
				case 0:
 | 
						|
					token_type = TokenType.Event; goto ret;
 | 
						|
				case 1:
 | 
						|
					token_type = TokenType.Property; goto ret;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.MethodDefOrRef:
 | 
						|
				rid = data >> 1;
 | 
						|
				switch (data & 1) {
 | 
						|
				case 0:
 | 
						|
					token_type = TokenType.Method; goto ret;
 | 
						|
				case 1:
 | 
						|
					token_type = TokenType.MemberRef; goto ret;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.MemberForwarded:
 | 
						|
				rid = data >> 1;
 | 
						|
				switch (data & 1) {
 | 
						|
				case 0:
 | 
						|
					token_type = TokenType.Field; goto ret;
 | 
						|
				case 1:
 | 
						|
					token_type = TokenType.Method; goto ret;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.Implementation:
 | 
						|
				rid = data >> 2;
 | 
						|
				switch (data & 3) {
 | 
						|
				case 0:
 | 
						|
					token_type = TokenType.File; goto ret;
 | 
						|
				case 1:
 | 
						|
					token_type = TokenType.AssemblyRef; goto ret;
 | 
						|
				case 2:
 | 
						|
					token_type = TokenType.ExportedType; goto ret;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.CustomAttributeType:
 | 
						|
				rid = data >> 3;
 | 
						|
				switch (data & 7) {
 | 
						|
				case 2:
 | 
						|
					token_type = TokenType.Method; goto ret;
 | 
						|
				case 3:
 | 
						|
					token_type = TokenType.MemberRef; goto ret;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.ResolutionScope:
 | 
						|
				rid = data >> 2;
 | 
						|
				switch (data & 3) {
 | 
						|
				case 0:
 | 
						|
					token_type = TokenType.Module; goto ret;
 | 
						|
				case 1:
 | 
						|
					token_type = TokenType.ModuleRef; goto ret;
 | 
						|
				case 2:
 | 
						|
					token_type = TokenType.AssemblyRef; goto ret;
 | 
						|
				case 3:
 | 
						|
					token_type = TokenType.TypeRef; goto ret;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.TypeOrMethodDef:
 | 
						|
				rid = data >> 1;
 | 
						|
				switch (data & 1) {
 | 
						|
				case 0:
 | 
						|
					token_type = TokenType.TypeDef; goto ret;
 | 
						|
				case 1:
 | 
						|
					token_type = TokenType.Method; goto ret;
 | 
						|
				default: goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.HasCustomDebugInformation:
 | 
						|
				rid = data >> 5;
 | 
						|
				switch (data & 31) {
 | 
						|
				case 0:
 | 
						|
					token_type = TokenType.Method; goto ret;
 | 
						|
				case 1:
 | 
						|
					token_type = TokenType.Field; goto ret;
 | 
						|
				case 2:
 | 
						|
					token_type = TokenType.TypeRef; goto ret;
 | 
						|
				case 3:
 | 
						|
					token_type = TokenType.TypeDef; goto ret;
 | 
						|
				case 4:
 | 
						|
					token_type = TokenType.Param; goto ret;
 | 
						|
				case 5:
 | 
						|
					token_type = TokenType.InterfaceImpl; goto ret;
 | 
						|
				case 6:
 | 
						|
					token_type = TokenType.MemberRef; goto ret;
 | 
						|
				case 7:
 | 
						|
					token_type = TokenType.Module; goto ret;
 | 
						|
				case 8:
 | 
						|
					token_type = TokenType.Permission; goto ret;
 | 
						|
				case 9:
 | 
						|
					token_type = TokenType.Property; goto ret;
 | 
						|
				case 10:
 | 
						|
					token_type = TokenType.Event; goto ret;
 | 
						|
				case 11:
 | 
						|
					token_type = TokenType.Signature; goto ret;
 | 
						|
				case 12:
 | 
						|
					token_type = TokenType.ModuleRef; goto ret;
 | 
						|
				case 13:
 | 
						|
					token_type = TokenType.TypeSpec; goto ret;
 | 
						|
				case 14:
 | 
						|
					token_type = TokenType.Assembly; goto ret;
 | 
						|
				case 15:
 | 
						|
					token_type = TokenType.AssemblyRef; goto ret;
 | 
						|
				case 16:
 | 
						|
					token_type = TokenType.File; goto ret;
 | 
						|
				case 17:
 | 
						|
					token_type = TokenType.ExportedType; goto ret;
 | 
						|
				case 18:
 | 
						|
					token_type = TokenType.ManifestResource; goto ret;
 | 
						|
				case 19:
 | 
						|
					token_type = TokenType.GenericParam; goto ret;
 | 
						|
				case 20:
 | 
						|
					token_type = TokenType.GenericParamConstraint; goto ret;
 | 
						|
				case 21:
 | 
						|
					token_type = TokenType.MethodSpec; goto ret;
 | 
						|
				case 22:
 | 
						|
					token_type = TokenType.Document; goto ret;
 | 
						|
				case 23:
 | 
						|
					token_type = TokenType.LocalScope; goto ret;
 | 
						|
				case 24:
 | 
						|
					token_type = TokenType.LocalVariable; goto ret;
 | 
						|
				case 25:
 | 
						|
					token_type = TokenType.LocalConstant; goto ret;
 | 
						|
				case 26:
 | 
						|
					token_type = TokenType.ImportScope; goto ret;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			default:
 | 
						|
				goto exit;
 | 
						|
			}
 | 
						|
		ret:
 | 
						|
			return new MetadataToken (token_type, rid);
 | 
						|
		exit:
 | 
						|
			return MetadataToken.Zero;
 | 
						|
		}
 | 
						|
 | 
						|
		public static uint CompressMetadataToken (this CodedIndex self, MetadataToken token)
 | 
						|
		{
 | 
						|
			uint ret = 0;
 | 
						|
			if (token.RID == 0)
 | 
						|
				return ret;
 | 
						|
			switch (self) {
 | 
						|
			case CodedIndex.TypeDefOrRef:
 | 
						|
				ret = token.RID << 2;
 | 
						|
				switch (token.TokenType) {
 | 
						|
				case TokenType.TypeDef:
 | 
						|
					return ret | 0;
 | 
						|
				case TokenType.TypeRef:
 | 
						|
					return ret | 1;
 | 
						|
				case TokenType.TypeSpec:
 | 
						|
					return ret | 2;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.HasConstant:
 | 
						|
				ret = token.RID << 2;
 | 
						|
				switch (token.TokenType) {
 | 
						|
				case TokenType.Field:
 | 
						|
					return ret | 0;
 | 
						|
				case TokenType.Param:
 | 
						|
					return ret | 1;
 | 
						|
				case TokenType.Property:
 | 
						|
					return ret | 2;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.HasCustomAttribute:
 | 
						|
				ret = token.RID << 5;
 | 
						|
				switch (token.TokenType) {
 | 
						|
				case TokenType.Method:
 | 
						|
					return ret | 0;
 | 
						|
				case TokenType.Field:
 | 
						|
					return ret | 1;
 | 
						|
				case TokenType.TypeRef:
 | 
						|
					return ret | 2;
 | 
						|
				case TokenType.TypeDef:
 | 
						|
					return ret | 3;
 | 
						|
				case TokenType.Param:
 | 
						|
					return ret | 4;
 | 
						|
				case TokenType.InterfaceImpl:
 | 
						|
					return ret | 5;
 | 
						|
				case TokenType.MemberRef:
 | 
						|
					return ret | 6;
 | 
						|
				case TokenType.Module:
 | 
						|
					return ret | 7;
 | 
						|
				case TokenType.Permission:
 | 
						|
					return ret | 8;
 | 
						|
				case TokenType.Property:
 | 
						|
					return ret | 9;
 | 
						|
				case TokenType.Event:
 | 
						|
					return ret | 10;
 | 
						|
				case TokenType.Signature:
 | 
						|
					return ret | 11;
 | 
						|
				case TokenType.ModuleRef:
 | 
						|
					return ret | 12;
 | 
						|
				case TokenType.TypeSpec:
 | 
						|
					return ret | 13;
 | 
						|
				case TokenType.Assembly:
 | 
						|
					return ret | 14;
 | 
						|
				case TokenType.AssemblyRef:
 | 
						|
					return ret | 15;
 | 
						|
				case TokenType.File:
 | 
						|
					return ret | 16;
 | 
						|
				case TokenType.ExportedType:
 | 
						|
					return ret | 17;
 | 
						|
				case TokenType.ManifestResource:
 | 
						|
					return ret | 18;
 | 
						|
				case TokenType.GenericParam:
 | 
						|
					return ret | 19;
 | 
						|
				case TokenType.GenericParamConstraint:
 | 
						|
					return ret | 20;
 | 
						|
				case TokenType.MethodSpec:
 | 
						|
					return ret | 21;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.HasFieldMarshal:
 | 
						|
				ret = token.RID << 1;
 | 
						|
				switch (token.TokenType) {
 | 
						|
				case TokenType.Field:
 | 
						|
					return ret | 0;
 | 
						|
				case TokenType.Param:
 | 
						|
					return ret | 1;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.HasDeclSecurity:
 | 
						|
				ret = token.RID << 2;
 | 
						|
				switch (token.TokenType) {
 | 
						|
				case TokenType.TypeDef:
 | 
						|
					return ret | 0;
 | 
						|
				case TokenType.Method:
 | 
						|
					return ret | 1;
 | 
						|
				case TokenType.Assembly:
 | 
						|
					return ret | 2;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.MemberRefParent:
 | 
						|
				ret = token.RID << 3;
 | 
						|
				switch (token.TokenType) {
 | 
						|
				case TokenType.TypeDef:
 | 
						|
					return ret | 0;
 | 
						|
				case TokenType.TypeRef:
 | 
						|
					return ret | 1;
 | 
						|
				case TokenType.ModuleRef:
 | 
						|
					return ret | 2;
 | 
						|
				case TokenType.Method:
 | 
						|
					return ret | 3;
 | 
						|
				case TokenType.TypeSpec:
 | 
						|
					return ret | 4;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.HasSemantics:
 | 
						|
				ret = token.RID << 1;
 | 
						|
				switch (token.TokenType) {
 | 
						|
				case TokenType.Event:
 | 
						|
					return ret | 0;
 | 
						|
				case TokenType.Property:
 | 
						|
					return ret | 1;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.MethodDefOrRef:
 | 
						|
				ret = token.RID << 1;
 | 
						|
				switch (token.TokenType) {
 | 
						|
				case TokenType.Method:
 | 
						|
					return ret | 0;
 | 
						|
				case TokenType.MemberRef:
 | 
						|
					return ret | 1;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.MemberForwarded:
 | 
						|
				ret = token.RID << 1;
 | 
						|
				switch (token.TokenType) {
 | 
						|
				case TokenType.Field:
 | 
						|
					return ret | 0;
 | 
						|
				case TokenType.Method:
 | 
						|
					return ret | 1;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.Implementation:
 | 
						|
				ret = token.RID << 2;
 | 
						|
				switch (token.TokenType) {
 | 
						|
				case TokenType.File:
 | 
						|
					return ret | 0;
 | 
						|
				case TokenType.AssemblyRef:
 | 
						|
					return ret | 1;
 | 
						|
				case TokenType.ExportedType:
 | 
						|
					return ret | 2;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.CustomAttributeType:
 | 
						|
				ret = token.RID << 3;
 | 
						|
				switch (token.TokenType) {
 | 
						|
				case TokenType.Method:
 | 
						|
					return ret | 2;
 | 
						|
				case TokenType.MemberRef:
 | 
						|
					return ret | 3;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.ResolutionScope:
 | 
						|
				ret = token.RID << 2;
 | 
						|
				switch (token.TokenType) {
 | 
						|
				case TokenType.Module:
 | 
						|
					return ret | 0;
 | 
						|
				case TokenType.ModuleRef:
 | 
						|
					return ret | 1;
 | 
						|
				case TokenType.AssemblyRef:
 | 
						|
					return ret | 2;
 | 
						|
				case TokenType.TypeRef:
 | 
						|
					return ret | 3;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.TypeOrMethodDef:
 | 
						|
				ret = token.RID << 1;
 | 
						|
				switch (token.TokenType) {
 | 
						|
				case TokenType.TypeDef:
 | 
						|
					return ret | 0;
 | 
						|
				case TokenType.Method:
 | 
						|
					return ret | 1;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			case CodedIndex.HasCustomDebugInformation:
 | 
						|
				ret = token.RID << 5;
 | 
						|
				switch (token.TokenType) {
 | 
						|
				case TokenType.Method:
 | 
						|
					return ret | 0;
 | 
						|
				case TokenType.Field:
 | 
						|
					return ret | 1;
 | 
						|
				case TokenType.TypeRef:
 | 
						|
					return ret | 2;
 | 
						|
				case TokenType.TypeDef:
 | 
						|
					return ret | 3;
 | 
						|
				case TokenType.Param:
 | 
						|
					return ret | 4;
 | 
						|
				case TokenType.InterfaceImpl:
 | 
						|
					return ret | 5;
 | 
						|
				case TokenType.MemberRef:
 | 
						|
					return ret | 6;
 | 
						|
				case TokenType.Module:
 | 
						|
					return ret | 7;
 | 
						|
				case TokenType.Permission:
 | 
						|
					return ret | 8;
 | 
						|
				case TokenType.Property:
 | 
						|
					return ret | 9;
 | 
						|
				case TokenType.Event:
 | 
						|
					return ret | 10;
 | 
						|
				case TokenType.Signature:
 | 
						|
					return ret | 11;
 | 
						|
				case TokenType.ModuleRef:
 | 
						|
					return ret | 12;
 | 
						|
				case TokenType.TypeSpec:
 | 
						|
					return ret | 13;
 | 
						|
				case TokenType.Assembly:
 | 
						|
					return ret | 14;
 | 
						|
				case TokenType.AssemblyRef:
 | 
						|
					return ret | 15;
 | 
						|
				case TokenType.File:
 | 
						|
					return ret | 16;
 | 
						|
				case TokenType.ExportedType:
 | 
						|
					return ret | 17;
 | 
						|
				case TokenType.ManifestResource:
 | 
						|
					return ret | 18;
 | 
						|
				case TokenType.GenericParam:
 | 
						|
					return ret | 19;
 | 
						|
				case TokenType.GenericParamConstraint:
 | 
						|
					return ret | 20;
 | 
						|
				case TokenType.MethodSpec:
 | 
						|
					return ret | 21;
 | 
						|
				case TokenType.Document:
 | 
						|
					return ret | 22;
 | 
						|
				case TokenType.LocalScope:
 | 
						|
					return ret | 23;
 | 
						|
				case TokenType.LocalVariable:
 | 
						|
					return ret | 24;
 | 
						|
				case TokenType.LocalConstant:
 | 
						|
					return ret | 25;
 | 
						|
				case TokenType.ImportScope:
 | 
						|
					return ret | 26;
 | 
						|
				default:
 | 
						|
					goto exit;
 | 
						|
				}
 | 
						|
			default:
 | 
						|
				goto exit;
 | 
						|
			}
 | 
						|
		exit:
 | 
						|
			throw new ArgumentException ();
 | 
						|
		}
 | 
						|
 | 
						|
		public static int GetSize (this CodedIndex self, Func<Table, int> counter)
 | 
						|
		{
 | 
						|
			int bits;
 | 
						|
			Table [] tables;
 | 
						|
 | 
						|
			switch (self) {
 | 
						|
			case CodedIndex.TypeDefOrRef:
 | 
						|
				bits = 2;
 | 
						|
				tables = new [] { Table.TypeDef, Table.TypeRef, Table.TypeSpec };
 | 
						|
				break;
 | 
						|
			case CodedIndex.HasConstant:
 | 
						|
				bits = 2;
 | 
						|
				tables = new [] { Table.Field, Table.Param, Table.Property };
 | 
						|
				break;
 | 
						|
			case CodedIndex.HasCustomAttribute:
 | 
						|
				bits = 5;
 | 
						|
				tables = new [] {
 | 
						|
					Table.Method, Table.Field, Table.TypeRef, Table.TypeDef, Table.Param, Table.InterfaceImpl, Table.MemberRef,
 | 
						|
					Table.Module, Table.DeclSecurity, Table.Property, Table.Event, Table.StandAloneSig, Table.ModuleRef,
 | 
						|
					Table.TypeSpec, Table.Assembly, Table.AssemblyRef, Table.File, Table.ExportedType,
 | 
						|
					Table.ManifestResource, Table.GenericParam, Table.GenericParamConstraint, Table.MethodSpec,
 | 
						|
				};
 | 
						|
				break;
 | 
						|
			case CodedIndex.HasFieldMarshal:
 | 
						|
				bits = 1;
 | 
						|
				tables = new [] { Table.Field, Table.Param };
 | 
						|
				break;
 | 
						|
			case CodedIndex.HasDeclSecurity:
 | 
						|
				bits = 2;
 | 
						|
				tables = new [] { Table.TypeDef, Table.Method, Table.Assembly };
 | 
						|
				break;
 | 
						|
			case CodedIndex.MemberRefParent:
 | 
						|
				bits = 3;
 | 
						|
				tables = new [] { Table.TypeDef, Table.TypeRef, Table.ModuleRef, Table.Method, Table.TypeSpec };
 | 
						|
				break;
 | 
						|
			case CodedIndex.HasSemantics:
 | 
						|
				bits = 1;
 | 
						|
				tables = new [] { Table.Event, Table.Property };
 | 
						|
				break;
 | 
						|
			case CodedIndex.MethodDefOrRef:
 | 
						|
				bits = 1;
 | 
						|
				tables = new [] { Table.Method, Table.MemberRef };
 | 
						|
				break;
 | 
						|
			case CodedIndex.MemberForwarded:
 | 
						|
				bits = 1;
 | 
						|
				tables = new [] { Table.Field, Table.Method };
 | 
						|
				break;
 | 
						|
			case CodedIndex.Implementation:
 | 
						|
				bits = 2;
 | 
						|
				tables = new [] { Table.File, Table.AssemblyRef, Table.ExportedType };
 | 
						|
				break;
 | 
						|
			case CodedIndex.CustomAttributeType:
 | 
						|
				bits = 3;
 | 
						|
				tables = new [] { Table.Method, Table.MemberRef };
 | 
						|
				break;
 | 
						|
			case CodedIndex.ResolutionScope:
 | 
						|
				bits = 2;
 | 
						|
				tables = new [] { Table.Module, Table.ModuleRef, Table.AssemblyRef, Table.TypeRef };
 | 
						|
				break;
 | 
						|
			case CodedIndex.TypeOrMethodDef:
 | 
						|
				bits = 1;
 | 
						|
				tables = new [] { Table.TypeDef, Table.Method };
 | 
						|
				break;
 | 
						|
			case CodedIndex.HasCustomDebugInformation:
 | 
						|
				bits = 5;
 | 
						|
				tables = new [] {
 | 
						|
					Table.Method, Table.Field, Table.TypeRef, Table.TypeDef, Table.Param, Table.InterfaceImpl, Table.MemberRef,
 | 
						|
					Table.Module, Table.DeclSecurity, Table.Property, Table.Event, Table.StandAloneSig, Table.ModuleRef,
 | 
						|
					Table.TypeSpec, Table.Assembly, Table.AssemblyRef, Table.File, Table.ExportedType,
 | 
						|
					Table.ManifestResource, Table.GenericParam, Table.GenericParamConstraint, Table.MethodSpec,
 | 
						|
					Table.Document, Table.LocalScope, Table.LocalVariable, Table.LocalConstant, Table.ImportScope,
 | 
						|
				};
 | 
						|
				break;
 | 
						|
			default:
 | 
						|
				throw new ArgumentException ();
 | 
						|
			}
 | 
						|
 | 
						|
			int max = 0;
 | 
						|
 | 
						|
			for (int i = 0; i < tables.Length; i++) {
 | 
						|
				max = System.Math.Max (counter (tables [i]), max);
 | 
						|
			}
 | 
						|
 | 
						|
			return max < (1 << (16 - bits)) ? 2 : 4;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |