mirror of https://github.com/icsharpcode/ILSpy.git
Browse Source
git-subtree-dir: Mono.Cecil git-subtree-split: 6668bdcbeed78041ab9844efc223eabaa404d73dpull/1/head
commit
de279f32b3
289 changed files with 46540 additions and 0 deletions
@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
|
||||
bin |
||||
obj |
||||
*.suo |
||||
*.user |
||||
*.pidb |
||||
*.userprefs |
||||
*.xml |
@ -0,0 +1,252 @@
@@ -0,0 +1,252 @@
|
||||
//
|
||||
// Code.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil.Cil { |
||||
|
||||
public enum Code { |
||||
Nop, |
||||
Break, |
||||
Ldarg_0, |
||||
Ldarg_1, |
||||
Ldarg_2, |
||||
Ldarg_3, |
||||
Ldloc_0, |
||||
Ldloc_1, |
||||
Ldloc_2, |
||||
Ldloc_3, |
||||
Stloc_0, |
||||
Stloc_1, |
||||
Stloc_2, |
||||
Stloc_3, |
||||
Ldarg_S, |
||||
Ldarga_S, |
||||
Starg_S, |
||||
Ldloc_S, |
||||
Ldloca_S, |
||||
Stloc_S, |
||||
Ldnull, |
||||
Ldc_I4_M1, |
||||
Ldc_I4_0, |
||||
Ldc_I4_1, |
||||
Ldc_I4_2, |
||||
Ldc_I4_3, |
||||
Ldc_I4_4, |
||||
Ldc_I4_5, |
||||
Ldc_I4_6, |
||||
Ldc_I4_7, |
||||
Ldc_I4_8, |
||||
Ldc_I4_S, |
||||
Ldc_I4, |
||||
Ldc_I8, |
||||
Ldc_R4, |
||||
Ldc_R8, |
||||
Dup, |
||||
Pop, |
||||
Jmp, |
||||
Call, |
||||
Calli, |
||||
Ret, |
||||
Br_S, |
||||
Brfalse_S, |
||||
Brtrue_S, |
||||
Beq_S, |
||||
Bge_S, |
||||
Bgt_S, |
||||
Ble_S, |
||||
Blt_S, |
||||
Bne_Un_S, |
||||
Bge_Un_S, |
||||
Bgt_Un_S, |
||||
Ble_Un_S, |
||||
Blt_Un_S, |
||||
Br, |
||||
Brfalse, |
||||
Brtrue, |
||||
Beq, |
||||
Bge, |
||||
Bgt, |
||||
Ble, |
||||
Blt, |
||||
Bne_Un, |
||||
Bge_Un, |
||||
Bgt_Un, |
||||
Ble_Un, |
||||
Blt_Un, |
||||
Switch, |
||||
Ldind_I1, |
||||
Ldind_U1, |
||||
Ldind_I2, |
||||
Ldind_U2, |
||||
Ldind_I4, |
||||
Ldind_U4, |
||||
Ldind_I8, |
||||
Ldind_I, |
||||
Ldind_R4, |
||||
Ldind_R8, |
||||
Ldind_Ref, |
||||
Stind_Ref, |
||||
Stind_I1, |
||||
Stind_I2, |
||||
Stind_I4, |
||||
Stind_I8, |
||||
Stind_R4, |
||||
Stind_R8, |
||||
Add, |
||||
Sub, |
||||
Mul, |
||||
Div, |
||||
Div_Un, |
||||
Rem, |
||||
Rem_Un, |
||||
And, |
||||
Or, |
||||
Xor, |
||||
Shl, |
||||
Shr, |
||||
Shr_Un, |
||||
Neg, |
||||
Not, |
||||
Conv_I1, |
||||
Conv_I2, |
||||
Conv_I4, |
||||
Conv_I8, |
||||
Conv_R4, |
||||
Conv_R8, |
||||
Conv_U4, |
||||
Conv_U8, |
||||
Callvirt, |
||||
Cpobj, |
||||
Ldobj, |
||||
Ldstr, |
||||
Newobj, |
||||
Castclass, |
||||
Isinst, |
||||
Conv_R_Un, |
||||
Unbox, |
||||
Throw, |
||||
Ldfld, |
||||
Ldflda, |
||||
Stfld, |
||||
Ldsfld, |
||||
Ldsflda, |
||||
Stsfld, |
||||
Stobj, |
||||
Conv_Ovf_I1_Un, |
||||
Conv_Ovf_I2_Un, |
||||
Conv_Ovf_I4_Un, |
||||
Conv_Ovf_I8_Un, |
||||
Conv_Ovf_U1_Un, |
||||
Conv_Ovf_U2_Un, |
||||
Conv_Ovf_U4_Un, |
||||
Conv_Ovf_U8_Un, |
||||
Conv_Ovf_I_Un, |
||||
Conv_Ovf_U_Un, |
||||
Box, |
||||
Newarr, |
||||
Ldlen, |
||||
Ldelema, |
||||
Ldelem_I1, |
||||
Ldelem_U1, |
||||
Ldelem_I2, |
||||
Ldelem_U2, |
||||
Ldelem_I4, |
||||
Ldelem_U4, |
||||
Ldelem_I8, |
||||
Ldelem_I, |
||||
Ldelem_R4, |
||||
Ldelem_R8, |
||||
Ldelem_Ref, |
||||
Stelem_I, |
||||
Stelem_I1, |
||||
Stelem_I2, |
||||
Stelem_I4, |
||||
Stelem_I8, |
||||
Stelem_R4, |
||||
Stelem_R8, |
||||
Stelem_Ref, |
||||
Ldelem_Any, |
||||
Stelem_Any, |
||||
Unbox_Any, |
||||
Conv_Ovf_I1, |
||||
Conv_Ovf_U1, |
||||
Conv_Ovf_I2, |
||||
Conv_Ovf_U2, |
||||
Conv_Ovf_I4, |
||||
Conv_Ovf_U4, |
||||
Conv_Ovf_I8, |
||||
Conv_Ovf_U8, |
||||
Refanyval, |
||||
Ckfinite, |
||||
Mkrefany, |
||||
Ldtoken, |
||||
Conv_U2, |
||||
Conv_U1, |
||||
Conv_I, |
||||
Conv_Ovf_I, |
||||
Conv_Ovf_U, |
||||
Add_Ovf, |
||||
Add_Ovf_Un, |
||||
Mul_Ovf, |
||||
Mul_Ovf_Un, |
||||
Sub_Ovf, |
||||
Sub_Ovf_Un, |
||||
Endfinally, |
||||
Leave, |
||||
Leave_S, |
||||
Stind_I, |
||||
Conv_U, |
||||
Arglist, |
||||
Ceq, |
||||
Cgt, |
||||
Cgt_Un, |
||||
Clt, |
||||
Clt_Un, |
||||
Ldftn, |
||||
Ldvirtftn, |
||||
Ldarg, |
||||
Ldarga, |
||||
Starg, |
||||
Ldloc, |
||||
Ldloca, |
||||
Stloc, |
||||
Localloc, |
||||
Endfilter, |
||||
Unaligned, |
||||
Volatile, |
||||
Tail, |
||||
Initobj, |
||||
Constrained, |
||||
Cpblk, |
||||
Initblk, |
||||
No, |
||||
Rethrow, |
||||
Sizeof, |
||||
Refanytype, |
||||
Readonly, |
||||
} |
||||
} |
@ -0,0 +1,604 @@
@@ -0,0 +1,604 @@
|
||||
//
|
||||
// CodeReader.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using Mono.Cecil.PE; |
||||
using Mono.Collections.Generic; |
||||
|
||||
using RVA = System.UInt32; |
||||
|
||||
namespace Mono.Cecil.Cil { |
||||
|
||||
sealed class CodeReader : ByteBuffer { |
||||
|
||||
readonly internal MetadataReader reader; |
||||
|
||||
int start; |
||||
Section code_section; |
||||
|
||||
MethodDefinition method; |
||||
MethodBody body; |
||||
|
||||
int Offset { |
||||
get { return base.position - start; } |
||||
} |
||||
|
||||
CodeReader (Section section, MetadataReader reader) |
||||
: base (section.Data) |
||||
{ |
||||
this.code_section = section; |
||||
this.reader = reader; |
||||
} |
||||
|
||||
public static CodeReader CreateCodeReader (MetadataReader metadata) |
||||
{ |
||||
return new CodeReader (metadata.image.MetadataSection, metadata); |
||||
} |
||||
|
||||
public MethodBody ReadMethodBody (MethodDefinition method) |
||||
{ |
||||
this.method = method; |
||||
this.body = new MethodBody (method); |
||||
|
||||
reader.context = method; |
||||
|
||||
ReadMethodBody (); |
||||
|
||||
return this.body; |
||||
} |
||||
|
||||
public void MoveTo (int rva) |
||||
{ |
||||
if (!IsInSection (rva)) { |
||||
code_section = reader.image.GetSectionAtVirtualAddress ((uint) rva); |
||||
Reset (code_section.Data); |
||||
} |
||||
|
||||
base.position = rva - (int) code_section.VirtualAddress; |
||||
} |
||||
|
||||
bool IsInSection (int rva) |
||||
{ |
||||
return code_section.VirtualAddress <= rva && rva < code_section.VirtualAddress + code_section.SizeOfRawData; |
||||
} |
||||
|
||||
void ReadMethodBody () |
||||
{ |
||||
MoveTo (method.RVA); |
||||
|
||||
var flags = ReadByte (); |
||||
switch (flags & 0x3) { |
||||
case 0x2: // tiny
|
||||
body.code_size = flags >> 2; |
||||
body.MaxStackSize = 8; |
||||
ReadCode (); |
||||
break; |
||||
case 0x3: // fat
|
||||
base.position--; |
||||
ReadFatMethod (); |
||||
break; |
||||
default: |
||||
throw new InvalidOperationException (); |
||||
} |
||||
|
||||
var symbol_reader = reader.module.SymbolReader; |
||||
|
||||
if (symbol_reader != null) { |
||||
var instructions = body.Instructions; |
||||
symbol_reader.Read (body, offset => GetInstruction (instructions, offset)); |
||||
} |
||||
} |
||||
|
||||
void ReadFatMethod () |
||||
{ |
||||
var flags = ReadUInt16 (); |
||||
body.max_stack_size = ReadUInt16 (); |
||||
body.code_size = (int) ReadUInt32 (); |
||||
body.local_var_token = new MetadataToken (ReadUInt32 ()); |
||||
body.init_locals = (flags & 0x10) != 0; |
||||
|
||||
if (body.local_var_token.RID != 0) |
||||
body.variables = ReadVariables (body.local_var_token); |
||||
|
||||
ReadCode (); |
||||
|
||||
if ((flags & 0x8) != 0) |
||||
ReadSection (); |
||||
} |
||||
|
||||
public VariableDefinitionCollection ReadVariables (MetadataToken local_var_token) |
||||
{ |
||||
var position = reader.position; |
||||
var variables = reader.ReadVariables (local_var_token); |
||||
reader.position = position; |
||||
|
||||
return variables; |
||||
} |
||||
|
||||
void ReadCode () |
||||
{ |
||||
start = position; |
||||
var code_size = body.code_size; |
||||
|
||||
if (code_size < 0 || buffer.Length <= (uint) (code_size + position)) |
||||
code_size = 0; |
||||
|
||||
var end = start + code_size; |
||||
var instructions = body.instructions = new InstructionCollection (code_size / 3); |
||||
|
||||
while (position < end) { |
||||
var offset = base.position - start; |
||||
var opcode = ReadOpCode (); |
||||
var current = new Instruction (offset, opcode); |
||||
|
||||
if (opcode.OperandType != OperandType.InlineNone) |
||||
current.operand = ReadOperand (current); |
||||
|
||||
instructions.Add (current); |
||||
} |
||||
|
||||
ResolveBranches (instructions); |
||||
} |
||||
|
||||
OpCode ReadOpCode () |
||||
{ |
||||
var il_opcode = ReadByte (); |
||||
return il_opcode != 0xfe |
||||
? OpCodes.OneByteOpCode [il_opcode] |
||||
: OpCodes.TwoBytesOpCode [ReadByte ()]; |
||||
} |
||||
|
||||
object ReadOperand (Instruction instruction) |
||||
{ |
||||
switch (instruction.opcode.OperandType) { |
||||
case OperandType.InlineSwitch: |
||||
var length = ReadInt32 (); |
||||
var base_offset = Offset + (4 * length); |
||||
var branches = new int [length]; |
||||
for (int i = 0; i < length; i++) |
||||
branches [i] = base_offset + ReadInt32 (); |
||||
return branches; |
||||
case OperandType.ShortInlineBrTarget: |
||||
return ReadSByte () + Offset; |
||||
case OperandType.InlineBrTarget: |
||||
return ReadInt32 () + Offset; |
||||
case OperandType.ShortInlineI: |
||||
if (instruction.opcode == OpCodes.Ldc_I4_S) |
||||
return ReadSByte (); |
||||
|
||||
return ReadByte (); |
||||
case OperandType.InlineI: |
||||
return ReadInt32 (); |
||||
case OperandType.ShortInlineR: |
||||
return ReadSingle (); |
||||
case OperandType.InlineR: |
||||
return ReadDouble (); |
||||
case OperandType.InlineI8: |
||||
return ReadInt64 (); |
||||
case OperandType.ShortInlineVar: |
||||
return GetVariable (ReadByte ()); |
||||
case OperandType.InlineVar: |
||||
return GetVariable (ReadUInt16 ()); |
||||
case OperandType.ShortInlineArg: |
||||
return GetParameter (ReadByte ()); |
||||
case OperandType.InlineArg: |
||||
return GetParameter (ReadUInt16 ()); |
||||
case OperandType.InlineSig: |
||||
return GetCallSite (ReadToken ()); |
||||
case OperandType.InlineString: |
||||
return GetString (ReadToken ()); |
||||
case OperandType.InlineTok: |
||||
case OperandType.InlineType: |
||||
case OperandType.InlineMethod: |
||||
case OperandType.InlineField: |
||||
return reader.LookupToken (ReadToken ()); |
||||
default: |
||||
throw new NotSupportedException (); |
||||
} |
||||
} |
||||
|
||||
public string GetString (MetadataToken token) |
||||
{ |
||||
return reader.image.UserStringHeap.Read (token.RID); |
||||
} |
||||
|
||||
public ParameterDefinition GetParameter (int index) |
||||
{ |
||||
return body.GetParameter (index); |
||||
} |
||||
|
||||
public VariableDefinition GetVariable (int index) |
||||
{ |
||||
return body.GetVariable (index); |
||||
} |
||||
|
||||
public CallSite GetCallSite (MetadataToken token) |
||||
{ |
||||
return reader.ReadCallSite (token); |
||||
} |
||||
|
||||
void ResolveBranches (Collection<Instruction> instructions) |
||||
{ |
||||
var items = instructions.items; |
||||
var size = instructions.size; |
||||
|
||||
for (int i = 0; i < size; i++) { |
||||
var instruction = items [i]; |
||||
switch (instruction.opcode.OperandType) { |
||||
case OperandType.ShortInlineBrTarget: |
||||
case OperandType.InlineBrTarget: |
||||
instruction.operand = GetInstruction ((int) instruction.operand); |
||||
break; |
||||
case OperandType.InlineSwitch: |
||||
var offsets = (int []) instruction.operand; |
||||
var branches = new Instruction [offsets.Length]; |
||||
for (int j = 0; j < offsets.Length; j++) |
||||
branches [j] = GetInstruction (offsets [j]); |
||||
|
||||
instruction.operand = branches; |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
Instruction GetInstruction (int offset) |
||||
{ |
||||
return GetInstruction (body.Instructions, offset); |
||||
} |
||||
|
||||
static Instruction GetInstruction (Collection<Instruction> instructions, int offset) |
||||
{ |
||||
var size = instructions.size; |
||||
var items = instructions.items; |
||||
if (offset < 0 || offset > items [size - 1].offset) |
||||
return null; |
||||
|
||||
int min = 0; |
||||
int max = size - 1; |
||||
while (min <= max) { |
||||
int mid = min + ((max - min) / 2); |
||||
var instruction = items [mid]; |
||||
var instruction_offset = instruction.offset; |
||||
|
||||
if (offset == instruction_offset) |
||||
return instruction; |
||||
|
||||
if (offset < instruction_offset) |
||||
max = mid - 1; |
||||
else |
||||
min = mid + 1; |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
void ReadSection () |
||||
{ |
||||
Align (4); |
||||
|
||||
const byte fat_format = 0x40; |
||||
const byte more_sects = 0x80; |
||||
|
||||
var flags = ReadByte (); |
||||
if ((flags & fat_format) == 0) |
||||
ReadSmallSection (); |
||||
else |
||||
ReadFatSection (); |
||||
|
||||
if ((flags & more_sects) != 0) |
||||
ReadSection (); |
||||
} |
||||
|
||||
void ReadSmallSection () |
||||
{ |
||||
var count = ReadByte () / 12; |
||||
Advance (2); |
||||
|
||||
ReadExceptionHandlers ( |
||||
count, |
||||
() => (int) ReadUInt16 (), |
||||
() => (int) ReadByte ()); |
||||
} |
||||
|
||||
void ReadFatSection () |
||||
{ |
||||
position--; |
||||
var count = (ReadInt32 () >> 8) / 24; |
||||
|
||||
ReadExceptionHandlers ( |
||||
count, |
||||
ReadInt32, |
||||
ReadInt32); |
||||
} |
||||
|
||||
// inline ?
|
||||
void ReadExceptionHandlers (int count, Func<int> read_entry, Func<int> read_length) |
||||
{ |
||||
for (int i = 0; i < count; i++) { |
||||
var handler = new ExceptionHandler ( |
||||
(ExceptionHandlerType) (read_entry () & 0x7)); |
||||
|
||||
handler.TryStart = GetInstruction (read_entry ()); |
||||
handler.TryEnd = GetInstruction (handler.TryStart.Offset + read_length ()); |
||||
|
||||
handler.HandlerStart = GetInstruction (read_entry ()); |
||||
handler.HandlerEnd = GetInstruction (handler.HandlerStart.Offset + read_length ()); |
||||
|
||||
ReadExceptionHandlerSpecific (handler); |
||||
|
||||
this.body.ExceptionHandlers.Add (handler); |
||||
} |
||||
} |
||||
|
||||
void ReadExceptionHandlerSpecific (ExceptionHandler handler) |
||||
{ |
||||
switch (handler.HandlerType) { |
||||
case ExceptionHandlerType.Catch: |
||||
handler.CatchType = (TypeReference) reader.LookupToken (ReadToken ()); |
||||
break; |
||||
case ExceptionHandlerType.Filter: |
||||
handler.FilterStart = GetInstruction (ReadInt32 ()); |
||||
handler.FilterEnd = handler.HandlerStart.Previous; |
||||
break; |
||||
default: |
||||
Advance (4); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
void Align (int align) |
||||
{ |
||||
align--; |
||||
Advance (((position + align) & ~align) - position); |
||||
} |
||||
|
||||
public MetadataToken ReadToken () |
||||
{ |
||||
return new MetadataToken (ReadUInt32 ()); |
||||
} |
||||
|
||||
#if !READ_ONLY
|
||||
|
||||
public ByteBuffer PatchRawMethodBody (MethodDefinition method, CodeWriter writer, out MethodSymbols symbols) |
||||
{ |
||||
var buffer = new ByteBuffer (); |
||||
symbols = new MethodSymbols (method.Name); |
||||
|
||||
this.method = method; |
||||
reader.context = method; |
||||
|
||||
MoveTo (method.RVA); |
||||
|
||||
var flags = ReadByte (); |
||||
|
||||
MetadataToken local_var_token; |
||||
|
||||
switch (flags & 0x3) { |
||||
case 0x2: // tiny
|
||||
buffer.WriteByte (flags); |
||||
local_var_token = MetadataToken.Zero; |
||||
symbols.code_size = flags >> 2; |
||||
PatchRawCode (buffer, symbols.code_size, writer); |
||||
break; |
||||
case 0x3: // fat
|
||||
base.position--; |
||||
|
||||
PatchRawFatMethod (buffer, symbols, writer, out local_var_token); |
||||
break; |
||||
default: |
||||
throw new NotSupportedException (); |
||||
} |
||||
|
||||
var symbol_reader = reader.module.SymbolReader; |
||||
if (symbol_reader != null && writer.metadata.write_symbols) { |
||||
symbols.method_token = GetOriginalToken (writer.metadata, method); |
||||
symbols.local_var_token = local_var_token; |
||||
symbol_reader.Read (symbols); |
||||
} |
||||
|
||||
return buffer; |
||||
} |
||||
|
||||
void PatchRawFatMethod (ByteBuffer buffer, MethodSymbols symbols, CodeWriter writer, out MetadataToken local_var_token) |
||||
{ |
||||
var flags = ReadUInt16 (); |
||||
buffer.WriteUInt16 (flags); |
||||
buffer.WriteUInt16 (ReadUInt16 ()); |
||||
symbols.code_size = ReadInt32 (); |
||||
buffer.WriteInt32 (symbols.code_size); |
||||
local_var_token = ReadToken (); |
||||
|
||||
if (local_var_token.RID > 0) { |
||||
var variables = symbols.variables = ReadVariables (local_var_token); |
||||
buffer.WriteUInt32 (variables != null |
||||
? writer.GetStandAloneSignature (symbols.variables).ToUInt32 () |
||||
: 0); |
||||
} else |
||||
buffer.WriteUInt32 (0); |
||||
|
||||
PatchRawCode (buffer, symbols.code_size, writer); |
||||
|
||||
if ((flags & 0x8) != 0) |
||||
PatchRawSection (buffer, writer.metadata); |
||||
} |
||||
|
||||
static MetadataToken GetOriginalToken (MetadataBuilder metadata, MethodDefinition method) |
||||
{ |
||||
MetadataToken original; |
||||
if (metadata.TryGetOriginalMethodToken (method.token, out original)) |
||||
return original; |
||||
|
||||
return MetadataToken.Zero; |
||||
} |
||||
|
||||
void PatchRawCode (ByteBuffer buffer, int code_size, CodeWriter writer) |
||||
{ |
||||
var metadata = writer.metadata; |
||||
buffer.WriteBytes (ReadBytes (code_size)); |
||||
var end = buffer.position; |
||||
buffer.position -= code_size; |
||||
|
||||
while (buffer.position < end) { |
||||
OpCode opcode; |
||||
var il_opcode = buffer.ReadByte (); |
||||
if (il_opcode != 0xfe) { |
||||
opcode = OpCodes.OneByteOpCode [il_opcode]; |
||||
} else { |
||||
var il_opcode2 = buffer.ReadByte (); |
||||
opcode = OpCodes.TwoBytesOpCode [il_opcode2]; |
||||
} |
||||
|
||||
switch (opcode.OperandType) { |
||||
case OperandType.ShortInlineI: |
||||
case OperandType.ShortInlineBrTarget: |
||||
case OperandType.ShortInlineVar: |
||||
case OperandType.ShortInlineArg: |
||||
buffer.position += 1; |
||||
break; |
||||
case OperandType.InlineVar: |
||||
case OperandType.InlineArg: |
||||
buffer.position += 2; |
||||
break; |
||||
case OperandType.InlineBrTarget: |
||||
case OperandType.ShortInlineR: |
||||
case OperandType.InlineI: |
||||
buffer.position += 4; |
||||
break; |
||||
case OperandType.InlineI8: |
||||
case OperandType.InlineR: |
||||
buffer.position += 8; |
||||
break; |
||||
case OperandType.InlineSwitch: |
||||
var length = buffer.ReadInt32 (); |
||||
buffer.position += length * 4; |
||||
break; |
||||
case OperandType.InlineString: |
||||
var @string = GetString (new MetadataToken (buffer.ReadUInt32 ())); |
||||
buffer.position -= 4; |
||||
buffer.WriteUInt32 ( |
||||
new MetadataToken ( |
||||
TokenType.String, |
||||
metadata.user_string_heap.GetStringIndex (@string)).ToUInt32 ()); |
||||
break; |
||||
case OperandType.InlineSig: |
||||
var call_site = GetCallSite (new MetadataToken (buffer.ReadUInt32 ())); |
||||
buffer.position -= 4; |
||||
buffer.WriteUInt32 (writer.GetStandAloneSignature (call_site).ToUInt32 ()); |
||||
break; |
||||
case OperandType.InlineTok: |
||||
case OperandType.InlineType: |
||||
case OperandType.InlineMethod: |
||||
case OperandType.InlineField: |
||||
var provider = reader.LookupToken (new MetadataToken (buffer.ReadUInt32 ())); |
||||
buffer.position -= 4; |
||||
buffer.WriteUInt32 (metadata.LookupToken (provider).ToUInt32 ()); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
void PatchRawSection (ByteBuffer buffer, MetadataBuilder metadata) |
||||
{ |
||||
var position = base.position; |
||||
Align (4); |
||||
buffer.WriteBytes (base.position - position); |
||||
|
||||
const byte fat_format = 0x40; |
||||
const byte more_sects = 0x80; |
||||
|
||||
var flags = ReadByte (); |
||||
if ((flags & fat_format) == 0) { |
||||
buffer.WriteByte (flags); |
||||
PatchRawSmallSection (buffer, metadata); |
||||
} else |
||||
PatchRawFatSection (buffer, metadata); |
||||
|
||||
if ((flags & more_sects) != 0) |
||||
PatchRawSection (buffer, metadata); |
||||
} |
||||
|
||||
void PatchRawSmallSection (ByteBuffer buffer, MetadataBuilder metadata) |
||||
{ |
||||
var length = ReadByte (); |
||||
buffer.WriteByte (length); |
||||
Advance (2); |
||||
|
||||
buffer.WriteUInt16 (0); |
||||
|
||||
var count = length / 12; |
||||
|
||||
PatchRawExceptionHandlers (buffer, metadata, count, false); |
||||
} |
||||
|
||||
void PatchRawFatSection (ByteBuffer buffer, MetadataBuilder metadata) |
||||
{ |
||||
position--; |
||||
var length = ReadInt32 (); |
||||
buffer.WriteInt32 (length); |
||||
|
||||
var count = (length >> 8) / 24; |
||||
|
||||
PatchRawExceptionHandlers (buffer, metadata, count, true); |
||||
} |
||||
|
||||
void PatchRawExceptionHandlers (ByteBuffer buffer, MetadataBuilder metadata, int count, bool fat_entry) |
||||
{ |
||||
const int fat_entry_size = 16; |
||||
const int small_entry_size = 6; |
||||
|
||||
for (int i = 0; i < count; i++) { |
||||
ExceptionHandlerType handler_type; |
||||
if (fat_entry) { |
||||
var type = ReadUInt32 (); |
||||
handler_type = (ExceptionHandlerType) (type & 0x7); |
||||
buffer.WriteUInt32 (type); |
||||
} else { |
||||
var type = ReadUInt16 (); |
||||
handler_type = (ExceptionHandlerType) (type & 0x7); |
||||
buffer.WriteUInt16 (type); |
||||
} |
||||
|
||||
buffer.WriteBytes (ReadBytes (fat_entry ? fat_entry_size : small_entry_size)); |
||||
|
||||
switch (handler_type) { |
||||
case ExceptionHandlerType.Catch: |
||||
var exception = reader.LookupToken (ReadToken ()); |
||||
buffer.WriteUInt32 (metadata.LookupToken (exception).ToUInt32 ()); |
||||
break; |
||||
default: |
||||
buffer.WriteUInt32 (ReadUInt32 ()); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
#endif
|
||||
|
||||
} |
||||
} |
@ -0,0 +1,638 @@
@@ -0,0 +1,638 @@
|
||||
//
|
||||
// CodeWriter.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
using Mono.Cecil.Metadata; |
||||
using Mono.Cecil.PE; |
||||
|
||||
using RVA = System.UInt32; |
||||
|
||||
#if !READ_ONLY
|
||||
|
||||
namespace Mono.Cecil.Cil { |
||||
|
||||
sealed class CodeWriter : ByteBuffer { |
||||
|
||||
readonly RVA code_base; |
||||
internal readonly MetadataBuilder metadata; |
||||
readonly Dictionary<uint, MetadataToken> standalone_signatures; |
||||
|
||||
RVA current; |
||||
MethodBody body; |
||||
|
||||
public CodeWriter (MetadataBuilder metadata) |
||||
: base (0) |
||||
{ |
||||
this.code_base = metadata.text_map.GetNextRVA (TextSegment.CLIHeader); |
||||
this.current = code_base; |
||||
this.metadata = metadata; |
||||
this.standalone_signatures = new Dictionary<uint, MetadataToken> (); |
||||
} |
||||
|
||||
public RVA WriteMethodBody (MethodDefinition method) |
||||
{ |
||||
var rva = BeginMethod (); |
||||
|
||||
if (IsUnresolved (method)) { |
||||
if (method.rva == 0) |
||||
return 0; |
||||
|
||||
WriteUnresolvedMethodBody (method); |
||||
} else { |
||||
if (IsEmptyMethodBody (method.Body)) |
||||
return 0; |
||||
|
||||
WriteResolvedMethodBody (method); |
||||
} |
||||
|
||||
Align (4); |
||||
|
||||
EndMethod (); |
||||
return rva; |
||||
} |
||||
|
||||
static bool IsEmptyMethodBody (MethodBody body) |
||||
{ |
||||
return body.instructions.IsNullOrEmpty () |
||||
&& body.variables.IsNullOrEmpty (); |
||||
} |
||||
|
||||
static bool IsUnresolved (MethodDefinition method) |
||||
{ |
||||
return method.HasBody && method.HasImage && method.body == null; |
||||
} |
||||
|
||||
void WriteUnresolvedMethodBody (MethodDefinition method) |
||||
{ |
||||
var code_reader = metadata.module.Read (method, (_, reader) => reader.code); |
||||
|
||||
MethodSymbols symbols; |
||||
var buffer = code_reader.PatchRawMethodBody (method, this, out symbols); |
||||
|
||||
WriteBytes (buffer); |
||||
|
||||
if (symbols.instructions.IsNullOrEmpty ()) |
||||
return; |
||||
|
||||
symbols.method_token = method.token; |
||||
symbols.local_var_token = GetLocalVarToken (buffer, symbols); |
||||
|
||||
var symbol_writer = metadata.symbol_writer; |
||||
if (symbol_writer != null) |
||||
symbol_writer.Write (symbols); |
||||
} |
||||
|
||||
static MetadataToken GetLocalVarToken (ByteBuffer buffer, MethodSymbols symbols) |
||||
{ |
||||
if (symbols.variables.IsNullOrEmpty ()) |
||||
return MetadataToken.Zero; |
||||
|
||||
buffer.position = 8; |
||||
return new MetadataToken (buffer.ReadUInt32 ()); |
||||
} |
||||
|
||||
void WriteResolvedMethodBody (MethodDefinition method) |
||||
{ |
||||
body = method.Body; |
||||
ComputeHeader (); |
||||
if (RequiresFatHeader ()) |
||||
WriteFatHeader (); |
||||
else |
||||
WriteByte ((byte) (0x2 | (body.CodeSize << 2))); // tiny
|
||||
|
||||
WriteInstructions (); |
||||
|
||||
if (body.HasExceptionHandlers) |
||||
WriteExceptionHandlers (); |
||||
|
||||
var symbol_writer = metadata.symbol_writer; |
||||
if (symbol_writer != null) |
||||
symbol_writer.Write (body); |
||||
} |
||||
|
||||
void WriteFatHeader () |
||||
{ |
||||
var body = this.body; |
||||
byte flags = 0x3; // fat
|
||||
if (body.InitLocals) |
||||
flags |= 0x10; // init locals
|
||||
if (body.HasExceptionHandlers) |
||||
flags |= 0x8; // more sections
|
||||
|
||||
WriteByte (flags); |
||||
WriteByte (0x30); |
||||
WriteInt16 ((short) body.max_stack_size); |
||||
WriteInt32 (body.code_size); |
||||
body.local_var_token = body.HasVariables |
||||
? GetStandAloneSignature (body.Variables) |
||||
: MetadataToken.Zero; |
||||
WriteMetadataToken (body.local_var_token); |
||||
} |
||||
|
||||
void WriteInstructions () |
||||
{ |
||||
var instructions = body.Instructions; |
||||
var items = instructions.items; |
||||
var size = instructions.size; |
||||
|
||||
for (int i = 0; i < size; i++) { |
||||
var instruction = items [i]; |
||||
WriteOpCode (instruction.opcode); |
||||
WriteOperand (instruction); |
||||
} |
||||
} |
||||
|
||||
void WriteOpCode (OpCode opcode) |
||||
{ |
||||
if (opcode.Size == 1) { |
||||
WriteByte (opcode.Op2); |
||||
} else { |
||||
WriteByte (opcode.Op1); |
||||
WriteByte (opcode.Op2); |
||||
} |
||||
} |
||||
|
||||
void WriteOperand (Instruction instruction) |
||||
{ |
||||
var opcode = instruction.opcode; |
||||
var operand_type = opcode.OperandType; |
||||
if (operand_type == OperandType.InlineNone) |
||||
return; |
||||
|
||||
var operand = instruction.operand; |
||||
if (operand == null) |
||||
throw new ArgumentException (); |
||||
|
||||
switch (operand_type) { |
||||
case OperandType.InlineSwitch: { |
||||
var targets = (Instruction []) operand; |
||||
WriteInt32 (targets.Length); |
||||
var diff = instruction.Offset + opcode.Size + (4 * (targets.Length + 1)); |
||||
for (int i = 0; i < targets.Length; i++) |
||||
WriteInt32 (GetTargetOffset (targets [i]) - diff); |
||||
break; |
||||
} |
||||
case OperandType.ShortInlineBrTarget: { |
||||
var target = (Instruction) operand; |
||||
WriteSByte ((sbyte) (GetTargetOffset (target) - (instruction.Offset + opcode.Size + 1))); |
||||
break; |
||||
} |
||||
case OperandType.InlineBrTarget: { |
||||
var target = (Instruction) operand; |
||||
WriteInt32 (GetTargetOffset (target) - (instruction.Offset + opcode.Size + 4)); |
||||
break; |
||||
} |
||||
case OperandType.ShortInlineVar: |
||||
WriteByte ((byte) GetVariableIndex ((VariableDefinition) operand)); |
||||
break; |
||||
case OperandType.ShortInlineArg: |
||||
WriteByte ((byte) GetParameterIndex ((ParameterDefinition) operand)); |
||||
break; |
||||
case OperandType.InlineVar: |
||||
WriteInt16 ((short) GetVariableIndex ((VariableDefinition) operand)); |
||||
break; |
||||
case OperandType.InlineArg: |
||||
WriteInt16 ((short) GetParameterIndex ((ParameterDefinition) operand)); |
||||
break; |
||||
case OperandType.InlineSig: |
||||
WriteMetadataToken (GetStandAloneSignature ((CallSite) operand)); |
||||
break; |
||||
case OperandType.ShortInlineI: |
||||
if (opcode == OpCodes.Ldc_I4_S) |
||||
WriteSByte ((sbyte) operand); |
||||
else |
||||
WriteByte ((byte) operand); |
||||
break; |
||||
case OperandType.InlineI: |
||||
WriteInt32 ((int) operand); |
||||
break; |
||||
case OperandType.InlineI8: |
||||
WriteInt64 ((long) operand); |
||||
break; |
||||
case OperandType.ShortInlineR: |
||||
WriteSingle ((float) operand); |
||||
break; |
||||
case OperandType.InlineR: |
||||
WriteDouble ((double) operand); |
||||
break; |
||||
case OperandType.InlineString: |
||||
WriteMetadataToken ( |
||||
new MetadataToken ( |
||||
TokenType.String, |
||||
GetUserStringIndex ((string) operand))); |
||||
break; |
||||
case OperandType.InlineType: |
||||
case OperandType.InlineField: |
||||
case OperandType.InlineMethod: |
||||
case OperandType.InlineTok: |
||||
WriteMetadataToken (metadata.LookupToken ((IMetadataTokenProvider) operand)); |
||||
break; |
||||
default: |
||||
throw new ArgumentException (); |
||||
} |
||||
} |
||||
|
||||
int GetTargetOffset (Instruction instruction) |
||||
{ |
||||
if (instruction == null) { |
||||
var last = body.instructions [body.instructions.size - 1]; |
||||
return last.offset + last.GetSize (); |
||||
} |
||||
|
||||
return instruction.offset; |
||||
} |
||||
|
||||
uint GetUserStringIndex (string @string) |
||||
{ |
||||
if (@string == null) |
||||
return 0; |
||||
|
||||
return metadata.user_string_heap.GetStringIndex (@string); |
||||
} |
||||
|
||||
static int GetVariableIndex (VariableDefinition variable) |
||||
{ |
||||
return variable.Index; |
||||
} |
||||
|
||||
int GetParameterIndex (ParameterDefinition parameter) |
||||
{ |
||||
if (body.method.HasThis) { |
||||
if (parameter == body.this_parameter) |
||||
return 0; |
||||
|
||||
return parameter.Index + 1; |
||||
} |
||||
|
||||
return parameter.Index; |
||||
} |
||||
|
||||
bool RequiresFatHeader () |
||||
{ |
||||
var body = this.body; |
||||
return body.CodeSize >= 64 |
||||
|| body.InitLocals |
||||
|| body.HasVariables |
||||
|| body.HasExceptionHandlers |
||||
|| body.MaxStackSize > 8; |
||||
} |
||||
|
||||
void ComputeHeader () |
||||
{ |
||||
int offset = 0; |
||||
var instructions = body.instructions; |
||||
var items = instructions.items; |
||||
var count = instructions.size; |
||||
var stack_size = 0; |
||||
var max_stack = 0; |
||||
Dictionary<Instruction, int> stack_sizes = null; |
||||
|
||||
if (body.HasExceptionHandlers) |
||||
ComputeExceptionHandlerStackSize (ref stack_sizes); |
||||
|
||||
for (int i = 0; i < count; i++) { |
||||
var instruction = items [i]; |
||||
instruction.offset = offset; |
||||
offset += instruction.GetSize (); |
||||
|
||||
ComputeStackSize (instruction, ref stack_sizes, ref stack_size, ref max_stack); |
||||
} |
||||
|
||||
body.code_size = offset; |
||||
body.max_stack_size = max_stack; |
||||
} |
||||
|
||||
void ComputeExceptionHandlerStackSize (ref Dictionary<Instruction, int> stack_sizes) |
||||
{ |
||||
var exception_handlers = body.ExceptionHandlers; |
||||
|
||||
for (int i = 0; i < exception_handlers.Count; i++) { |
||||
var exception_handler = exception_handlers [i]; |
||||
|
||||
switch (exception_handler.HandlerType) { |
||||
case ExceptionHandlerType.Catch: |
||||
AddExceptionStackSize (exception_handler.HandlerStart, ref stack_sizes); |
||||
break; |
||||
case ExceptionHandlerType.Filter: |
||||
AddExceptionStackSize (exception_handler.FilterStart, ref stack_sizes); |
||||
AddExceptionStackSize (exception_handler.HandlerStart, ref stack_sizes); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
static void AddExceptionStackSize (Instruction handler_start, ref Dictionary<Instruction, int> stack_sizes) |
||||
{ |
||||
if (handler_start == null) |
||||
return; |
||||
|
||||
if (stack_sizes == null) |
||||
stack_sizes = new Dictionary<Instruction, int> (); |
||||
|
||||
stack_sizes [handler_start] = 1; |
||||
} |
||||
|
||||
static void ComputeStackSize (Instruction instruction, ref Dictionary<Instruction, int> stack_sizes, ref int stack_size, ref int max_stack) |
||||
{ |
||||
int computed_size; |
||||
if (stack_sizes != null && stack_sizes.TryGetValue (instruction, out computed_size)) |
||||
stack_size = computed_size; |
||||
|
||||
max_stack = System.Math.Max (max_stack, stack_size); |
||||
ComputeStackDelta (instruction, ref stack_size); |
||||
max_stack = System.Math.Max (max_stack, stack_size); |
||||
|
||||
CopyBranchStackSize (instruction, ref stack_sizes, stack_size); |
||||
ComputeStackSize (instruction, ref stack_size); |
||||
} |
||||
|
||||
static void CopyBranchStackSize (Instruction instruction, ref Dictionary<Instruction, int> stack_sizes, int stack_size) |
||||
{ |
||||
if (stack_size == 0) |
||||
return; |
||||
|
||||
switch (instruction.opcode.OperandType) { |
||||
case OperandType.ShortInlineBrTarget: |
||||
case OperandType.InlineBrTarget: |
||||
CopyBranchStackSize (ref stack_sizes, (Instruction) instruction.operand, stack_size); |
||||
break; |
||||
case OperandType.InlineSwitch: |
||||
var targets = (Instruction[]) instruction.operand; |
||||
for (int i = 0; i < targets.Length; i++) |
||||
CopyBranchStackSize (ref stack_sizes, targets [i], stack_size); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
static void CopyBranchStackSize (ref Dictionary<Instruction, int> stack_sizes, Instruction target, int stack_size) |
||||
{ |
||||
if (stack_sizes == null) |
||||
stack_sizes = new Dictionary<Instruction, int> (); |
||||
|
||||
int branch_stack_size = stack_size; |
||||
|
||||
int computed_size; |
||||
if (stack_sizes.TryGetValue (target, out computed_size)) |
||||
branch_stack_size = System.Math.Max (branch_stack_size, computed_size); |
||||
|
||||
stack_sizes [target] = branch_stack_size; |
||||
} |
||||
|
||||
static void ComputeStackSize (Instruction instruction, ref int stack_size) |
||||
{ |
||||
switch (instruction.opcode.FlowControl) { |
||||
case FlowControl.Branch: |
||||
case FlowControl.Break: |
||||
case FlowControl.Throw: |
||||
case FlowControl.Return: |
||||
stack_size = 0; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
static void ComputeStackDelta (Instruction instruction, ref int stack_size) |
||||
{ |
||||
switch (instruction.opcode.FlowControl) { |
||||
case FlowControl.Call: { |
||||
var method = (IMethodSignature) instruction.operand; |
||||
stack_size -= (method.HasParameters ? method.Parameters.Count : 0) |
||||
+ (method.HasThis && instruction.opcode.Code != Code.Newobj ? 1 : 0); |
||||
stack_size += (method.ReturnType.etype == ElementType.Void ? 0 : 1) |
||||
+ (method.HasThis && instruction.opcode.Code == Code.Newobj ? 1 : 0); |
||||
break; |
||||
} |
||||
default: |
||||
ComputePopDelta (instruction.opcode.StackBehaviourPop, ref stack_size); |
||||
ComputePushDelta (instruction.opcode.StackBehaviourPush, ref stack_size); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
static void ComputePopDelta (StackBehaviour pop_behavior, ref int stack_size) |
||||
{ |
||||
switch (pop_behavior) { |
||||
case StackBehaviour.Popi: |
||||
case StackBehaviour.Popref: |
||||
case StackBehaviour.Pop1: |
||||
stack_size--; |
||||
break; |
||||
case StackBehaviour.Pop1_pop1: |
||||
case StackBehaviour.Popi_pop1: |
||||
case StackBehaviour.Popi_popi: |
||||
case StackBehaviour.Popi_popi8: |
||||
case StackBehaviour.Popi_popr4: |
||||
case StackBehaviour.Popi_popr8: |
||||
case StackBehaviour.Popref_pop1: |
||||
case StackBehaviour.Popref_popi: |
||||
stack_size -= 2; |
||||
break; |
||||
case StackBehaviour.Popi_popi_popi: |
||||
case StackBehaviour.Popref_popi_popi: |
||||
case StackBehaviour.Popref_popi_popi8: |
||||
case StackBehaviour.Popref_popi_popr4: |
||||
case StackBehaviour.Popref_popi_popr8: |
||||
case StackBehaviour.Popref_popi_popref: |
||||
stack_size -= 3; |
||||
break; |
||||
case StackBehaviour.PopAll: |
||||
stack_size = 0; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
static void ComputePushDelta (StackBehaviour push_behaviour, ref int stack_size) |
||||
{ |
||||
switch (push_behaviour) { |
||||
case StackBehaviour.Push1: |
||||
case StackBehaviour.Pushi: |
||||
case StackBehaviour.Pushi8: |
||||
case StackBehaviour.Pushr4: |
||||
case StackBehaviour.Pushr8: |
||||
case StackBehaviour.Pushref: |
||||
stack_size++; |
||||
break; |
||||
case StackBehaviour.Push1_push1: |
||||
stack_size += 2; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
void WriteExceptionHandlers () |
||||
{ |
||||
Align (4); |
||||
|
||||
var handlers = body.ExceptionHandlers; |
||||
|
||||
if (handlers.Count < 0x15 && !RequiresFatSection (handlers)) |
||||
WriteSmallSection (handlers); |
||||
else |
||||
WriteFatSection (handlers); |
||||
} |
||||
|
||||
static bool RequiresFatSection (Collection<ExceptionHandler> handlers) |
||||
{ |
||||
for (int i = 0; i < handlers.Count; i++) { |
||||
var handler = handlers [i]; |
||||
|
||||
if (IsFatRange (handler.TryStart, handler.TryEnd)) |
||||
return true; |
||||
|
||||
if (IsFatRange (handler.HandlerStart, handler.HandlerEnd)) |
||||
return true; |
||||
|
||||
if (handler.HandlerType == ExceptionHandlerType.Filter |
||||
&& IsFatRange (handler.FilterStart, handler.FilterEnd)) |
||||
return true; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
static bool IsFatRange (Instruction start, Instruction end) |
||||
{ |
||||
if (end == null) |
||||
return true; |
||||
|
||||
return end.Offset - start.Offset > 255 || start.Offset > 65535; |
||||
} |
||||
|
||||
void WriteSmallSection (Collection<ExceptionHandler> handlers) |
||||
{ |
||||
const byte eh_table = 0x1; |
||||
|
||||
WriteByte (eh_table); |
||||
WriteByte ((byte) (handlers.Count * 12 + 4)); |
||||
WriteBytes (2); |
||||
|
||||
WriteExceptionHandlers ( |
||||
handlers, |
||||
i => WriteUInt16 ((ushort) i), |
||||
i => WriteByte ((byte) i)); |
||||
} |
||||
|
||||
void WriteFatSection (Collection<ExceptionHandler> handlers) |
||||
{ |
||||
const byte eh_table = 0x1; |
||||
const byte fat_format = 0x40; |
||||
|
||||
WriteByte (eh_table | fat_format); |
||||
|
||||
int size = handlers.Count * 24 + 4; |
||||
WriteByte ((byte) (size & 0xff)); |
||||
WriteByte ((byte) ((size >> 8) & 0xff)); |
||||
WriteByte ((byte) ((size >> 16) & 0xff)); |
||||
|
||||
WriteExceptionHandlers (handlers, WriteInt32, WriteInt32); |
||||
} |
||||
|
||||
void WriteExceptionHandlers (Collection<ExceptionHandler> handlers, Action<int> write_entry, Action<int> write_length) |
||||
{ |
||||
for (int i = 0; i < handlers.Count; i++) { |
||||
var handler = handlers [i]; |
||||
|
||||
write_entry ((int) handler.HandlerType); |
||||
|
||||
write_entry (handler.TryStart.Offset); |
||||
write_length (GetTargetOffset (handler.TryEnd) - handler.TryStart.Offset); |
||||
|
||||
write_entry (handler.HandlerStart.Offset); |
||||
write_length (GetTargetOffset (handler.HandlerEnd) - handler.HandlerStart.Offset); |
||||
|
||||
WriteExceptionHandlerSpecific (handler); |
||||
} |
||||
} |
||||
|
||||
void WriteExceptionHandlerSpecific (ExceptionHandler handler) |
||||
{ |
||||
switch (handler.HandlerType) { |
||||
case ExceptionHandlerType.Catch: |
||||
WriteMetadataToken (metadata.LookupToken (handler.CatchType)); |
||||
break; |
||||
case ExceptionHandlerType.Filter: |
||||
WriteInt32 (handler.FilterStart.Offset); |
||||
break; |
||||
default: |
||||
WriteInt32 (0); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
public MetadataToken GetStandAloneSignature (Collection<VariableDefinition> variables) |
||||
{ |
||||
var signature = metadata.GetLocalVariableBlobIndex (variables); |
||||
|
||||
return GetStandAloneSignatureToken (signature); |
||||
} |
||||
|
||||
public MetadataToken GetStandAloneSignature (CallSite call_site) |
||||
{ |
||||
var signature = metadata.GetCallSiteBlobIndex (call_site); |
||||
var token = GetStandAloneSignatureToken (signature); |
||||
call_site.MetadataToken = token; |
||||
return token; |
||||
} |
||||
|
||||
MetadataToken GetStandAloneSignatureToken (uint signature) |
||||
{ |
||||
MetadataToken token; |
||||
if (standalone_signatures.TryGetValue (signature, out token)) |
||||
return token; |
||||
|
||||
token = new MetadataToken (TokenType.Signature, metadata.AddStandAloneSignature (signature)); |
||||
standalone_signatures.Add (signature, token); |
||||
return token; |
||||
} |
||||
|
||||
RVA BeginMethod () |
||||
{ |
||||
return current; |
||||
} |
||||
|
||||
void WriteMetadataToken (MetadataToken token) |
||||
{ |
||||
WriteUInt32 (token.ToUInt32 ()); |
||||
} |
||||
|
||||
void Align (int align) |
||||
{ |
||||
align--; |
||||
WriteBytes (((position + align) & ~align) - position); |
||||
} |
||||
|
||||
void EndMethod () |
||||
{ |
||||
current = (RVA) (code_base + position); |
||||
} |
||||
} |
||||
} |
||||
|
||||
#endif
|
@ -0,0 +1,111 @@
@@ -0,0 +1,111 @@
|
||||
//
|
||||
// Document.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil.Cil { |
||||
|
||||
public enum DocumentType { |
||||
Other, |
||||
Text, |
||||
} |
||||
|
||||
public enum DocumentHashAlgorithm { |
||||
None, |
||||
MD5, |
||||
SHA1, |
||||
} |
||||
|
||||
public enum DocumentLanguage { |
||||
Other, |
||||
C, |
||||
Cpp, |
||||
CSharp, |
||||
Basic, |
||||
Java, |
||||
Cobol, |
||||
Pascal, |
||||
Cil, |
||||
JScript, |
||||
Smc, |
||||
MCpp, |
||||
} |
||||
|
||||
public enum DocumentLanguageVendor { |
||||
Other, |
||||
Microsoft, |
||||
} |
||||
|
||||
public sealed class Document { |
||||
|
||||
string url; |
||||
|
||||
byte type; |
||||
byte hash_algorithm; |
||||
byte language; |
||||
byte language_vendor; |
||||
|
||||
byte [] hash; |
||||
|
||||
public string Url { |
||||
get { return url; } |
||||
set { url = value; } |
||||
} |
||||
|
||||
public DocumentType Type { |
||||
get { return (DocumentType) type; } |
||||
set { type = (byte) value; } |
||||
} |
||||
|
||||
public DocumentHashAlgorithm HashAlgorithm { |
||||
get { return (DocumentHashAlgorithm) hash_algorithm; } |
||||
set { hash_algorithm = (byte) value; } |
||||
} |
||||
|
||||
public DocumentLanguage Language { |
||||
get { return (DocumentLanguage) language; } |
||||
set { language = (byte) value; } |
||||
} |
||||
|
||||
public DocumentLanguageVendor LanguageVendor { |
||||
get { return (DocumentLanguageVendor) language_vendor; } |
||||
set { language_vendor = (byte) value; } |
||||
} |
||||
|
||||
public byte [] Hash { |
||||
get { return hash; } |
||||
set { hash = value; } |
||||
} |
||||
|
||||
public Document (string url) |
||||
{ |
||||
this.url = url; |
||||
this.hash = Empty<byte>.Array; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,95 @@
@@ -0,0 +1,95 @@
|
||||
//
|
||||
// ExceptionHandler.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil.Cil { |
||||
|
||||
public enum ExceptionHandlerType { |
||||
Catch = 0, |
||||
Filter = 1, |
||||
Finally = 2, |
||||
Fault = 4, |
||||
} |
||||
|
||||
public sealed class ExceptionHandler { |
||||
|
||||
Instruction try_start; |
||||
Instruction try_end; |
||||
Instruction filter_start; |
||||
Instruction filter_end; |
||||
Instruction handler_start; |
||||
Instruction handler_end; |
||||
|
||||
TypeReference catch_type; |
||||
ExceptionHandlerType handler_type; |
||||
|
||||
public Instruction TryStart { |
||||
get { return try_start; } |
||||
set { try_start = value; } |
||||
} |
||||
|
||||
public Instruction TryEnd { |
||||
get { return try_end; } |
||||
set { try_end = value; } |
||||
} |
||||
|
||||
public Instruction FilterStart { |
||||
get { return filter_start; } |
||||
set { filter_start = value; } |
||||
} |
||||
|
||||
public Instruction FilterEnd { |
||||
get { return filter_end; } |
||||
set { filter_end = value; } |
||||
} |
||||
|
||||
public Instruction HandlerStart { |
||||
get { return handler_start; } |
||||
set { handler_start = value; } |
||||
} |
||||
|
||||
public Instruction HandlerEnd { |
||||
get { return handler_end; } |
||||
set { handler_end = value; } |
||||
} |
||||
|
||||
public TypeReference CatchType { |
||||
get { return catch_type; } |
||||
set { catch_type = value; } |
||||
} |
||||
|
||||
public ExceptionHandlerType HandlerType { |
||||
get { return handler_type; } |
||||
set { handler_type = value; } |
||||
} |
||||
|
||||
public ExceptionHandler (ExceptionHandlerType handlerType) |
||||
{ |
||||
this.handler_type = handlerType; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,278 @@
@@ -0,0 +1,278 @@
|
||||
//
|
||||
// ILProcessor.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil.Cil { |
||||
|
||||
public sealed class ILProcessor { |
||||
|
||||
readonly MethodBody body; |
||||
readonly Collection<Instruction> instructions; |
||||
|
||||
public MethodBody Body { |
||||
get { return body; } |
||||
} |
||||
|
||||
internal ILProcessor (MethodBody body) |
||||
{ |
||||
this.body = body; |
||||
this.instructions = body.Instructions; |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode) |
||||
{ |
||||
return Instruction.Create (opcode); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, TypeReference type) |
||||
{ |
||||
return Instruction.Create (opcode, type); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, CallSite site) |
||||
{ |
||||
return Instruction.Create (opcode, site); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, MethodReference method) |
||||
{ |
||||
return Instruction.Create (opcode, method); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, FieldReference field) |
||||
{ |
||||
return Instruction.Create (opcode, field); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, string value) |
||||
{ |
||||
return Instruction.Create (opcode, value); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, sbyte value) |
||||
{ |
||||
return Instruction.Create (opcode, value); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, byte value) |
||||
{ |
||||
if (opcode.OperandType == OperandType.ShortInlineVar) |
||||
return Instruction.Create (opcode, body.Variables [value]); |
||||
|
||||
if (opcode.OperandType == OperandType.ShortInlineArg) |
||||
return Instruction.Create (opcode, body.GetParameter (value)); |
||||
|
||||
return Instruction.Create (opcode, value); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, int value) |
||||
{ |
||||
if (opcode.OperandType == OperandType.InlineVar) |
||||
return Instruction.Create (opcode, body.Variables [value]); |
||||
|
||||
if (opcode.OperandType == OperandType.InlineArg) |
||||
return Instruction.Create (opcode, body.GetParameter (value)); |
||||
|
||||
return Instruction.Create (opcode, value); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, long value) |
||||
{ |
||||
return Instruction.Create (opcode, value); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, float value) |
||||
{ |
||||
return Instruction.Create (opcode, value); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, double value) |
||||
{ |
||||
return Instruction.Create (opcode, value); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, Instruction target) |
||||
{ |
||||
return Instruction.Create (opcode, target); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, Instruction [] targets) |
||||
{ |
||||
return Instruction.Create (opcode, targets); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, VariableDefinition variable) |
||||
{ |
||||
return Instruction.Create (opcode, variable); |
||||
} |
||||
|
||||
public Instruction Create (OpCode opcode, ParameterDefinition parameter) |
||||
{ |
||||
return Instruction.Create (opcode, parameter); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode) |
||||
{ |
||||
Append (Create (opcode)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, TypeReference type) |
||||
{ |
||||
Append (Create (opcode, type)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, MethodReference method) |
||||
{ |
||||
Append (Create (opcode, method)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, CallSite site) |
||||
{ |
||||
Append (Create (opcode, site)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, FieldReference field) |
||||
{ |
||||
Append (Create (opcode, field)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, string value) |
||||
{ |
||||
Append (Create (opcode, value)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, byte value) |
||||
{ |
||||
Append (Create (opcode, value)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, sbyte value) |
||||
{ |
||||
Append (Create (opcode, value)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, int value) |
||||
{ |
||||
Append (Create (opcode, value)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, long value) |
||||
{ |
||||
Append (Create (opcode, value)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, float value) |
||||
{ |
||||
Append (Create (opcode, value)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, double value) |
||||
{ |
||||
Append (Create (opcode, value)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, Instruction target) |
||||
{ |
||||
Append (Create (opcode, target)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, Instruction [] targets) |
||||
{ |
||||
Append (Create (opcode, targets)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, VariableDefinition variable) |
||||
{ |
||||
Append (Create (opcode, variable)); |
||||
} |
||||
|
||||
public void Emit (OpCode opcode, ParameterDefinition parameter) |
||||
{ |
||||
Append (Create (opcode, parameter)); |
||||
} |
||||
|
||||
public void InsertBefore (Instruction target, Instruction instruction) |
||||
{ |
||||
if (target == null) |
||||
throw new ArgumentNullException ("target"); |
||||
if (instruction == null) |
||||
throw new ArgumentNullException ("instruction"); |
||||
|
||||
var index = instructions.IndexOf (target); |
||||
if (index == -1) |
||||
throw new ArgumentOutOfRangeException ("target"); |
||||
|
||||
instructions.Insert (index, instruction); |
||||
} |
||||
|
||||
public void InsertAfter (Instruction target, Instruction instruction) |
||||
{ |
||||
if (target == null) |
||||
throw new ArgumentNullException ("target"); |
||||
if (instruction == null) |
||||
throw new ArgumentNullException ("instruction"); |
||||
|
||||
var index = instructions.IndexOf (target); |
||||
if (index == -1) |
||||
throw new ArgumentOutOfRangeException ("target"); |
||||
|
||||
instructions.Insert (index + 1, instruction); |
||||
} |
||||
|
||||
public void Append (Instruction instruction) |
||||
{ |
||||
if (instruction == null) |
||||
throw new ArgumentNullException ("instruction"); |
||||
|
||||
instructions.Add (instruction); |
||||
} |
||||
|
||||
public void Replace (Instruction target, Instruction instruction) |
||||
{ |
||||
if (target == null) |
||||
throw new ArgumentNullException ("target"); |
||||
if (instruction == null) |
||||
throw new ArgumentNullException ("instruction"); |
||||
|
||||
InsertAfter (target, instruction); |
||||
Remove (target); |
||||
} |
||||
|
||||
public void Remove (Instruction instruction) |
||||
{ |
||||
if (instruction == null) |
||||
throw new ArgumentNullException ("instruction"); |
||||
|
||||
if (!instructions.Remove (instruction)) |
||||
throw new ArgumentOutOfRangeException ("instruction"); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,321 @@
@@ -0,0 +1,321 @@
|
||||
//
|
||||
// Instruction.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Text; |
||||
|
||||
namespace Mono.Cecil.Cil { |
||||
|
||||
public sealed class Instruction { |
||||
|
||||
internal int offset; |
||||
internal OpCode opcode; |
||||
internal object operand; |
||||
|
||||
internal Instruction previous; |
||||
internal Instruction next; |
||||
|
||||
SequencePoint sequence_point; |
||||
|
||||
public int Offset { |
||||
get { return offset; } |
||||
set { offset = value; } |
||||
} |
||||
|
||||
public OpCode OpCode { |
||||
get { return opcode; } |
||||
set { opcode = value; } |
||||
} |
||||
|
||||
public object Operand { |
||||
get { return operand; } |
||||
set { operand = value; } |
||||
} |
||||
|
||||
public Instruction Previous { |
||||
get { return previous; } |
||||
set { previous = value; } |
||||
} |
||||
|
||||
public Instruction Next { |
||||
get { return next; } |
||||
set { next = value; } |
||||
} |
||||
|
||||
public SequencePoint SequencePoint { |
||||
get { return sequence_point; } |
||||
set { sequence_point = value; } |
||||
} |
||||
|
||||
internal Instruction (int offset, OpCode opCode) |
||||
{ |
||||
this.offset = offset; |
||||
this.opcode = opCode; |
||||
} |
||||
|
||||
internal Instruction (OpCode opcode, object operand) |
||||
{ |
||||
this.opcode = opcode; |
||||
this.operand = operand; |
||||
} |
||||
|
||||
public int GetSize () |
||||
{ |
||||
int size = opcode.Size; |
||||
|
||||
switch (opcode.OperandType) { |
||||
case OperandType.InlineSwitch: |
||||
return size + (1 + ((Instruction []) operand).Length) * 4; |
||||
case OperandType.InlineI8: |
||||
case OperandType.InlineR: |
||||
return size + 8; |
||||
case OperandType.InlineBrTarget: |
||||
case OperandType.InlineField: |
||||
case OperandType.InlineI: |
||||
case OperandType.InlineMethod: |
||||
case OperandType.InlineString: |
||||
case OperandType.InlineTok: |
||||
case OperandType.InlineType: |
||||
case OperandType.ShortInlineR: |
||||
case OperandType.InlineSig: |
||||
return size + 4; |
||||
case OperandType.InlineArg: |
||||
case OperandType.InlineVar: |
||||
return size + 2; |
||||
case OperandType.ShortInlineBrTarget: |
||||
case OperandType.ShortInlineI: |
||||
case OperandType.ShortInlineArg: |
||||
case OperandType.ShortInlineVar: |
||||
return size + 1; |
||||
default: |
||||
return size; |
||||
} |
||||
} |
||||
|
||||
public override string ToString () |
||||
{ |
||||
var instruction = new StringBuilder (); |
||||
|
||||
AppendLabel (instruction, this); |
||||
instruction.Append (':'); |
||||
instruction.Append (' '); |
||||
instruction.Append (opcode.Name); |
||||
|
||||
if (operand == null) |
||||
return instruction.ToString (); |
||||
|
||||
instruction.Append (' '); |
||||
|
||||
switch (opcode.OperandType) { |
||||
case OperandType.ShortInlineBrTarget: |
||||
case OperandType.InlineBrTarget: |
||||
AppendLabel (instruction, (Instruction) operand); |
||||
break; |
||||
case OperandType.InlineSwitch: |
||||
var labels = (Instruction []) operand; |
||||
for (int i = 0; i < labels.Length; i++) { |
||||
if (i > 0) |
||||
instruction.Append (','); |
||||
|
||||
AppendLabel (instruction, labels [i]); |
||||
} |
||||
break; |
||||
case OperandType.InlineString: |
||||
instruction.Append ('\"'); |
||||
instruction.Append (operand); |
||||
instruction.Append ('\"'); |
||||
break; |
||||
default: |
||||
instruction.Append (operand); |
||||
break; |
||||
} |
||||
|
||||
return instruction.ToString (); |
||||
} |
||||
|
||||
static void AppendLabel (StringBuilder builder, Instruction instruction) |
||||
{ |
||||
builder.Append ("IL_"); |
||||
builder.Append (instruction.offset.ToString ("x4")); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode) |
||||
{ |
||||
if (opcode.OperandType != OperandType.InlineNone) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, null); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, TypeReference type) |
||||
{ |
||||
if (type == null) |
||||
throw new ArgumentNullException ("type"); |
||||
if (opcode.OperandType != OperandType.InlineType && |
||||
opcode.OperandType != OperandType.InlineTok) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, type); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, CallSite site) |
||||
{ |
||||
if (site == null) |
||||
throw new ArgumentNullException ("site"); |
||||
if (opcode.Code != Code.Calli) |
||||
throw new ArgumentException ("code"); |
||||
|
||||
return new Instruction (opcode, site); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, MethodReference method) |
||||
{ |
||||
if (method == null) |
||||
throw new ArgumentNullException ("method"); |
||||
if (opcode.OperandType != OperandType.InlineMethod && |
||||
opcode.OperandType != OperandType.InlineTok) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, method); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, FieldReference field) |
||||
{ |
||||
if (field == null) |
||||
throw new ArgumentNullException ("field"); |
||||
if (opcode.OperandType != OperandType.InlineField && |
||||
opcode.OperandType != OperandType.InlineTok) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, field); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, string value) |
||||
{ |
||||
if (value == null) |
||||
throw new ArgumentNullException ("value"); |
||||
if (opcode.OperandType != OperandType.InlineString) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, value); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, sbyte value) |
||||
{ |
||||
if (opcode.OperandType != OperandType.ShortInlineI && |
||||
opcode != OpCodes.Ldc_I4_S) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, value); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, byte value) |
||||
{ |
||||
if (opcode.OperandType != OperandType.ShortInlineI || |
||||
opcode == OpCodes.Ldc_I4_S) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, value); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, int value) |
||||
{ |
||||
if (opcode.OperandType != OperandType.InlineI) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, value); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, long value) |
||||
{ |
||||
if (opcode.OperandType != OperandType.InlineI8) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, value); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, float value) |
||||
{ |
||||
if (opcode.OperandType != OperandType.ShortInlineR) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, value); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, double value) |
||||
{ |
||||
if (opcode.OperandType != OperandType.InlineR) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, value); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, Instruction target) |
||||
{ |
||||
if (target == null) |
||||
throw new ArgumentNullException ("target"); |
||||
if (opcode.OperandType != OperandType.InlineBrTarget && |
||||
opcode.OperandType != OperandType.ShortInlineBrTarget) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, target); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, Instruction [] targets) |
||||
{ |
||||
if (targets == null) |
||||
throw new ArgumentNullException ("targets"); |
||||
if (opcode.OperandType != OperandType.InlineSwitch) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, targets); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, VariableDefinition variable) |
||||
{ |
||||
if (variable == null) |
||||
throw new ArgumentNullException ("variable"); |
||||
if (opcode.OperandType != OperandType.ShortInlineVar && |
||||
opcode.OperandType != OperandType.InlineVar) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, variable); |
||||
} |
||||
|
||||
public static Instruction Create (OpCode opcode, ParameterDefinition parameter) |
||||
{ |
||||
if (parameter == null) |
||||
throw new ArgumentNullException ("parameter"); |
||||
if (opcode.OperandType != OperandType.ShortInlineArg && |
||||
opcode.OperandType != OperandType.InlineArg) |
||||
throw new ArgumentException ("opcode"); |
||||
|
||||
return new Instruction (opcode, parameter); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,230 @@
@@ -0,0 +1,230 @@
|
||||
//
|
||||
// MethodBody.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil.Cil { |
||||
|
||||
public sealed class MethodBody : IVariableDefinitionProvider { |
||||
|
||||
readonly internal MethodDefinition method; |
||||
|
||||
internal ParameterDefinition this_parameter; |
||||
internal int max_stack_size; |
||||
internal int code_size; |
||||
internal bool init_locals; |
||||
internal MetadataToken local_var_token; |
||||
|
||||
internal Collection<Instruction> instructions; |
||||
internal Collection<ExceptionHandler> exceptions; |
||||
internal Collection<VariableDefinition> variables; |
||||
Scope scope; |
||||
|
||||
public MethodDefinition Method { |
||||
get { return method; } |
||||
} |
||||
|
||||
public int MaxStackSize { |
||||
get { return max_stack_size; } |
||||
set { max_stack_size = value; } |
||||
} |
||||
|
||||
public int CodeSize { |
||||
get { return code_size; } |
||||
} |
||||
|
||||
public bool InitLocals { |
||||
get { return init_locals; } |
||||
set { init_locals = value; } |
||||
} |
||||
|
||||
public MetadataToken LocalVarToken { |
||||
get { return local_var_token; } |
||||
set { local_var_token = value; } |
||||
} |
||||
|
||||
public Collection<Instruction> Instructions { |
||||
get { return instructions ?? (instructions = new InstructionCollection ()); } |
||||
} |
||||
|
||||
public bool HasExceptionHandlers { |
||||
get { return !exceptions.IsNullOrEmpty (); } |
||||
} |
||||
|
||||
public Collection<ExceptionHandler> ExceptionHandlers { |
||||
get { return exceptions ?? (exceptions = new Collection<ExceptionHandler> ()); } |
||||
} |
||||
|
||||
public bool HasVariables { |
||||
get { return !variables.IsNullOrEmpty (); } |
||||
} |
||||
|
||||
public Collection<VariableDefinition> Variables { |
||||
get { return variables ?? (variables = new VariableDefinitionCollection ()); } |
||||
} |
||||
|
||||
public Scope Scope { |
||||
get { return scope; } |
||||
set { scope = value; } |
||||
} |
||||
|
||||
public ParameterDefinition ThisParameter { |
||||
get { |
||||
if (method == null || method.DeclaringType == null) |
||||
throw new NotSupportedException (); |
||||
|
||||
return this_parameter ?? (this_parameter = new ParameterDefinition ("0", ParameterAttributes.None, method.DeclaringType)); |
||||
} |
||||
} |
||||
|
||||
public MethodBody (MethodDefinition method) |
||||
{ |
||||
this.method = method; |
||||
} |
||||
|
||||
public ILProcessor GetILProcessor () |
||||
{ |
||||
return new ILProcessor (this); |
||||
} |
||||
} |
||||
|
||||
public interface IVariableDefinitionProvider { |
||||
bool HasVariables { get; } |
||||
Collection<VariableDefinition> Variables { get; } |
||||
} |
||||
|
||||
class VariableDefinitionCollection : Collection<VariableDefinition> { |
||||
|
||||
internal VariableDefinitionCollection () |
||||
{ |
||||
} |
||||
|
||||
internal VariableDefinitionCollection (int capacity) |
||||
: base (capacity) |
||||
{ |
||||
} |
||||
|
||||
protected override void OnAdd (VariableDefinition item, int index) |
||||
{ |
||||
item.index = index; |
||||
} |
||||
|
||||
protected override void OnInsert (VariableDefinition item, int index) |
||||
{ |
||||
item.index = index; |
||||
|
||||
for (int i = index; i < size; i++) |
||||
items [i].index = i + 1; |
||||
} |
||||
|
||||
protected override void OnSet (VariableDefinition item, int index) |
||||
{ |
||||
item.index = index; |
||||
} |
||||
|
||||
protected override void OnRemove (VariableDefinition item, int index) |
||||
{ |
||||
item.index = -1; |
||||
|
||||
for (int i = index + 1; i < size; i++) |
||||
items [i].index = i - 1; |
||||
} |
||||
} |
||||
|
||||
class InstructionCollection : Collection<Instruction> { |
||||
|
||||
internal InstructionCollection () |
||||
{ |
||||
} |
||||
|
||||
internal InstructionCollection (int capacity) |
||||
: base (capacity) |
||||
{ |
||||
} |
||||
|
||||
protected override void OnAdd (Instruction item, int index) |
||||
{ |
||||
if (index == 0) |
||||
return; |
||||
|
||||
var previous = items [index - 1]; |
||||
previous.next = item; |
||||
item.previous = previous; |
||||
} |
||||
|
||||
protected override void OnInsert (Instruction item, int index) |
||||
{ |
||||
if (size == 0) |
||||
return; |
||||
|
||||
var current = items [index]; |
||||
if (current == null) { |
||||
var last = items [index - 1]; |
||||
last.next = item; |
||||
item.previous = last; |
||||
return; |
||||
} |
||||
|
||||
var previous = current.previous; |
||||
if (previous != null) { |
||||
previous.next = item; |
||||
item.previous = previous; |
||||
} |
||||
|
||||
current.previous = item; |
||||
item.next = current; |
||||
} |
||||
|
||||
protected override void OnSet (Instruction item, int index) |
||||
{ |
||||
var current = items [index]; |
||||
|
||||
item.previous = current.previous; |
||||
item.next = current.next; |
||||
|
||||
current.previous = null; |
||||
current.next = null; |
||||
} |
||||
|
||||
protected override void OnRemove (Instruction item, int index) |
||||
{ |
||||
var previous = item.previous; |
||||
if (previous != null) |
||||
previous.next = item.next; |
||||
|
||||
var next = item.next; |
||||
if (next != null) |
||||
next.previous = item.previous; |
||||
|
||||
item.previous = null; |
||||
item.next = null; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,524 @@
@@ -0,0 +1,524 @@
|
||||
//
|
||||
// OpCode.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil.Cil { |
||||
|
||||
public enum FlowControl { |
||||
Branch, |
||||
Break, |
||||
Call, |
||||
Cond_Branch, |
||||
Meta, |
||||
Next, |
||||
Phi, |
||||
Return, |
||||
Throw, |
||||
} |
||||
|
||||
public enum OpCodeType { |
||||
Annotation, |
||||
Macro, |
||||
Nternal, |
||||
Objmodel, |
||||
Prefix, |
||||
Primitive, |
||||
} |
||||
|
||||
public enum OperandType { |
||||
InlineBrTarget, |
||||
InlineField, |
||||
InlineI, |
||||
InlineI8, |
||||
InlineMethod, |
||||
InlineNone, |
||||
InlinePhi, |
||||
InlineR, |
||||
InlineSig, |
||||
InlineString, |
||||
InlineSwitch, |
||||
InlineTok, |
||||
InlineType, |
||||
InlineVar, |
||||
InlineArg, |
||||
ShortInlineBrTarget, |
||||
ShortInlineI, |
||||
ShortInlineR, |
||||
ShortInlineVar, |
||||
ShortInlineArg, |
||||
} |
||||
|
||||
public enum StackBehaviour { |
||||
Pop0, |
||||
Pop1, |
||||
Pop1_pop1, |
||||
Popi, |
||||
Popi_pop1, |
||||
Popi_popi, |
||||
Popi_popi8, |
||||
Popi_popi_popi, |
||||
Popi_popr4, |
||||
Popi_popr8, |
||||
Popref, |
||||
Popref_pop1, |
||||
Popref_popi, |
||||
Popref_popi_popi, |
||||
Popref_popi_popi8, |
||||
Popref_popi_popr4, |
||||
Popref_popi_popr8, |
||||
Popref_popi_popref, |
||||
PopAll, |
||||
Push0, |
||||
Push1, |
||||
Push1_push1, |
||||
Pushi, |
||||
Pushi8, |
||||
Pushr4, |
||||
Pushr8, |
||||
Pushref, |
||||
Varpop, |
||||
Varpush, |
||||
} |
||||
|
||||
public struct OpCode { |
||||
|
||||
readonly byte op1; |
||||
readonly byte op2; |
||||
readonly byte code; |
||||
readonly byte flow_control; |
||||
readonly byte opcode_type; |
||||
readonly byte operand_type; |
||||
readonly byte stack_behavior_pop; |
||||
readonly byte stack_behavior_push; |
||||
|
||||
public string Name { |
||||
get { return OpCodeNames.names [op1 == 0xff ? op2 : op2 + 256]; } |
||||
} |
||||
|
||||
public int Size { |
||||
get { return op1 == 0xff ? 1 : 2; } |
||||
} |
||||
|
||||
public byte Op1 { |
||||
get { return op1; } |
||||
} |
||||
|
||||
public byte Op2 { |
||||
get { return op2; } |
||||
} |
||||
|
||||
public short Value { |
||||
get { return (short) ((op1 << 8) | op2); } |
||||
} |
||||
|
||||
public Code Code { |
||||
get { return (Code) code; } |
||||
} |
||||
|
||||
public FlowControl FlowControl { |
||||
get { return (FlowControl) flow_control; } |
||||
} |
||||
|
||||
public OpCodeType OpCodeType { |
||||
get { return (OpCodeType) opcode_type; } |
||||
} |
||||
|
||||
public OperandType OperandType { |
||||
get { return (OperandType) operand_type; } |
||||
} |
||||
|
||||
public StackBehaviour StackBehaviourPop { |
||||
get { return (StackBehaviour) stack_behavior_pop; } |
||||
} |
||||
|
||||
public StackBehaviour StackBehaviourPush { |
||||
get { return (StackBehaviour) stack_behavior_push; } |
||||
} |
||||
|
||||
internal OpCode (int x, int y) |
||||
{ |
||||
this.op1 = (byte) ((x >> 0) & 0xff); |
||||
this.op2 = (byte) ((x >> 8) & 0xff); |
||||
this.code = (byte) ((x >> 16) & 0xff); |
||||
this.flow_control = (byte) ((x >> 24) & 0xff); |
||||
|
||||
this.opcode_type = (byte) ((y >> 0) & 0xff); |
||||
this.operand_type = (byte) ((y >> 8) & 0xff); |
||||
this.stack_behavior_pop = (byte) ((y >> 16) & 0xff); |
||||
this.stack_behavior_push = (byte) ((y >> 24) & 0xff); |
||||
|
||||
if (op1 == 0xff) |
||||
OpCodes.OneByteOpCode [op2] = this; |
||||
else |
||||
OpCodes.TwoBytesOpCode [op2] = this; |
||||
} |
||||
|
||||
public override int GetHashCode () |
||||
{ |
||||
return Value; |
||||
} |
||||
|
||||
public override bool Equals (object obj) |
||||
{ |
||||
if (!(obj is OpCode)) |
||||
return false; |
||||
|
||||
var opcode = (OpCode) obj; |
||||
return op1 == opcode.op1 && op2 == opcode.op2; |
||||
} |
||||
|
||||
public bool Equals (OpCode opcode) |
||||
{ |
||||
return op1 == opcode.op1 && op2 == opcode.op2; |
||||
} |
||||
|
||||
public static bool operator == (OpCode one, OpCode other) |
||||
{ |
||||
return one.op1 == other.op1 && one.op2 == other.op2; |
||||
} |
||||
|
||||
public static bool operator != (OpCode one, OpCode other) |
||||
{ |
||||
return one.op1 != other.op1 || one.op2 != other.op2; |
||||
} |
||||
|
||||
public override string ToString () |
||||
{ |
||||
return Name; |
||||
} |
||||
} |
||||
|
||||
static class OpCodeNames { |
||||
|
||||
internal static readonly string [] names = { |
||||
"nop", |
||||
"break", |
||||
"ldarg.0", |
||||
"ldarg.1", |
||||
"ldarg.2", |
||||
"ldarg.3", |
||||
"ldloc.0", |
||||
"ldloc.1", |
||||
"ldloc.2", |
||||
"ldloc.3", |
||||
"stloc.0", |
||||
"stloc.1", |
||||
"stloc.2", |
||||
"stloc.3", |
||||
"ldarg.s", |
||||
"ldarga.s", |
||||
"starg.s", |
||||
"ldloc.s", |
||||
"ldloca.s", |
||||
"stloc.s", |
||||
"ldnull", |
||||
"ldc.i4.m1", |
||||
"ldc.i4.0", |
||||
"ldc.i4.1", |
||||
"ldc.i4.2", |
||||
"ldc.i4.3", |
||||
"ldc.i4.4", |
||||
"ldc.i4.5", |
||||
"ldc.i4.6", |
||||
"ldc.i4.7", |
||||
"ldc.i4.8", |
||||
"ldc.i4.s", |
||||
"ldc.i4", |
||||
"ldc.i8", |
||||
"ldc.r4", |
||||
"ldc.r8", |
||||
null, |
||||
"dup", |
||||
"pop", |
||||
"jmp", |
||||
"call", |
||||
"calli", |
||||
"ret", |
||||
"br.s", |
||||
"brfalse.s", |
||||
"brtrue.s", |
||||
"beq.s", |
||||
"bge.s", |
||||
"bgt.s", |
||||
"ble.s", |
||||
"blt.s", |
||||
"bne.un.s", |
||||
"bge.un.s", |
||||
"bgt.un.s", |
||||
"ble.un.s", |
||||
"blt.un.s", |
||||
"br", |
||||
"brfalse", |
||||
"brtrue", |
||||
"beq", |
||||
"bge", |
||||
"bgt", |
||||
"ble", |
||||
"blt", |
||||
"bne.un", |
||||
"bge.un", |
||||
"bgt.un", |
||||
"ble.un", |
||||
"blt.un", |
||||
"switch", |
||||
"ldind.i1", |
||||
"ldind.u1", |
||||
"ldind.i2", |
||||
"ldind.u2", |
||||
"ldind.i4", |
||||
"ldind.u4", |
||||
"ldind.i8", |
||||
"ldind.i", |
||||
"ldind.r4", |
||||
"ldind.r8", |
||||
"ldind.ref", |
||||
"stind.ref", |
||||
"stind.i1", |
||||
"stind.i2", |
||||
"stind.i4", |
||||
"stind.i8", |
||||
"stind.r4", |
||||
"stind.r8", |
||||
"add", |
||||
"sub", |
||||
"mul", |
||||
"div", |
||||
"div.un", |
||||
"rem", |
||||
"rem.un", |
||||
"and", |
||||
"or", |
||||
"xor", |
||||
"shl", |
||||
"shr", |
||||
"shr.un", |
||||
"neg", |
||||
"not", |
||||
"conv.i1", |
||||
"conv.i2", |
||||
"conv.i4", |
||||
"conv.i8", |
||||
"conv.r4", |
||||
"conv.r8", |
||||
"conv.u4", |
||||
"conv.u8", |
||||
"callvirt", |
||||
"cpobj", |
||||
"ldobj", |
||||
"ldstr", |
||||
"newobj", |
||||
"castclass", |
||||
"isinst", |
||||
"conv.r.un", |
||||
null, |
||||
null, |
||||
"unbox", |
||||
"throw", |
||||
"ldfld", |
||||
"ldflda", |
||||
"stfld", |
||||
"ldsfld", |
||||
"ldsflda", |
||||
"stsfld", |
||||
"stobj", |
||||
"conv.ovf.i1.un", |
||||
"conv.ovf.i2.un", |
||||
"conv.ovf.i4.un", |
||||
"conv.ovf.i8.un", |
||||
"conv.ovf.u1.un", |
||||
"conv.ovf.u2.un", |
||||
"conv.ovf.u4.un", |
||||
"conv.ovf.u8.un", |
||||
"conv.ovf.i.un", |
||||
"conv.ovf.u.un", |
||||
"box", |
||||
"newarr", |
||||
"ldlen", |
||||
"ldelema", |
||||
"ldelem.i1", |
||||
"ldelem.u1", |
||||
"ldelem.i2", |
||||
"ldelem.u2", |
||||
"ldelem.i4", |
||||
"ldelem.u4", |
||||
"ldelem.i8", |
||||
"ldelem.i", |
||||
"ldelem.r4", |
||||
"ldelem.r8", |
||||
"ldelem.ref", |
||||
"stelem.i", |
||||
"stelem.i1", |
||||
"stelem.i2", |
||||
"stelem.i4", |
||||
"stelem.i8", |
||||
"stelem.r4", |
||||
"stelem.r8", |
||||
"stelem.ref", |
||||
"ldelem.any", |
||||
"stelem.any", |
||||
"unbox.any", |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
"conv.ovf.i1", |
||||
"conv.ovf.u1", |
||||
"conv.ovf.i2", |
||||
"conv.ovf.u2", |
||||
"conv.ovf.i4", |
||||
"conv.ovf.u4", |
||||
"conv.ovf.i8", |
||||
"conv.ovf.u8", |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
"refanyval", |
||||
"ckfinite", |
||||
null, |
||||
null, |
||||
"mkrefany", |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
"ldtoken", |
||||
"conv.u2", |
||||
"conv.u1", |
||||
"conv.i", |
||||
"conv.ovf.i", |
||||
"conv.ovf.u", |
||||
"add.ovf", |
||||
"add.ovf.un", |
||||
"mul.ovf", |
||||
"mul.ovf.un", |
||||
"sub.ovf", |
||||
"sub.ovf.un", |
||||
"endfinally", |
||||
"leave", |
||||
"leave.s", |
||||
"stind.i", |
||||
"conv.u", |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
"prefix7", |
||||
"prefix6", |
||||
"prefix5", |
||||
"prefix4", |
||||
"prefix3", |
||||
"prefix2", |
||||
"prefix1", |
||||
"prefixref", |
||||
"arglist", |
||||
"ceq", |
||||
"cgt", |
||||
"cgt.un", |
||||
"clt", |
||||
"clt.un", |
||||
"ldftn", |
||||
"ldvirtftn", |
||||
null, |
||||
"ldarg", |
||||
"ldarga", |
||||
"starg", |
||||
"ldloc", |
||||
"ldloca", |
||||
"stloc", |
||||
"localloc", |
||||
null, |
||||
"endfilter", |
||||
"unaligned.", |
||||
"volatile.", |
||||
"tail.", |
||||
"initobj", |
||||
"constrained.", |
||||
"cpblk", |
||||
"initblk", |
||||
"no.", // added by spouliot to match Cecil existing definitions
|
||||
"rethrow", |
||||
null, |
||||
"sizeof", |
||||
"refanytype", |
||||
"readonly.", // added by spouliot to match Cecil existing definitions
|
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,912 @@
@@ -0,0 +1,912 @@
|
||||
//
|
||||
// OpCodes.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil.Cil { |
||||
|
||||
public static class OpCodes { |
||||
|
||||
internal static readonly OpCode [] OneByteOpCode = new OpCode [0xe0 + 1]; |
||||
internal static readonly OpCode [] TwoBytesOpCode = new OpCode [0x1e + 1]; |
||||
|
||||
public static readonly OpCode Nop = new OpCode ( |
||||
0xff << 0 | 0x00 << 8 | (byte) Code.Nop << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Break = new OpCode ( |
||||
0xff << 0 | 0x01 << 8 | (byte) Code.Break << 16 | (byte) FlowControl.Break << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Ldarg_0 = new OpCode ( |
||||
0xff << 0 | 0x02 << 8 | (byte) Code.Ldarg_0 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldarg_1 = new OpCode ( |
||||
0xff << 0 | 0x03 << 8 | (byte) Code.Ldarg_1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldarg_2 = new OpCode ( |
||||
0xff << 0 | 0x04 << 8 | (byte) Code.Ldarg_2 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldarg_3 = new OpCode ( |
||||
0xff << 0 | 0x05 << 8 | (byte) Code.Ldarg_3 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldloc_0 = new OpCode ( |
||||
0xff << 0 | 0x06 << 8 | (byte) Code.Ldloc_0 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldloc_1 = new OpCode ( |
||||
0xff << 0 | 0x07 << 8 | (byte) Code.Ldloc_1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldloc_2 = new OpCode ( |
||||
0xff << 0 | 0x08 << 8 | (byte) Code.Ldloc_2 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldloc_3 = new OpCode ( |
||||
0xff << 0 | 0x09 << 8 | (byte) Code.Ldloc_3 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Stloc_0 = new OpCode ( |
||||
0xff << 0 | 0x0a << 8 | (byte) Code.Stloc_0 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stloc_1 = new OpCode ( |
||||
0xff << 0 | 0x0b << 8 | (byte) Code.Stloc_1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stloc_2 = new OpCode ( |
||||
0xff << 0 | 0x0c << 8 | (byte) Code.Stloc_2 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stloc_3 = new OpCode ( |
||||
0xff << 0 | 0x0d << 8 | (byte) Code.Stloc_3 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Ldarg_S = new OpCode ( |
||||
0xff << 0 | 0x0e << 8 | (byte) Code.Ldarg_S << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineArg << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldarga_S = new OpCode ( |
||||
0xff << 0 | 0x0f << 8 | (byte) Code.Ldarga_S << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineArg << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Starg_S = new OpCode ( |
||||
0xff << 0 | 0x10 << 8 | (byte) Code.Starg_S << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineArg << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Ldloc_S = new OpCode ( |
||||
0xff << 0 | 0x11 << 8 | (byte) Code.Ldloc_S << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineVar << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldloca_S = new OpCode ( |
||||
0xff << 0 | 0x12 << 8 | (byte) Code.Ldloca_S << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineVar << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Stloc_S = new OpCode ( |
||||
0xff << 0 | 0x13 << 8 | (byte) Code.Stloc_S << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineVar << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Ldnull = new OpCode ( |
||||
0xff << 0 | 0x14 << 8 | (byte) Code.Ldnull << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushref << 24); |
||||
|
||||
public static readonly OpCode Ldc_I4_M1 = new OpCode ( |
||||
0xff << 0 | 0x15 << 8 | (byte) Code.Ldc_I4_M1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldc_I4_0 = new OpCode ( |
||||
0xff << 0 | 0x16 << 8 | (byte) Code.Ldc_I4_0 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldc_I4_1 = new OpCode ( |
||||
0xff << 0 | 0x17 << 8 | (byte) Code.Ldc_I4_1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldc_I4_2 = new OpCode ( |
||||
0xff << 0 | 0x18 << 8 | (byte) Code.Ldc_I4_2 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldc_I4_3 = new OpCode ( |
||||
0xff << 0 | 0x19 << 8 | (byte) Code.Ldc_I4_3 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldc_I4_4 = new OpCode ( |
||||
0xff << 0 | 0x1a << 8 | (byte) Code.Ldc_I4_4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldc_I4_5 = new OpCode ( |
||||
0xff << 0 | 0x1b << 8 | (byte) Code.Ldc_I4_5 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldc_I4_6 = new OpCode ( |
||||
0xff << 0 | 0x1c << 8 | (byte) Code.Ldc_I4_6 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldc_I4_7 = new OpCode ( |
||||
0xff << 0 | 0x1d << 8 | (byte) Code.Ldc_I4_7 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldc_I4_8 = new OpCode ( |
||||
0xff << 0 | 0x1e << 8 | (byte) Code.Ldc_I4_8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldc_I4_S = new OpCode ( |
||||
0xff << 0 | 0x1f << 8 | (byte) Code.Ldc_I4_S << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineI << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldc_I4 = new OpCode ( |
||||
0xff << 0 | 0x20 << 8 | (byte) Code.Ldc_I4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineI << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldc_I8 = new OpCode ( |
||||
0xff << 0 | 0x21 << 8 | (byte) Code.Ldc_I8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineI8 << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi8 << 24); |
||||
|
||||
public static readonly OpCode Ldc_R4 = new OpCode ( |
||||
0xff << 0 | 0x22 << 8 | (byte) Code.Ldc_R4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.ShortInlineR << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushr4 << 24); |
||||
|
||||
public static readonly OpCode Ldc_R8 = new OpCode ( |
||||
0xff << 0 | 0x23 << 8 | (byte) Code.Ldc_R8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineR << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushr8 << 24); |
||||
|
||||
public static readonly OpCode Dup = new OpCode ( |
||||
0xff << 0 | 0x25 << 8 | (byte) Code.Dup << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Push1_push1 << 24); |
||||
|
||||
public static readonly OpCode Pop = new OpCode ( |
||||
0xff << 0 | 0x26 << 8 | (byte) Code.Pop << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Jmp = new OpCode ( |
||||
0xff << 0 | 0x27 << 8 | (byte) Code.Jmp << 16 | (byte) FlowControl.Call << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineMethod << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Call = new OpCode ( |
||||
0xff << 0 | 0x28 << 8 | (byte) Code.Call << 16 | (byte) FlowControl.Call << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineMethod << 8 | (byte) StackBehaviour.Varpop << 16 | (byte) StackBehaviour.Varpush << 24); |
||||
|
||||
public static readonly OpCode Calli = new OpCode ( |
||||
0xff << 0 | 0x29 << 8 | (byte) Code.Calli << 16 | (byte) FlowControl.Call << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineSig << 8 | (byte) StackBehaviour.Varpop << 16 | (byte) StackBehaviour.Varpush << 24); |
||||
|
||||
public static readonly OpCode Ret = new OpCode ( |
||||
0xff << 0 | 0x2a << 8 | (byte) Code.Ret << 16 | (byte) FlowControl.Return << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Varpop << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Br_S = new OpCode ( |
||||
0xff << 0 | 0x2b << 8 | (byte) Code.Br_S << 16 | (byte) FlowControl.Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineBrTarget << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Brfalse_S = new OpCode ( |
||||
0xff << 0 | 0x2c << 8 | (byte) Code.Brfalse_S << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineBrTarget << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Brtrue_S = new OpCode ( |
||||
0xff << 0 | 0x2d << 8 | (byte) Code.Brtrue_S << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineBrTarget << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Beq_S = new OpCode ( |
||||
0xff << 0 | 0x2e << 8 | (byte) Code.Beq_S << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Bge_S = new OpCode ( |
||||
0xff << 0 | 0x2f << 8 | (byte) Code.Bge_S << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Bgt_S = new OpCode ( |
||||
0xff << 0 | 0x30 << 8 | (byte) Code.Bgt_S << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Ble_S = new OpCode ( |
||||
0xff << 0 | 0x31 << 8 | (byte) Code.Ble_S << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Blt_S = new OpCode ( |
||||
0xff << 0 | 0x32 << 8 | (byte) Code.Blt_S << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Bne_Un_S = new OpCode ( |
||||
0xff << 0 | 0x33 << 8 | (byte) Code.Bne_Un_S << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Bge_Un_S = new OpCode ( |
||||
0xff << 0 | 0x34 << 8 | (byte) Code.Bge_Un_S << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Bgt_Un_S = new OpCode ( |
||||
0xff << 0 | 0x35 << 8 | (byte) Code.Bgt_Un_S << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Ble_Un_S = new OpCode ( |
||||
0xff << 0 | 0x36 << 8 | (byte) Code.Ble_Un_S << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Blt_Un_S = new OpCode ( |
||||
0xff << 0 | 0x37 << 8 | (byte) Code.Blt_Un_S << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Br = new OpCode ( |
||||
0xff << 0 | 0x38 << 8 | (byte) Code.Br << 16 | (byte) FlowControl.Branch << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineBrTarget << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Brfalse = new OpCode ( |
||||
0xff << 0 | 0x39 << 8 | (byte) Code.Brfalse << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineBrTarget << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Brtrue = new OpCode ( |
||||
0xff << 0 | 0x3a << 8 | (byte) Code.Brtrue << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineBrTarget << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Beq = new OpCode ( |
||||
0xff << 0 | 0x3b << 8 | (byte) Code.Beq << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Bge = new OpCode ( |
||||
0xff << 0 | 0x3c << 8 | (byte) Code.Bge << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Bgt = new OpCode ( |
||||
0xff << 0 | 0x3d << 8 | (byte) Code.Bgt << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Ble = new OpCode ( |
||||
0xff << 0 | 0x3e << 8 | (byte) Code.Ble << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Blt = new OpCode ( |
||||
0xff << 0 | 0x3f << 8 | (byte) Code.Blt << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Bne_Un = new OpCode ( |
||||
0xff << 0 | 0x40 << 8 | (byte) Code.Bne_Un << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Bge_Un = new OpCode ( |
||||
0xff << 0 | 0x41 << 8 | (byte) Code.Bge_Un << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Bgt_Un = new OpCode ( |
||||
0xff << 0 | 0x42 << 8 | (byte) Code.Bgt_Un << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Ble_Un = new OpCode ( |
||||
0xff << 0 | 0x43 << 8 | (byte) Code.Ble_Un << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Blt_Un = new OpCode ( |
||||
0xff << 0 | 0x44 << 8 | (byte) Code.Blt_Un << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.InlineBrTarget << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Switch = new OpCode ( |
||||
0xff << 0 | 0x45 << 8 | (byte) Code.Switch << 16 | (byte) FlowControl.Cond_Branch << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineSwitch << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Ldind_I1 = new OpCode ( |
||||
0xff << 0 | 0x46 << 8 | (byte) Code.Ldind_I1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldind_U1 = new OpCode ( |
||||
0xff << 0 | 0x47 << 8 | (byte) Code.Ldind_U1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldind_I2 = new OpCode ( |
||||
0xff << 0 | 0x48 << 8 | (byte) Code.Ldind_I2 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldind_U2 = new OpCode ( |
||||
0xff << 0 | 0x49 << 8 | (byte) Code.Ldind_U2 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldind_I4 = new OpCode ( |
||||
0xff << 0 | 0x4a << 8 | (byte) Code.Ldind_I4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldind_U4 = new OpCode ( |
||||
0xff << 0 | 0x4b << 8 | (byte) Code.Ldind_U4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldind_I8 = new OpCode ( |
||||
0xff << 0 | 0x4c << 8 | (byte) Code.Ldind_I8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Pushi8 << 24); |
||||
|
||||
public static readonly OpCode Ldind_I = new OpCode ( |
||||
0xff << 0 | 0x4d << 8 | (byte) Code.Ldind_I << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldind_R4 = new OpCode ( |
||||
0xff << 0 | 0x4e << 8 | (byte) Code.Ldind_R4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Pushr4 << 24); |
||||
|
||||
public static readonly OpCode Ldind_R8 = new OpCode ( |
||||
0xff << 0 | 0x4f << 8 | (byte) Code.Ldind_R8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Pushr8 << 24); |
||||
|
||||
public static readonly OpCode Ldind_Ref = new OpCode ( |
||||
0xff << 0 | 0x50 << 8 | (byte) Code.Ldind_Ref << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Pushref << 24); |
||||
|
||||
public static readonly OpCode Stind_Ref = new OpCode ( |
||||
0xff << 0 | 0x51 << 8 | (byte) Code.Stind_Ref << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi_popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stind_I1 = new OpCode ( |
||||
0xff << 0 | 0x52 << 8 | (byte) Code.Stind_I1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi_popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stind_I2 = new OpCode ( |
||||
0xff << 0 | 0x53 << 8 | (byte) Code.Stind_I2 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi_popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stind_I4 = new OpCode ( |
||||
0xff << 0 | 0x54 << 8 | (byte) Code.Stind_I4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi_popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stind_I8 = new OpCode ( |
||||
0xff << 0 | 0x55 << 8 | (byte) Code.Stind_I8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi_popi8 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stind_R4 = new OpCode ( |
||||
0xff << 0 | 0x56 << 8 | (byte) Code.Stind_R4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi_popr4 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stind_R8 = new OpCode ( |
||||
0xff << 0 | 0x57 << 8 | (byte) Code.Stind_R8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi_popr8 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Add = new OpCode ( |
||||
0xff << 0 | 0x58 << 8 | (byte) Code.Add << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Sub = new OpCode ( |
||||
0xff << 0 | 0x59 << 8 | (byte) Code.Sub << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Mul = new OpCode ( |
||||
0xff << 0 | 0x5a << 8 | (byte) Code.Mul << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Div = new OpCode ( |
||||
0xff << 0 | 0x5b << 8 | (byte) Code.Div << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Div_Un = new OpCode ( |
||||
0xff << 0 | 0x5c << 8 | (byte) Code.Div_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Rem = new OpCode ( |
||||
0xff << 0 | 0x5d << 8 | (byte) Code.Rem << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Rem_Un = new OpCode ( |
||||
0xff << 0 | 0x5e << 8 | (byte) Code.Rem_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode And = new OpCode ( |
||||
0xff << 0 | 0x5f << 8 | (byte) Code.And << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Or = new OpCode ( |
||||
0xff << 0 | 0x60 << 8 | (byte) Code.Or << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Xor = new OpCode ( |
||||
0xff << 0 | 0x61 << 8 | (byte) Code.Xor << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Shl = new OpCode ( |
||||
0xff << 0 | 0x62 << 8 | (byte) Code.Shl << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Shr = new OpCode ( |
||||
0xff << 0 | 0x63 << 8 | (byte) Code.Shr << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Shr_Un = new OpCode ( |
||||
0xff << 0 | 0x64 << 8 | (byte) Code.Shr_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Neg = new OpCode ( |
||||
0xff << 0 | 0x65 << 8 | (byte) Code.Neg << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Not = new OpCode ( |
||||
0xff << 0 | 0x66 << 8 | (byte) Code.Not << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Conv_I1 = new OpCode ( |
||||
0xff << 0 | 0x67 << 8 | (byte) Code.Conv_I1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_I2 = new OpCode ( |
||||
0xff << 0 | 0x68 << 8 | (byte) Code.Conv_I2 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_I4 = new OpCode ( |
||||
0xff << 0 | 0x69 << 8 | (byte) Code.Conv_I4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_I8 = new OpCode ( |
||||
0xff << 0 | 0x6a << 8 | (byte) Code.Conv_I8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi8 << 24); |
||||
|
||||
public static readonly OpCode Conv_R4 = new OpCode ( |
||||
0xff << 0 | 0x6b << 8 | (byte) Code.Conv_R4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushr4 << 24); |
||||
|
||||
public static readonly OpCode Conv_R8 = new OpCode ( |
||||
0xff << 0 | 0x6c << 8 | (byte) Code.Conv_R8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushr8 << 24); |
||||
|
||||
public static readonly OpCode Conv_U4 = new OpCode ( |
||||
0xff << 0 | 0x6d << 8 | (byte) Code.Conv_U4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_U8 = new OpCode ( |
||||
0xff << 0 | 0x6e << 8 | (byte) Code.Conv_U8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi8 << 24); |
||||
|
||||
public static readonly OpCode Callvirt = new OpCode ( |
||||
0xff << 0 | 0x6f << 8 | (byte) Code.Callvirt << 16 | (byte) FlowControl.Call << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineMethod << 8 | (byte) StackBehaviour.Varpop << 16 | (byte) StackBehaviour.Varpush << 24); |
||||
|
||||
public static readonly OpCode Cpobj = new OpCode ( |
||||
0xff << 0 | 0x70 << 8 | (byte) Code.Cpobj << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Popi_popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Ldobj = new OpCode ( |
||||
0xff << 0 | 0x71 << 8 | (byte) Code.Ldobj << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldstr = new OpCode ( |
||||
0xff << 0 | 0x72 << 8 | (byte) Code.Ldstr << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineString << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushref << 24); |
||||
|
||||
public static readonly OpCode Newobj = new OpCode ( |
||||
0xff << 0 | 0x73 << 8 | (byte) Code.Newobj << 16 | (byte) FlowControl.Call << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineMethod << 8 | (byte) StackBehaviour.Varpop << 16 | (byte) StackBehaviour.Pushref << 24); |
||||
|
||||
public static readonly OpCode Castclass = new OpCode ( |
||||
0xff << 0 | 0x74 << 8 | (byte) Code.Castclass << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Popref << 16 | (byte) StackBehaviour.Pushref << 24); |
||||
|
||||
public static readonly OpCode Isinst = new OpCode ( |
||||
0xff << 0 | 0x75 << 8 | (byte) Code.Isinst << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Popref << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_R_Un = new OpCode ( |
||||
0xff << 0 | 0x76 << 8 | (byte) Code.Conv_R_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushr8 << 24); |
||||
|
||||
public static readonly OpCode Unbox = new OpCode ( |
||||
0xff << 0 | 0x79 << 8 | (byte) Code.Unbox << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Popref << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Throw = new OpCode ( |
||||
0xff << 0 | 0x7a << 8 | (byte) Code.Throw << 16 | (byte) FlowControl.Throw << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Ldfld = new OpCode ( |
||||
0xff << 0 | 0x7b << 8 | (byte) Code.Ldfld << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineField << 8 | (byte) StackBehaviour.Popref << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldflda = new OpCode ( |
||||
0xff << 0 | 0x7c << 8 | (byte) Code.Ldflda << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineField << 8 | (byte) StackBehaviour.Popref << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Stfld = new OpCode ( |
||||
0xff << 0 | 0x7d << 8 | (byte) Code.Stfld << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineField << 8 | (byte) StackBehaviour.Popref_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Ldsfld = new OpCode ( |
||||
0xff << 0 | 0x7e << 8 | (byte) Code.Ldsfld << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineField << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldsflda = new OpCode ( |
||||
0xff << 0 | 0x7f << 8 | (byte) Code.Ldsflda << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineField << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Stsfld = new OpCode ( |
||||
0xff << 0 | 0x80 << 8 | (byte) Code.Stsfld << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineField << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stobj = new OpCode ( |
||||
0xff << 0 | 0x81 << 8 | (byte) Code.Stobj << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Popi_pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_I1_Un = new OpCode ( |
||||
0xff << 0 | 0x82 << 8 | (byte) Code.Conv_Ovf_I1_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_I2_Un = new OpCode ( |
||||
0xff << 0 | 0x83 << 8 | (byte) Code.Conv_Ovf_I2_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_I4_Un = new OpCode ( |
||||
0xff << 0 | 0x84 << 8 | (byte) Code.Conv_Ovf_I4_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_I8_Un = new OpCode ( |
||||
0xff << 0 | 0x85 << 8 | (byte) Code.Conv_Ovf_I8_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi8 << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_U1_Un = new OpCode ( |
||||
0xff << 0 | 0x86 << 8 | (byte) Code.Conv_Ovf_U1_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_U2_Un = new OpCode ( |
||||
0xff << 0 | 0x87 << 8 | (byte) Code.Conv_Ovf_U2_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_U4_Un = new OpCode ( |
||||
0xff << 0 | 0x88 << 8 | (byte) Code.Conv_Ovf_U4_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_U8_Un = new OpCode ( |
||||
0xff << 0 | 0x89 << 8 | (byte) Code.Conv_Ovf_U8_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi8 << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_I_Un = new OpCode ( |
||||
0xff << 0 | 0x8a << 8 | (byte) Code.Conv_Ovf_I_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_U_Un = new OpCode ( |
||||
0xff << 0 | 0x8b << 8 | (byte) Code.Conv_Ovf_U_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Box = new OpCode ( |
||||
0xff << 0 | 0x8c << 8 | (byte) Code.Box << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushref << 24); |
||||
|
||||
public static readonly OpCode Newarr = new OpCode ( |
||||
0xff << 0 | 0x8d << 8 | (byte) Code.Newarr << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Pushref << 24); |
||||
|
||||
public static readonly OpCode Ldlen = new OpCode ( |
||||
0xff << 0 | 0x8e << 8 | (byte) Code.Ldlen << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldelema = new OpCode ( |
||||
0xff << 0 | 0x8f << 8 | (byte) Code.Ldelema << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Popref_popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldelem_I1 = new OpCode ( |
||||
0xff << 0 | 0x90 << 8 | (byte) Code.Ldelem_I1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldelem_U1 = new OpCode ( |
||||
0xff << 0 | 0x91 << 8 | (byte) Code.Ldelem_U1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldelem_I2 = new OpCode ( |
||||
0xff << 0 | 0x92 << 8 | (byte) Code.Ldelem_I2 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldelem_U2 = new OpCode ( |
||||
0xff << 0 | 0x93 << 8 | (byte) Code.Ldelem_U2 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldelem_I4 = new OpCode ( |
||||
0xff << 0 | 0x94 << 8 | (byte) Code.Ldelem_I4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldelem_U4 = new OpCode ( |
||||
0xff << 0 | 0x95 << 8 | (byte) Code.Ldelem_U4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldelem_I8 = new OpCode ( |
||||
0xff << 0 | 0x96 << 8 | (byte) Code.Ldelem_I8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi << 16 | (byte) StackBehaviour.Pushi8 << 24); |
||||
|
||||
public static readonly OpCode Ldelem_I = new OpCode ( |
||||
0xff << 0 | 0x97 << 8 | (byte) Code.Ldelem_I << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldelem_R4 = new OpCode ( |
||||
0xff << 0 | 0x98 << 8 | (byte) Code.Ldelem_R4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi << 16 | (byte) StackBehaviour.Pushr4 << 24); |
||||
|
||||
public static readonly OpCode Ldelem_R8 = new OpCode ( |
||||
0xff << 0 | 0x99 << 8 | (byte) Code.Ldelem_R8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi << 16 | (byte) StackBehaviour.Pushr8 << 24); |
||||
|
||||
public static readonly OpCode Ldelem_Ref = new OpCode ( |
||||
0xff << 0 | 0x9a << 8 | (byte) Code.Ldelem_Ref << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi << 16 | (byte) StackBehaviour.Pushref << 24); |
||||
|
||||
public static readonly OpCode Stelem_I = new OpCode ( |
||||
0xff << 0 | 0x9b << 8 | (byte) Code.Stelem_I << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi_popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stelem_I1 = new OpCode ( |
||||
0xff << 0 | 0x9c << 8 | (byte) Code.Stelem_I1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi_popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stelem_I2 = new OpCode ( |
||||
0xff << 0 | 0x9d << 8 | (byte) Code.Stelem_I2 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi_popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stelem_I4 = new OpCode ( |
||||
0xff << 0 | 0x9e << 8 | (byte) Code.Stelem_I4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi_popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stelem_I8 = new OpCode ( |
||||
0xff << 0 | 0x9f << 8 | (byte) Code.Stelem_I8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi_popi8 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stelem_R4 = new OpCode ( |
||||
0xff << 0 | 0xa0 << 8 | (byte) Code.Stelem_R4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi_popr4 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stelem_R8 = new OpCode ( |
||||
0xff << 0 | 0xa1 << 8 | (byte) Code.Stelem_R8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi_popr8 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stelem_Ref = new OpCode ( |
||||
0xff << 0 | 0xa2 << 8 | (byte) Code.Stelem_Ref << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popref_popi_popref << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Ldelem_Any = new OpCode ( |
||||
0xff << 0 | 0xa3 << 8 | (byte) Code.Ldelem_Any << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Popref_popi << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Stelem_Any = new OpCode ( |
||||
0xff << 0 | 0xa4 << 8 | (byte) Code.Stelem_Any << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Popref_popi_popref << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Unbox_Any = new OpCode ( |
||||
0xff << 0 | 0xa5 << 8 | (byte) Code.Unbox_Any << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Popref << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_I1 = new OpCode ( |
||||
0xff << 0 | 0xb3 << 8 | (byte) Code.Conv_Ovf_I1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_U1 = new OpCode ( |
||||
0xff << 0 | 0xb4 << 8 | (byte) Code.Conv_Ovf_U1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_I2 = new OpCode ( |
||||
0xff << 0 | 0xb5 << 8 | (byte) Code.Conv_Ovf_I2 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_U2 = new OpCode ( |
||||
0xff << 0 | 0xb6 << 8 | (byte) Code.Conv_Ovf_U2 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_I4 = new OpCode ( |
||||
0xff << 0 | 0xb7 << 8 | (byte) Code.Conv_Ovf_I4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_U4 = new OpCode ( |
||||
0xff << 0 | 0xb8 << 8 | (byte) Code.Conv_Ovf_U4 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_I8 = new OpCode ( |
||||
0xff << 0 | 0xb9 << 8 | (byte) Code.Conv_Ovf_I8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi8 << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_U8 = new OpCode ( |
||||
0xff << 0 | 0xba << 8 | (byte) Code.Conv_Ovf_U8 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi8 << 24); |
||||
|
||||
public static readonly OpCode Refanyval = new OpCode ( |
||||
0xff << 0 | 0xc2 << 8 | (byte) Code.Refanyval << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ckfinite = new OpCode ( |
||||
0xff << 0 | 0xc3 << 8 | (byte) Code.Ckfinite << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushr8 << 24); |
||||
|
||||
public static readonly OpCode Mkrefany = new OpCode ( |
||||
0xff << 0 | 0xc6 << 8 | (byte) Code.Mkrefany << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldtoken = new OpCode ( |
||||
0xff << 0 | 0xd0 << 8 | (byte) Code.Ldtoken << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineTok << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_U2 = new OpCode ( |
||||
0xff << 0 | 0xd1 << 8 | (byte) Code.Conv_U2 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_U1 = new OpCode ( |
||||
0xff << 0 | 0xd2 << 8 | (byte) Code.Conv_U1 << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_I = new OpCode ( |
||||
0xff << 0 | 0xd3 << 8 | (byte) Code.Conv_I << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_I = new OpCode ( |
||||
0xff << 0 | 0xd4 << 8 | (byte) Code.Conv_Ovf_I << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Conv_Ovf_U = new OpCode ( |
||||
0xff << 0 | 0xd5 << 8 | (byte) Code.Conv_Ovf_U << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Add_Ovf = new OpCode ( |
||||
0xff << 0 | 0xd6 << 8 | (byte) Code.Add_Ovf << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Add_Ovf_Un = new OpCode ( |
||||
0xff << 0 | 0xd7 << 8 | (byte) Code.Add_Ovf_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Mul_Ovf = new OpCode ( |
||||
0xff << 0 | 0xd8 << 8 | (byte) Code.Mul_Ovf << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Mul_Ovf_Un = new OpCode ( |
||||
0xff << 0 | 0xd9 << 8 | (byte) Code.Mul_Ovf_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Sub_Ovf = new OpCode ( |
||||
0xff << 0 | 0xda << 8 | (byte) Code.Sub_Ovf << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Sub_Ovf_Un = new OpCode ( |
||||
0xff << 0 | 0xdb << 8 | (byte) Code.Sub_Ovf_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Endfinally = new OpCode ( |
||||
0xff << 0 | 0xdc << 8 | (byte) Code.Endfinally << 16 | (byte) FlowControl.Return << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Leave = new OpCode ( |
||||
0xff << 0 | 0xdd << 8 | (byte) Code.Leave << 16 | (byte) FlowControl.Branch << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineBrTarget << 8 | (byte) StackBehaviour.PopAll << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Leave_S = new OpCode ( |
||||
0xff << 0 | 0xde << 8 | (byte) Code.Leave_S << 16 | (byte) FlowControl.Branch << 24, |
||||
(byte) OpCodeType.Macro << 0 | (byte) OperandType.ShortInlineBrTarget << 8 | (byte) StackBehaviour.PopAll << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Stind_I = new OpCode ( |
||||
0xff << 0 | 0xdf << 8 | (byte) Code.Stind_I << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi_popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Conv_U = new OpCode ( |
||||
0xff << 0 | 0xe0 << 8 | (byte) Code.Conv_U << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Arglist = new OpCode ( |
||||
0xfe << 0 | 0x00 << 8 | (byte) Code.Arglist << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ceq = new OpCode ( |
||||
0xfe << 0 | 0x01 << 8 | (byte) Code.Ceq << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Cgt = new OpCode ( |
||||
0xfe << 0 | 0x02 << 8 | (byte) Code.Cgt << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Cgt_Un = new OpCode ( |
||||
0xfe << 0 | 0x03 << 8 | (byte) Code.Cgt_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Clt = new OpCode ( |
||||
0xfe << 0 | 0x04 << 8 | (byte) Code.Clt << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Clt_Un = new OpCode ( |
||||
0xfe << 0 | 0x05 << 8 | (byte) Code.Clt_Un << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1_pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldftn = new OpCode ( |
||||
0xfe << 0 | 0x06 << 8 | (byte) Code.Ldftn << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineMethod << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldvirtftn = new OpCode ( |
||||
0xfe << 0 | 0x07 << 8 | (byte) Code.Ldvirtftn << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineMethod << 8 | (byte) StackBehaviour.Popref << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Ldarg = new OpCode ( |
||||
0xfe << 0 | 0x09 << 8 | (byte) Code.Ldarg << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineArg << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldarga = new OpCode ( |
||||
0xfe << 0 | 0x0a << 8 | (byte) Code.Ldarga << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineArg << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Starg = new OpCode ( |
||||
0xfe << 0 | 0x0b << 8 | (byte) Code.Starg << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineArg << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Ldloc = new OpCode ( |
||||
0xfe << 0 | 0x0c << 8 | (byte) Code.Ldloc << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineVar << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push1 << 24); |
||||
|
||||
public static readonly OpCode Ldloca = new OpCode ( |
||||
0xfe << 0 | 0x0d << 8 | (byte) Code.Ldloca << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineVar << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Stloc = new OpCode ( |
||||
0xfe << 0 | 0x0e << 8 | (byte) Code.Stloc << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineVar << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Localloc = new OpCode ( |
||||
0xfe << 0 | 0x0f << 8 | (byte) Code.Localloc << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Endfilter = new OpCode ( |
||||
0xfe << 0 | 0x11 << 8 | (byte) Code.Endfilter << 16 | (byte) FlowControl.Return << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Unaligned = new OpCode ( |
||||
0xfe << 0 | 0x12 << 8 | (byte) Code.Unaligned << 16 | (byte) FlowControl.Meta << 24, |
||||
(byte) OpCodeType.Prefix << 0 | (byte) OperandType.ShortInlineI << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Volatile = new OpCode ( |
||||
0xfe << 0 | 0x13 << 8 | (byte) Code.Volatile << 16 | (byte) FlowControl.Meta << 24, |
||||
(byte) OpCodeType.Prefix << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Tail = new OpCode ( |
||||
0xfe << 0 | 0x14 << 8 | (byte) Code.Tail << 16 | (byte) FlowControl.Meta << 24, |
||||
(byte) OpCodeType.Prefix << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Initobj = new OpCode ( |
||||
0xfe << 0 | 0x15 << 8 | (byte) Code.Initobj << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Constrained = new OpCode ( |
||||
0xfe << 0 | 0x16 << 8 | (byte) Code.Constrained << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Prefix << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Cpblk = new OpCode ( |
||||
0xfe << 0 | 0x17 << 8 | (byte) Code.Cpblk << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi_popi_popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Initblk = new OpCode ( |
||||
0xfe << 0 | 0x18 << 8 | (byte) Code.Initblk << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Popi_popi_popi << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode No = new OpCode ( |
||||
0xfe << 0 | 0x19 << 8 | (byte) Code.No << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Prefix << 0 | (byte) OperandType.ShortInlineI << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Rethrow = new OpCode ( |
||||
0xfe << 0 | 0x1a << 8 | (byte) Code.Rethrow << 16 | (byte) FlowControl.Throw << 24, |
||||
(byte) OpCodeType.Objmodel << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
|
||||
public static readonly OpCode Sizeof = new OpCode ( |
||||
0xfe << 0 | 0x1c << 8 | (byte) Code.Sizeof << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineType << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Refanytype = new OpCode ( |
||||
0xfe << 0 | 0x1d << 8 | (byte) Code.Refanytype << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Primitive << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop1 << 16 | (byte) StackBehaviour.Pushi << 24); |
||||
|
||||
public static readonly OpCode Readonly = new OpCode ( |
||||
0xfe << 0 | 0x1e << 8 | (byte) Code.Readonly << 16 | (byte) FlowControl.Next << 24, |
||||
(byte) OpCodeType.Prefix << 0 | (byte) OperandType.InlineNone << 8 | (byte) StackBehaviour.Pop0 << 16 | (byte) StackBehaviour.Push0 << 24); |
||||
} |
||||
} |
@ -0,0 +1,70 @@
@@ -0,0 +1,70 @@
|
||||
//
|
||||
// SequencePoint.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil.Cil { |
||||
|
||||
public sealed class SequencePoint { |
||||
|
||||
Document document; |
||||
|
||||
int start_line; |
||||
int start_column; |
||||
int end_line; |
||||
int end_column; |
||||
|
||||
public int StartLine { |
||||
get { return start_line; } |
||||
set { start_line = value; } |
||||
} |
||||
|
||||
public int StartColumn { |
||||
get { return start_column; } |
||||
set { start_column = value; } |
||||
} |
||||
|
||||
public int EndLine { |
||||
get { return end_line; } |
||||
set { end_line = value; } |
||||
} |
||||
|
||||
public int EndColumn { |
||||
get { return end_column; } |
||||
set { end_column = value; } |
||||
} |
||||
|
||||
public Document Document { |
||||
get { return document; } |
||||
set { document = value; } |
||||
} |
||||
|
||||
public SequencePoint (Document document) |
||||
{ |
||||
this.document = document; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,272 @@
@@ -0,0 +1,272 @@
|
||||
//
|
||||
// Symbols.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.IO; |
||||
using System.Runtime.InteropServices; |
||||
using SR = System.Reflection; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil.Cil { |
||||
|
||||
[StructLayout (LayoutKind.Sequential)] |
||||
public struct ImageDebugDirectory { |
||||
public int Characteristics; |
||||
public int TimeDateStamp; |
||||
public short MajorVersion; |
||||
public short MinorVersion; |
||||
public int Type; |
||||
public int SizeOfData; |
||||
public int AddressOfRawData; |
||||
public int PointerToRawData; |
||||
} |
||||
|
||||
public sealed class Scope : IVariableDefinitionProvider { |
||||
|
||||
Instruction start; |
||||
Instruction end; |
||||
|
||||
Collection<Scope> scopes; |
||||
Collection<VariableDefinition> variables; |
||||
|
||||
public Instruction Start { |
||||
get { return start; } |
||||
set { start = value; } |
||||
} |
||||
|
||||
public Instruction End { |
||||
get { return end; } |
||||
set { end = value; } |
||||
} |
||||
|
||||
public bool HasScopes { |
||||
get { return !scopes.IsNullOrEmpty (); } |
||||
} |
||||
|
||||
public Collection<Scope> Scopes { |
||||
get { |
||||
if (scopes == null) |
||||
scopes = new Collection<Scope> (); |
||||
|
||||
return scopes; |
||||
} |
||||
} |
||||
|
||||
public bool HasVariables { |
||||
get { return !variables.IsNullOrEmpty (); } |
||||
} |
||||
|
||||
public Collection<VariableDefinition> Variables { |
||||
get { |
||||
if (variables == null) |
||||
variables = new Collection<VariableDefinition> (); |
||||
|
||||
return variables; |
||||
} |
||||
} |
||||
} |
||||
|
||||
public struct InstructionSymbol { |
||||
|
||||
public readonly int Offset; |
||||
public readonly SequencePoint SequencePoint; |
||||
|
||||
public InstructionSymbol (int offset, SequencePoint sequencePoint) |
||||
{ |
||||
this.Offset = offset; |
||||
this.SequencePoint = sequencePoint; |
||||
} |
||||
} |
||||
|
||||
public sealed class MethodSymbols { |
||||
|
||||
internal int code_size; |
||||
internal string method_name; |
||||
internal MetadataToken method_token; |
||||
internal MetadataToken local_var_token; |
||||
internal Collection<VariableDefinition> variables; |
||||
internal Collection<InstructionSymbol> instructions; |
||||
|
||||
public bool HasVariables { |
||||
get { return !variables.IsNullOrEmpty (); } |
||||
} |
||||
|
||||
public Collection<VariableDefinition> Variables { |
||||
get { |
||||
if (variables == null) |
||||
variables = new Collection<VariableDefinition> (); |
||||
|
||||
return variables; |
||||
} |
||||
} |
||||
|
||||
public Collection<InstructionSymbol> Instructions { |
||||
get { |
||||
if (instructions == null) |
||||
instructions = new Collection<InstructionSymbol> (); |
||||
|
||||
return instructions; |
||||
} |
||||
} |
||||
|
||||
public int CodeSize { |
||||
get { return code_size; } |
||||
} |
||||
|
||||
public string MethodName { |
||||
get { return method_name; } |
||||
} |
||||
|
||||
public MetadataToken MethodToken { |
||||
get { return method_token; } |
||||
} |
||||
|
||||
public MetadataToken LocalVarToken { |
||||
get { return local_var_token; } |
||||
} |
||||
|
||||
public MethodSymbols (string methodName) |
||||
{ |
||||
this.method_name = methodName; |
||||
} |
||||
} |
||||
|
||||
public delegate Instruction InstructionMapper (int offset); |
||||
|
||||
public interface ISymbolReader : IDisposable { |
||||
|
||||
bool ProcessDebugHeader (ImageDebugDirectory directory, byte [] header); |
||||
void Read (MethodBody body, InstructionMapper mapper); |
||||
void Read (MethodSymbols symbols); |
||||
} |
||||
|
||||
public interface ISymbolReaderProvider { |
||||
|
||||
ISymbolReader GetSymbolReader (ModuleDefinition module, string fileName); |
||||
ISymbolReader GetSymbolReader (ModuleDefinition module, Stream symbolStream); |
||||
} |
||||
|
||||
static class SymbolProvider { |
||||
|
||||
static readonly string symbol_kind = Type.GetType ("Mono.Runtime") != null ? "Mdb" : "Pdb"; |
||||
|
||||
static SR.AssemblyName GetPlatformSymbolAssemblyName () |
||||
{ |
||||
var cecil_name = typeof (SymbolProvider).Assembly.GetName (); |
||||
|
||||
var name = new SR.AssemblyName { |
||||
Name = "Mono.Cecil." + symbol_kind, |
||||
Version = cecil_name.Version, |
||||
}; |
||||
|
||||
name.SetPublicKeyToken (cecil_name.GetPublicKeyToken ()); |
||||
|
||||
return name; |
||||
} |
||||
|
||||
static Type GetPlatformType (string fullname) |
||||
{ |
||||
var type = Type.GetType (fullname); |
||||
if (type != null) |
||||
return type; |
||||
|
||||
var assembly_name = GetPlatformSymbolAssemblyName (); |
||||
|
||||
type = Type.GetType (fullname + ", " + assembly_name.FullName); |
||||
if (type != null) |
||||
return type; |
||||
|
||||
try { |
||||
var assembly = SR.Assembly.Load (assembly_name); |
||||
if (assembly != null) |
||||
return assembly.GetType (fullname); |
||||
} catch (FileNotFoundException) { |
||||
#if !CF
|
||||
} catch (FileLoadException) { |
||||
#endif
|
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
static ISymbolReaderProvider reader_provider; |
||||
|
||||
public static ISymbolReaderProvider GetPlatformReaderProvider () |
||||
{ |
||||
if (reader_provider != null) |
||||
return reader_provider; |
||||
|
||||
var type = GetPlatformType (GetProviderTypeName ("ReaderProvider")); |
||||
if (type == null) |
||||
return null; |
||||
|
||||
return reader_provider = (ISymbolReaderProvider) Activator.CreateInstance (type); |
||||
} |
||||
|
||||
static string GetProviderTypeName (string name) |
||||
{ |
||||
return "Mono.Cecil." + symbol_kind + "." + symbol_kind + name; |
||||
} |
||||
|
||||
#if !READ_ONLY
|
||||
|
||||
static ISymbolWriterProvider writer_provider; |
||||
|
||||
public static ISymbolWriterProvider GetPlatformWriterProvider () |
||||
{ |
||||
if (writer_provider != null) |
||||
return writer_provider; |
||||
|
||||
var type = GetPlatformType (GetProviderTypeName ("WriterProvider")); |
||||
if (type == null) |
||||
return null; |
||||
|
||||
return writer_provider = (ISymbolWriterProvider) Activator.CreateInstance (type); |
||||
} |
||||
|
||||
#endif
|
||||
} |
||||
|
||||
#if !READ_ONLY
|
||||
|
||||
public interface ISymbolWriter : IDisposable { |
||||
|
||||
bool GetDebugHeader (out ImageDebugDirectory directory, out byte [] header); |
||||
void Write (MethodBody body); |
||||
void Write (MethodSymbols symbols); |
||||
} |
||||
|
||||
public interface ISymbolWriterProvider { |
||||
|
||||
ISymbolWriter GetSymbolWriter (ModuleDefinition module, string fileName); |
||||
ISymbolWriter GetSymbolWriter (ModuleDefinition module, Stream symbolStream); |
||||
} |
||||
|
||||
#endif
|
||||
} |
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
//
|
||||
// VariableDefinition.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil.Cil { |
||||
|
||||
public sealed class VariableDefinition : VariableReference { |
||||
|
||||
public bool IsPinned { |
||||
get { return variable_type.IsPinned; } |
||||
} |
||||
|
||||
public VariableDefinition (TypeReference variableType) |
||||
: base (variableType) |
||||
{ |
||||
} |
||||
|
||||
public VariableDefinition (string name, TypeReference variableType) |
||||
: base (name, variableType) |
||||
{ |
||||
} |
||||
|
||||
public override VariableDefinition Resolve () |
||||
{ |
||||
return this; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,75 @@
@@ -0,0 +1,75 @@
|
||||
//
|
||||
// VariableReference.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil.Cil { |
||||
|
||||
public abstract class VariableReference { |
||||
|
||||
string name; |
||||
internal int index = -1; |
||||
protected TypeReference variable_type; |
||||
|
||||
public string Name { |
||||
get { return name; } |
||||
set { name = value; } |
||||
} |
||||
|
||||
public TypeReference VariableType { |
||||
get { return variable_type; } |
||||
set { variable_type = value; } |
||||
} |
||||
|
||||
public int Index { |
||||
get { return index; } |
||||
} |
||||
|
||||
internal VariableReference (TypeReference variable_type) |
||||
: this (string.Empty, variable_type) |
||||
{ |
||||
} |
||||
|
||||
internal VariableReference (string name, TypeReference variable_type) |
||||
{ |
||||
this.name = name; |
||||
this.variable_type = variable_type; |
||||
} |
||||
|
||||
public abstract VariableDefinition Resolve (); |
||||
|
||||
public override string ToString () |
||||
{ |
||||
if (!string.IsNullOrEmpty (name)) |
||||
return name; |
||||
|
||||
if (index >= 0) |
||||
return "V_" + index; |
||||
|
||||
return string.Empty; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,59 @@
@@ -0,0 +1,59 @@
|
||||
//
|
||||
// BlobHeap.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using Mono.Cecil.PE; |
||||
|
||||
namespace Mono.Cecil.Metadata { |
||||
|
||||
sealed class BlobHeap : Heap { |
||||
|
||||
public BlobHeap (Section section, uint start, uint size) |
||||
: base (section, start, size) |
||||
{ |
||||
} |
||||
|
||||
public byte [] Read (uint index) |
||||
{ |
||||
if (index == 0 || index > Size - 1) |
||||
return Empty<byte>.Array; |
||||
|
||||
var data = Section.Data; |
||||
|
||||
int position = (int) (index + Offset); |
||||
int length = (int) data.ReadCompressedUInt32 (ref position); |
||||
|
||||
var buffer = new byte [length]; |
||||
|
||||
Buffer.BlockCopy (data, position, buffer, 0, length); |
||||
|
||||
return buffer; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,373 @@
@@ -0,0 +1,373 @@
|
||||
//
|
||||
// TableHeapBuffer.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Text; |
||||
|
||||
using Mono.Cecil.PE; |
||||
|
||||
using RVA = System.UInt32; |
||||
|
||||
#if !READ_ONLY
|
||||
|
||||
namespace Mono.Cecil.Metadata { |
||||
|
||||
sealed class TableHeapBuffer : HeapBuffer { |
||||
|
||||
readonly ModuleDefinition module; |
||||
readonly MetadataBuilder metadata; |
||||
|
||||
internal MetadataTable [] tables = new MetadataTable [45]; |
||||
|
||||
bool large_string; |
||||
bool large_blob; |
||||
readonly int [] coded_index_sizes = new int [13]; |
||||
readonly Func<Table, int> counter; |
||||
|
||||
public override bool IsEmpty { |
||||
get { return false; } |
||||
} |
||||
|
||||
public TableHeapBuffer (ModuleDefinition module, MetadataBuilder metadata) |
||||
: base (24) |
||||
{ |
||||
this.module = module; |
||||
this.metadata = metadata; |
||||
this.counter = GetTableLength; |
||||
} |
||||
|
||||
int GetTableLength (Table table) |
||||
{ |
||||
var md_table = tables [(int) table]; |
||||
return md_table != null ? md_table.Length : 0; |
||||
} |
||||
|
||||
public TTable GetTable<TTable> (Table table) where TTable : MetadataTable, new () |
||||
{ |
||||
var md_table = (TTable) tables [(int) table]; |
||||
if (md_table != null) |
||||
return md_table; |
||||
|
||||
md_table = new TTable (); |
||||
tables [(int) table] = md_table; |
||||
return md_table; |
||||
} |
||||
|
||||
public void WriteBySize (uint value, int size) |
||||
{ |
||||
if (size == 4) |
||||
WriteUInt32 (value); |
||||
else |
||||
WriteUInt16 ((ushort) value); |
||||
} |
||||
|
||||
public void WriteBySize (uint value, bool large) |
||||
{ |
||||
if (large) |
||||
WriteUInt32 (value); |
||||
else |
||||
WriteUInt16 ((ushort) value); |
||||
} |
||||
|
||||
public void WriteString (uint @string) |
||||
{ |
||||
WriteBySize (@string, large_string); |
||||
} |
||||
|
||||
public void WriteBlob (uint blob) |
||||
{ |
||||
WriteBySize (blob, large_blob); |
||||
} |
||||
|
||||
public void WriteRID (uint rid, Table table) |
||||
{ |
||||
var md_table = tables [(int) table]; |
||||
WriteBySize (rid, md_table == null ? false : md_table.IsLarge); |
||||
} |
||||
|
||||
int GetCodedIndexSize (CodedIndex coded_index) |
||||
{ |
||||
var index = (int) coded_index; |
||||
var size = coded_index_sizes [index]; |
||||
if (size != 0) |
||||
return size; |
||||
|
||||
return coded_index_sizes [index] = coded_index.GetSize (counter); |
||||
} |
||||
|
||||
public void WriteCodedRID (uint rid, CodedIndex coded_index) |
||||
{ |
||||
WriteBySize (rid, GetCodedIndexSize (coded_index)); |
||||
} |
||||
|
||||
public void WriteTableHeap () |
||||
{ |
||||
WriteUInt32 (0); // Reserved
|
||||
WriteByte (GetTableHeapVersion ()); // MajorVersion
|
||||
WriteByte (0); // MinorVersion
|
||||
WriteByte (GetHeapSizes ()); // HeapSizes
|
||||
WriteByte (10); // Reserved2
|
||||
WriteUInt64 (GetValid ()); // Valid
|
||||
WriteUInt64 (0x0016003301fa00); // Sorted
|
||||
|
||||
WriteRowCount (); |
||||
WriteTables (); |
||||
} |
||||
|
||||
void WriteRowCount () |
||||
{ |
||||
for (int i = 0; i < tables.Length; i++) { |
||||
var table = tables [i]; |
||||
if (table == null || table.Length == 0) |
||||
continue; |
||||
|
||||
WriteUInt32 ((uint) table.Length); |
||||
} |
||||
} |
||||
|
||||
void WriteTables () |
||||
{ |
||||
for (int i = 0; i < tables.Length; i++) { |
||||
var table = tables [i]; |
||||
if (table == null || table.Length == 0) |
||||
continue; |
||||
|
||||
table.Write (this); |
||||
} |
||||
} |
||||
|
||||
ulong GetValid () |
||||
{ |
||||
ulong valid = 0; |
||||
|
||||
for (int i = 0; i < tables.Length; i++) { |
||||
var table = tables [i]; |
||||
if (table == null || table.Length == 0) |
||||
continue; |
||||
|
||||
table.Sort (); |
||||
valid |= (1UL << i); |
||||
} |
||||
|
||||
return valid; |
||||
} |
||||
|
||||
byte GetHeapSizes () |
||||
{ |
||||
byte heap_sizes = 0; |
||||
|
||||
if (metadata.string_heap.IsLarge) { |
||||
large_string = true; |
||||
heap_sizes |= 0x01; |
||||
} |
||||
|
||||
if (metadata.blob_heap.IsLarge) { |
||||
large_blob = true; |
||||
heap_sizes |= 0x04; |
||||
} |
||||
|
||||
return heap_sizes; |
||||
} |
||||
|
||||
byte GetTableHeapVersion () |
||||
{ |
||||
switch (module.Runtime) { |
||||
case TargetRuntime.Net_1_0: |
||||
case TargetRuntime.Net_1_1: |
||||
return 1; |
||||
default: |
||||
return 2; |
||||
} |
||||
} |
||||
|
||||
public void FixupData (RVA data_rva) |
||||
{ |
||||
var table = GetTable<FieldRVATable> (Table.FieldRVA); |
||||
if (table.length == 0) |
||||
return; |
||||
|
||||
var field_idx_size = GetTable<FieldTable> (Table.Field).IsLarge ? 4 : 2; |
||||
var previous = this.position; |
||||
|
||||
base.position = table.position; |
||||
for (int i = 0; i < table.length; i++) { |
||||
var rva = ReadUInt32 (); |
||||
base.position -= 4; |
||||
WriteUInt32 (rva + data_rva); |
||||
base.position += field_idx_size; |
||||
} |
||||
|
||||
base.position = previous; |
||||
} |
||||
} |
||||
|
||||
sealed class ResourceBuffer : ByteBuffer { |
||||
|
||||
public ResourceBuffer () |
||||
: base (0) |
||||
{ |
||||
} |
||||
|
||||
public uint AddResource (byte [] resource) |
||||
{ |
||||
var offset = (uint) this.position; |
||||
WriteInt32 (resource.Length); |
||||
WriteBytes (resource); |
||||
return offset; |
||||
} |
||||
} |
||||
|
||||
sealed class DataBuffer : ByteBuffer { |
||||
|
||||
public DataBuffer () |
||||
: base (0) |
||||
{ |
||||
} |
||||
|
||||
public RVA AddData (byte [] data) |
||||
{ |
||||
var rva = (RVA) position; |
||||
WriteBytes (data); |
||||
return rva; |
||||
} |
||||
} |
||||
|
||||
abstract class HeapBuffer : ByteBuffer { |
||||
|
||||
public bool IsLarge { |
||||
get { return base.length > 65536; } |
||||
} |
||||
|
||||
public abstract bool IsEmpty { get; } |
||||
|
||||
protected HeapBuffer (int length) |
||||
: base (length) |
||||
{ |
||||
} |
||||
} |
||||
|
||||
class StringHeapBuffer : HeapBuffer { |
||||
|
||||
readonly Dictionary<string, uint> strings = new Dictionary<string, uint> (); |
||||
|
||||
public sealed override bool IsEmpty { |
||||
get { return length <= 1; } |
||||
} |
||||
|
||||
public StringHeapBuffer () |
||||
: base (1) |
||||
{ |
||||
WriteByte (0); |
||||
} |
||||
|
||||
public uint GetStringIndex (string @string) |
||||
{ |
||||
uint index; |
||||
if (strings.TryGetValue (@string, out index)) |
||||
return index; |
||||
|
||||
index = (uint) base.position; |
||||
WriteString (@string); |
||||
strings.Add (@string, index); |
||||
return index; |
||||
} |
||||
|
||||
protected virtual void WriteString (string @string) |
||||
{ |
||||
WriteBytes (Encoding.UTF8.GetBytes (@string)); |
||||
WriteByte (0); |
||||
} |
||||
} |
||||
|
||||
sealed class BlobHeapBuffer : HeapBuffer { |
||||
|
||||
readonly Dictionary<ByteBuffer, uint> blobs = new Dictionary<ByteBuffer, uint> (new ByteBufferEqualityComparer ()); |
||||
|
||||
public override bool IsEmpty { |
||||
get { return length <= 1; } |
||||
} |
||||
|
||||
public BlobHeapBuffer () |
||||
: base (1) |
||||
{ |
||||
WriteByte (0); |
||||
} |
||||
|
||||
public uint GetBlobIndex (ByteBuffer blob) |
||||
{ |
||||
uint index; |
||||
if (blobs.TryGetValue (blob, out index)) |
||||
return index; |
||||
|
||||
index = (uint) base.position; |
||||
WriteBlob (blob); |
||||
blobs.Add (blob, index); |
||||
return index; |
||||
} |
||||
|
||||
void WriteBlob (ByteBuffer blob) |
||||
{ |
||||
WriteCompressedUInt32 ((uint) blob.length); |
||||
WriteBytes (blob); |
||||
} |
||||
} |
||||
|
||||
sealed class UserStringHeapBuffer : StringHeapBuffer { |
||||
|
||||
protected override void WriteString (string @string) |
||||
{ |
||||
WriteCompressedUInt32 ((uint) @string.Length * 2 + 1); |
||||
|
||||
byte special = 0; |
||||
|
||||
for (int i = 0; i < @string.Length; i++) { |
||||
var @char = @string [i]; |
||||
WriteUInt16 (@char); |
||||
|
||||
if (special == 1) |
||||
continue; |
||||
|
||||
if (@char < 0x20 || @char > 0x7e) { |
||||
if (@char > 0x7e |
||||
|| (@char >= 0x01 && @char <= 0x08) |
||||
|| (@char >= 0x0e && @char <= 0x1f) |
||||
|| @char == 0x27 |
||||
|| @char == 0x2d) { |
||||
|
||||
special = 1; |
||||
} |
||||
} |
||||
} |
||||
|
||||
WriteByte (special); |
||||
} |
||||
} |
||||
} |
||||
|
||||
#endif
|
@ -0,0 +1,46 @@
@@ -0,0 +1,46 @@
|
||||
//
|
||||
// CodedIndex.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil.Metadata { |
||||
|
||||
enum CodedIndex { |
||||
TypeDefOrRef, |
||||
HasConstant, |
||||
HasCustomAttribute, |
||||
HasFieldMarshal, |
||||
HasDeclSecurity, |
||||
MemberRefParent, |
||||
HasSemantics, |
||||
MethodDefOrRef, |
||||
MemberForwarded, |
||||
Implementation, |
||||
CustomAttributeType, |
||||
ResolutionScope, |
||||
TypeOrMethodDef |
||||
} |
||||
} |
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
//
|
||||
// ElementType.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil.Metadata { |
||||
|
||||
enum ElementType : byte { |
||||
None = 0x00, |
||||
Void = 0x01, |
||||
Boolean = 0x02, |
||||
Char = 0x03, |
||||
I1 = 0x04, |
||||
U1 = 0x05, |
||||
I2 = 0x06, |
||||
U2 = 0x07, |
||||
I4 = 0x08, |
||||
U4 = 0x09, |
||||
I8 = 0x0a, |
||||
U8 = 0x0b, |
||||
R4 = 0x0c, |
||||
R8 = 0x0d, |
||||
String = 0x0e, |
||||
Ptr = 0x0f, // Followed by <type> token
|
||||
ByRef = 0x10, // Followed by <type> token
|
||||
ValueType = 0x11, // Followed by <type> token
|
||||
Class = 0x12, // Followed by <type> token
|
||||
Var = 0x13, // Followed by generic parameter number
|
||||
Array = 0x14, // <type> <rank> <boundsCount> <bound1> <loCount> <lo1>
|
||||
GenericInst = 0x15, // <type> <type-arg-count> <type-1> ... <type-n> */
|
||||
TypedByRef = 0x16, |
||||
I = 0x18, // System.IntPtr
|
||||
U = 0x19, // System.UIntPtr
|
||||
FnPtr = 0x1b, // Followed by full method signature
|
||||
Object = 0x1c, // System.Object
|
||||
SzArray = 0x1d, // Single-dim array with 0 lower bound
|
||||
MVar = 0x1e, // Followed by generic parameter number
|
||||
CModReqD = 0x1f, // Required modifier : followed by a TypeDef or TypeRef token
|
||||
CModOpt = 0x20, // Optional modifier : followed by a TypeDef or TypeRef token
|
||||
Internal = 0x21, // Implemented within the CLI
|
||||
Modifier = 0x40, // Or'd with following element types
|
||||
Sentinel = 0x41, // Sentinel for varargs method signature
|
||||
Pinned = 0x45, // Denotes a local variable that points at a pinned object
|
||||
|
||||
// special undocumented constants
|
||||
Type = 0x50, |
||||
Boxed = 0x51, |
||||
Enum = 0x55 |
||||
} |
||||
} |
@ -0,0 +1,59 @@
@@ -0,0 +1,59 @@
|
||||
//
|
||||
// GuidHeap.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using Mono.Cecil.PE; |
||||
|
||||
namespace Mono.Cecil.Metadata { |
||||
|
||||
sealed class GuidHeap : Heap { |
||||
|
||||
public GuidHeap (Section section, uint start, uint size) |
||||
: base (section, start, size) |
||||
{ |
||||
} |
||||
|
||||
public Guid Read (uint index) |
||||
{ |
||||
if (index == 0) |
||||
return new Guid (); |
||||
|
||||
const int guid_size = 16; |
||||
|
||||
var buffer = new byte [guid_size]; |
||||
|
||||
index--; |
||||
|
||||
Buffer.BlockCopy (Section.Data, (int) (Offset + index), buffer, 0, guid_size); |
||||
|
||||
return new Guid (buffer); |
||||
|
||||
} |
||||
} |
||||
} |
@ -0,0 +1,48 @@
@@ -0,0 +1,48 @@
|
||||
//
|
||||
// Heap.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using Mono.Cecil.PE; |
||||
|
||||
namespace Mono.Cecil.Metadata { |
||||
|
||||
abstract class Heap { |
||||
|
||||
public int IndexSize; |
||||
|
||||
public readonly Section Section; |
||||
public readonly uint Offset; |
||||
public readonly uint Size; |
||||
|
||||
protected Heap (Section section, uint offset, uint size) |
||||
{ |
||||
this.Section = section; |
||||
this.Offset = offset; |
||||
this.Size = size; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,105 @@
@@ -0,0 +1,105 @@
|
||||
//
|
||||
// MetadataToken.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public struct MetadataToken { |
||||
|
||||
readonly uint token; |
||||
|
||||
public uint RID { |
||||
get { return token & 0x00ffffff; } |
||||
} |
||||
|
||||
public TokenType TokenType { |
||||
get { return (TokenType) (token & 0xff000000); } |
||||
} |
||||
|
||||
public static readonly MetadataToken Zero = new MetadataToken ((uint) 0); |
||||
|
||||
public MetadataToken (uint token) |
||||
{ |
||||
this.token = token; |
||||
} |
||||
|
||||
public MetadataToken (TokenType type) |
||||
: this (type, 0) |
||||
{ |
||||
} |
||||
|
||||
public MetadataToken (TokenType type, uint rid) |
||||
{ |
||||
token = (uint) type | rid; |
||||
} |
||||
|
||||
public MetadataToken (TokenType type, int rid) |
||||
{ |
||||
token = (uint) type | (uint) rid; |
||||
} |
||||
|
||||
public int ToInt32 () |
||||
{ |
||||
return (int) token; |
||||
} |
||||
|
||||
public uint ToUInt32 () |
||||
{ |
||||
return token; |
||||
} |
||||
|
||||
public override int GetHashCode () |
||||
{ |
||||
return (int) token; |
||||
} |
||||
|
||||
public override bool Equals (object obj) |
||||
{ |
||||
if (obj is MetadataToken) { |
||||
var other = (MetadataToken) obj; |
||||
return other.token == token; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
public static bool operator == (MetadataToken one, MetadataToken other) |
||||
{ |
||||
return one.token == other.token; |
||||
} |
||||
|
||||
public static bool operator != (MetadataToken one, MetadataToken other) |
||||
{ |
||||
return one.token != other.token; |
||||
} |
||||
|
||||
public override string ToString () |
||||
{ |
||||
return string.Format ("[{0}:0x{1}]", TokenType, RID.ToString ("x4")); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,170 @@
@@ -0,0 +1,170 @@
|
||||
//
|
||||
// Row.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil.Metadata { |
||||
|
||||
struct Row<T1, T2> { |
||||
internal T1 Col1; |
||||
internal T2 Col2; |
||||
|
||||
public Row (T1 col1, T2 col2) |
||||
{ |
||||
Col1 = col1; |
||||
Col2 = col2; |
||||
} |
||||
} |
||||
|
||||
struct Row<T1, T2, T3> { |
||||
internal T1 Col1; |
||||
internal T2 Col2; |
||||
internal T3 Col3; |
||||
|
||||
public Row (T1 col1, T2 col2, T3 col3) |
||||
{ |
||||
Col1 = col1; |
||||
Col2 = col2; |
||||
Col3 = col3; |
||||
} |
||||
} |
||||
|
||||
struct Row<T1, T2, T3, T4> { |
||||
internal T1 Col1; |
||||
internal T2 Col2; |
||||
internal T3 Col3; |
||||
internal T4 Col4; |
||||
|
||||
public Row (T1 col1, T2 col2, T3 col3, T4 col4) |
||||
{ |
||||
Col1 = col1; |
||||
Col2 = col2; |
||||
Col3 = col3; |
||||
Col4 = col4; |
||||
} |
||||
} |
||||
|
||||
struct Row<T1, T2, T3, T4, T5> { |
||||
internal T1 Col1; |
||||
internal T2 Col2; |
||||
internal T3 Col3; |
||||
internal T4 Col4; |
||||
internal T5 Col5; |
||||
|
||||
public Row (T1 col1, T2 col2, T3 col3, T4 col4, T5 col5) |
||||
{ |
||||
Col1 = col1; |
||||
Col2 = col2; |
||||
Col3 = col3; |
||||
Col4 = col4; |
||||
Col5 = col5; |
||||
} |
||||
} |
||||
|
||||
struct Row<T1, T2, T3, T4, T5, T6> { |
||||
internal T1 Col1; |
||||
internal T2 Col2; |
||||
internal T3 Col3; |
||||
internal T4 Col4; |
||||
internal T5 Col5; |
||||
internal T6 Col6; |
||||
|
||||
public Row (T1 col1, T2 col2, T3 col3, T4 col4, T5 col5, T6 col6) |
||||
{ |
||||
Col1 = col1; |
||||
Col2 = col2; |
||||
Col3 = col3; |
||||
Col4 = col4; |
||||
Col5 = col5; |
||||
Col6 = col6; |
||||
} |
||||
} |
||||
|
||||
struct Row<T1, T2, T3, T4, T5, T6, T7, T8, T9> { |
||||
internal T1 Col1; |
||||
internal T2 Col2; |
||||
internal T3 Col3; |
||||
internal T4 Col4; |
||||
internal T5 Col5; |
||||
internal T6 Col6; |
||||
internal T7 Col7; |
||||
internal T8 Col8; |
||||
internal T9 Col9; |
||||
|
||||
public Row (T1 col1, T2 col2, T3 col3, T4 col4, T5 col5, T6 col6, T7 col7, T8 col8, T9 col9) |
||||
{ |
||||
Col1 = col1; |
||||
Col2 = col2; |
||||
Col3 = col3; |
||||
Col4 = col4; |
||||
Col5 = col5; |
||||
Col6 = col6; |
||||
Col7 = col7; |
||||
Col8 = col8; |
||||
Col9 = col9; |
||||
} |
||||
} |
||||
|
||||
sealed class RowEqualityComparer : IEqualityComparer<Row<string, string>>, IEqualityComparer<Row<uint, uint>>, IEqualityComparer<Row<uint, uint, uint>> { |
||||
|
||||
public bool Equals (Row<string, string> x, Row<string, string> y) |
||||
{ |
||||
return x.Col1 == y.Col1 |
||||
&& x.Col2 == y.Col2; |
||||
} |
||||
|
||||
public int GetHashCode (Row<string, string> obj) |
||||
{ |
||||
string x = obj.Col1, y = obj.Col2; |
||||
return (x != null ? x.GetHashCode () : 0) ^ (y != null ? y.GetHashCode () : 0); |
||||
} |
||||
|
||||
public bool Equals (Row<uint, uint> x, Row<uint, uint> y) |
||||
{ |
||||
return x.Col1 == y.Col1 |
||||
&& x.Col2 == y.Col2; |
||||
} |
||||
|
||||
public int GetHashCode (Row<uint, uint> obj) |
||||
{ |
||||
return (int) (obj.Col1 ^ obj.Col2); |
||||
} |
||||
|
||||
public bool Equals (Row<uint, uint, uint> x, Row<uint, uint, uint> y) |
||||
{ |
||||
return x.Col1 == y.Col1 |
||||
&& x.Col2 == y.Col2 |
||||
&& x.Col3 == y.Col3; |
||||
} |
||||
|
||||
public int GetHashCode (Row<uint, uint, uint> obj) |
||||
{ |
||||
return (int) (obj.Col1 ^ obj.Col2 ^ obj.Col3); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,81 @@
@@ -0,0 +1,81 @@
|
||||
//
|
||||
// StringHeap.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Text; |
||||
|
||||
using Mono.Cecil.PE; |
||||
|
||||
namespace Mono.Cecil.Metadata { |
||||
|
||||
class StringHeap : Heap { |
||||
|
||||
readonly Dictionary<uint, string> strings = new Dictionary<uint, string> (); |
||||
|
||||
public StringHeap (Section section, uint start, uint size) |
||||
: base (section, start, size) |
||||
{ |
||||
} |
||||
|
||||
public string Read (uint index) |
||||
{ |
||||
if (index == 0) |
||||
return string.Empty; |
||||
|
||||
string @string; |
||||
if (strings.TryGetValue (index, out @string)) |
||||
return @string; |
||||
|
||||
if (index > Size - 1) |
||||
return string.Empty; |
||||
|
||||
@string = ReadStringAt (index); |
||||
if (@string.Length != 0) |
||||
strings.Add (index, @string); |
||||
|
||||
return @string; |
||||
} |
||||
|
||||
protected virtual string ReadStringAt (uint index) |
||||
{ |
||||
int length = 0; |
||||
byte [] data = Section.Data; |
||||
int start = (int) (index + Offset); |
||||
|
||||
for (int i = start; ; i++) { |
||||
if (data [i] == 0) |
||||
break; |
||||
|
||||
length++; |
||||
} |
||||
|
||||
return Encoding.UTF8.GetString (data, start, length); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,153 @@
@@ -0,0 +1,153 @@
|
||||
//
|
||||
// TableHeap.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using Mono.Cecil.PE; |
||||
|
||||
namespace Mono.Cecil.Metadata { |
||||
|
||||
enum Table : byte { |
||||
Module = 0x00, |
||||
TypeRef = 0x01, |
||||
TypeDef = 0x02, |
||||
FieldPtr = 0x03, |
||||
Field = 0x04, |
||||
MethodPtr = 0x05, |
||||
Method = 0x06, |
||||
ParamPtr = 0x07, |
||||
Param = 0x08, |
||||
InterfaceImpl = 0x09, |
||||
MemberRef = 0x0a, |
||||
Constant = 0x0b, |
||||
CustomAttribute = 0x0c, |
||||
FieldMarshal = 0x0d, |
||||
DeclSecurity = 0x0e, |
||||
ClassLayout = 0x0f, |
||||
FieldLayout = 0x10, |
||||
StandAloneSig = 0x11, |
||||
EventMap = 0x12, |
||||
EventPtr = 0x13, |
||||
Event = 0x14, |
||||
PropertyMap = 0x15, |
||||
PropertyPtr = 0x16, |
||||
Property = 0x17, |
||||
MethodSemantics = 0x18, |
||||
MethodImpl = 0x19, |
||||
ModuleRef = 0x1a, |
||||
TypeSpec = 0x1b, |
||||
ImplMap = 0x1c, |
||||
FieldRVA = 0x1d, |
||||
Assembly = 0x20, |
||||
AssemblyProcessor = 0x21, |
||||
AssemblyOS = 0x22, |
||||
AssemblyRef = 0x23, |
||||
AssemblyRefProcessor = 0x24, |
||||
AssemblyRefOS = 0x25, |
||||
File = 0x26, |
||||
ExportedType = 0x27, |
||||
ManifestResource = 0x28, |
||||
NestedClass = 0x29, |
||||
GenericParam = 0x2a, |
||||
MethodSpec = 0x2b, |
||||
GenericParamConstraint = 0x2c, |
||||
} |
||||
|
||||
struct TableInformation { |
||||
public uint Offset; |
||||
public uint Length; |
||||
public uint RowSize; |
||||
} |
||||
|
||||
sealed class TableHeap : Heap { |
||||
|
||||
public long Valid; |
||||
public long Sorted; |
||||
|
||||
public static readonly Table [] TableIdentifiers = new [] { |
||||
Table.Module, |
||||
Table.TypeRef, |
||||
Table.TypeDef, |
||||
Table.FieldPtr, |
||||
Table.Field, |
||||
Table.MethodPtr, |
||||
Table.Method, |
||||
Table.ParamPtr, |
||||
Table.Param, |
||||
Table.InterfaceImpl, |
||||
Table.MemberRef, |
||||
Table.Constant, |
||||
Table.CustomAttribute, |
||||
Table.FieldMarshal, |
||||
Table.DeclSecurity, |
||||
Table.ClassLayout, |
||||
Table.FieldLayout, |
||||
Table.StandAloneSig, |
||||
Table.EventMap, |
||||
Table.EventPtr, |
||||
Table.Event, |
||||
Table.PropertyMap, |
||||
Table.PropertyPtr, |
||||
Table.Property, |
||||
Table.MethodSemantics, |
||||
Table.MethodImpl, |
||||
Table.ModuleRef, |
||||
Table.TypeSpec, |
||||
Table.ImplMap, |
||||
Table.FieldRVA, |
||||
Table.Assembly, |
||||
Table.AssemblyProcessor, |
||||
Table.AssemblyOS, |
||||
Table.AssemblyRef, |
||||
Table.AssemblyRefProcessor, |
||||
Table.AssemblyRefOS, |
||||
Table.File, |
||||
Table.ExportedType, |
||||
Table.ManifestResource, |
||||
Table.NestedClass, |
||||
Table.GenericParam, |
||||
Table.MethodSpec, |
||||
Table.GenericParamConstraint, |
||||
}; |
||||
|
||||
public readonly TableInformation [] Tables = new TableInformation [45]; |
||||
|
||||
public TableInformation this [Table table] { |
||||
get { return Tables [(int) table]; } |
||||
} |
||||
|
||||
public TableHeap (Section section, uint start, uint size) |
||||
: base (section, start, size) |
||||
{ |
||||
} |
||||
|
||||
public bool HasTable (Table table) |
||||
{ |
||||
return (Valid & (1L << (int) table)) != 0; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,56 @@
@@ -0,0 +1,56 @@
|
||||
//
|
||||
// TokenType.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public enum TokenType : uint { |
||||
Module = 0x00000000, |
||||
TypeRef = 0x01000000, |
||||
TypeDef = 0x02000000, |
||||
Field = 0x04000000, |
||||
Method = 0x06000000, |
||||
Param = 0x08000000, |
||||
InterfaceImpl = 0x09000000, |
||||
MemberRef = 0x0a000000, |
||||
CustomAttribute = 0x0c000000, |
||||
Permission = 0x0e000000, |
||||
Signature = 0x11000000, |
||||
Event = 0x14000000, |
||||
Property = 0x17000000, |
||||
ModuleRef = 0x1a000000, |
||||
TypeSpec = 0x1b000000, |
||||
Assembly = 0x20000000, |
||||
AssemblyRef = 0x23000000, |
||||
File = 0x26000000, |
||||
ExportedType = 0x27000000, |
||||
ManifestResource = 0x28000000, |
||||
GenericParam = 0x2a000000, |
||||
MethodSpec = 0x2b000000, |
||||
String = 0x70000000, |
||||
} |
||||
} |
@ -0,0 +1,59 @@
@@ -0,0 +1,59 @@
|
||||
//
|
||||
// UserStringHeap.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using Mono.Cecil.PE; |
||||
|
||||
namespace Mono.Cecil.Metadata { |
||||
|
||||
sealed class UserStringHeap : StringHeap { |
||||
|
||||
public UserStringHeap (Section section, uint start, uint size) |
||||
: base (section, start, size) |
||||
{ |
||||
} |
||||
|
||||
protected override string ReadStringAt (uint index) |
||||
{ |
||||
byte [] data = Section.Data; |
||||
int start = (int) (index + Offset); |
||||
|
||||
uint length = (uint) (data.ReadCompressedUInt32 (ref start) & ~1); |
||||
if (length < 1) |
||||
return string.Empty; |
||||
|
||||
var chars = new char [length / 2]; |
||||
|
||||
for (int i = start, j = 0; i < start + length; i += 2) |
||||
chars [j++] = (char) (data [i] | (data [i + 1] << 8)); |
||||
|
||||
return new string (chars); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,529 @@
@@ -0,0 +1,529 @@
|
||||
//
|
||||
// Utilities.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using Mono.Cecil.Metadata; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
static partial class Mixin { |
||||
|
||||
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; |
||||
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; |
||||
} |
||||
default: |
||||
goto exit; |
||||
} |
||||
ret: |
||||
return new MetadataToken (token_type, rid); |
||||
exit: |
||||
return MetadataToken.Zero; |
||||
} |
||||
|
||||
#if !READ_ONLY
|
||||
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; |
||||
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; |
||||
} |
||||
default: |
||||
goto exit; |
||||
} |
||||
exit: |
||||
throw new ArgumentException (); |
||||
} |
||||
#endif
|
||||
|
||||
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 |
||||
}; |
||||
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; |
||||
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; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,51 @@
@@ -0,0 +1,51 @@
|
||||
//
|
||||
// BinaryStreamReader.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.IO; |
||||
|
||||
namespace Mono.Cecil.PE { |
||||
|
||||
class BinaryStreamReader : BinaryReader { |
||||
|
||||
public BinaryStreamReader (Stream stream) |
||||
: base (stream) |
||||
{ |
||||
} |
||||
|
||||
protected void Advance (int bytes) |
||||
{ |
||||
BaseStream.Seek (bytes, SeekOrigin.Current); |
||||
} |
||||
|
||||
protected DataDirectory ReadDataDirectory () |
||||
{ |
||||
return new DataDirectory (ReadUInt32 (), ReadUInt32 ()); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,96 @@
@@ -0,0 +1,96 @@
|
||||
//
|
||||
// BinaryStreamWriter.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.IO; |
||||
|
||||
#if !READ_ONLY
|
||||
|
||||
namespace Mono.Cecil.PE { |
||||
|
||||
class BinaryStreamWriter : BinaryWriter { |
||||
|
||||
public BinaryStreamWriter (Stream stream) |
||||
: base (stream) |
||||
{ |
||||
} |
||||
|
||||
public void WriteByte (byte value) |
||||
{ |
||||
Write (value); |
||||
} |
||||
|
||||
public void WriteUInt16 (ushort value) |
||||
{ |
||||
Write (value); |
||||
} |
||||
|
||||
public void WriteInt16 (short value) |
||||
{ |
||||
Write (value); |
||||
} |
||||
|
||||
public void WriteUInt32 (uint value) |
||||
{ |
||||
Write (value); |
||||
} |
||||
|
||||
public void WriteInt32 (int value) |
||||
{ |
||||
Write (value); |
||||
} |
||||
|
||||
public void WriteUInt64 (ulong value) |
||||
{ |
||||
Write (value); |
||||
} |
||||
|
||||
public void WriteBytes (byte [] bytes) |
||||
{ |
||||
Write (bytes); |
||||
} |
||||
|
||||
public void WriteDataDirectory (DataDirectory directory) |
||||
{ |
||||
Write (directory.VirtualAddress); |
||||
Write (directory.Size); |
||||
} |
||||
|
||||
public void WriteBuffer (ByteBuffer buffer) |
||||
{ |
||||
Write (buffer.buffer, 0, buffer.length); |
||||
} |
||||
|
||||
protected void Advance (int bytes) |
||||
{ |
||||
BaseStream.Seek (bytes, SeekOrigin.Current); |
||||
} |
||||
} |
||||
} |
||||
|
||||
#endif
|
@ -0,0 +1,342 @@
@@ -0,0 +1,342 @@
|
||||
//
|
||||
// ByteBuffer.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil.PE { |
||||
|
||||
class ByteBuffer { |
||||
|
||||
internal byte [] buffer; |
||||
internal int length; |
||||
internal int position; |
||||
|
||||
public ByteBuffer () |
||||
{ |
||||
this.buffer = Empty<byte>.Array; |
||||
} |
||||
|
||||
public ByteBuffer (int length) |
||||
{ |
||||
this.buffer = new byte [length]; |
||||
} |
||||
|
||||
public ByteBuffer (byte [] buffer) |
||||
{ |
||||
this.buffer = buffer ?? Empty<byte>.Array; |
||||
this.length = this.buffer.Length; |
||||
} |
||||
|
||||
public void Reset (byte [] buffer) |
||||
{ |
||||
this.buffer = buffer ?? Empty<byte>.Array; |
||||
this.length = this.buffer.Length; |
||||
} |
||||
|
||||
public void Advance (int length) |
||||
{ |
||||
position += length; |
||||
} |
||||
|
||||
public byte ReadByte () |
||||
{ |
||||
return buffer [position++]; |
||||
} |
||||
|
||||
public sbyte ReadSByte () |
||||
{ |
||||
return (sbyte) ReadByte (); |
||||
} |
||||
|
||||
public byte [] ReadBytes (int length) |
||||
{ |
||||
var bytes = new byte [length]; |
||||
Buffer.BlockCopy (buffer, position, bytes, 0, length); |
||||
position += length; |
||||
return bytes; |
||||
} |
||||
|
||||
public ushort ReadUInt16 () |
||||
{ |
||||
ushort value = (ushort) (buffer [position] |
||||
| (buffer [position + 1] << 8)); |
||||
position += 2; |
||||
return value; |
||||
} |
||||
|
||||
public short ReadInt16 () |
||||
{ |
||||
return (short) ReadUInt16 (); |
||||
} |
||||
|
||||
public uint ReadUInt32 () |
||||
{ |
||||
uint value = (uint) (buffer [position] |
||||
| (buffer [position + 1] << 8) |
||||
| (buffer [position + 2] << 16) |
||||
| (buffer [position + 3] << 24)); |
||||
position += 4; |
||||
return value; |
||||
} |
||||
|
||||
public int ReadInt32 () |
||||
{ |
||||
return (int) ReadUInt32 (); |
||||
} |
||||
|
||||
public ulong ReadUInt64 () |
||||
{ |
||||
uint low = ReadUInt32 (); |
||||
uint high = ReadUInt32 (); |
||||
|
||||
return (((ulong) high) << 32) | low; |
||||
} |
||||
|
||||
public long ReadInt64 () |
||||
{ |
||||
return (long) ReadUInt64 (); |
||||
} |
||||
|
||||
public uint ReadCompressedUInt32 () |
||||
{ |
||||
byte first = ReadByte (); |
||||
if ((first & 0x80) == 0) |
||||
return first; |
||||
|
||||
if ((first & 0x40) == 0) |
||||
return ((uint) (first & ~0x80) << 8) |
||||
| ReadByte (); |
||||
|
||||
return ((uint) (first & ~0xc0) << 24) |
||||
| (uint) ReadByte () << 16 |
||||
| (uint) ReadByte () << 8 |
||||
| ReadByte (); |
||||
} |
||||
|
||||
public int ReadCompressedInt32 () |
||||
{ |
||||
var value = (int) ReadCompressedUInt32 (); |
||||
|
||||
return (value & 1) != 0 |
||||
? -(value >> 1) |
||||
: value >> 1; |
||||
} |
||||
|
||||
public float ReadSingle () |
||||
{ |
||||
if (!BitConverter.IsLittleEndian) { |
||||
var bytes = ReadBytes (4); |
||||
Array.Reverse (bytes); |
||||
return BitConverter.ToSingle (bytes, 0); |
||||
} |
||||
|
||||
float value = BitConverter.ToSingle (buffer, position); |
||||
position += 4; |
||||
return value; |
||||
} |
||||
|
||||
public double ReadDouble () |
||||
{ |
||||
if (!BitConverter.IsLittleEndian) { |
||||
var bytes = ReadBytes (8); |
||||
Array.Reverse (bytes); |
||||
return BitConverter.ToDouble (bytes, 0); |
||||
} |
||||
|
||||
double value = BitConverter.ToDouble (buffer, position); |
||||
position += 8; |
||||
return value; |
||||
} |
||||
|
||||
#if !READ_ONLY
|
||||
|
||||
public void WriteByte (byte value) |
||||
{ |
||||
if (position == buffer.Length) |
||||
Grow (1); |
||||
|
||||
buffer [position++] = value; |
||||
|
||||
if (position > length) |
||||
length = position; |
||||
} |
||||
|
||||
public void WriteSByte (sbyte value) |
||||
{ |
||||
WriteByte ((byte) value); |
||||
} |
||||
|
||||
public void WriteUInt16 (ushort value) |
||||
{ |
||||
if (position + 2 > buffer.Length) |
||||
Grow (2); |
||||
|
||||
buffer [position++] = (byte) value; |
||||
buffer [position++] = (byte) (value >> 8); |
||||
|
||||
if (position > length) |
||||
length = position; |
||||
} |
||||
|
||||
public void WriteInt16 (short value) |
||||
{ |
||||
WriteUInt16 ((ushort) value); |
||||
} |
||||
|
||||
public void WriteUInt32 (uint value) |
||||
{ |
||||
if (position + 4 > buffer.Length) |
||||
Grow (4); |
||||
|
||||
buffer [position++] = (byte) value; |
||||
buffer [position++] = (byte) (value >> 8); |
||||
buffer [position++] = (byte) (value >> 16); |
||||
buffer [position++] = (byte) (value >> 24); |
||||
|
||||
if (position > length) |
||||
length = position; |
||||
} |
||||
|
||||
public void WriteInt32 (int value) |
||||
{ |
||||
WriteUInt32 ((uint) value); |
||||
} |
||||
|
||||
public void WriteUInt64 (ulong value) |
||||
{ |
||||
if (position + 8 > buffer.Length) |
||||
Grow (8); |
||||
|
||||
buffer [position++] = (byte) value; |
||||
buffer [position++] = (byte) (value >> 8); |
||||
buffer [position++] = (byte) (value >> 16); |
||||
buffer [position++] = (byte) (value >> 24); |
||||
buffer [position++] = (byte) (value >> 32); |
||||
buffer [position++] = (byte) (value >> 40); |
||||
buffer [position++] = (byte) (value >> 48); |
||||
buffer [position++] = (byte) (value >> 56); |
||||
|
||||
if (position > length) |
||||
length = position; |
||||
} |
||||
|
||||
public void WriteInt64 (long value) |
||||
{ |
||||
WriteUInt64 ((ulong) value); |
||||
} |
||||
|
||||
public void WriteCompressedUInt32 (uint value) |
||||
{ |
||||
if (value < 0x80) |
||||
WriteByte ((byte) value); |
||||
else if (value < 0x4000) { |
||||
WriteByte ((byte) (0x80 | (value >> 8))); |
||||
WriteByte ((byte) (value & 0xff)); |
||||
} else { |
||||
WriteByte ((byte) ((value >> 24) | 0xc0)); |
||||
WriteByte ((byte) ((value >> 16) & 0xff)); |
||||
WriteByte ((byte) ((value >> 8) & 0xff)); |
||||
WriteByte ((byte) (value & 0xff)); |
||||
} |
||||
} |
||||
|
||||
public void WriteCompressedInt32 (int value) |
||||
{ |
||||
WriteCompressedUInt32 ((uint) ((value < 0) ? ((-value) << 1) | 1 : value << 1)); |
||||
} |
||||
|
||||
public void WriteBytes (byte [] bytes) |
||||
{ |
||||
var length = bytes.Length; |
||||
if (position + length > buffer.Length) |
||||
Grow (length); |
||||
|
||||
Buffer.BlockCopy (bytes, 0, buffer, position, length); |
||||
position += length; |
||||
|
||||
if (position > this.length) |
||||
this.length = position; |
||||
} |
||||
|
||||
public void WriteBytes (int length) |
||||
{ |
||||
if (position + length > buffer.Length) |
||||
Grow (length); |
||||
|
||||
position += length; |
||||
|
||||
if (position > this.length) |
||||
this.length = position; |
||||
} |
||||
|
||||
public void WriteBytes (ByteBuffer buffer) |
||||
{ |
||||
if (position + buffer.length > this.buffer.Length) |
||||
Grow (buffer.length); |
||||
|
||||
Buffer.BlockCopy (buffer.buffer, 0, this.buffer, position, buffer.length); |
||||
position += buffer.length; |
||||
|
||||
if (position > this.length) |
||||
this.length = position; |
||||
} |
||||
|
||||
public void WriteSingle (float value) |
||||
{ |
||||
var bytes = BitConverter.GetBytes (value); |
||||
|
||||
if (!BitConverter.IsLittleEndian) |
||||
Array.Reverse (bytes); |
||||
|
||||
WriteBytes (bytes); |
||||
} |
||||
|
||||
public void WriteDouble (double value) |
||||
{ |
||||
var bytes = BitConverter.GetBytes (value); |
||||
|
||||
if (!BitConverter.IsLittleEndian) |
||||
Array.Reverse (bytes); |
||||
|
||||
WriteBytes (bytes); |
||||
} |
||||
|
||||
void Grow (int desired) |
||||
{ |
||||
var current = this.buffer; |
||||
var current_length = current.Length; |
||||
|
||||
var buffer = new byte [System.Math.Max (current_length + desired, current_length * 2)]; |
||||
Buffer.BlockCopy (current, 0, buffer, 0, current_length); |
||||
this.buffer = buffer; |
||||
} |
||||
|
||||
#endif
|
||||
|
||||
} |
||||
} |
@ -0,0 +1,78 @@
@@ -0,0 +1,78 @@
|
||||
//
|
||||
// ByteBufferEqualityComparer.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil.PE { |
||||
|
||||
sealed class ByteBufferEqualityComparer : IEqualityComparer<ByteBuffer> { |
||||
|
||||
public bool Equals (ByteBuffer x, ByteBuffer y) |
||||
{ |
||||
if (x.length != y.length) |
||||
return false; |
||||
|
||||
var x_buffer = x.buffer; |
||||
var y_buffer = y.buffer; |
||||
|
||||
for (int i = 0; i < x.length; i++) |
||||
if (x_buffer [i] != y_buffer [i]) |
||||
return false; |
||||
|
||||
return true; |
||||
} |
||||
|
||||
public int GetHashCode (ByteBuffer buffer) |
||||
{ |
||||
#if !BYTE_BUFFER_WELL_DISTRIBUTED_HASH
|
||||
var hash = 0; |
||||
var bytes = buffer.buffer; |
||||
for (int i = 0; i < buffer.length; i++) |
||||
hash = (hash * 37) ^ bytes [i]; |
||||
|
||||
return hash; |
||||
#else
|
||||
const uint p = 16777619; |
||||
uint hash = 2166136261; |
||||
|
||||
var bytes = buffer.buffer; |
||||
for (int i = 0; i < buffer.length; i++) |
||||
hash = (hash ^ bytes [i]) * p; |
||||
|
||||
hash += hash << 13; |
||||
hash ^= hash >> 7; |
||||
hash += hash << 3; |
||||
hash ^= hash >> 17; |
||||
hash += hash << 5; |
||||
|
||||
return (int) hash; |
||||
#endif
|
||||
} |
||||
} |
||||
} |
@ -0,0 +1,50 @@
@@ -0,0 +1,50 @@
|
||||
//
|
||||
// DataDirectory.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using RVA = System.UInt32; |
||||
|
||||
namespace Mono.Cecil.PE { |
||||
|
||||
struct DataDirectory { |
||||
|
||||
public readonly RVA VirtualAddress; |
||||
public readonly uint Size; |
||||
|
||||
public bool IsZero { |
||||
get { return VirtualAddress == 0 && Size == 0; } |
||||
} |
||||
|
||||
public DataDirectory (RVA rva, uint size) |
||||
{ |
||||
this.VirtualAddress = rva; |
||||
this.Size = size; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,159 @@
@@ -0,0 +1,159 @@
|
||||
//
|
||||
// Image.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using Mono; |
||||
using Mono.Cecil.Cil; |
||||
using Mono.Cecil.Metadata; |
||||
|
||||
using RVA = System.UInt32; |
||||
|
||||
namespace Mono.Cecil.PE { |
||||
|
||||
sealed class Image { |
||||
|
||||
public ModuleKind Kind; |
||||
public TargetRuntime Runtime; |
||||
public TargetArchitecture Architecture; |
||||
public string FileName; |
||||
|
||||
public Section [] Sections; |
||||
|
||||
public Section MetadataSection; |
||||
|
||||
public uint EntryPointToken; |
||||
public ModuleAttributes Attributes; |
||||
|
||||
public DataDirectory Debug; |
||||
public DataDirectory Resources; |
||||
|
||||
public StringHeap StringHeap; |
||||
public BlobHeap BlobHeap; |
||||
public UserStringHeap UserStringHeap; |
||||
public GuidHeap GuidHeap; |
||||
public TableHeap TableHeap; |
||||
|
||||
readonly int [] coded_index_sizes = new int [13]; |
||||
|
||||
readonly Func<Table, int> counter; |
||||
|
||||
public Image () |
||||
{ |
||||
counter = GetTableLength; |
||||
} |
||||
|
||||
public bool HasTable (Table table) |
||||
{ |
||||
return GetTableLength (table) > 0; |
||||
} |
||||
|
||||
public int GetTableLength (Table table) |
||||
{ |
||||
return (int) TableHeap [table].Length; |
||||
} |
||||
|
||||
public int GetTableIndexSize (Table table) |
||||
{ |
||||
return GetTableLength (table) < 65536 ? 2 : 4; |
||||
} |
||||
|
||||
public int GetCodedIndexSize (CodedIndex coded_index) |
||||
{ |
||||
var index = (int) coded_index; |
||||
var size = coded_index_sizes [index]; |
||||
if (size != 0) |
||||
return size; |
||||
|
||||
return coded_index_sizes [index] = coded_index.GetSize (counter); |
||||
} |
||||
|
||||
public uint ResolveVirtualAddress (RVA rva) |
||||
{ |
||||
var section = GetSectionAtVirtualAddress (rva); |
||||
if (section == null) |
||||
throw new ArgumentOutOfRangeException (); |
||||
|
||||
return ResolveVirtualAddressInSection (rva, section); |
||||
} |
||||
|
||||
public uint ResolveVirtualAddressInSection (RVA rva, Section section) |
||||
{ |
||||
return rva + section.PointerToRawData - section.VirtualAddress; |
||||
} |
||||
|
||||
public Section GetSection (string name) |
||||
{ |
||||
var sections = this.Sections; |
||||
for (int i = 0; i < sections.Length; i++) { |
||||
var section = sections [i]; |
||||
if (section.Name == name) |
||||
return section; |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
public Section GetSectionAtVirtualAddress (RVA rva) |
||||
{ |
||||
var sections = this.Sections; |
||||
for (int i = 0; i < sections.Length; i++) { |
||||
var section = sections [i]; |
||||
if (rva >= section.VirtualAddress && rva < section.VirtualAddress + section.SizeOfRawData) |
||||
return section; |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
public ImageDebugDirectory GetDebugHeader (out byte [] header) |
||||
{ |
||||
var section = GetSectionAtVirtualAddress (Debug.VirtualAddress); |
||||
var buffer = new ByteBuffer (section.Data); |
||||
buffer.position = (int) (Debug.VirtualAddress - section.VirtualAddress); |
||||
|
||||
var directory = new ImageDebugDirectory { |
||||
Characteristics = buffer.ReadInt32 (), |
||||
TimeDateStamp = buffer.ReadInt32 (), |
||||
MajorVersion = buffer.ReadInt16 (), |
||||
MinorVersion = buffer.ReadInt16 (), |
||||
Type = buffer.ReadInt32 (), |
||||
SizeOfData = buffer.ReadInt32 (), |
||||
AddressOfRawData = buffer.ReadInt32 (), |
||||
PointerToRawData = buffer.ReadInt32 (), |
||||
}; |
||||
|
||||
buffer.position = (int) (directory.PointerToRawData - section.PointerToRawData); |
||||
|
||||
header = new byte [directory.SizeOfData]; |
||||
Buffer.BlockCopy (buffer.buffer, buffer.position, header, 0, header.Length); |
||||
|
||||
return directory; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,678 @@
@@ -0,0 +1,678 @@
|
||||
//
|
||||
// ImageReader.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.IO; |
||||
|
||||
using Mono.Cecil.Metadata; |
||||
|
||||
using RVA = System.UInt32; |
||||
|
||||
namespace Mono.Cecil.PE { |
||||
|
||||
sealed class ImageReader : BinaryStreamReader { |
||||
|
||||
readonly Image image; |
||||
|
||||
DataDirectory cli; |
||||
DataDirectory metadata; |
||||
|
||||
public ImageReader (Stream stream) |
||||
: base (stream) |
||||
{ |
||||
image = new Image (); |
||||
|
||||
image.FileName = stream.GetFullyQualifiedName (); |
||||
} |
||||
|
||||
void MoveTo (DataDirectory directory) |
||||
{ |
||||
BaseStream.Position = image.ResolveVirtualAddress (directory.VirtualAddress); |
||||
} |
||||
|
||||
void MoveTo (uint position) |
||||
{ |
||||
BaseStream.Position = position; |
||||
} |
||||
|
||||
void ReadImage () |
||||
{ |
||||
if (BaseStream.Length < 128) |
||||
throw new BadImageFormatException (); |
||||
|
||||
// - DOSHeader
|
||||
|
||||
// PE 2
|
||||
// Start 58
|
||||
// Lfanew 4
|
||||
// End 64
|
||||
|
||||
if (ReadUInt16 () != 0x5a4d) |
||||
throw new BadImageFormatException (); |
||||
|
||||
Advance (58); |
||||
|
||||
MoveTo (ReadUInt32 ()); |
||||
|
||||
if (ReadUInt32 () != 0x00004550) |
||||
throw new BadImageFormatException (); |
||||
|
||||
// - PEFileHeader
|
||||
|
||||
// Machine 2
|
||||
image.Architecture = ReadArchitecture (); |
||||
|
||||
// NumberOfSections 2
|
||||
ushort sections = ReadUInt16 (); |
||||
|
||||
// TimeDateStamp 4
|
||||
// PointerToSymbolTable 4
|
||||
// NumberOfSymbols 4
|
||||
// OptionalHeaderSize 2
|
||||
Advance (14); |
||||
|
||||
// Characteristics 2
|
||||
ushort characteristics = ReadUInt16 (); |
||||
|
||||
ushort subsystem; |
||||
ReadOptionalHeaders (out subsystem); |
||||
ReadSections (sections); |
||||
ReadCLIHeader (); |
||||
ReadMetadata (); |
||||
|
||||
image.Kind = GetModuleKind (characteristics, subsystem); |
||||
} |
||||
|
||||
TargetArchitecture ReadArchitecture () |
||||
{ |
||||
var machine = ReadUInt16 (); |
||||
switch (machine) { |
||||
case 0x014c: |
||||
return TargetArchitecture.I386; |
||||
case 0x8664: |
||||
return TargetArchitecture.AMD64; |
||||
case 0x0200: |
||||
return TargetArchitecture.IA64; |
||||
} |
||||
|
||||
throw new NotSupportedException (); |
||||
} |
||||
|
||||
static ModuleKind GetModuleKind (ushort characteristics, ushort subsystem) |
||||
{ |
||||
if ((characteristics & 0x2000) != 0) // ImageCharacteristics.Dll
|
||||
return ModuleKind.Dll; |
||||
|
||||
if (subsystem == 0x2 || subsystem == 0x9) // SubSystem.WindowsGui || SubSystem.WindowsCeGui
|
||||
return ModuleKind.Windows; |
||||
|
||||
return ModuleKind.Console; |
||||
} |
||||
|
||||
void ReadOptionalHeaders (out ushort subsystem) |
||||
{ |
||||
// - PEOptionalHeader
|
||||
// - StandardFieldsHeader
|
||||
|
||||
// Magic 2
|
||||
bool pe64 = ReadUInt16 () == 0x20b; |
||||
|
||||
// pe32 || pe64
|
||||
|
||||
// LMajor 1
|
||||
// LMinor 1
|
||||
// CodeSize 4
|
||||
// InitializedDataSize 4
|
||||
// UninitializedDataSize4
|
||||
// EntryPointRVA 4
|
||||
// BaseOfCode 4
|
||||
// BaseOfData 4 || 0
|
||||
|
||||
// - NTSpecificFieldsHeader
|
||||
|
||||
// ImageBase 4 || 8
|
||||
// SectionAlignment 4
|
||||
// FileAlignement 4
|
||||
// OSMajor 2
|
||||
// OSMinor 2
|
||||
// UserMajor 2
|
||||
// UserMinor 2
|
||||
// SubSysMajor 2
|
||||
// SubSysMinor 2
|
||||
// Reserved 4
|
||||
// ImageSize 4
|
||||
// HeaderSize 4
|
||||
// FileChecksum 4
|
||||
Advance (66); |
||||
|
||||
// SubSystem 2
|
||||
subsystem = ReadUInt16 (); |
||||
|
||||
// DLLFlags 2
|
||||
// StackReserveSize 4 || 8
|
||||
// StackCommitSize 4 || 8
|
||||
// HeapReserveSize 4 || 8
|
||||
// HeapCommitSize 4 || 8
|
||||
// LoaderFlags 4
|
||||
// NumberOfDataDir 4
|
||||
|
||||
// - DataDirectoriesHeader
|
||||
|
||||
// ExportTable 8
|
||||
// ImportTable 8
|
||||
// ResourceTable 8
|
||||
// ExceptionTable 8
|
||||
// CertificateTable 8
|
||||
// BaseRelocationTable 8
|
||||
|
||||
Advance (pe64 ? 90 : 74); |
||||
|
||||
// Debug 8
|
||||
image.Debug = ReadDataDirectory (); |
||||
|
||||
// Copyright 8
|
||||
// GlobalPtr 8
|
||||
// TLSTable 8
|
||||
// LoadConfigTable 8
|
||||
// BoundImport 8
|
||||
// IAT 8
|
||||
// DelayImportDescriptor8
|
||||
Advance (56); |
||||
|
||||
// CLIHeader 8
|
||||
cli = ReadDataDirectory (); |
||||
|
||||
if (cli.IsZero) |
||||
throw new BadImageFormatException (); |
||||
|
||||
// Reserved 8
|
||||
Advance (8); |
||||
} |
||||
|
||||
string ReadAlignedString (int length) |
||||
{ |
||||
int read = 0; |
||||
var buffer = new char [length]; |
||||
while (read < length) { |
||||
var current = ReadByte (); |
||||
if (current == 0) |
||||
break; |
||||
|
||||
buffer [read++] = (char) current; |
||||
} |
||||
|
||||
Advance (-1 + ((read + 4) & ~3) - read); |
||||
|
||||
return new string (buffer, 0, read); |
||||
} |
||||
|
||||
string ReadZeroTerminatedString (int length) |
||||
{ |
||||
int read = 0; |
||||
var buffer = new char [length]; |
||||
var bytes = ReadBytes (length); |
||||
while (read < length) { |
||||
var current = bytes [read]; |
||||
if (current == 0) |
||||
break; |
||||
|
||||
buffer [read++] = (char) current; |
||||
} |
||||
|
||||
return new string (buffer, 0, read); |
||||
} |
||||
|
||||
void ReadSections (ushort count) |
||||
{ |
||||
var sections = new Section [count]; |
||||
|
||||
for (int i = 0; i < count; i++) { |
||||
var section = new Section (); |
||||
|
||||
// Name
|
||||
section.Name = ReadZeroTerminatedString (8); |
||||
|
||||
// VirtualSize 4
|
||||
Advance (4); |
||||
|
||||
// VirtualAddress 4
|
||||
section.VirtualAddress = ReadUInt32 (); |
||||
// SizeOfRawData 4
|
||||
section.SizeOfRawData = ReadUInt32 (); |
||||
// PointerToRawData 4
|
||||
section.PointerToRawData = ReadUInt32 (); |
||||
|
||||
// PointerToRelocations 4
|
||||
// PointerToLineNumbers 4
|
||||
// NumberOfRelocations 2
|
||||
// NumberOfLineNumbers 2
|
||||
// Characteristics 4
|
||||
Advance (16); |
||||
|
||||
sections [i] = section; |
||||
|
||||
if (section.Name == ".reloc") |
||||
continue; |
||||
|
||||
ReadSectionData (section); |
||||
} |
||||
|
||||
image.Sections = sections; |
||||
} |
||||
|
||||
void ReadSectionData (Section section) |
||||
{ |
||||
var position = BaseStream.Position; |
||||
|
||||
MoveTo (section.PointerToRawData); |
||||
|
||||
var length = (int) section.SizeOfRawData; |
||||
var data = new byte [length]; |
||||
int offset = 0, read; |
||||
|
||||
while ((read = Read (data, offset, length - offset)) > 0) |
||||
offset += read; |
||||
|
||||
section.Data = data; |
||||
|
||||
BaseStream.Position = position; |
||||
} |
||||
|
||||
void ReadCLIHeader () |
||||
{ |
||||
MoveTo (cli); |
||||
|
||||
// - CLIHeader
|
||||
|
||||
// Cb 4
|
||||
// MajorRuntimeVersion 2
|
||||
// MinorRuntimeVersion 2
|
||||
Advance (8); |
||||
|
||||
// Metadata 8
|
||||
metadata = ReadDataDirectory (); |
||||
// Flags 4
|
||||
image.Attributes = (ModuleAttributes) ReadUInt32 (); |
||||
// EntryPointToken 4
|
||||
image.EntryPointToken = ReadUInt32 (); |
||||
// Resources 8
|
||||
image.Resources = ReadDataDirectory (); |
||||
// StrongNameSignature 8
|
||||
// CodeManagerTable 8
|
||||
// VTableFixups 8
|
||||
// ExportAddressTableJumps 8
|
||||
// ManagedNativeHeader 8
|
||||
} |
||||
|
||||
void ReadMetadata () |
||||
{ |
||||
MoveTo (metadata); |
||||
|
||||
if (ReadUInt32 () != 0x424a5342) |
||||
throw new BadImageFormatException (); |
||||
|
||||
// MajorVersion 2
|
||||
// MinorVersion 2
|
||||
// Reserved 4
|
||||
Advance (8); |
||||
|
||||
var version = ReadZeroTerminatedString (ReadInt32 ()); |
||||
image.Runtime = version.ParseRuntime (); |
||||
|
||||
// Flags 2
|
||||
Advance (2); |
||||
|
||||
var streams = ReadUInt16 (); |
||||
|
||||
var section = image.GetSectionAtVirtualAddress (metadata.VirtualAddress); |
||||
if (section == null) |
||||
throw new BadImageFormatException (); |
||||
|
||||
image.MetadataSection = section; |
||||
|
||||
for (int i = 0; i < streams; i++) |
||||
ReadMetadataStream (section); |
||||
|
||||
if (image.TableHeap != null) |
||||
ReadTableHeap (); |
||||
} |
||||
|
||||
void ReadMetadataStream (Section section) |
||||
{ |
||||
// Offset 4
|
||||
uint start = metadata.VirtualAddress - section.VirtualAddress + ReadUInt32 (); // relative to the section start
|
||||
|
||||
// Size 4
|
||||
uint size = ReadUInt32 (); |
||||
|
||||
var name = ReadAlignedString (16); |
||||
switch (name) { |
||||
case "#~": |
||||
case "#-": |
||||
image.TableHeap = new TableHeap (section, start, size); |
||||
break; |
||||
case "#Strings": |
||||
image.StringHeap = new StringHeap (section, start, size); |
||||
break; |
||||
case "#Blob": |
||||
image.BlobHeap = new BlobHeap (section, start, size); |
||||
break; |
||||
case "#GUID": |
||||
image.GuidHeap = new GuidHeap (section, start, size); |
||||
break; |
||||
case "#US": |
||||
image.UserStringHeap = new UserStringHeap (section, start, size); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
void ReadTableHeap () |
||||
{ |
||||
var heap = image.TableHeap; |
||||
|
||||
uint start = heap.Section.PointerToRawData; |
||||
|
||||
MoveTo (heap.Offset + start); |
||||
|
||||
// Reserved 4
|
||||
// MajorVersion 1
|
||||
// MinorVersion 1
|
||||
Advance (6); |
||||
|
||||
// HeapSizes 1
|
||||
var sizes = ReadByte (); |
||||
|
||||
// Reserved2 1
|
||||
Advance (1); |
||||
|
||||
// Valid 8
|
||||
heap.Valid = ReadInt64 (); |
||||
|
||||
// Sorted 8
|
||||
heap.Sorted = ReadInt64 (); |
||||
|
||||
for (int i = 0; i < TableHeap.TableIdentifiers.Length; i++) { |
||||
var table = TableHeap.TableIdentifiers [i]; |
||||
if (!heap.HasTable (table)) |
||||
continue; |
||||
|
||||
heap.Tables [(int) table].Length = ReadUInt32 (); |
||||
} |
||||
|
||||
SetIndexSize (image.StringHeap, sizes, 0x1); |
||||
SetIndexSize (image.GuidHeap, sizes, 0x2); |
||||
SetIndexSize (image.BlobHeap, sizes, 0x4); |
||||
|
||||
ComputeTableInformations (); |
||||
} |
||||
|
||||
static void SetIndexSize (Heap heap, uint sizes, byte flag) |
||||
{ |
||||
if (heap == null) |
||||
return; |
||||
|
||||
heap.IndexSize = (sizes & flag) > 0 ? 4 : 2; |
||||
} |
||||
|
||||
int GetTableIndexSize (Table table) |
||||
{ |
||||
return image.GetTableIndexSize (table); |
||||
} |
||||
|
||||
int GetCodedIndexSize (CodedIndex index) |
||||
{ |
||||
return image.GetCodedIndexSize (index); |
||||
} |
||||
|
||||
void ComputeTableInformations () |
||||
{ |
||||
uint offset = (uint) BaseStream.Position - image.MetadataSection.PointerToRawData; // header
|
||||
|
||||
int stridx_size = image.StringHeap.IndexSize; |
||||
int blobidx_size = image.BlobHeap != null ? image.BlobHeap.IndexSize : 2; |
||||
|
||||
var heap = image.TableHeap; |
||||
var tables = heap.Tables; |
||||
|
||||
for (int i = 0; i < TableHeap.TableIdentifiers.Length; i++) { |
||||
var table = TableHeap.TableIdentifiers [i]; |
||||
if (!heap.HasTable (table)) |
||||
continue; |
||||
|
||||
int size; |
||||
switch (table) { |
||||
case Table.Module: |
||||
size = 2 // Generation
|
||||
+ stridx_size // Name
|
||||
+ (image.GuidHeap.IndexSize * 3); // Mvid, EncId, EncBaseId
|
||||
break; |
||||
case Table.TypeRef: |
||||
size = GetCodedIndexSize (CodedIndex.ResolutionScope) // ResolutionScope
|
||||
+ (stridx_size * 2); // Name, Namespace
|
||||
break; |
||||
case Table.TypeDef: |
||||
size = 4 // Flags
|
||||
+ (stridx_size * 2) // Name, Namespace
|
||||
+ GetCodedIndexSize (CodedIndex.TypeDefOrRef) // BaseType
|
||||
+ GetTableIndexSize (Table.Field) // FieldList
|
||||
+ GetTableIndexSize (Table.Method); // MethodList
|
||||
break; |
||||
case Table.FieldPtr: |
||||
size = GetTableIndexSize (Table.Field); // Field
|
||||
break; |
||||
case Table.Field: |
||||
size = 2 // Flags
|
||||
+ stridx_size // Name
|
||||
+ blobidx_size; // Signature
|
||||
break; |
||||
case Table.MethodPtr: |
||||
size = GetTableIndexSize (Table.Method); // Method
|
||||
break; |
||||
case Table.Method: |
||||
size = 8 // Rva 4, ImplFlags 2, Flags 2
|
||||
+ stridx_size // Name
|
||||
+ blobidx_size // Signature
|
||||
+ GetTableIndexSize (Table.Param); // ParamList
|
||||
break; |
||||
case Table.ParamPtr: |
||||
size = GetTableIndexSize (Table.Param); // Param
|
||||
break; |
||||
case Table.Param: |
||||
size = 4 // Flags 2, Sequence 2
|
||||
+ stridx_size; // Name
|
||||
break; |
||||
case Table.InterfaceImpl: |
||||
size = GetTableIndexSize (Table.TypeDef) // Class
|
||||
+ GetCodedIndexSize (CodedIndex.TypeDefOrRef); // Interface
|
||||
break; |
||||
case Table.MemberRef: |
||||
size = GetCodedIndexSize (CodedIndex.MemberRefParent) // Class
|
||||
+ stridx_size // Name
|
||||
+ blobidx_size; // Signature
|
||||
break; |
||||
case Table.Constant: |
||||
size = 2 // Type
|
||||
+ GetCodedIndexSize (CodedIndex.HasConstant) // Parent
|
||||
+ blobidx_size; // Value
|
||||
break; |
||||
case Table.CustomAttribute: |
||||
size = GetCodedIndexSize (CodedIndex.HasCustomAttribute) // Parent
|
||||
+ GetCodedIndexSize (CodedIndex.CustomAttributeType) // Type
|
||||
+ blobidx_size; // Value
|
||||
break; |
||||
case Table.FieldMarshal: |
||||
size = GetCodedIndexSize (CodedIndex.HasFieldMarshal) // Parent
|
||||
+ blobidx_size; // NativeType
|
||||
break; |
||||
case Table.DeclSecurity: |
||||
size = 2 // Action
|
||||
+ GetCodedIndexSize (CodedIndex.HasDeclSecurity) // Parent
|
||||
+ blobidx_size; // PermissionSet
|
||||
break; |
||||
case Table.ClassLayout: |
||||
size = 6 // PackingSize 2, ClassSize 4
|
||||
+ GetTableIndexSize (Table.TypeDef); // Parent
|
||||
break; |
||||
case Table.FieldLayout: |
||||
size = 4 // Offset
|
||||
+ GetTableIndexSize (Table.Field); // Field
|
||||
break; |
||||
case Table.StandAloneSig: |
||||
size = blobidx_size; // Signature
|
||||
break; |
||||
case Table.EventMap: |
||||
size = GetTableIndexSize (Table.TypeDef) // Parent
|
||||
+ GetTableIndexSize (Table.Event); // EventList
|
||||
break; |
||||
case Table.EventPtr: |
||||
size = GetTableIndexSize (Table.Event); // Event
|
||||
break; |
||||
case Table.Event: |
||||
size = 2 // Flags
|
||||
+ stridx_size // Name
|
||||
+ GetCodedIndexSize (CodedIndex.TypeDefOrRef); // EventType
|
||||
break; |
||||
case Table.PropertyMap: |
||||
size = GetTableIndexSize (Table.TypeDef) // Parent
|
||||
+ GetTableIndexSize (Table.Property); // PropertyList
|
||||
break; |
||||
case Table.PropertyPtr: |
||||
size = GetTableIndexSize (Table.Property); // Property
|
||||
break; |
||||
case Table.Property: |
||||
size = 2 // Flags
|
||||
+ stridx_size // Name
|
||||
+ blobidx_size; // Type
|
||||
break; |
||||
case Table.MethodSemantics: |
||||
size = 2 // Semantics
|
||||
+ GetTableIndexSize (Table.Method) // Method
|
||||
+ GetCodedIndexSize (CodedIndex.HasSemantics); // Association
|
||||
break; |
||||
case Table.MethodImpl: |
||||
size = GetTableIndexSize (Table.TypeDef) // Class
|
||||
+ GetCodedIndexSize (CodedIndex.MethodDefOrRef) // MethodBody
|
||||
+ GetCodedIndexSize (CodedIndex.MethodDefOrRef); // MethodDeclaration
|
||||
break; |
||||
case Table.ModuleRef: |
||||
size = stridx_size; // Name
|
||||
break; |
||||
case Table.TypeSpec: |
||||
size = blobidx_size; // Signature
|
||||
break; |
||||
case Table.ImplMap: |
||||
size = 2 // MappingFlags
|
||||
+ GetCodedIndexSize (CodedIndex.MemberForwarded) // MemberForwarded
|
||||
+ stridx_size // ImportName
|
||||
+ GetTableIndexSize (Table.ModuleRef); // ImportScope
|
||||
break; |
||||
case Table.FieldRVA: |
||||
size = 4 // RVA
|
||||
+ GetTableIndexSize (Table.Field); // Field
|
||||
break; |
||||
case Table.Assembly: |
||||
size = 16 // HashAlgId 4, Version 4 * 2, Flags 4
|
||||
+ blobidx_size // PublicKey
|
||||
+ (stridx_size * 2); // Name, Culture
|
||||
break; |
||||
case Table.AssemblyProcessor: |
||||
size = 4; // Processor
|
||||
break; |
||||
case Table.AssemblyOS: |
||||
size = 12; // Platform 4, Version 2 * 4
|
||||
break; |
||||
case Table.AssemblyRef: |
||||
size = 12 // Version 2 * 4 + Flags 4
|
||||
+ (blobidx_size * 2) // PublicKeyOrToken, HashValue
|
||||
+ (stridx_size * 2); // Name, Culture
|
||||
break; |
||||
case Table.AssemblyRefProcessor: |
||||
size = 4 // Processor
|
||||
+ GetTableIndexSize (Table.AssemblyRef); // AssemblyRef
|
||||
break; |
||||
case Table.AssemblyRefOS: |
||||
size = 12 // Platform 4, Version 2 * 4
|
||||
+ GetTableIndexSize (Table.AssemblyRef); // AssemblyRef
|
||||
break; |
||||
case Table.File: |
||||
size = 4 // Flags
|
||||
+ stridx_size // Name
|
||||
+ blobidx_size; // HashValue
|
||||
break; |
||||
case Table.ExportedType: |
||||
size = 8 // Flags 4, TypeDefId 4
|
||||
+ (stridx_size * 2) // Name, Namespace
|
||||
+ GetCodedIndexSize (CodedIndex.Implementation); // Implementation
|
||||
break; |
||||
case Table.ManifestResource: |
||||
size = 8 // Offset, Flags
|
||||
+ stridx_size // Name
|
||||
+ GetCodedIndexSize (CodedIndex.Implementation); // Implementation
|
||||
break; |
||||
case Table.NestedClass: |
||||
size = GetTableIndexSize (Table.TypeDef) // NestedClass
|
||||
+ GetTableIndexSize (Table.TypeDef); // EnclosingClass
|
||||
break; |
||||
case Table.GenericParam: |
||||
size = 4 // Number, Flags
|
||||
+ GetCodedIndexSize (CodedIndex.TypeOrMethodDef) // Owner
|
||||
+ stridx_size; // Name
|
||||
break; |
||||
case Table.MethodSpec: |
||||
size = GetCodedIndexSize (CodedIndex.MethodDefOrRef) // Method
|
||||
+ blobidx_size; // Instantiation
|
||||
break; |
||||
case Table.GenericParamConstraint: |
||||
size = GetTableIndexSize (Table.GenericParam) // Owner
|
||||
+ GetCodedIndexSize (CodedIndex.TypeDefOrRef); // Constraint
|
||||
break; |
||||
default: |
||||
throw new NotSupportedException (); |
||||
} |
||||
|
||||
int index = (int) table; |
||||
|
||||
tables [index].RowSize = (uint) size; |
||||
tables [index].Offset = offset; |
||||
|
||||
offset += (uint) size * tables [index].Length; |
||||
} |
||||
} |
||||
|
||||
public static Image ReadImageFrom (Stream stream) |
||||
{ |
||||
try { |
||||
var reader = new ImageReader (stream); |
||||
reader.ReadImage (); |
||||
return reader.image; |
||||
} catch (EndOfStreamException e) { |
||||
throw new BadImageFormatException (stream.GetFullyQualifiedName (), e); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,820 @@
@@ -0,0 +1,820 @@
|
||||
//
|
||||
// ImageWriter.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.IO; |
||||
|
||||
#if !READ_ONLY
|
||||
|
||||
using Mono.Cecil.Cil; |
||||
using Mono.Cecil.Metadata; |
||||
|
||||
using RVA = System.UInt32; |
||||
|
||||
namespace Mono.Cecil.PE { |
||||
|
||||
sealed class ImageWriter : BinaryStreamWriter { |
||||
|
||||
readonly ModuleDefinition module; |
||||
readonly MetadataBuilder metadata; |
||||
readonly TextMap text_map; |
||||
|
||||
ImageDebugDirectory debug_directory; |
||||
byte [] debug_data; |
||||
|
||||
ByteBuffer win32_resources; |
||||
|
||||
const uint pe_header_size = 0x178u; |
||||
const uint section_header_size = 0x28u; |
||||
const uint file_alignment = 0x200; |
||||
const uint section_alignment = 0x2000; |
||||
const ulong image_base = 0x00400000; |
||||
|
||||
internal const RVA text_rva = 0x2000; |
||||
|
||||
readonly bool pe64; |
||||
readonly uint time_stamp; |
||||
|
||||
internal Section text; |
||||
internal Section rsrc; |
||||
internal Section reloc; |
||||
|
||||
ushort sections; |
||||
|
||||
ImageWriter (ModuleDefinition module, MetadataBuilder metadata, Stream stream) |
||||
: base (stream) |
||||
{ |
||||
this.module = module; |
||||
this.metadata = metadata; |
||||
this.GetDebugHeader (); |
||||
this.GetWin32Resources (); |
||||
this.text_map = BuildTextMap (); |
||||
this.sections = 2; // text + reloc
|
||||
this.pe64 = module.Architecture != TargetArchitecture.I386; |
||||
this.time_stamp = (uint) DateTime.UtcNow.Subtract (new DateTime (1970, 1, 1)).TotalSeconds; |
||||
} |
||||
|
||||
void GetDebugHeader () |
||||
{ |
||||
var symbol_writer = metadata.symbol_writer; |
||||
if (symbol_writer == null) |
||||
return; |
||||
|
||||
if (!symbol_writer.GetDebugHeader (out debug_directory, out debug_data)) |
||||
debug_data = Empty<byte>.Array; |
||||
} |
||||
|
||||
void GetWin32Resources () |
||||
{ |
||||
var rsrc = GetImageResourceSection (); |
||||
if (rsrc == null) |
||||
return; |
||||
|
||||
var raw_resources = new byte [rsrc.Data.Length]; |
||||
Buffer.BlockCopy (rsrc.Data, 0, raw_resources, 0, rsrc.Data.Length); |
||||
win32_resources = new ByteBuffer (raw_resources); |
||||
} |
||||
|
||||
Section GetImageResourceSection () |
||||
{ |
||||
if (!module.HasImage) |
||||
return null; |
||||
|
||||
const string rsrc_section = ".rsrc"; |
||||
|
||||
return module.Image.GetSection (rsrc_section); |
||||
} |
||||
|
||||
public static ImageWriter CreateWriter (ModuleDefinition module, MetadataBuilder metadata, Stream stream) |
||||
{ |
||||
var writer = new ImageWriter (module, metadata, stream); |
||||
writer.BuildSections (); |
||||
return writer; |
||||
} |
||||
|
||||
void BuildSections () |
||||
{ |
||||
var has_win32_resources = win32_resources != null; |
||||
if (has_win32_resources) |
||||
sections++; |
||||
|
||||
text = CreateSection (".text", text_map.GetLength (), null); |
||||
var previous = text; |
||||
|
||||
if (has_win32_resources) { |
||||
rsrc = CreateSection (".rsrc", (uint) win32_resources.length, previous); |
||||
|
||||
PatchWin32Resources (win32_resources); |
||||
previous = rsrc; |
||||
} |
||||
|
||||
reloc = CreateSection (".reloc", 12u, previous); |
||||
} |
||||
|
||||
Section CreateSection (string name, uint size, Section previous) |
||||
{ |
||||
return new Section { |
||||
Name = name, |
||||
VirtualAddress = previous != null |
||||
? previous.VirtualAddress + Align (previous.VirtualSize, section_alignment) |
||||
: text_rva, |
||||
VirtualSize = size, |
||||
PointerToRawData = previous != null |
||||
? previous.PointerToRawData + previous.SizeOfRawData |
||||
: Align (GetHeaderSize (), file_alignment), |
||||
SizeOfRawData = Align (size, file_alignment) |
||||
}; |
||||
} |
||||
|
||||
static uint Align (uint value, uint align) |
||||
{ |
||||
align--; |
||||
return (value + align) & ~align; |
||||
} |
||||
|
||||
void WriteDOSHeader () |
||||
{ |
||||
Write (new byte [] { |
||||
// dos header start
|
||||
0x4d, 0x5a, 0x90, 0x00, 0x03, 0x00, 0x00, |
||||
0x00, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, |
||||
0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, |
||||
0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, |
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
||||
0x00, 0x00, 0x00, 0x00, |
||||
// lfanew
|
||||
0x80, 0x00, 0x00, 0x00, |
||||
// dos header end
|
||||
0x0e, 0x1f, 0xba, 0x0e, 0x00, 0xb4, 0x09, |
||||
0xcd, 0x21, 0xb8, 0x01, 0x4c, 0xcd, 0x21, |
||||
0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, |
||||
0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x63, |
||||
0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, |
||||
0x65, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x69, |
||||
0x6e, 0x20, 0x44, 0x4f, 0x53, 0x20, 0x6d, |
||||
0x6f, 0x64, 0x65, 0x2e, 0x0d, 0x0d, 0x0a, |
||||
0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
||||
0x00 |
||||
}); |
||||
} |
||||
|
||||
void WritePEFileHeader () |
||||
{ |
||||
WriteUInt32 (0x00004550); // Magic
|
||||
WriteUInt16 (GetMachine ()); // Machine
|
||||
WriteUInt16 (sections); // NumberOfSections
|
||||
WriteUInt32 (time_stamp); |
||||
WriteUInt32 (0); // PointerToSymbolTable
|
||||
WriteUInt32 (0); // NumberOfSymbols
|
||||
WriteUInt16 ((ushort) (!pe64 ? 0xe0 : 0xf0)); // SizeOfOptionalHeader
|
||||
|
||||
// ExecutableImage | (pe64 ? 32BitsMachine : LargeAddressAware)
|
||||
var characteristics = (ushort) (0x0002 | (!pe64 ? 0x0100 : 0x0020)); |
||||
if (module.Kind == ModuleKind.Dll || module.Kind == ModuleKind.NetModule) |
||||
characteristics |= 0x2000; |
||||
WriteUInt16 (characteristics); // Characteristics
|
||||
} |
||||
|
||||
ushort GetMachine () |
||||
{ |
||||
switch (module.Architecture) { |
||||
case TargetArchitecture.I386: |
||||
return 0x014c; |
||||
case TargetArchitecture.AMD64: |
||||
return 0x8664; |
||||
case TargetArchitecture.IA64: |
||||
return 0x0200; |
||||
} |
||||
|
||||
throw new NotSupportedException (); |
||||
} |
||||
|
||||
void WriteOptionalHeaders () |
||||
{ |
||||
WriteUInt16 ((ushort) (!pe64 ? 0x10b : 0x20b)); // Magic
|
||||
WriteByte (8); // LMajor
|
||||
WriteByte (0); // LMinor
|
||||
WriteUInt32 (text.SizeOfRawData); // CodeSize
|
||||
WriteUInt32 (reloc.SizeOfRawData |
||||
+ (rsrc != null ? rsrc.SizeOfRawData : 0)); // InitializedDataSize
|
||||
WriteUInt32 (0); // UninitializedDataSize
|
||||
|
||||
var entry_point_rva = text_map.GetRVA (TextSegment.StartupStub); |
||||
if (module.Architecture == TargetArchitecture.IA64) |
||||
entry_point_rva += 0x20; |
||||
WriteUInt32 (entry_point_rva); // EntryPointRVA
|
||||
WriteUInt32 (text_rva); // BaseOfCode
|
||||
|
||||
if (!pe64) { |
||||
WriteUInt32 (0); // BaseOfData
|
||||
WriteUInt32 ((uint) image_base); // ImageBase
|
||||
} else { |
||||
WriteUInt64 (image_base); // ImageBase
|
||||
} |
||||
|
||||
WriteUInt32 (section_alignment); // SectionAlignment
|
||||
WriteUInt32 (file_alignment); // FileAlignment
|
||||
|
||||
WriteUInt16 (4); // OSMajor
|
||||
WriteUInt16 (0); // OSMinor
|
||||
WriteUInt16 (0); // UserMajor
|
||||
WriteUInt16 (0); // UserMinor
|
||||
WriteUInt16 (4); // SubSysMajor
|
||||
WriteUInt16 (0); // SubSysMinor
|
||||
WriteUInt32 (0); // Reserved
|
||||
|
||||
WriteUInt32 (reloc.VirtualAddress + Align (reloc.VirtualSize, section_alignment)); // ImageSize
|
||||
WriteUInt32 (text.PointerToRawData); // HeaderSize
|
||||
|
||||
WriteUInt32 (0); // Checksum
|
||||
WriteUInt16 (GetSubSystem ()); // SubSystem
|
||||
WriteUInt16 (0x8540); // DLLFlags
|
||||
|
||||
const ulong stack_reserve = 0x100000; |
||||
const ulong stack_commit = 0x1000; |
||||
const ulong heap_reserve = 0x100000; |
||||
const ulong heap_commit = 0x1000; |
||||
|
||||
if (!pe64) { |
||||
WriteUInt32 ((uint) stack_reserve); |
||||
WriteUInt32 ((uint) stack_commit); |
||||
WriteUInt32 ((uint) heap_reserve); |
||||
WriteUInt32 ((uint) heap_commit); |
||||
} else { |
||||
WriteUInt64 (stack_reserve); |
||||
WriteUInt64 (stack_commit); |
||||
WriteUInt64 (heap_reserve); |
||||
WriteUInt64 (heap_commit); |
||||
} |
||||
|
||||
WriteUInt32 (0); // LoaderFlags
|
||||
WriteUInt32 (16); // NumberOfDataDir
|
||||
|
||||
WriteZeroDataDirectory (); // ExportTable
|
||||
WriteDataDirectory (text_map.GetDataDirectory (TextSegment.ImportDirectory)); // ImportTable
|
||||
if (rsrc != null) { // ResourceTable
|
||||
WriteUInt32 (rsrc.VirtualAddress); |
||||
WriteUInt32 (rsrc.VirtualSize); |
||||
} else |
||||
WriteZeroDataDirectory (); |
||||
|
||||
WriteZeroDataDirectory (); // ExceptionTable
|
||||
WriteZeroDataDirectory (); // CertificateTable
|
||||
WriteUInt32 (reloc.VirtualAddress); // BaseRelocationTable
|
||||
WriteUInt32 (reloc.VirtualSize); |
||||
|
||||
if (text_map.GetLength (TextSegment.DebugDirectory) > 0) { |
||||
WriteUInt32 (text_map.GetRVA (TextSegment.DebugDirectory)); |
||||
WriteUInt32 (28u); |
||||
} else |
||||
WriteZeroDataDirectory (); |
||||
|
||||
WriteZeroDataDirectory (); // Copyright
|
||||
WriteZeroDataDirectory (); // GlobalPtr
|
||||
WriteZeroDataDirectory (); // TLSTable
|
||||
WriteZeroDataDirectory (); // LoadConfigTable
|
||||
WriteZeroDataDirectory (); // BoundImport
|
||||
WriteDataDirectory (text_map.GetDataDirectory (TextSegment.ImportAddressTable)); // IAT
|
||||
WriteZeroDataDirectory (); // DelayImportDesc
|
||||
WriteDataDirectory (text_map.GetDataDirectory (TextSegment.CLIHeader)); // CLIHeader
|
||||
WriteZeroDataDirectory (); // Reserved
|
||||
} |
||||
|
||||
void WriteZeroDataDirectory () |
||||
{ |
||||
WriteUInt32 (0); |
||||
WriteUInt32 (0); |
||||
} |
||||
|
||||
ushort GetSubSystem () |
||||
{ |
||||
switch (module.Kind) { |
||||
case ModuleKind.Console: |
||||
case ModuleKind.Dll: |
||||
case ModuleKind.NetModule: |
||||
return 0x3; |
||||
case ModuleKind.Windows: |
||||
return 0x2; |
||||
default: |
||||
throw new ArgumentOutOfRangeException (); |
||||
} |
||||
} |
||||
|
||||
void WriteSectionHeaders () |
||||
{ |
||||
WriteSection (text, 0x60000020); |
||||
|
||||
if (rsrc != null) |
||||
WriteSection (rsrc, 0x40000040); |
||||
|
||||
WriteSection (reloc, 0x42000040); |
||||
} |
||||
|
||||
void WriteSection (Section section, uint characteristics) |
||||
{ |
||||
var name = new byte [8]; |
||||
var sect_name = section.Name; |
||||
for (int i = 0; i < sect_name.Length; i++) |
||||
name [i] = (byte) sect_name [i]; |
||||
|
||||
WriteBytes (name); |
||||
WriteUInt32 (section.VirtualSize); |
||||
WriteUInt32 (section.VirtualAddress); |
||||
WriteUInt32 (section.SizeOfRawData); |
||||
WriteUInt32 (section.PointerToRawData); |
||||
WriteUInt32 (0); // PointerToRelocations
|
||||
WriteUInt32 (0); // PointerToLineNumbers
|
||||
WriteUInt16 (0); // NumberOfRelocations
|
||||
WriteUInt16 (0); // NumberOfLineNumbers
|
||||
WriteUInt32 (characteristics); |
||||
} |
||||
|
||||
void MoveTo (uint pointer) |
||||
{ |
||||
BaseStream.Seek (pointer, SeekOrigin.Begin); |
||||
} |
||||
|
||||
void MoveToRVA (Section section, RVA rva) |
||||
{ |
||||
BaseStream.Seek (section.PointerToRawData + rva - section.VirtualAddress, SeekOrigin.Begin); |
||||
} |
||||
|
||||
void MoveToRVA (TextSegment segment) |
||||
{ |
||||
MoveToRVA (text, text_map.GetRVA (segment)); |
||||
} |
||||
|
||||
void WriteRVA (RVA rva) |
||||
{ |
||||
if (!pe64) |
||||
WriteUInt32 (rva); |
||||
else |
||||
WriteUInt64 (rva); |
||||
} |
||||
|
||||
void WriteText () |
||||
{ |
||||
MoveTo (text.PointerToRawData); |
||||
|
||||
// ImportAddressTable
|
||||
|
||||
WriteRVA (text_map.GetRVA (TextSegment.ImportHintNameTable)); |
||||
WriteRVA (0); |
||||
|
||||
// CLIHeader
|
||||
|
||||
WriteUInt32 (0x48); |
||||
WriteUInt16 (2); |
||||
WriteUInt16 ((ushort) ((module.Runtime <= TargetRuntime.Net_1_1) ? 0 : 5)); |
||||
|
||||
WriteUInt32 (text_map.GetRVA (TextSegment.MetadataHeader)); |
||||
WriteUInt32 (GetMetadataLength ()); |
||||
WriteUInt32 ((uint) module.Attributes); |
||||
WriteUInt32 (metadata.entry_point.ToUInt32 ()); |
||||
WriteDataDirectory (text_map.GetDataDirectory (TextSegment.Resources)); |
||||
WriteDataDirectory (text_map.GetDataDirectory (TextSegment.StrongNameSignature)); |
||||
WriteZeroDataDirectory (); // CodeManagerTable
|
||||
WriteZeroDataDirectory (); // VTableFixups
|
||||
WriteZeroDataDirectory (); // ExportAddressTableJumps
|
||||
WriteZeroDataDirectory (); // ManagedNativeHeader
|
||||
|
||||
// Code
|
||||
|
||||
MoveToRVA (TextSegment.Code); |
||||
WriteBuffer (metadata.code); |
||||
|
||||
// Resources
|
||||
|
||||
MoveToRVA (TextSegment.Resources); |
||||
WriteBuffer (metadata.resources); |
||||
|
||||
// Data
|
||||
|
||||
if (metadata.data.length > 0) { |
||||
MoveToRVA (TextSegment.Data); |
||||
WriteBuffer (metadata.data); |
||||
} |
||||
|
||||
// StrongNameSignature
|
||||
// stays blank
|
||||
|
||||
// MetadataHeader
|
||||
|
||||
MoveToRVA (TextSegment.MetadataHeader); |
||||
WriteMetadataHeader (); |
||||
|
||||
WriteMetadata (); |
||||
|
||||
// DebugDirectory
|
||||
if (text_map.GetLength (TextSegment.DebugDirectory) > 0) { |
||||
MoveToRVA (TextSegment.DebugDirectory); |
||||
WriteDebugDirectory (); |
||||
} |
||||
|
||||
// ImportDirectory
|
||||
MoveToRVA (TextSegment.ImportDirectory); |
||||
WriteImportDirectory (); |
||||
|
||||
// StartupStub
|
||||
MoveToRVA (TextSegment.StartupStub); |
||||
WriteStartupStub (); |
||||
} |
||||
|
||||
uint GetMetadataLength () |
||||
{ |
||||
return text_map.GetRVA (TextSegment.DebugDirectory) - text_map.GetRVA (TextSegment.MetadataHeader); |
||||
} |
||||
|
||||
void WriteMetadataHeader () |
||||
{ |
||||
WriteUInt32 (0x424a5342); // Signature
|
||||
WriteUInt16 (1); // MajorVersion
|
||||
WriteUInt16 (1); // MinorVersion
|
||||
WriteUInt32 (0); // Reserved
|
||||
|
||||
var version = GetZeroTerminatedString (GetVersion ()); |
||||
WriteUInt32 ((uint) version.Length); |
||||
WriteBytes (version); |
||||
WriteUInt16 (0); // Flags
|
||||
WriteUInt16 (GetStreamCount ()); |
||||
|
||||
uint offset = text_map.GetRVA (TextSegment.TableHeap) - text_map.GetRVA (TextSegment.MetadataHeader); |
||||
|
||||
WriteStreamHeader (ref offset, TextSegment.TableHeap, "#~"); |
||||
WriteStreamHeader (ref offset, TextSegment.StringHeap, "#Strings"); |
||||
WriteStreamHeader (ref offset, TextSegment.UserStringHeap, "#US"); |
||||
WriteStreamHeader (ref offset, TextSegment.GuidHeap, "#GUID"); |
||||
WriteStreamHeader (ref offset, TextSegment.BlobHeap, "#Blob"); |
||||
} |
||||
|
||||
string GetVersion () |
||||
{ |
||||
switch (module.Runtime) { |
||||
case TargetRuntime.Net_1_0: |
||||
return "v1.0.3705"; |
||||
case TargetRuntime.Net_1_1: |
||||
return "v1.1.4322"; |
||||
case TargetRuntime.Net_2_0: |
||||
return "v2.0.50727"; |
||||
case TargetRuntime.Net_4_0: |
||||
default: |
||||
return "v4.0.30319"; |
||||
} |
||||
} |
||||
|
||||
ushort GetStreamCount () |
||||
{ |
||||
return (ushort) ( |
||||
1 // #~
|
||||
+ 1 // #Strings
|
||||
+ (metadata.user_string_heap.IsEmpty ? 0 : 1) // #US
|
||||
+ 1 // GUID
|
||||
+ (metadata.blob_heap.IsEmpty ? 0 : 1)); // #Blob
|
||||
} |
||||
|
||||
void WriteStreamHeader (ref uint offset, TextSegment heap, string name) |
||||
{ |
||||
var length = (uint) text_map.GetLength (heap); |
||||
if (length == 0) |
||||
return; |
||||
|
||||
WriteUInt32 (offset); |
||||
WriteUInt32 (length); |
||||
WriteBytes (GetZeroTerminatedString (name)); |
||||
offset += length; |
||||
} |
||||
|
||||
static byte [] GetZeroTerminatedString (string @string) |
||||
{ |
||||
return GetString (@string, (@string.Length + 1 + 3) & ~3); |
||||
} |
||||
|
||||
static byte [] GetSimpleString (string @string) |
||||
{ |
||||
return GetString (@string, @string.Length); |
||||
} |
||||
|
||||
static byte [] GetString (string @string, int length) |
||||
{ |
||||
var bytes = new byte [length]; |
||||
for (int i = 0; i < @string.Length; i++) |
||||
bytes [i] = (byte) @string [i]; |
||||
|
||||
return bytes; |
||||
} |
||||
|
||||
void WriteMetadata () |
||||
{ |
||||
WriteHeap (TextSegment.TableHeap, metadata.table_heap); |
||||
WriteHeap (TextSegment.StringHeap, metadata.string_heap); |
||||
WriteHeap (TextSegment.UserStringHeap, metadata.user_string_heap); |
||||
WriteGuidHeap (); |
||||
WriteHeap (TextSegment.BlobHeap, metadata.blob_heap); |
||||
} |
||||
|
||||
void WriteHeap (TextSegment heap, HeapBuffer buffer) |
||||
{ |
||||
if (buffer.IsEmpty) |
||||
return; |
||||
|
||||
MoveToRVA (heap); |
||||
WriteBuffer (buffer); |
||||
} |
||||
|
||||
void WriteGuidHeap () |
||||
{ |
||||
MoveToRVA (TextSegment.GuidHeap); |
||||
WriteBytes (module.Mvid.ToByteArray ()); |
||||
} |
||||
|
||||
void WriteDebugDirectory () |
||||
{ |
||||
WriteInt32 (debug_directory.Characteristics); |
||||
WriteUInt32 (time_stamp); |
||||
WriteInt16 (debug_directory.MajorVersion); |
||||
WriteInt16 (debug_directory.MinorVersion); |
||||
WriteInt32 (debug_directory.Type); |
||||
WriteInt32 (debug_directory.SizeOfData); |
||||
WriteInt32 (debug_directory.AddressOfRawData); |
||||
WriteInt32 ((int) BaseStream.Position + 4); |
||||
|
||||
WriteBytes (debug_data); |
||||
} |
||||
|
||||
void WriteImportDirectory () |
||||
{ |
||||
WriteUInt32 (text_map.GetRVA (TextSegment.ImportDirectory) + 40); // ImportLookupTable
|
||||
WriteUInt32 (0); // DateTimeStamp
|
||||
WriteUInt32 (0); // ForwarderChain
|
||||
WriteUInt32 (text_map.GetRVA (TextSegment.ImportHintNameTable) + 14); |
||||
WriteUInt32 (text_map.GetRVA (TextSegment.ImportAddressTable)); |
||||
Advance (20); |
||||
|
||||
// ImportLookupTable
|
||||
WriteUInt32 (text_map.GetRVA (TextSegment.ImportHintNameTable)); |
||||
|
||||
// ImportHintNameTable
|
||||
MoveToRVA (TextSegment.ImportHintNameTable); |
||||
|
||||
WriteUInt16 (0); // Hint
|
||||
WriteBytes (GetRuntimeMain ()); |
||||
WriteByte (0); |
||||
WriteBytes (GetSimpleString ("mscoree.dll")); |
||||
WriteUInt16 (0); |
||||
} |
||||
|
||||
byte [] GetRuntimeMain () |
||||
{ |
||||
return module.Kind == ModuleKind.Dll || module.Kind == ModuleKind.NetModule |
||||
? GetSimpleString ("_CorDllMain") |
||||
: GetSimpleString ("_CorExeMain"); |
||||
} |
||||
|
||||
void WriteStartupStub () |
||||
{ |
||||
switch (module.Architecture) { |
||||
case TargetArchitecture.I386: |
||||
WriteUInt16 (0x25ff); |
||||
WriteUInt32 ((uint) image_base + text_map.GetRVA (TextSegment.ImportAddressTable)); |
||||
return; |
||||
case TargetArchitecture.AMD64: |
||||
WriteUInt16 (0xa148); |
||||
WriteUInt32 ((uint) image_base + text_map.GetRVA (TextSegment.ImportAddressTable)); |
||||
WriteUInt16 (0xe0ff); |
||||
return; |
||||
case TargetArchitecture.IA64: |
||||
WriteBytes (new byte [] { |
||||
0x0b, 0x48, 0x00, 0x02, 0x18, 0x10, 0xa0, 0x40, 0x24, 0x30, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, |
||||
0x10, 0x08, 0x00, 0x12, 0x18, 0x10, 0x60, 0x50, 0x04, 0x80, 0x03, 0x00, 0x60, 0x00, 0x80, 0x00 |
||||
}); |
||||
WriteUInt32 ((uint) image_base + text_map.GetRVA (TextSegment.StartupStub)); |
||||
WriteUInt32 ((uint) image_base + text_rva); |
||||
return; |
||||
} |
||||
} |
||||
|
||||
void WriteRsrc () |
||||
{ |
||||
MoveTo (rsrc.PointerToRawData); |
||||
WriteBuffer (win32_resources); |
||||
} |
||||
|
||||
void WriteReloc () |
||||
{ |
||||
MoveTo (reloc.PointerToRawData); |
||||
|
||||
var reloc_rva = text_map.GetRVA (TextSegment.StartupStub); |
||||
reloc_rva += module.Architecture == TargetArchitecture.IA64 ? 0x20u : 2; |
||||
var page_rva = reloc_rva & ~0xfffu; |
||||
|
||||
WriteUInt32 (page_rva); // PageRVA
|
||||
WriteUInt32 (0x000c); // Block Size
|
||||
|
||||
switch (module.Architecture) { |
||||
case TargetArchitecture.I386: |
||||
WriteUInt32 (0x3000 + reloc_rva - page_rva); |
||||
break; |
||||
case TargetArchitecture.AMD64: |
||||
WriteUInt32 (0xa000 + reloc_rva - page_rva); |
||||
break; |
||||
case TargetArchitecture.IA64: |
||||
WriteUInt16 ((ushort) (0xa000 + reloc_rva - page_rva)); |
||||
WriteUInt16 ((ushort) (0xa000 + reloc_rva - page_rva + 8)); |
||||
break; |
||||
} |
||||
|
||||
WriteBytes (new byte [file_alignment - reloc.VirtualSize]); |
||||
} |
||||
|
||||
public void WriteImage () |
||||
{ |
||||
WriteDOSHeader (); |
||||
WritePEFileHeader (); |
||||
WriteOptionalHeaders (); |
||||
WriteSectionHeaders (); |
||||
WriteText (); |
||||
if (rsrc != null) |
||||
WriteRsrc (); |
||||
WriteReloc (); |
||||
} |
||||
|
||||
TextMap BuildTextMap () |
||||
{ |
||||
var map = metadata.text_map; |
||||
|
||||
map.AddMap (TextSegment.Code, metadata.code.length, !pe64 ? 4 : 16); |
||||
map.AddMap (TextSegment.Resources, metadata.resources.length, 8); |
||||
map.AddMap (TextSegment.Data, metadata.data.length, 4); |
||||
if (metadata.data.length > 0) |
||||
metadata.table_heap.FixupData (map.GetRVA (TextSegment.Data)); |
||||
map.AddMap (TextSegment.StrongNameSignature, GetStrongNameLength (), 4); |
||||
|
||||
map.AddMap (TextSegment.MetadataHeader, GetMetadataHeaderLength ()); |
||||
map.AddMap (TextSegment.TableHeap, metadata.table_heap.length, 4); |
||||
map.AddMap (TextSegment.StringHeap, metadata.string_heap.length, 4); |
||||
map.AddMap (TextSegment.UserStringHeap, metadata.user_string_heap.IsEmpty ? 0 : metadata.user_string_heap.length, 4); |
||||
map.AddMap (TextSegment.GuidHeap, 16); |
||||
map.AddMap (TextSegment.BlobHeap, metadata.blob_heap.IsEmpty ? 0 : metadata.blob_heap.length, 4); |
||||
|
||||
int debug_dir_len = 0; |
||||
if (!debug_data.IsNullOrEmpty ()) { |
||||
const int debug_dir_header_len = 28; |
||||
|
||||
debug_directory.AddressOfRawData = (int) map.GetNextRVA (TextSegment.BlobHeap) + debug_dir_header_len; |
||||
debug_dir_len = debug_data.Length + debug_dir_header_len; |
||||
} |
||||
|
||||
map.AddMap (TextSegment.DebugDirectory, debug_dir_len, 4); |
||||
|
||||
RVA import_dir_rva = map.GetNextRVA (TextSegment.DebugDirectory); |
||||
RVA import_hnt_rva = import_dir_rva + (!pe64 ? 48u : 52u); |
||||
import_hnt_rva = (import_hnt_rva + 15u) & ~15u; |
||||
uint import_dir_len = (import_hnt_rva - import_dir_rva) + 27u; |
||||
|
||||
RVA startup_stub_rva = import_dir_rva + import_dir_len; |
||||
startup_stub_rva = module.Architecture == TargetArchitecture.IA64 |
||||
? (startup_stub_rva + 15u) & ~15u |
||||
: 2 + ((startup_stub_rva + 3u) & ~3u); |
||||
|
||||
map.AddMap (TextSegment.ImportDirectory, new Range (import_dir_rva, import_dir_len)); |
||||
map.AddMap (TextSegment.ImportHintNameTable, new Range (import_hnt_rva, 0)); |
||||
map.AddMap (TextSegment.StartupStub, new Range (startup_stub_rva, GetStartupStubLength ())); |
||||
|
||||
return map; |
||||
} |
||||
|
||||
uint GetStartupStubLength () |
||||
{ |
||||
switch (module.Architecture) { |
||||
case TargetArchitecture.I386: |
||||
return 6; |
||||
case TargetArchitecture.AMD64: |
||||
return 12; |
||||
case TargetArchitecture.IA64: |
||||
return 48; |
||||
default: |
||||
throw new InvalidOperationException (); |
||||
} |
||||
} |
||||
|
||||
int GetMetadataHeaderLength () |
||||
{ |
||||
return |
||||
// MetadataHeader
|
||||
40 |
||||
// #~ header
|
||||
+ 12 |
||||
// #Strings header
|
||||
+ 20 |
||||
// #US header
|
||||
+ (metadata.user_string_heap.IsEmpty ? 0 : 12) |
||||
// #GUID header
|
||||
+ 16 |
||||
// #Blob header
|
||||
+ (metadata.blob_heap.IsEmpty ? 0 : 16); |
||||
} |
||||
|
||||
int GetStrongNameLength () |
||||
{ |
||||
if ((module.Attributes & ModuleAttributes.StrongNameSigned) == 0) |
||||
return 0; |
||||
|
||||
if (module.Assembly == null) |
||||
throw new InvalidOperationException (); |
||||
|
||||
var public_key = module.Assembly.Name.PublicKey; |
||||
|
||||
if (public_key != null) { |
||||
// in fx 2.0 the key may be from 384 to 16384 bits
|
||||
// so we must calculate the signature size based on
|
||||
// the size of the public key (minus the 32 byte header)
|
||||
int size = public_key.Length; |
||||
if (size > 32) |
||||
return size - 32; |
||||
// note: size == 16 for the ECMA "key" which is replaced
|
||||
// by the runtime with a 1024 bits key (128 bytes)
|
||||
} |
||||
|
||||
return 128; // default strongname signature size
|
||||
} |
||||
|
||||
public DataDirectory GetStrongNameSignatureDirectory () |
||||
{ |
||||
return text_map.GetDataDirectory (TextSegment.StrongNameSignature); |
||||
} |
||||
|
||||
public uint GetHeaderSize () |
||||
{ |
||||
return pe_header_size + (sections * section_header_size); |
||||
} |
||||
|
||||
void PatchWin32Resources (ByteBuffer resources) |
||||
{ |
||||
PatchResourceDirectoryTable (resources); |
||||
} |
||||
|
||||
void PatchResourceDirectoryTable (ByteBuffer resources) |
||||
{ |
||||
resources.Advance (12); |
||||
|
||||
var entries = resources.ReadUInt16 () + resources.ReadUInt16 (); |
||||
|
||||
for (int i = 0; i < entries; i++) |
||||
PatchResourceDirectoryEntry (resources); |
||||
} |
||||
|
||||
void PatchResourceDirectoryEntry (ByteBuffer resources) |
||||
{ |
||||
resources.Advance (4); |
||||
var child = resources.ReadUInt32 (); |
||||
|
||||
var position = resources.position; |
||||
resources.position = (int) child & 0x7fffffff; |
||||
|
||||
if ((child & 0x80000000) != 0) |
||||
PatchResourceDirectoryTable (resources); |
||||
else |
||||
PatchResourceDataEntry (resources); |
||||
|
||||
resources.position = position; |
||||
} |
||||
|
||||
void PatchResourceDataEntry (ByteBuffer resources) |
||||
{ |
||||
var old_rsrc = GetImageResourceSection (); |
||||
var rva = resources.ReadUInt32 (); |
||||
resources.position -= 4; |
||||
resources.WriteUInt32 (rva - old_rsrc.VirtualAddress + rsrc.VirtualAddress); |
||||
} |
||||
} |
||||
} |
||||
|
||||
#endif
|
@ -0,0 +1,43 @@
@@ -0,0 +1,43 @@
|
||||
//
|
||||
// Section.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using RVA = System.UInt32; |
||||
|
||||
namespace Mono.Cecil.PE { |
||||
|
||||
sealed class Section { |
||||
public string Name; |
||||
public RVA VirtualAddress; |
||||
public uint VirtualSize; |
||||
public uint SizeOfRawData; |
||||
public uint PointerToRawData; |
||||
public byte [] Data; |
||||
} |
||||
} |
@ -0,0 +1,129 @@
@@ -0,0 +1,129 @@
|
||||
//
|
||||
// TextMap.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
#if !READ_ONLY
|
||||
|
||||
using RVA = System.UInt32; |
||||
|
||||
namespace Mono.Cecil.PE { |
||||
|
||||
enum TextSegment { |
||||
ImportAddressTable, |
||||
CLIHeader, |
||||
Code, |
||||
Resources, |
||||
Data, |
||||
StrongNameSignature, |
||||
|
||||
// Metadata
|
||||
MetadataHeader, |
||||
TableHeap, |
||||
StringHeap, |
||||
UserStringHeap, |
||||
GuidHeap, |
||||
BlobHeap, |
||||
// End Metadata
|
||||
|
||||
DebugDirectory, |
||||
ImportDirectory, |
||||
ImportHintNameTable, |
||||
StartupStub, |
||||
} |
||||
|
||||
sealed class TextMap { |
||||
|
||||
readonly Range [] map = new Range [16 /*Enum.GetValues (typeof (TextSegment)).Length*/]; |
||||
|
||||
public void AddMap (TextSegment segment, int length) |
||||
{ |
||||
map [(int) segment] = new Range (GetStart (segment), (uint) length); |
||||
} |
||||
|
||||
public void AddMap (TextSegment segment, int length, int align) |
||||
{ |
||||
align--; |
||||
|
||||
AddMap (segment, (length + align) & ~align); |
||||
} |
||||
|
||||
public void AddMap (TextSegment segment, Range range) |
||||
{ |
||||
map [(int) segment] = range; |
||||
} |
||||
|
||||
public Range GetRange (TextSegment segment) |
||||
{ |
||||
return map [(int) segment]; |
||||
} |
||||
|
||||
public DataDirectory GetDataDirectory (TextSegment segment) |
||||
{ |
||||
var range = map [(int) segment]; |
||||
|
||||
return new DataDirectory (range.Length == 0 ? 0 : range.Start, range.Length); |
||||
} |
||||
|
||||
public RVA GetRVA (TextSegment segment) |
||||
{ |
||||
return map [(int) segment].Start; |
||||
} |
||||
|
||||
public RVA GetNextRVA (TextSegment segment) |
||||
{ |
||||
var i = (int) segment; |
||||
return map [i].Start + map [i].Length; |
||||
} |
||||
|
||||
public int GetLength (TextSegment segment) |
||||
{ |
||||
return (int) map [(int) segment].Length; |
||||
} |
||||
|
||||
RVA GetStart (TextSegment segment) |
||||
{ |
||||
var index = (int) segment; |
||||
return index == 0 ? ImageWriter.text_rva : ComputeStart (index); |
||||
} |
||||
|
||||
RVA ComputeStart (int index) |
||||
{ |
||||
index--; |
||||
return map [index].Start + map [index].Length; |
||||
} |
||||
|
||||
public uint GetLength () |
||||
{ |
||||
var range = map [(int) TextSegment.StartupStub]; |
||||
return range.Start - ImageWriter.text_rva + range.Length; |
||||
} |
||||
} |
||||
} |
||||
|
||||
#endif
|
@ -0,0 +1,264 @@
@@ -0,0 +1,264 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
<PropertyGroup> |
||||
<Configuration Condition=" '$(Configuration)' == '' ">net_4_0_Debug</Configuration> |
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> |
||||
<ProductVersion>9.0.30729</ProductVersion> |
||||
<SchemaVersion>2.0</SchemaVersion> |
||||
<ProjectGuid>{D68133BD-1E63-496E-9EDE-4FBDBF77B486}</ProjectGuid> |
||||
<OutputType>Library</OutputType> |
||||
<AppDesignerFolder>Properties</AppDesignerFolder> |
||||
<RootNamespace>Mono.Cecil</RootNamespace> |
||||
<AssemblyName>Mono.Cecil</AssemblyName> |
||||
<FileAlignment>512</FileAlignment> |
||||
<SignAssembly>true</SignAssembly> |
||||
<AssemblyOriginatorKeyFile>mono.snk</AssemblyOriginatorKeyFile> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'net_2_0_Debug|AnyCPU' "> |
||||
<DebugSymbols>true</DebugSymbols> |
||||
<DebugType>full</DebugType> |
||||
<Optimize>false</Optimize> |
||||
<OutputPath>bin\net_2_0_Debug\</OutputPath> |
||||
<DefineConstants>DEBUG;TRACE</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'net_2_0_Release|AnyCPU' "> |
||||
<DebugType>pdbonly</DebugType> |
||||
<Optimize>true</Optimize> |
||||
<OutputPath>bin\net_2_0_Release\</OutputPath> |
||||
<DefineConstants>TRACE</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'net_3_5_Debug|AnyCPU' "> |
||||
<DebugSymbols>true</DebugSymbols> |
||||
<DebugType>full</DebugType> |
||||
<Optimize>false</Optimize> |
||||
<OutputPath>bin\net_3_5_Debug\</OutputPath> |
||||
<DefineConstants>DEBUG;TRACE;NET_3_5</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'net_3_5_Release|AnyCPU' "> |
||||
<DebugType>pdbonly</DebugType> |
||||
<Optimize>true</Optimize> |
||||
<OutputPath>bin\net_3_5_Release\</OutputPath> |
||||
<DefineConstants>TRACE;NET_3_5</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'net_4_0_Debug|AnyCPU' "> |
||||
<DebugSymbols>true</DebugSymbols> |
||||
<DebugType>full</DebugType> |
||||
<Optimize>false</Optimize> |
||||
<OutputPath>bin\net_4_0_Debug\</OutputPath> |
||||
<DefineConstants>DEBUG;TRACE;NET_3_5;NET_4_0</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'net_4_0_Release|AnyCPU' "> |
||||
<DebugType>pdbonly</DebugType> |
||||
<Optimize>true</Optimize> |
||||
<OutputPath>bin\net_4_0_Release\</OutputPath> |
||||
<DefineConstants>TRACE;NET_3_5;NET_4_0</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'silverlight_Debug|AnyCPU' "> |
||||
<DebugSymbols>true</DebugSymbols> |
||||
<DebugType>full</DebugType> |
||||
<Optimize>false</Optimize> |
||||
<OutputPath>bin\silverlight_Debug\</OutputPath> |
||||
<DefineConstants>DEBUG;TRACE;NET_3_5;NET_4_0;SILVERLIGHT</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
<TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier> |
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'silverlight_Release|AnyCPU' "> |
||||
<DebugType>pdbonly</DebugType> |
||||
<Optimize>true</Optimize> |
||||
<OutputPath>bin\silverlight_Release\</OutputPath> |
||||
<DefineConstants>TRACE;NET_3_5;NET_4_0;SILVERLIGHT</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
<TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier> |
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'winphone_Debug|AnyCPU' "> |
||||
<DebugSymbols>true</DebugSymbols> |
||||
<DebugType>full</DebugType> |
||||
<Optimize>false</Optimize> |
||||
<OutputPath>bin\winphone_Debug\</OutputPath> |
||||
<DefineConstants>DEBUG;TRACE;NET_3_5;NET_4_0;SILVERLIGHT;CF</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
<TargetFrameworkProfile>WindowsPhone</TargetFrameworkProfile> |
||||
<TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier> |
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'winphone_Release|AnyCPU' "> |
||||
<DebugType>pdbonly</DebugType> |
||||
<Optimize>true</Optimize> |
||||
<OutputPath>bin\winphone_Release\</OutputPath> |
||||
<DefineConstants>TRACE;NET_3_5;NET_4_0;SILVERLIGHT;CF</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
<TargetFrameworkProfile>WindowsPhone</TargetFrameworkProfile> |
||||
<TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier> |
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> |
||||
</PropertyGroup> |
||||
<ItemGroup Condition=" '$(TargetFrameworkVersion)' != 'v2.0' "> |
||||
<Reference Include="System.Core" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<Compile Include="Mono.Cecil.Cil\Code.cs" /> |
||||
<Compile Include="Mono.Cecil.Cil\CodeWriter.cs" /> |
||||
<Compile Include="Mono.Cecil.Cil\CodeReader.cs" /> |
||||
<Compile Include="Mono.Cecil.Cil\Document.cs" /> |
||||
<Compile Include="Mono.Cecil.Cil\ExceptionHandler.cs" /> |
||||
<Compile Include="Mono.Cecil.Cil\ILProcessor.cs" /> |
||||
<Compile Include="Mono.Cecil.Cil\Instruction.cs" /> |
||||
<Compile Include="Mono.Cecil.Cil\MethodBody.cs" /> |
||||
<Compile Include="Mono.Cecil.Cil\OpCode.cs" /> |
||||
<Compile Include="Mono.Cecil.Cil\OpCodes.cs" /> |
||||
<Compile Include="Mono.Cecil.Cil\SequencePoint.cs" /> |
||||
<Compile Include="Mono.Cecil.Cil\Symbols.cs" /> |
||||
<Compile Include="Mono.Cecil.Cil\VariableDefinition.cs" /> |
||||
<Compile Include="Mono.Cecil.Cil\VariableReference.cs" /> |
||||
<Compile Include="Mono.Cecil.Metadata\BlobHeap.cs" /> |
||||
<Compile Include="Mono.Cecil.Metadata\Buffers.cs" /> |
||||
<Compile Include="Mono.Cecil.Metadata\CodedIndex.cs" /> |
||||
<Compile Include="Mono.Cecil.Metadata\ElementType.cs" /> |
||||
<Compile Include="Mono.Cecil.Metadata\GuidHeap.cs" /> |
||||
<Compile Include="Mono.Cecil.Metadata\Heap.cs" /> |
||||
<Compile Include="Mono.Cecil.Metadata\MetadataToken.cs" /> |
||||
<Compile Include="Mono.Cecil.Metadata\Row.cs" /> |
||||
<Compile Include="Mono.Cecil.Metadata\StringHeap.cs" /> |
||||
<Compile Include="Mono.Cecil.Metadata\TableHeap.cs" /> |
||||
<Compile Include="Mono.Cecil.Metadata\TokenType.cs" /> |
||||
<Compile Include="Mono.Cecil.Metadata\UserStringHeap.cs" /> |
||||
<Compile Include="Mono.Cecil.Metadata\Utilities.cs" /> |
||||
<Compile Include="Mono.Cecil.PE\BinaryStreamReader.cs" /> |
||||
<Compile Include="Mono.Cecil.PE\BinaryStreamWriter.cs" /> |
||||
<Compile Include="Mono.Cecil.PE\ByteBufferEqualityComparer.cs" /> |
||||
<Compile Include="Mono.Cecil.PE\ByteBuffer.cs" /> |
||||
<Compile Include="Mono.Cecil.PE\DataDirectory.cs" /> |
||||
<Compile Include="Mono.Cecil.PE\Image.cs" /> |
||||
<Compile Include="Mono.Cecil.PE\ImageReader.cs" /> |
||||
<Compile Include="Mono.Cecil.PE\ImageWriter.cs" /> |
||||
<Compile Include="Mono.Cecil.PE\Section.cs" /> |
||||
<Compile Include="Mono.Cecil.PE\TextMap.cs" /> |
||||
<Compile Include="Mono.Cecil\ArrayType.cs" /> |
||||
<Compile Include="Mono.Cecil\AssemblyDefinition.cs" /> |
||||
<Compile Include="Mono.Cecil\AssemblyFlags.cs" /> |
||||
<Compile Include="Mono.Cecil\AssemblyHashAlgorithm.cs" /> |
||||
<Compile Include="Mono.Cecil\AssemblyInfo.cs" /> |
||||
<Compile Include="Mono.Cecil\AssemblyLinkedResource.cs" /> |
||||
<Compile Include="Mono.Cecil\AssemblyNameDefinition.cs" /> |
||||
<Compile Include="Mono.Cecil\AssemblyNameReference.cs" /> |
||||
<Compile Include="Mono.Cecil\AssemblyReader.cs" /> |
||||
<Compile Include="Mono.Cecil\AssemblyWriter.cs" /> |
||||
<Compile Include="Mono.Cecil\BaseAssemblyResolver.cs" /> |
||||
<Compile Include="Mono.Cecil\CallSite.cs" /> |
||||
<Compile Include="Mono.Cecil\TypeParser.cs" /> |
||||
<Compile Include="Mono.Cecil\Import.cs" /> |
||||
<Compile Include="Mono.Collections.Generic\Collection.cs" /> |
||||
<Compile Include="Mono.Cecil\ExportedType.cs" /> |
||||
<Compile Include="Mono.Cecil\SecurityDeclaration.cs" /> |
||||
<Compile Include="Mono.Cecil\CustomAttribute.cs" /> |
||||
<Compile Include="Mono.Cecil\DefaultAssemblyResolver.cs" /> |
||||
<Compile Include="Mono.Cecil\FileAttributes.cs" /> |
||||
<Compile Include="Mono.Cecil\FunctionPointerType.cs" /> |
||||
<Compile Include="Mono.Cecil\GenericInstanceMethod.cs" /> |
||||
<Compile Include="Mono.Cecil\GenericInstanceType.cs" /> |
||||
<Compile Include="Mono.Cecil\GenericParameter.cs" /> |
||||
<Compile Include="Mono.Cecil\GenericParameterAttributes.cs" /> |
||||
<Compile Include="Mono.Cecil\IConstantProvider.cs" /> |
||||
<Compile Include="Mono.Cecil\ICustomAttributeProvider.cs" /> |
||||
<Compile Include="Mono.Cecil\IGenericInstance.cs" /> |
||||
<Compile Include="Mono.Cecil\IGenericParameterProvider.cs" /> |
||||
<Compile Include="Mono.Cecil\IMarshalInfoProvider.cs" /> |
||||
<Compile Include="Mono.Cecil\MarshalInfo.cs" /> |
||||
<Compile Include="Mono.Cecil\MetadataResolver.cs" /> |
||||
<Compile Include="Mono.Cecil\Modifiers.cs" /> |
||||
<Compile Include="Mono.Cecil\NativeType.cs" /> |
||||
<Compile Include="Mono.Cecil\PinnedType.cs" /> |
||||
<Compile Include="Mono.Cecil\MetadataSystem.cs" /> |
||||
<Compile Include="Mono.Cecil\IMethodSignature.cs" /> |
||||
<Compile Include="Mono.Cecil\ParameterDefinitionCollection.cs" /> |
||||
<Compile Include="Mono.Cecil\EmbeddedResource.cs" /> |
||||
<Compile Include="Mono.Cecil\EventAttributes.cs" /> |
||||
<Compile Include="Mono.Cecil\EventDefinition.cs" /> |
||||
<Compile Include="Mono.Cecil\EventReference.cs" /> |
||||
<Compile Include="Mono.Cecil\FieldAttributes.cs" /> |
||||
<Compile Include="Mono.Cecil\FieldDefinition.cs" /> |
||||
<Compile Include="Mono.Cecil\FieldReference.cs" /> |
||||
<Compile Include="Mono.Cecil\IMemberDefinition.cs" /> |
||||
<Compile Include="Mono.Cecil\LinkedResource.cs" /> |
||||
<Compile Include="Mono.Cecil\MemberReference.cs" /> |
||||
<Compile Include="Mono.Cecil\MethodAttributes.cs" /> |
||||
<Compile Include="Mono.Cecil\MethodCallingConvention.cs" /> |
||||
<Compile Include="Mono.Cecil\MethodDefinition.cs" /> |
||||
<Compile Include="Mono.Cecil\MethodImplAttributes.cs" /> |
||||
<Compile Include="Mono.Cecil\MethodReference.cs" /> |
||||
<Compile Include="Mono.Cecil\MethodReturnType.cs" /> |
||||
<Compile Include="Mono.Cecil\MethodSemanticsAttributes.cs" /> |
||||
<Compile Include="Mono.Cecil\MethodSpecification.cs" /> |
||||
<Compile Include="Mono.Cecil\ParameterAttributes.cs" /> |
||||
<Compile Include="Mono.Cecil\ParameterDefinition.cs" /> |
||||
<Compile Include="Mono.Cecil\ParameterReference.cs" /> |
||||
<Compile Include="Mono.Cecil\PInvokeAttributes.cs" /> |
||||
<Compile Include="Mono.Cecil\PInvokeInfo.cs" /> |
||||
<Compile Include="Mono.Cecil\PointerType.cs" /> |
||||
<Compile Include="Mono.Cecil\PropertyAttributes.cs" /> |
||||
<Compile Include="Mono.Cecil\PropertyDefinition.cs" /> |
||||
<Compile Include="Mono.Cecil\PropertyReference.cs" /> |
||||
<Compile Include="Mono.Cecil\ReferenceType.cs" /> |
||||
<Compile Include="Mono.Cecil\IMetadataScope.cs" /> |
||||
<Compile Include="Mono.Cecil\IMetadataTokenProvider.cs" /> |
||||
<Compile Include="Mono.Cecil\ManifestResourceAttributes.cs" /> |
||||
<Compile Include="Mono.Cecil\ModuleReference.cs" /> |
||||
<Compile Include="Mono.Cecil\MemberDefinitionCollection.cs" /> |
||||
<Compile Include="Mono.Cecil\ModuleDefinition.cs" /> |
||||
<Compile Include="Mono.Cecil\ModuleKind.cs" /> |
||||
<Compile Include="Mono.Cecil\Resource.cs" /> |
||||
<Compile Include="Mono.Cecil\SentinelType.cs" /> |
||||
<Compile Include="Mono.Cecil\TargetRuntime.cs" /> |
||||
<Compile Include="Mono.Cecil\TypeAttributes.cs" /> |
||||
<Compile Include="Mono.Cecil\TypeDefinition.cs" /> |
||||
<Compile Include="Mono.Cecil\TypeDefinitionCollection.cs" /> |
||||
<Compile Include="Mono.Cecil\TypeReference.cs" /> |
||||
<Compile Include="Mono.Cecil\TypeSpecification.cs" /> |
||||
<Compile Include="Mono.Cecil\TypeSystem.cs" /> |
||||
<Compile Include="Mono.Cecil\VariantType.cs" /> |
||||
<Compile Include="Mono.Collections.Generic\ReadOnlyCollection.cs" /> |
||||
<Compile Include="Mono.Security.Cryptography\CryptoConvert.cs" /> |
||||
<Compile Include="Mono.Security.Cryptography\CryptoService.cs" /> |
||||
<Compile Include="System.Runtime.CompilerServices\ExtensionAttribute.cs" /> |
||||
<Compile Include="Mono\Actions.cs" /> |
||||
<Compile Include="Mono\Empty.cs" /> |
||||
<Compile Include="Mono\Funcs.cs" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<Content Include="NOTES.txt" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<None Include="mono.snk" /> |
||||
</ItemGroup> |
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. |
||||
Other similar extension points exist, see Microsoft.Common.targets. |
||||
<Target Name="BeforeBuild"> |
||||
</Target> |
||||
<Target Name="AfterBuild"> |
||||
</Target> |
||||
--> |
||||
</Project> |
@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
|
||||
<NUnitProject> |
||||
<Settings activeconfig="Default" /> |
||||
<Config name="Default" binpathtype="Auto"> |
||||
<assembly path="Test\bin\net_4_0_Debug\Mono.Cecil.Tests.dll" /> |
||||
<assembly path="rocks\Test\bin\net_4_0_Debug\Mono.Cecil.Rocks.Tests.dll" /> |
||||
<assembly path="symbols\mdb\Test\bin\net_4_0_Debug\Mono.Cecil.Mdb.Tests.dll" /> |
||||
<assembly path="symbols\pdb\Test\bin\net_4_0_Debug\Mono.Cecil.Pdb.Tests.dll" /> |
||||
</Config> |
||||
</NUnitProject> |
@ -0,0 +1,197 @@
@@ -0,0 +1,197 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 11.00 |
||||
# Visual Studio 2010 |
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{74E5ECE0-06B4-401C-AEBA-E8DD53E17943}" |
||||
EndProject |
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Symbols", "Symbols", "{929D5B3B-E29A-40CC-93D8-0FF43A6F9FA1}" |
||||
EndProject |
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil", "Mono.Cecil.csproj", "{D68133BD-1E63-496E-9EDE-4FBDBF77B486}" |
||||
EndProject |
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil.Tests", "Test\Mono.Cecil.Tests.csproj", "{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}" |
||||
EndProject |
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dbg", "dbg\dbg.csproj", "{89A775F3-64AB-485E-B958-60C25254B732}" |
||||
EndProject |
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil.Mdb", "symbols\mdb\Mono.Cecil.Mdb.csproj", "{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}" |
||||
EndProject |
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil.Mdb.Tests", "symbols\mdb\Test\Mono.Cecil.Mdb.Tests.csproj", "{AC71DF9C-99FA-4A63-990A-66C8010355A6}" |
||||
EndProject |
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil.Pdb", "symbols\pdb\Mono.Cecil.Pdb.csproj", "{63E6915C-7EA4-4D76-AB28-0D7191EEA626}" |
||||
EndProject |
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil.Pdb.Tests", "symbols\pdb\Test\Mono.Cecil.Pdb.Tests.csproj", "{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}" |
||||
EndProject |
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil.Rocks.Tests", "rocks\Test\Mono.Cecil.Rocks.Tests.csproj", "{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}" |
||||
EndProject |
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil.Rocks", "rocks\Mono.Cecil.Rocks.csproj", "{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}" |
||||
EndProject |
||||
Global |
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
net_2_0_Debug|Any CPU = net_2_0_Debug|Any CPU |
||||
net_2_0_Release|Any CPU = net_2_0_Release|Any CPU |
||||
net_3_5_Debug|Any CPU = net_3_5_Debug|Any CPU |
||||
net_3_5_Release|Any CPU = net_3_5_Release|Any CPU |
||||
net_4_0_Debug|Any CPU = net_4_0_Debug|Any CPU |
||||
net_4_0_Release|Any CPU = net_4_0_Release|Any CPU |
||||
silverlight_Debug|Any CPU = silverlight_Debug|Any CPU |
||||
silverlight_Release|Any CPU = silverlight_Release|Any CPU |
||||
winphone_Debug|Any CPU = winphone_Debug|Any CPU |
||||
winphone_Release|Any CPU = winphone_Release|Any CPU |
||||
EndGlobalSection |
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_2_0_Debug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_2_0_Debug|Any CPU.Build.0 = net_2_0_Debug|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_2_0_Release|Any CPU.ActiveCfg = net_2_0_Release|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_2_0_Release|Any CPU.Build.0 = net_2_0_Release|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.silverlight_Debug|Any CPU.ActiveCfg = silverlight_Debug|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.silverlight_Debug|Any CPU.Build.0 = silverlight_Debug|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.silverlight_Release|Any CPU.ActiveCfg = silverlight_Release|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.silverlight_Release|Any CPU.Build.0 = silverlight_Release|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.winphone_Debug|Any CPU.ActiveCfg = winphone_Debug|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.winphone_Debug|Any CPU.Build.0 = winphone_Debug|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.winphone_Release|Any CPU.ActiveCfg = winphone_Release|Any CPU |
||||
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}.winphone_Release|Any CPU.Build.0 = winphone_Release|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_2_0_Debug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_2_0_Debug|Any CPU.Build.0 = net_2_0_Debug|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_2_0_Release|Any CPU.ActiveCfg = net_2_0_Release|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_2_0_Release|Any CPU.Build.0 = net_2_0_Release|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.silverlight_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.silverlight_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.winphone_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.winphone_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{89A775F3-64AB-485E-B958-60C25254B732}.net_2_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU |
||||
{89A775F3-64AB-485E-B958-60C25254B732}.net_2_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{89A775F3-64AB-485E-B958-60C25254B732}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU |
||||
{89A775F3-64AB-485E-B958-60C25254B732}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU |
||||
{89A775F3-64AB-485E-B958-60C25254B732}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU |
||||
{89A775F3-64AB-485E-B958-60C25254B732}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU |
||||
{89A775F3-64AB-485E-B958-60C25254B732}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU |
||||
{89A775F3-64AB-485E-B958-60C25254B732}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU |
||||
{89A775F3-64AB-485E-B958-60C25254B732}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{89A775F3-64AB-485E-B958-60C25254B732}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU |
||||
{89A775F3-64AB-485E-B958-60C25254B732}.silverlight_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{89A775F3-64AB-485E-B958-60C25254B732}.silverlight_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{89A775F3-64AB-485E-B958-60C25254B732}.winphone_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{89A775F3-64AB-485E-B958-60C25254B732}.winphone_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_2_0_Debug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_2_0_Debug|Any CPU.Build.0 = net_2_0_Debug|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_2_0_Release|Any CPU.ActiveCfg = net_2_0_Release|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_2_0_Release|Any CPU.Build.0 = net_2_0_Release|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.silverlight_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.silverlight_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.winphone_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.winphone_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_2_0_Debug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_2_0_Debug|Any CPU.Build.0 = net_2_0_Debug|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_2_0_Release|Any CPU.ActiveCfg = net_2_0_Release|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_2_0_Release|Any CPU.Build.0 = net_2_0_Release|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.silverlight_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.silverlight_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.winphone_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6}.winphone_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_2_0_Debug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_2_0_Debug|Any CPU.Build.0 = net_2_0_Debug|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_2_0_Release|Any CPU.ActiveCfg = net_2_0_Release|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_2_0_Release|Any CPU.Build.0 = net_2_0_Release|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.silverlight_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.silverlight_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.winphone_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626}.winphone_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_2_0_Debug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_2_0_Debug|Any CPU.Build.0 = net_2_0_Debug|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_2_0_Release|Any CPU.ActiveCfg = net_2_0_Release|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_2_0_Release|Any CPU.Build.0 = net_2_0_Release|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.silverlight_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.silverlight_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.winphone_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.winphone_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_2_0_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_2_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.silverlight_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.silverlight_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.winphone_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.winphone_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_2_0_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_2_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.silverlight_Debug|Any CPU.ActiveCfg = silverlight_Debug|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.silverlight_Debug|Any CPU.Build.0 = silverlight_Debug|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.silverlight_Release|Any CPU.ActiveCfg = silverlight_Release|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.silverlight_Release|Any CPU.Build.0 = silverlight_Release|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.winphone_Debug|Any CPU.ActiveCfg = winphone_Debug|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.winphone_Debug|Any CPU.Build.0 = winphone_Debug|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.winphone_Release|Any CPU.ActiveCfg = winphone_Release|Any CPU |
||||
{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.winphone_Release|Any CPU.Build.0 = winphone_Release|Any CPU |
||||
EndGlobalSection |
||||
GlobalSection(SolutionProperties) = preSolution |
||||
HideSolutionNode = FALSE |
||||
EndGlobalSection |
||||
GlobalSection(NestedProjects) = preSolution |
||||
{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055} = {74E5ECE0-06B4-401C-AEBA-E8DD53E17943} |
||||
{AC71DF9C-99FA-4A63-990A-66C8010355A6} = {74E5ECE0-06B4-401C-AEBA-E8DD53E17943} |
||||
{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA} = {74E5ECE0-06B4-401C-AEBA-E8DD53E17943} |
||||
{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52} = {74E5ECE0-06B4-401C-AEBA-E8DD53E17943} |
||||
{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD} = {929D5B3B-E29A-40CC-93D8-0FF43A6F9FA1} |
||||
{63E6915C-7EA4-4D76-AB28-0D7191EEA626} = {929D5B3B-E29A-40CC-93D8-0FF43A6F9FA1} |
||||
EndGlobalSection |
||||
EndGlobal |
@ -0,0 +1,159 @@
@@ -0,0 +1,159 @@
|
||||
//
|
||||
// ArrayType.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Text; |
||||
using Mono.Collections.Generic; |
||||
using MD = Mono.Cecil.Metadata; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public struct ArrayDimension { |
||||
|
||||
int? lower_bound; |
||||
int? upper_bound; |
||||
|
||||
public int? LowerBound { |
||||
get { return lower_bound; } |
||||
set { lower_bound = value; } |
||||
} |
||||
|
||||
public int? UpperBound { |
||||
get { return upper_bound; } |
||||
set { upper_bound = value; } |
||||
} |
||||
|
||||
public bool IsSized { |
||||
get { return lower_bound.HasValue || upper_bound.HasValue; } |
||||
} |
||||
|
||||
public ArrayDimension (int? lowerBound, int? upperBound) |
||||
{ |
||||
this.lower_bound = lowerBound; |
||||
this.upper_bound = upperBound; |
||||
} |
||||
|
||||
public override string ToString () |
||||
{ |
||||
return !IsSized |
||||
? string.Empty |
||||
: lower_bound + "..." + upper_bound; |
||||
} |
||||
} |
||||
|
||||
public sealed class ArrayType : TypeSpecification { |
||||
|
||||
Collection<ArrayDimension> dimensions; |
||||
|
||||
public Collection<ArrayDimension> Dimensions { |
||||
get { |
||||
if (dimensions != null) |
||||
return dimensions; |
||||
|
||||
dimensions = new Collection<ArrayDimension> (); |
||||
dimensions.Add (new ArrayDimension ()); |
||||
return dimensions; |
||||
} |
||||
} |
||||
|
||||
public int Rank { |
||||
get { return dimensions == null ? 1 : dimensions.Count; } |
||||
} |
||||
|
||||
public bool IsVector { |
||||
get { |
||||
if (dimensions == null) |
||||
return true; |
||||
|
||||
if (dimensions.Count > 1) |
||||
return false; |
||||
|
||||
var dimension = dimensions [0]; |
||||
|
||||
return !dimension.IsSized; |
||||
} |
||||
} |
||||
|
||||
public override bool IsValueType { |
||||
get { return false; } |
||||
set { throw new InvalidOperationException (); } |
||||
} |
||||
|
||||
public override string Name { |
||||
get { return base.Name + Suffix; } |
||||
} |
||||
|
||||
public override string FullName { |
||||
get { return base.FullName + Suffix; } |
||||
} |
||||
|
||||
string Suffix { |
||||
get { |
||||
if (IsVector) |
||||
return "[]"; |
||||
|
||||
var suffix = new StringBuilder (); |
||||
suffix.Append ("["); |
||||
for (int i = 0; i < dimensions.Count; i++) { |
||||
if (i > 0) |
||||
suffix.Append (","); |
||||
|
||||
suffix.Append (dimensions [i].ToString ()); |
||||
} |
||||
suffix.Append ("]"); |
||||
|
||||
return suffix.ToString (); |
||||
} |
||||
} |
||||
|
||||
public override bool IsArray { |
||||
get { return true; } |
||||
} |
||||
|
||||
public ArrayType (TypeReference type) |
||||
: base (type) |
||||
{ |
||||
Mixin.CheckType (type); |
||||
this.etype = MD.ElementType.Array; |
||||
} |
||||
|
||||
public ArrayType (TypeReference type, int rank) |
||||
: this (type) |
||||
{ |
||||
Mixin.CheckType (type); |
||||
|
||||
if (rank == 1) |
||||
return; |
||||
|
||||
dimensions = new Collection<ArrayDimension> (rank); |
||||
for (int i = 0; i < rank; i++) |
||||
dimensions.Add (new ArrayDimension ()); |
||||
this.etype = MD.ElementType.Array; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,189 @@
@@ -0,0 +1,189 @@
|
||||
//
|
||||
// AssemblyDefinition.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.IO; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public sealed class AssemblyDefinition : ICustomAttributeProvider, ISecurityDeclarationProvider { |
||||
|
||||
AssemblyNameDefinition name; |
||||
|
||||
internal ModuleDefinition main_module; |
||||
Collection<ModuleDefinition> modules; |
||||
Collection<CustomAttribute> custom_attributes; |
||||
Collection<SecurityDeclaration> security_declarations; |
||||
|
||||
public AssemblyNameDefinition Name { |
||||
get { return name; } |
||||
set { name = value; } |
||||
} |
||||
|
||||
public string FullName { |
||||
get { return name != null ? name.FullName : string.Empty; } |
||||
} |
||||
|
||||
public MetadataToken MetadataToken { |
||||
get { return new MetadataToken (TokenType.Assembly, 1); } |
||||
set { } |
||||
} |
||||
|
||||
public Collection<ModuleDefinition> Modules { |
||||
get { |
||||
if (modules != null) |
||||
return modules; |
||||
|
||||
if (main_module.HasImage) |
||||
return modules = main_module.Read (this, (_, reader) => reader.ReadModules ()); |
||||
|
||||
return modules = new Collection<ModuleDefinition> { main_module }; |
||||
} |
||||
} |
||||
|
||||
public ModuleDefinition MainModule { |
||||
get { return main_module; } |
||||
} |
||||
|
||||
public MethodDefinition EntryPoint { |
||||
get { return main_module.EntryPoint; } |
||||
set { main_module.EntryPoint = value; } |
||||
} |
||||
|
||||
public bool HasCustomAttributes { |
||||
get { |
||||
if (custom_attributes != null) |
||||
return custom_attributes.Count > 0; |
||||
|
||||
return this.GetHasCustomAttributes (main_module); |
||||
} |
||||
} |
||||
|
||||
public Collection<CustomAttribute> CustomAttributes { |
||||
get { return custom_attributes ?? (custom_attributes = this.GetCustomAttributes (main_module)); } |
||||
} |
||||
|
||||
public bool HasSecurityDeclarations { |
||||
get { |
||||
if (security_declarations != null) |
||||
return security_declarations.Count > 0; |
||||
|
||||
return this.GetHasSecurityDeclarations (main_module); |
||||
} |
||||
} |
||||
|
||||
public Collection<SecurityDeclaration> SecurityDeclarations { |
||||
get { return security_declarations ?? (security_declarations = this.GetSecurityDeclarations (main_module)); } |
||||
} |
||||
|
||||
internal AssemblyDefinition () |
||||
{ |
||||
} |
||||
|
||||
#if !READ_ONLY
|
||||
public static AssemblyDefinition CreateAssembly (AssemblyNameDefinition assemblyName, string moduleName, ModuleKind kind) |
||||
{ |
||||
return CreateAssembly (assemblyName, moduleName, new ModuleParameters { Kind = kind }); |
||||
} |
||||
|
||||
public static AssemblyDefinition CreateAssembly (AssemblyNameDefinition assemblyName, string moduleName, ModuleParameters parameters) |
||||
{ |
||||
if (assemblyName == null) |
||||
throw new ArgumentNullException ("assemblyName"); |
||||
if (moduleName == null) |
||||
throw new ArgumentNullException ("moduleName"); |
||||
Mixin.CheckParameters (parameters); |
||||
if (parameters.Kind == ModuleKind.NetModule) |
||||
throw new ArgumentException ("kind"); |
||||
|
||||
var assembly = ModuleDefinition.CreateModule (moduleName, parameters).Assembly; |
||||
assembly.Name = assemblyName; |
||||
|
||||
return assembly; |
||||
} |
||||
#endif
|
||||
|
||||
public static AssemblyDefinition ReadAssembly (string fileName) |
||||
{ |
||||
return ReadAssembly (ModuleDefinition.ReadModule (fileName)); |
||||
} |
||||
|
||||
public static AssemblyDefinition ReadAssembly (string fileName, ReaderParameters parameters) |
||||
{ |
||||
return ReadAssembly (ModuleDefinition.ReadModule (fileName, parameters)); |
||||
} |
||||
|
||||
public static AssemblyDefinition ReadAssembly (Stream stream) |
||||
{ |
||||
return ReadAssembly (ModuleDefinition.ReadModule (stream)); |
||||
} |
||||
|
||||
public static AssemblyDefinition ReadAssembly (Stream stream, ReaderParameters parameters) |
||||
{ |
||||
return ReadAssembly (ModuleDefinition.ReadModule (stream, parameters)); |
||||
} |
||||
|
||||
static AssemblyDefinition ReadAssembly (ModuleDefinition module) |
||||
{ |
||||
var assembly = module.Assembly; |
||||
if (assembly == null) |
||||
throw new ArgumentException (); |
||||
|
||||
return assembly; |
||||
} |
||||
|
||||
#if !READ_ONLY
|
||||
public void Write (string fileName) |
||||
{ |
||||
Write (fileName, new WriterParameters ()); |
||||
} |
||||
|
||||
public void Write (Stream stream) |
||||
{ |
||||
Write (stream, new WriterParameters ()); |
||||
} |
||||
|
||||
public void Write (string fileName, WriterParameters parameters) |
||||
{ |
||||
main_module.Write (fileName, parameters); |
||||
} |
||||
|
||||
public void Write (Stream stream, WriterParameters parameters) |
||||
{ |
||||
main_module.Write (stream, parameters); |
||||
} |
||||
#endif
|
||||
|
||||
public override string ToString () |
||||
{ |
||||
return this.FullName; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,41 @@
@@ -0,0 +1,41 @@
|
||||
//
|
||||
// AssemblyFlags.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
[Flags] |
||||
public enum AssemblyAttributes : uint { |
||||
PublicKey = 0x0001, |
||||
SideBySideCompatible = 0x0000, |
||||
Retargetable = 0x0100, |
||||
DisableJITCompileOptimizer = 0x4000, |
||||
EnableJITCompileTracking = 0x8000, |
||||
} |
||||
} |
@ -0,0 +1,36 @@
@@ -0,0 +1,36 @@
|
||||
//
|
||||
// AssemblyHashAlgorithm.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public enum AssemblyHashAlgorithm : uint { |
||||
None = 0x0000, |
||||
Reserved = 0x8003, // MD5
|
||||
SHA1 = 0x8004 |
||||
} |
||||
} |
@ -0,0 +1,49 @@
@@ -0,0 +1,49 @@
|
||||
//
|
||||
// AssemblyInfo.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System.Reflection; |
||||
using System.Runtime.CompilerServices; |
||||
using System.Runtime.InteropServices; |
||||
|
||||
[assembly: AssemblyTitle ("Mono.Cecil")] |
||||
[assembly: AssemblyProduct ("Mono.Cecil")] |
||||
[assembly: AssemblyCopyright ("Copyright © 2008 - 2010 Jb Evain")] |
||||
|
||||
[assembly: ComVisible (false)] |
||||
|
||||
[assembly: Guid ("fd225bb4-fa53-44b2-a6db-85f5e48dcb54")] |
||||
|
||||
[assembly: AssemblyVersion ("0.9.4.0")] |
||||
#if !CF
|
||||
[assembly: AssemblyFileVersion ("0.9.4.0")] |
||||
#endif
|
||||
|
||||
[assembly: InternalsVisibleTo ("Mono.Cecil.Pdb, PublicKey=002400000480000094000000060200000024000052534131000400000100010079159977d2d03a8e6bea7a2e74e8d1afcc93e8851974952bb480a12c9134474d04062447c37e0e68c080536fcf3c3fbe2ff9c979ce998475e506e8ce82dd5b0f350dc10e93bf2eeecf874b24770c5081dbea7447fddafa277b22de47d6ffea449674a4f9fccf84d15069089380284dbdd35f46cdff12a1bd78e4ef0065d016df")] |
||||
[assembly: InternalsVisibleTo ("Mono.Cecil.Mdb, PublicKey=002400000480000094000000060200000024000052534131000400000100010079159977d2d03a8e6bea7a2e74e8d1afcc93e8851974952bb480a12c9134474d04062447c37e0e68c080536fcf3c3fbe2ff9c979ce998475e506e8ce82dd5b0f350dc10e93bf2eeecf874b24770c5081dbea7447fddafa277b22de47d6ffea449674a4f9fccf84d15069089380284dbdd35f46cdff12a1bd78e4ef0065d016df")] |
||||
[assembly: InternalsVisibleTo ("Mono.Cecil.Rocks, PublicKey=002400000480000094000000060200000024000052534131000400000100010079159977d2d03a8e6bea7a2e74e8d1afcc93e8851974952bb480a12c9134474d04062447c37e0e68c080536fcf3c3fbe2ff9c979ce998475e506e8ce82dd5b0f350dc10e93bf2eeecf874b24770c5081dbea7447fddafa277b22de47d6ffea449674a4f9fccf84d15069089380284dbdd35f46cdff12a1bd78e4ef0065d016df")] |
||||
[assembly: InternalsVisibleTo ("Mono.Cecil.Tests, PublicKey=002400000480000094000000060200000024000052534131000400000100010079159977d2d03a8e6bea7a2e74e8d1afcc93e8851974952bb480a12c9134474d04062447c37e0e68c080536fcf3c3fbe2ff9c979ce998475e506e8ce82dd5b0f350dc10e93bf2eeecf874b24770c5081dbea7447fddafa277b22de47d6ffea449674a4f9fccf84d15069089380284dbdd35f46cdff12a1bd78e4ef0065d016df")] |
@ -0,0 +1,57 @@
@@ -0,0 +1,57 @@
|
||||
//
|
||||
// AssemblyLinkedResource.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public sealed class AssemblyLinkedResource : Resource { |
||||
|
||||
AssemblyNameReference reference; |
||||
|
||||
public AssemblyNameReference Assembly { |
||||
get { return reference; } |
||||
set { reference = value; } |
||||
} |
||||
|
||||
public override ResourceType ResourceType { |
||||
get { return ResourceType.AssemblyLinked; } |
||||
} |
||||
|
||||
public AssemblyLinkedResource (string name, ManifestResourceAttributes flags) |
||||
: base (name, flags) |
||||
{ |
||||
} |
||||
|
||||
public AssemblyLinkedResource (string name, ManifestResourceAttributes flags, AssemblyNameReference reference) |
||||
: base (name, flags) |
||||
{ |
||||
this.reference = reference; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,50 @@
@@ -0,0 +1,50 @@
|
||||
//
|
||||
// AssemblyNameDefinition.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public sealed class AssemblyNameDefinition : AssemblyNameReference { |
||||
|
||||
public override byte [] Hash { |
||||
get { return Empty<byte>.Array; } |
||||
} |
||||
|
||||
internal AssemblyNameDefinition () |
||||
{ |
||||
this.token = new MetadataToken (TokenType.Assembly, 1); |
||||
} |
||||
|
||||
public AssemblyNameDefinition (string name, Version version) |
||||
: base (name, version) |
||||
{ |
||||
this.token = new MetadataToken (TokenType.Assembly, 1); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,263 @@
@@ -0,0 +1,263 @@
|
||||
//
|
||||
// AssemblyNameReference.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Globalization; |
||||
using System.Security.Cryptography; |
||||
using System.Text; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public class AssemblyNameReference : IMetadataScope { |
||||
|
||||
string name; |
||||
string culture; |
||||
Version version; |
||||
uint attributes; |
||||
byte [] public_key; |
||||
byte [] public_key_token; |
||||
AssemblyHashAlgorithm hash_algorithm; |
||||
byte [] hash; |
||||
|
||||
internal MetadataToken token; |
||||
|
||||
string full_name; |
||||
|
||||
public string Name { |
||||
get { return name; } |
||||
set { |
||||
name = value; |
||||
full_name = null; |
||||
} |
||||
} |
||||
|
||||
public string Culture { |
||||
get { return culture; } |
||||
set { |
||||
culture = value; |
||||
full_name = null; |
||||
} |
||||
} |
||||
|
||||
public Version Version { |
||||
get { return version; } |
||||
set { |
||||
version = value; |
||||
full_name = null; |
||||
} |
||||
} |
||||
|
||||
public AssemblyAttributes Attributes { |
||||
get { return (AssemblyAttributes) attributes; } |
||||
set { attributes = (uint) value; } |
||||
} |
||||
|
||||
public bool HasPublicKey { |
||||
get { return attributes.GetAttributes ((uint) AssemblyAttributes.PublicKey); } |
||||
set { attributes = attributes.SetAttributes ((uint) AssemblyAttributes.PublicKey, value); } |
||||
} |
||||
|
||||
public bool IsSideBySideCompatible { |
||||
get { return attributes.GetAttributes ((uint) AssemblyAttributes.SideBySideCompatible); } |
||||
set { attributes = attributes.SetAttributes ((uint) AssemblyAttributes.SideBySideCompatible, value); } |
||||
} |
||||
|
||||
public bool IsRetargetable { |
||||
get { return attributes.GetAttributes ((uint) AssemblyAttributes.Retargetable); } |
||||
set { attributes = attributes.SetAttributes ((uint) AssemblyAttributes.Retargetable, value); } |
||||
} |
||||
|
||||
public byte [] PublicKey { |
||||
get { return public_key; } |
||||
set { |
||||
public_key = value; |
||||
HasPublicKey = !public_key.IsNullOrEmpty (); |
||||
public_key_token = Empty<byte>.Array; |
||||
full_name = null; |
||||
} |
||||
} |
||||
|
||||
public byte [] PublicKeyToken { |
||||
get { |
||||
if (public_key_token.IsNullOrEmpty () && !public_key.IsNullOrEmpty ()) { |
||||
var hash = HashPublicKey (); |
||||
// we need the last 8 bytes in reverse order
|
||||
public_key_token = new byte [8]; |
||||
Array.Copy (hash, (hash.Length - 8), public_key_token, 0, 8); |
||||
Array.Reverse (public_key_token, 0, 8); |
||||
} |
||||
return public_key_token; |
||||
} |
||||
set { |
||||
public_key_token = value; |
||||
full_name = null; |
||||
} |
||||
} |
||||
|
||||
byte [] HashPublicKey () |
||||
{ |
||||
HashAlgorithm algorithm; |
||||
|
||||
switch (hash_algorithm) { |
||||
case AssemblyHashAlgorithm.Reserved: |
||||
#if SILVERLIGHT
|
||||
throw new NotSupportedException (); |
||||
#else
|
||||
algorithm = MD5.Create (); |
||||
break; |
||||
#endif
|
||||
default: |
||||
// None default to SHA1
|
||||
#if SILVERLIGHT
|
||||
algorithm = new SHA1Managed (); |
||||
break; |
||||
#else
|
||||
algorithm = SHA1.Create (); |
||||
break; |
||||
#endif
|
||||
} |
||||
|
||||
using (algorithm) |
||||
return algorithm.ComputeHash (public_key); |
||||
} |
||||
|
||||
public virtual MetadataScopeType MetadataScopeType { |
||||
get { return MetadataScopeType.AssemblyNameReference; } |
||||
} |
||||
|
||||
public string FullName { |
||||
get { |
||||
if (full_name != null) |
||||
return full_name; |
||||
|
||||
const string sep = ", "; |
||||
|
||||
var builder = new StringBuilder (); |
||||
builder.Append (name); |
||||
if (version != null) { |
||||
builder.Append (sep); |
||||
builder.Append ("Version="); |
||||
builder.Append (version.ToString ()); |
||||
} |
||||
builder.Append (sep); |
||||
builder.Append ("Culture="); |
||||
builder.Append (string.IsNullOrEmpty (culture) ? "neutral" : culture); |
||||
builder.Append (sep); |
||||
builder.Append ("PublicKeyToken="); |
||||
|
||||
if (this.PublicKeyToken != null && public_key_token.Length > 0) { |
||||
for (int i = 0 ; i < public_key_token.Length ; i++) { |
||||
builder.Append (public_key_token [i].ToString ("x2")); |
||||
} |
||||
} else |
||||
builder.Append ("null"); |
||||
|
||||
return full_name = builder.ToString (); |
||||
} |
||||
} |
||||
|
||||
public static AssemblyNameReference Parse (string fullName) |
||||
{ |
||||
if (fullName == null) |
||||
throw new ArgumentNullException ("fullName"); |
||||
if (fullName.Length == 0) |
||||
throw new ArgumentException ("Name can not be empty"); |
||||
|
||||
var name = new AssemblyNameReference (); |
||||
var tokens = fullName.Split (','); |
||||
for (int i = 0; i < tokens.Length; i++) { |
||||
var token = tokens [i].Trim (); |
||||
|
||||
if (i == 0) { |
||||
name.Name = token; |
||||
continue; |
||||
} |
||||
|
||||
var parts = token.Split ('='); |
||||
if (parts.Length != 2) |
||||
throw new ArgumentException ("Malformed name"); |
||||
|
||||
switch (parts [0]) { |
||||
case "Version": |
||||
name.Version = new Version (parts [1]); |
||||
break; |
||||
case "Culture": |
||||
name.Culture = parts [1]; |
||||
break; |
||||
case "PublicKeyToken": |
||||
string pk_token = parts [1]; |
||||
if (pk_token == "null") |
||||
break; |
||||
|
||||
name.PublicKeyToken = new byte [pk_token.Length / 2]; |
||||
for (int j = 0; j < name.PublicKeyToken.Length; j++) { |
||||
name.PublicKeyToken [j] = Byte.Parse (pk_token.Substring (j * 2, 2), NumberStyles.HexNumber); |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
|
||||
return name; |
||||
} |
||||
|
||||
public AssemblyHashAlgorithm HashAlgorithm { |
||||
get { return hash_algorithm; } |
||||
set { hash_algorithm = value; } |
||||
} |
||||
|
||||
public virtual byte [] Hash { |
||||
get { return hash; } |
||||
set { hash = value; } |
||||
} |
||||
|
||||
public MetadataToken MetadataToken { |
||||
get { return token; } |
||||
set { token = value; } |
||||
} |
||||
|
||||
internal AssemblyNameReference () |
||||
{ |
||||
} |
||||
|
||||
public AssemblyNameReference (string name, Version version) |
||||
{ |
||||
if (name == null) |
||||
throw new ArgumentNullException ("name"); |
||||
|
||||
this.name = name; |
||||
this.version = version; |
||||
this.hash_algorithm = AssemblyHashAlgorithm.None; |
||||
this.token = new MetadataToken (TokenType.AssemblyRef); |
||||
} |
||||
|
||||
public override string ToString () |
||||
{ |
||||
return this.FullName; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,336 @@
@@ -0,0 +1,336 @@
|
||||
//
|
||||
// BaseAssemblyResolver.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
using System.Text; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public delegate AssemblyDefinition AssemblyResolveEventHandler (object sender, AssemblyNameReference reference); |
||||
|
||||
public sealed class AssemblyResolveEventArgs : EventArgs { |
||||
|
||||
readonly AssemblyNameReference reference; |
||||
|
||||
public AssemblyNameReference AssemblyReference { |
||||
get { return reference; } |
||||
} |
||||
|
||||
public AssemblyResolveEventArgs (AssemblyNameReference reference) |
||||
{ |
||||
this.reference = reference; |
||||
} |
||||
} |
||||
|
||||
public abstract class BaseAssemblyResolver : IAssemblyResolver { |
||||
|
||||
static readonly bool on_mono = Type.GetType ("Mono.Runtime") != null; |
||||
|
||||
readonly Collection<string> directories; |
||||
|
||||
#if !SILVERLIGHT && !CF
|
||||
Collection<string> gac_paths; |
||||
#endif
|
||||
|
||||
public void AddSearchDirectory (string directory) |
||||
{ |
||||
directories.Add (directory); |
||||
} |
||||
|
||||
public void RemoveSearchDirectory (string directory) |
||||
{ |
||||
directories.Remove (directory); |
||||
} |
||||
|
||||
public string [] GetSearchDirectories () |
||||
{ |
||||
var directories = new string [this.directories.size]; |
||||
Array.Copy (this.directories.items, directories, directories.Length); |
||||
return directories; |
||||
} |
||||
|
||||
public virtual AssemblyDefinition Resolve (string fullName) |
||||
{ |
||||
return Resolve (fullName, new ReaderParameters ()); |
||||
} |
||||
|
||||
public virtual AssemblyDefinition Resolve (string fullName, ReaderParameters parameters) |
||||
{ |
||||
if (fullName == null) |
||||
throw new ArgumentNullException ("fullName"); |
||||
|
||||
return Resolve (AssemblyNameReference.Parse (fullName), parameters); |
||||
} |
||||
|
||||
public event AssemblyResolveEventHandler ResolveFailure; |
||||
|
||||
protected BaseAssemblyResolver () |
||||
{ |
||||
directories = new Collection<string> (2) { ".", "bin" }; |
||||
} |
||||
|
||||
AssemblyDefinition GetAssembly (string file, ReaderParameters parameters) |
||||
{ |
||||
if (parameters.AssemblyResolver == null) |
||||
parameters.AssemblyResolver = this; |
||||
|
||||
return ModuleDefinition.ReadModule (file, parameters).Assembly; |
||||
} |
||||
|
||||
public virtual AssemblyDefinition Resolve (AssemblyNameReference name) |
||||
{ |
||||
return Resolve (name, new ReaderParameters ()); |
||||
} |
||||
|
||||
public virtual AssemblyDefinition Resolve (AssemblyNameReference name, ReaderParameters parameters) |
||||
{ |
||||
if (name == null) |
||||
throw new ArgumentNullException ("name"); |
||||
if (parameters == null) |
||||
parameters = new ReaderParameters (); |
||||
|
||||
var assembly = SearchDirectory (name, directories, parameters); |
||||
if (assembly != null) |
||||
return assembly; |
||||
|
||||
#if !SILVERLIGHT && !CF
|
||||
var framework_dir = Path.GetDirectoryName (typeof (object).Module.FullyQualifiedName); |
||||
|
||||
if (IsZero (name.Version)) { |
||||
assembly = SearchDirectory (name, new [] { framework_dir }, parameters); |
||||
if (assembly != null) |
||||
return assembly; |
||||
} |
||||
|
||||
if (name.Name == "mscorlib") { |
||||
assembly = GetCorlib (name, parameters); |
||||
if (assembly != null) |
||||
return assembly; |
||||
} |
||||
|
||||
assembly = GetAssemblyInGac (name, parameters); |
||||
if (assembly != null) |
||||
return assembly; |
||||
|
||||
assembly = SearchDirectory (name, new [] { framework_dir }, parameters); |
||||
if (assembly != null) |
||||
return assembly; |
||||
#endif
|
||||
|
||||
if (ResolveFailure != null) { |
||||
assembly = ResolveFailure (this, name); |
||||
if (assembly != null) |
||||
return assembly; |
||||
} |
||||
|
||||
throw new FileNotFoundException ("Could not resolve: " + name); |
||||
} |
||||
|
||||
AssemblyDefinition SearchDirectory (AssemblyNameReference name, IEnumerable<string> directories, ReaderParameters parameters) |
||||
{ |
||||
var extensions = new [] { ".exe", ".dll" }; |
||||
foreach (var directory in directories) { |
||||
foreach (var extension in extensions) { |
||||
string file = Path.Combine (directory, name.Name + extension); |
||||
if (File.Exists (file)) |
||||
return GetAssembly (file, parameters); |
||||
} |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
static bool IsZero (Version version) |
||||
{ |
||||
return version == null || (version.Major == 0 && version.Minor == 0 && version.Build == 0 && version.Revision == 0); |
||||
} |
||||
|
||||
#if !SILVERLIGHT && !CF
|
||||
AssemblyDefinition GetCorlib (AssemblyNameReference reference, ReaderParameters parameters) |
||||
{ |
||||
var version = reference.Version; |
||||
var corlib = typeof (object).Assembly.GetName (); |
||||
|
||||
if (corlib.Version == version || IsZero (version)) |
||||
return GetAssembly (typeof (object).Module.FullyQualifiedName, parameters); |
||||
|
||||
var path = Directory.GetParent ( |
||||
Directory.GetParent ( |
||||
typeof (object).Module.FullyQualifiedName).FullName |
||||
).FullName; |
||||
|
||||
if (on_mono) { |
||||
if (version.Major == 1) |
||||
path = Path.Combine (path, "1.0"); |
||||
else if (version.Major == 2) { |
||||
if (version.MajorRevision == 5) |
||||
path = Path.Combine (path, "2.1"); |
||||
else |
||||
path = Path.Combine (path, "2.0"); |
||||
} else if (version.Major == 4) |
||||
path = Path.Combine (path, "4.0"); |
||||
else |
||||
throw new NotSupportedException ("Version not supported: " + version); |
||||
} else { |
||||
switch (version.Major) { |
||||
case 1: |
||||
if (version.MajorRevision == 3300) |
||||
path = Path.Combine (path, "v1.0.3705"); |
||||
else |
||||
path = Path.Combine (path, "v1.0.5000.0"); |
||||
break; |
||||
case 2: |
||||
path = Path.Combine (path, "v2.0.50727"); |
||||
break; |
||||
case 4: |
||||
path = Path.Combine (path, "v4.0.30319"); |
||||
break; |
||||
default: |
||||
throw new NotSupportedException ("Version not supported: " + version); |
||||
} |
||||
} |
||||
|
||||
var file = Path.Combine (path, "mscorlib.dll"); |
||||
if (File.Exists (file)) |
||||
return GetAssembly (file, parameters); |
||||
|
||||
return null; |
||||
} |
||||
|
||||
static Collection<string> GetGacPaths () |
||||
{ |
||||
if (on_mono) |
||||
return GetDefaultMonoGacPaths (); |
||||
|
||||
var paths = new Collection<string> (2); |
||||
var windir = Environment.GetEnvironmentVariable ("WINDIR"); |
||||
if (windir == null) |
||||
return paths; |
||||
|
||||
paths.Add (Path.Combine (windir, "assembly")); |
||||
paths.Add (Path.Combine (windir, Path.Combine ("Microsoft.NET", "assembly"))); |
||||
return paths; |
||||
} |
||||
|
||||
static Collection<string> GetDefaultMonoGacPaths () |
||||
{ |
||||
var paths = new Collection<string> (1); |
||||
var gac = GetCurrentMonoGac (); |
||||
if (gac != null) |
||||
paths.Add (gac); |
||||
|
||||
var gac_paths_env = Environment.GetEnvironmentVariable ("MONO_GAC_PREFIX"); |
||||
if (string.IsNullOrEmpty (gac_paths_env)) |
||||
return paths; |
||||
|
||||
var prefixes = gac_paths_env.Split (Path.PathSeparator); |
||||
foreach (var prefix in prefixes) { |
||||
if (string.IsNullOrEmpty (prefix)) |
||||
continue; |
||||
|
||||
var gac_path = Path.Combine (Path.Combine (Path.Combine (prefix, "lib"), "mono"), "gac"); |
||||
if (Directory.Exists (gac_path) && !paths.Contains (gac)) |
||||
paths.Add (gac_path); |
||||
} |
||||
|
||||
return paths; |
||||
} |
||||
|
||||
static string GetCurrentMonoGac () |
||||
{ |
||||
return Path.Combine ( |
||||
Directory.GetParent ( |
||||
Path.GetDirectoryName (typeof (object).Module.FullyQualifiedName)).FullName, |
||||
"gac"); |
||||
} |
||||
|
||||
AssemblyDefinition GetAssemblyInGac (AssemblyNameReference reference, ReaderParameters parameters) |
||||
{ |
||||
if (reference.PublicKeyToken == null || reference.PublicKeyToken.Length == 0) |
||||
return null; |
||||
|
||||
if (gac_paths == null) |
||||
gac_paths = GetGacPaths (); |
||||
|
||||
if (on_mono) |
||||
return GetAssemblyInMonoGac (reference, parameters); |
||||
|
||||
return GetAssemblyInNetGac (reference, parameters); |
||||
} |
||||
|
||||
AssemblyDefinition GetAssemblyInMonoGac (AssemblyNameReference reference, ReaderParameters parameters) |
||||
{ |
||||
for (int i = 0; i < gac_paths.Count; i++) { |
||||
var gac_path = gac_paths [i]; |
||||
var file = GetAssemblyFile (reference, string.Empty, gac_path); |
||||
if (File.Exists (file)) |
||||
return GetAssembly (file, parameters); |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
AssemblyDefinition GetAssemblyInNetGac (AssemblyNameReference reference, ReaderParameters parameters) |
||||
{ |
||||
var gacs = new [] { "GAC_MSIL", "GAC_32", "GAC" }; |
||||
var prefixes = new [] { string.Empty, "v4.0_" }; |
||||
|
||||
for (int i = 0; i < 2; i++) { |
||||
for (int j = 0; j < gacs.Length; j++) { |
||||
var gac = Path.Combine (gac_paths [i], gacs [j]); |
||||
var file = GetAssemblyFile (reference, prefixes [i], gac); |
||||
if (Directory.Exists (gac) && File.Exists (file)) |
||||
return GetAssembly (file, parameters); |
||||
} |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
static string GetAssemblyFile (AssemblyNameReference reference, string prefix, string gac) |
||||
{ |
||||
var gac_folder = new StringBuilder () |
||||
.Append (prefix) |
||||
.Append (reference.Version) |
||||
.Append ("__"); |
||||
|
||||
for (int i = 0; i < reference.PublicKeyToken.Length; i++) |
||||
gac_folder.Append (reference.PublicKeyToken [i].ToString ("x2")); |
||||
|
||||
return Path.Combine ( |
||||
Path.Combine ( |
||||
Path.Combine (gac, reference.Name), gac_folder.ToString ()), |
||||
reference.Name + ".dll"); |
||||
} |
||||
#endif
|
||||
} |
||||
} |
@ -0,0 +1,54 @@
@@ -0,0 +1,54 @@
|
||||
//
|
||||
// CallSite.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Text; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public sealed class CallSite : MethodReference { |
||||
|
||||
public override string FullName { |
||||
get { |
||||
var signature = new StringBuilder (); |
||||
signature.Append (ReturnType.FullName); |
||||
this.MethodSignatureFullName (signature); |
||||
return signature.ToString (); |
||||
} |
||||
} |
||||
|
||||
public override ModuleDefinition Module { |
||||
get { return ReturnType.Module; } |
||||
} |
||||
|
||||
public override MethodDefinition Resolve () |
||||
{ |
||||
return null; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,232 @@
@@ -0,0 +1,232 @@
|
||||
//
|
||||
// CustomAttribute.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public struct CustomAttributeArgument { |
||||
|
||||
readonly TypeReference type; |
||||
readonly object value; |
||||
|
||||
public TypeReference Type { |
||||
get { return type; } |
||||
} |
||||
|
||||
public object Value { |
||||
get { return value; } |
||||
} |
||||
|
||||
public CustomAttributeArgument (TypeReference type, object value) |
||||
{ |
||||
Mixin.CheckType (type); |
||||
this.type = type; |
||||
this.value = value; |
||||
} |
||||
} |
||||
|
||||
public struct CustomAttributeNamedArgument { |
||||
|
||||
readonly string name; |
||||
readonly CustomAttributeArgument argument; |
||||
|
||||
public string Name { |
||||
get { return name; } |
||||
} |
||||
|
||||
public CustomAttributeArgument Argument { |
||||
get { return argument; } |
||||
} |
||||
|
||||
public CustomAttributeNamedArgument (string name, CustomAttributeArgument argument) |
||||
{ |
||||
Mixin.CheckName (name); |
||||
this.name = name; |
||||
this.argument = argument; |
||||
} |
||||
} |
||||
|
||||
public interface ICustomAttribute { |
||||
|
||||
TypeReference AttributeType { get; } |
||||
|
||||
bool HasFields { get; } |
||||
bool HasProperties { get; } |
||||
Collection<CustomAttributeNamedArgument> Fields { get; } |
||||
Collection<CustomAttributeNamedArgument> Properties { get; } |
||||
} |
||||
|
||||
public sealed class CustomAttribute : ICustomAttribute { |
||||
|
||||
readonly internal uint signature; |
||||
internal bool resolved; |
||||
MethodReference constructor; |
||||
byte [] blob; |
||||
internal Collection<CustomAttributeArgument> arguments; |
||||
internal Collection<CustomAttributeNamedArgument> fields; |
||||
internal Collection<CustomAttributeNamedArgument> properties; |
||||
|
||||
public MethodReference Constructor { |
||||
get { return constructor; } |
||||
set { constructor = value; } |
||||
} |
||||
|
||||
public TypeReference AttributeType { |
||||
get { return constructor.DeclaringType; } |
||||
} |
||||
|
||||
public bool IsResolved { |
||||
get { return resolved; } |
||||
} |
||||
|
||||
public bool HasConstructorArguments { |
||||
get { |
||||
Resolve (); |
||||
|
||||
return !arguments.IsNullOrEmpty (); |
||||
} |
||||
} |
||||
|
||||
public Collection<CustomAttributeArgument> ConstructorArguments { |
||||
get { |
||||
Resolve (); |
||||
|
||||
return arguments ?? (arguments = new Collection<CustomAttributeArgument> ()); |
||||
} |
||||
} |
||||
|
||||
public bool HasFields { |
||||
get { |
||||
Resolve (); |
||||
|
||||
return !fields.IsNullOrEmpty (); |
||||
} |
||||
} |
||||
|
||||
public Collection<CustomAttributeNamedArgument> Fields { |
||||
get { |
||||
Resolve (); |
||||
|
||||
return fields ?? (fields = new Collection<CustomAttributeNamedArgument> ()); |
||||
} |
||||
} |
||||
|
||||
public bool HasProperties { |
||||
get { |
||||
Resolve (); |
||||
|
||||
return !properties.IsNullOrEmpty (); |
||||
} |
||||
} |
||||
|
||||
public Collection<CustomAttributeNamedArgument> Properties { |
||||
get { |
||||
Resolve (); |
||||
|
||||
return properties ?? (properties = new Collection<CustomAttributeNamedArgument> ()); |
||||
} |
||||
} |
||||
|
||||
internal bool HasImage { |
||||
get { return constructor != null && constructor.HasImage; } |
||||
} |
||||
|
||||
internal ModuleDefinition Module { |
||||
get { return constructor.Module; } |
||||
} |
||||
|
||||
internal CustomAttribute (uint signature, MethodReference constructor) |
||||
{ |
||||
this.signature = signature; |
||||
this.constructor = constructor; |
||||
this.resolved = false; |
||||
} |
||||
|
||||
public CustomAttribute (MethodReference constructor) |
||||
{ |
||||
this.constructor = constructor; |
||||
this.resolved = true; |
||||
} |
||||
|
||||
public CustomAttribute (MethodReference constructor, byte [] blob) |
||||
{ |
||||
this.constructor = constructor; |
||||
this.resolved = false; |
||||
this.blob = blob; |
||||
} |
||||
|
||||
public byte [] GetBlob () |
||||
{ |
||||
if (blob != null) |
||||
return blob; |
||||
|
||||
if (!HasImage || signature == 0) |
||||
throw new NotSupportedException (); |
||||
|
||||
return blob = Module.Read (this, (attribute, reader) => reader.ReadCustomAttributeBlob (attribute.signature)); |
||||
} |
||||
|
||||
void Resolve () |
||||
{ |
||||
if (resolved || !HasImage) |
||||
return; |
||||
|
||||
try { |
||||
Module.Read (this, (attribute, reader) => { |
||||
reader.ReadCustomAttributeSignature (attribute); |
||||
return this; |
||||
}); |
||||
|
||||
resolved = true; |
||||
} catch (ResolutionException) { |
||||
if (arguments != null) |
||||
arguments.Clear (); |
||||
if (fields != null) |
||||
fields.Clear (); |
||||
if (properties != null) |
||||
properties.Clear (); |
||||
|
||||
resolved = false; |
||||
} |
||||
} |
||||
} |
||||
|
||||
static partial class Mixin { |
||||
|
||||
public static void CheckName (string name) |
||||
{ |
||||
if (name == null) |
||||
throw new ArgumentNullException ("name"); |
||||
if (name.Length == 0) |
||||
throw new ArgumentException ("Empty name"); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,75 @@
@@ -0,0 +1,75 @@
|
||||
//
|
||||
// DefaultAssemblyResolver.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public static class GlobalAssemblyResolver { |
||||
|
||||
public static readonly IAssemblyResolver Instance = new DefaultAssemblyResolver (); |
||||
} |
||||
|
||||
public class DefaultAssemblyResolver : BaseAssemblyResolver { |
||||
|
||||
readonly IDictionary<string, AssemblyDefinition> cache; |
||||
|
||||
public DefaultAssemblyResolver () |
||||
{ |
||||
cache = new Dictionary<string, AssemblyDefinition> (); |
||||
} |
||||
|
||||
public override AssemblyDefinition Resolve (AssemblyNameReference name) |
||||
{ |
||||
if (name == null) |
||||
throw new ArgumentNullException ("name"); |
||||
|
||||
AssemblyDefinition assembly; |
||||
if (cache.TryGetValue (name.FullName, out assembly)) |
||||
return assembly; |
||||
|
||||
assembly = base.Resolve (name); |
||||
cache [name.FullName] = assembly; |
||||
|
||||
return assembly; |
||||
} |
||||
|
||||
protected void RegisterAssembly (AssemblyDefinition assembly) |
||||
{ |
||||
if (assembly == null) |
||||
throw new ArgumentNullException ("assembly"); |
||||
|
||||
var name = assembly.Name.FullName; |
||||
if (cache.ContainsKey (name)) |
||||
return; |
||||
|
||||
cache [name] = assembly; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,105 @@
@@ -0,0 +1,105 @@
|
||||
//
|
||||
// EmbeddedResource.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.IO; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public sealed class EmbeddedResource : Resource { |
||||
|
||||
readonly MetadataReader reader; |
||||
|
||||
uint? offset; |
||||
byte [] data; |
||||
Stream stream; |
||||
|
||||
public override ResourceType ResourceType { |
||||
get { return ResourceType.Embedded; } |
||||
} |
||||
|
||||
public EmbeddedResource (string name, ManifestResourceAttributes attributes, byte [] data) : |
||||
base (name, attributes) |
||||
{ |
||||
this.data = data; |
||||
} |
||||
|
||||
public EmbeddedResource (string name, ManifestResourceAttributes attributes, Stream stream) : |
||||
base (name, attributes) |
||||
{ |
||||
this.stream = stream; |
||||
} |
||||
|
||||
internal EmbeddedResource (string name, ManifestResourceAttributes attributes, uint offset, MetadataReader reader) |
||||
: base (name, attributes) |
||||
{ |
||||
this.offset = offset; |
||||
this.reader = reader; |
||||
} |
||||
|
||||
public Stream GetResourceStream () |
||||
{ |
||||
if (stream != null) |
||||
return stream; |
||||
|
||||
if (data != null) |
||||
return new MemoryStream (data); |
||||
|
||||
if (offset.HasValue) |
||||
return reader.GetManagedResourceStream (offset.Value); |
||||
|
||||
throw new InvalidOperationException (); |
||||
} |
||||
|
||||
public byte [] GetResourceData () |
||||
{ |
||||
if (stream != null) |
||||
return ReadStream (stream); |
||||
|
||||
if (data != null) |
||||
return data; |
||||
|
||||
if (offset.HasValue) |
||||
return reader.GetManagedResourceStream (offset.Value).ToArray (); |
||||
|
||||
throw new InvalidOperationException (); |
||||
} |
||||
|
||||
static byte [] ReadStream (Stream stream) |
||||
{ |
||||
var length = (int) stream.Length; |
||||
var data = new byte [length]; |
||||
int offset = 0, read; |
||||
|
||||
while ((read = stream.Read (data, offset, length - offset)) > 0) |
||||
offset += read; |
||||
|
||||
return data; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,39 @@
@@ -0,0 +1,39 @@
|
||||
//
|
||||
// EventAttributes.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
[Flags] |
||||
public enum EventAttributes : ushort { |
||||
None = 0x0000, |
||||
SpecialName = 0x0200, // Event is special
|
||||
RTSpecialName = 0x0400 // CLI provides 'special' behavior, depending upon the name of the event
|
||||
} |
||||
} |
@ -0,0 +1,168 @@
@@ -0,0 +1,168 @@
|
||||
//
|
||||
// EventDefinition.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public sealed class EventDefinition : EventReference, IMemberDefinition { |
||||
|
||||
ushort attributes; |
||||
|
||||
Collection<CustomAttribute> custom_attributes; |
||||
|
||||
internal MethodDefinition add_method; |
||||
internal MethodDefinition invoke_method; |
||||
internal MethodDefinition remove_method; |
||||
internal Collection<MethodDefinition> other_methods; |
||||
|
||||
public EventAttributes Attributes { |
||||
get { return (EventAttributes) attributes; } |
||||
set { attributes = (ushort) value; } |
||||
} |
||||
|
||||
public MethodDefinition AddMethod { |
||||
get { |
||||
if (add_method != null) |
||||
return add_method; |
||||
|
||||
InitializeMethods (); |
||||
return add_method; |
||||
} |
||||
set { add_method = value; } |
||||
} |
||||
|
||||
public MethodDefinition InvokeMethod { |
||||
get { |
||||
if (invoke_method != null) |
||||
return invoke_method; |
||||
|
||||
InitializeMethods (); |
||||
return invoke_method; |
||||
} |
||||
set { invoke_method = value; } |
||||
} |
||||
|
||||
public MethodDefinition RemoveMethod { |
||||
get { |
||||
if (remove_method != null) |
||||
return remove_method; |
||||
|
||||
InitializeMethods (); |
||||
return remove_method; |
||||
} |
||||
set { remove_method = value; } |
||||
} |
||||
|
||||
public bool HasOtherMethods { |
||||
get { |
||||
if (other_methods != null) |
||||
return other_methods.Count > 0; |
||||
|
||||
InitializeMethods (); |
||||
return !other_methods.IsNullOrEmpty (); |
||||
} |
||||
} |
||||
|
||||
public Collection<MethodDefinition> OtherMethods { |
||||
get { |
||||
if (other_methods != null) |
||||
return other_methods; |
||||
|
||||
InitializeMethods (); |
||||
|
||||
if (other_methods != null) |
||||
return other_methods; |
||||
|
||||
return other_methods = new Collection<MethodDefinition> (); |
||||
} |
||||
} |
||||
|
||||
public bool HasCustomAttributes { |
||||
get { |
||||
if (custom_attributes != null) |
||||
return custom_attributes.Count > 0; |
||||
|
||||
return this.GetHasCustomAttributes (Module); |
||||
} |
||||
} |
||||
|
||||
public Collection<CustomAttribute> CustomAttributes { |
||||
get { return custom_attributes ?? (custom_attributes = this.GetCustomAttributes (Module)); } |
||||
} |
||||
|
||||
#region EventAttributes
|
||||
|
||||
public bool IsSpecialName { |
||||
get { return attributes.GetAttributes ((ushort) EventAttributes.SpecialName); } |
||||
set { attributes = attributes.SetAttributes ((ushort) EventAttributes.SpecialName, value); } |
||||
} |
||||
|
||||
public bool IsRuntimeSpecialName { |
||||
get { return attributes.GetAttributes ((ushort) FieldAttributes.RTSpecialName); } |
||||
set { attributes = attributes.SetAttributes ((ushort) FieldAttributes.RTSpecialName, value); } |
||||
} |
||||
|
||||
#endregion
|
||||
|
||||
public new TypeDefinition DeclaringType { |
||||
get { return (TypeDefinition) base.DeclaringType; } |
||||
set { base.DeclaringType = value; } |
||||
} |
||||
|
||||
public override bool IsDefinition { |
||||
get { return true; } |
||||
} |
||||
|
||||
public EventDefinition (string name, EventAttributes attributes, TypeReference eventType) |
||||
: base (name, eventType) |
||||
{ |
||||
this.attributes = (ushort) attributes; |
||||
this.token = new MetadataToken (TokenType.Event); |
||||
} |
||||
|
||||
void InitializeMethods () |
||||
{ |
||||
if (add_method != null |
||||
|| invoke_method != null |
||||
|| remove_method != null) |
||||
return; |
||||
|
||||
var module = this.Module; |
||||
if (!module.HasImage ()) |
||||
return; |
||||
|
||||
module.Read (this, (@event, reader) => reader.ReadMethods (@event)); |
||||
} |
||||
|
||||
public override EventDefinition Resolve () |
||||
{ |
||||
return this; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,57 @@
@@ -0,0 +1,57 @@
|
||||
//
|
||||
// EventReference.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public abstract class EventReference : MemberReference { |
||||
|
||||
TypeReference event_type; |
||||
|
||||
public TypeReference EventType { |
||||
get { return event_type; } |
||||
set { event_type = value; } |
||||
} |
||||
|
||||
public override string FullName { |
||||
get { return event_type.FullName + " " + MemberFullName (); } |
||||
} |
||||
|
||||
protected EventReference (string name, TypeReference eventType) |
||||
: base (name) |
||||
{ |
||||
if (eventType == null) |
||||
throw new ArgumentNullException ("eventType"); |
||||
|
||||
event_type = eventType; |
||||
} |
||||
|
||||
public abstract EventDefinition Resolve (); |
||||
} |
||||
} |
@ -0,0 +1,249 @@
@@ -0,0 +1,249 @@
|
||||
//
|
||||
// ExportedType.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public class ExportedType : IMetadataTokenProvider { |
||||
|
||||
string @namespace; |
||||
string name; |
||||
uint attributes; |
||||
IMetadataScope scope; |
||||
ModuleDefinition module; |
||||
int identifier; |
||||
ExportedType declaring_type; |
||||
internal MetadataToken token; |
||||
|
||||
public string Namespace { |
||||
get { return @namespace; } |
||||
set { @namespace = value; } |
||||
} |
||||
|
||||
public string Name { |
||||
get { return name; } |
||||
set { name = value; } |
||||
} |
||||
|
||||
public TypeAttributes Attributes { |
||||
get { return (TypeAttributes) attributes; } |
||||
set { attributes = (uint) value; } |
||||
} |
||||
|
||||
public IMetadataScope Scope { |
||||
get { |
||||
if (declaring_type != null) |
||||
return declaring_type.Scope; |
||||
|
||||
return scope; |
||||
} |
||||
} |
||||
|
||||
public ExportedType DeclaringType { |
||||
get { return declaring_type; } |
||||
set { declaring_type = value; } |
||||
} |
||||
|
||||
public MetadataToken MetadataToken { |
||||
get { return token; } |
||||
set { token = value; } |
||||
} |
||||
|
||||
public int Identifier { |
||||
get { return identifier; } |
||||
set { identifier = value; } |
||||
} |
||||
|
||||
#region TypeAttributes
|
||||
|
||||
public bool IsNotPublic { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.NotPublic); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.NotPublic, value); } |
||||
} |
||||
|
||||
public bool IsPublic { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.Public); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.Public, value); } |
||||
} |
||||
|
||||
public bool IsNestedPublic { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.NestedPublic); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.NestedPublic, value); } |
||||
} |
||||
|
||||
public bool IsNestedPrivate { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.NestedPrivate); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.NestedPrivate, value); } |
||||
} |
||||
|
||||
public bool IsNestedFamily { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.NestedFamily); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.NestedFamily, value); } |
||||
} |
||||
|
||||
public bool IsNestedAssembly { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.NestedAssembly); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.NestedAssembly, value); } |
||||
} |
||||
|
||||
public bool IsNestedFamilyAndAssembly { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.NestedFamANDAssem); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.NestedFamANDAssem, value); } |
||||
} |
||||
|
||||
public bool IsNestedFamilyOrAssembly { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.NestedFamORAssem); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.VisibilityMask, (uint) TypeAttributes.NestedFamORAssem, value); } |
||||
} |
||||
|
||||
public bool IsAutoLayout { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.LayoutMask, (uint) TypeAttributes.AutoLayout); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.LayoutMask, (uint) TypeAttributes.AutoLayout, value); } |
||||
} |
||||
|
||||
public bool IsSequentialLayout { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.LayoutMask, (uint) TypeAttributes.SequentialLayout); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.LayoutMask, (uint) TypeAttributes.SequentialLayout, value); } |
||||
} |
||||
|
||||
public bool IsExplicitLayout { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.LayoutMask, (uint) TypeAttributes.ExplicitLayout); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.LayoutMask, (uint) TypeAttributes.ExplicitLayout, value); } |
||||
} |
||||
|
||||
public bool IsClass { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.ClassSemanticMask, (uint) TypeAttributes.Class); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.ClassSemanticMask, (uint) TypeAttributes.Class, value); } |
||||
} |
||||
|
||||
public bool IsInterface { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.ClassSemanticMask, (uint) TypeAttributes.Interface); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.ClassSemanticMask, (uint) TypeAttributes.Interface, value); } |
||||
} |
||||
|
||||
public bool IsAbstract { |
||||
get { return attributes.GetAttributes ((uint) TypeAttributes.Abstract); } |
||||
set { attributes = attributes.SetAttributes ((uint) TypeAttributes.Abstract, value); } |
||||
} |
||||
|
||||
public bool IsSealed { |
||||
get { return attributes.GetAttributes ((uint) TypeAttributes.Sealed); } |
||||
set { attributes = attributes.SetAttributes ((uint) TypeAttributes.Sealed, value); } |
||||
} |
||||
|
||||
public bool IsSpecialName { |
||||
get { return attributes.GetAttributes ((uint) TypeAttributes.SpecialName); } |
||||
set { attributes = attributes.SetAttributes ((uint) TypeAttributes.SpecialName, value); } |
||||
} |
||||
|
||||
public bool IsImport { |
||||
get { return attributes.GetAttributes ((uint) TypeAttributes.Import); } |
||||
set { attributes = attributes.SetAttributes ((uint) TypeAttributes.Import, value); } |
||||
} |
||||
|
||||
public bool IsSerializable { |
||||
get { return attributes.GetAttributes ((uint) TypeAttributes.Serializable); } |
||||
set { attributes = attributes.SetAttributes ((uint) TypeAttributes.Serializable, value); } |
||||
} |
||||
|
||||
public bool IsAnsiClass { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.StringFormatMask, (uint) TypeAttributes.AnsiClass); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.StringFormatMask, (uint) TypeAttributes.AnsiClass, value); } |
||||
} |
||||
|
||||
public bool IsUnicodeClass { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.StringFormatMask, (uint) TypeAttributes.UnicodeClass); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.StringFormatMask, (uint) TypeAttributes.UnicodeClass, value); } |
||||
} |
||||
|
||||
public bool IsAutoClass { |
||||
get { return attributes.GetMaskedAttributes ((uint) TypeAttributes.StringFormatMask, (uint) TypeAttributes.AutoClass); } |
||||
set { attributes = attributes.SetMaskedAttributes ((uint) TypeAttributes.StringFormatMask, (uint) TypeAttributes.AutoClass, value); } |
||||
} |
||||
|
||||
public bool IsBeforeFieldInit { |
||||
get { return attributes.GetAttributes ((uint) TypeAttributes.BeforeFieldInit); } |
||||
set { attributes = attributes.SetAttributes ((uint) TypeAttributes.BeforeFieldInit, value); } |
||||
} |
||||
|
||||
public bool IsRuntimeSpecialName { |
||||
get { return attributes.GetAttributes ((uint) TypeAttributes.RTSpecialName); } |
||||
set { attributes = attributes.SetAttributes ((uint) TypeAttributes.RTSpecialName, value); } |
||||
} |
||||
|
||||
public bool HasSecurity { |
||||
get { return attributes.GetAttributes ((uint) TypeAttributes.HasSecurity); } |
||||
set { attributes = attributes.SetAttributes ((uint) TypeAttributes.HasSecurity, value); } |
||||
} |
||||
|
||||
#endregion
|
||||
|
||||
public bool IsForwarder { |
||||
get { return attributes.GetAttributes ((uint) TypeAttributes.Forwarder); } |
||||
set { attributes = attributes.SetAttributes ((uint) TypeAttributes.Forwarder, value); } |
||||
} |
||||
|
||||
public string FullName { |
||||
get { |
||||
if (declaring_type != null) |
||||
return declaring_type.FullName + "/" + name; |
||||
|
||||
if (string.IsNullOrEmpty (@namespace)) |
||||
return name; |
||||
|
||||
return @namespace + "." + name; |
||||
} |
||||
} |
||||
|
||||
public ExportedType (string @namespace, string name, ModuleDefinition module, IMetadataScope scope) |
||||
{ |
||||
this.@namespace = @namespace; |
||||
this.name = name; |
||||
this.scope = scope; |
||||
this.module = module; |
||||
} |
||||
|
||||
public override string ToString () |
||||
{ |
||||
return FullName; |
||||
} |
||||
|
||||
public TypeDefinition Resolve () |
||||
{ |
||||
return module.Resolve (CreateReference ()); |
||||
} |
||||
|
||||
internal TypeReference CreateReference () |
||||
{ |
||||
return new TypeReference (@namespace, name, module, scope) { |
||||
DeclaringType = declaring_type != null ? declaring_type.CreateReference () : null, |
||||
}; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,59 @@
@@ -0,0 +1,59 @@
|
||||
//
|
||||
// FieldAttributes.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
[Flags] |
||||
public enum FieldAttributes : ushort { |
||||
FieldAccessMask = 0x0007, |
||||
CompilerControlled = 0x0000, // Member not referenceable
|
||||
Private = 0x0001, // Accessible only by the parent type
|
||||
FamANDAssem = 0x0002, // Accessible by sub-types only in this assembly
|
||||
Assembly = 0x0003, // Accessible by anyone in the Assembly
|
||||
Family = 0x0004, // Accessible only by type and sub-types
|
||||
FamORAssem = 0x0005, // Accessible by sub-types anywhere, plus anyone in the assembly
|
||||
Public = 0x0006, // Accessible by anyone who has visibility to this scope field contract attributes
|
||||
|
||||
Static = 0x0010, // Defined on type, else per instance
|
||||
InitOnly = 0x0020, // Field may only be initialized, not written after init
|
||||
Literal = 0x0040, // Value is compile time constant
|
||||
NotSerialized = 0x0080, // Field does not have to be serialized when type is remoted
|
||||
SpecialName = 0x0200, // Field is special
|
||||
|
||||
// Interop Attributes
|
||||
PInvokeImpl = 0x2000, // Implementation is forwarded through PInvoke
|
||||
|
||||
// Additional flags
|
||||
RTSpecialName = 0x0400, // CLI provides 'special' behavior, depending upon the name of the field
|
||||
HasFieldMarshal = 0x1000, // Field has marshalling information
|
||||
HasDefault = 0x8000, // Field has default
|
||||
HasFieldRVA = 0x0100 // Field has RVA
|
||||
} |
||||
} |
@ -0,0 +1,279 @@
@@ -0,0 +1,279 @@
|
||||
//
|
||||
// FieldDefinition.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public sealed class FieldDefinition : FieldReference, IMemberDefinition, IConstantProvider, IMarshalInfoProvider { |
||||
|
||||
ushort attributes; |
||||
Collection<CustomAttribute> custom_attributes; |
||||
|
||||
int offset = Mixin.NotResolvedMarker; |
||||
|
||||
internal int rva = Mixin.NotResolvedMarker; |
||||
byte [] initial_value; |
||||
|
||||
object constant = Mixin.NotResolved; |
||||
|
||||
MarshalInfo marshal_info; |
||||
|
||||
void ResolveLayout () |
||||
{ |
||||
if (offset != Mixin.NotResolvedMarker) |
||||
return; |
||||
|
||||
if (!HasImage) { |
||||
offset = Mixin.NoDataMarker; |
||||
return; |
||||
} |
||||
|
||||
offset = Module.Read (this, (field, reader) => reader.ReadFieldLayout (field)); |
||||
} |
||||
|
||||
public bool HasLayoutInfo { |
||||
get { |
||||
if (offset >= 0) |
||||
return true; |
||||
|
||||
ResolveLayout (); |
||||
|
||||
return offset >= 0; |
||||
} |
||||
} |
||||
|
||||
public int Offset { |
||||
get { |
||||
if (offset >= 0) |
||||
return offset; |
||||
|
||||
ResolveLayout (); |
||||
|
||||
return offset >= 0 ? offset : -1; |
||||
} |
||||
set { offset = value; } |
||||
} |
||||
|
||||
void ResolveRVA () |
||||
{ |
||||
if (rva != Mixin.NotResolvedMarker) |
||||
return; |
||||
|
||||
if (!HasImage) |
||||
return; |
||||
|
||||
rva = Module.Read (this, (field, reader) => reader.ReadFieldRVA (field)); |
||||
} |
||||
|
||||
public int RVA { |
||||
get { |
||||
if (rva > 0) |
||||
return rva; |
||||
|
||||
ResolveRVA (); |
||||
|
||||
return rva > 0 ? rva : 0; |
||||
} |
||||
} |
||||
|
||||
public byte [] InitialValue { |
||||
get { |
||||
if (initial_value != null) |
||||
return initial_value; |
||||
|
||||
ResolveRVA (); |
||||
|
||||
if (initial_value == null) |
||||
initial_value = Empty<byte>.Array; |
||||
|
||||
return initial_value; |
||||
} |
||||
set { initial_value = value; } |
||||
} |
||||
|
||||
public FieldAttributes Attributes { |
||||
get { return (FieldAttributes) attributes; } |
||||
set { attributes = (ushort) value; } |
||||
} |
||||
|
||||
public bool HasConstant { |
||||
get { |
||||
ResolveConstant (); |
||||
|
||||
return constant != Mixin.NoValue; |
||||
} |
||||
set { if (!value) constant = Mixin.NoValue; } |
||||
} |
||||
|
||||
public object Constant { |
||||
get { return HasConstant ? constant : null; } |
||||
set { constant = value; } |
||||
} |
||||
|
||||
void ResolveConstant () |
||||
{ |
||||
if (constant != Mixin.NotResolved) |
||||
return; |
||||
|
||||
this.ResolveConstant (ref constant, Module); |
||||
} |
||||
|
||||
public bool HasCustomAttributes { |
||||
get { |
||||
if (custom_attributes != null) |
||||
return custom_attributes.Count > 0; |
||||
|
||||
return this.GetHasCustomAttributes (Module); |
||||
} |
||||
} |
||||
|
||||
public Collection<CustomAttribute> CustomAttributes { |
||||
get { return custom_attributes ?? (custom_attributes = this.GetCustomAttributes (Module)); } |
||||
} |
||||
|
||||
public bool HasMarshalInfo { |
||||
get { |
||||
if (marshal_info != null) |
||||
return true; |
||||
|
||||
return this.GetHasMarshalInfo (Module); |
||||
} |
||||
} |
||||
|
||||
public MarshalInfo MarshalInfo { |
||||
get { return marshal_info ?? (marshal_info = this.GetMarshalInfo (Module)); } |
||||
set { marshal_info = value; } |
||||
} |
||||
|
||||
#region FieldAttributes
|
||||
|
||||
public bool IsCompilerControlled { |
||||
get { return attributes.GetMaskedAttributes ((ushort) FieldAttributes.FieldAccessMask, (ushort) FieldAttributes.CompilerControlled); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) FieldAttributes.FieldAccessMask, (ushort) FieldAttributes.CompilerControlled, value); } |
||||
} |
||||
|
||||
public bool IsPrivate { |
||||
get { return attributes.GetMaskedAttributes ((ushort) FieldAttributes.FieldAccessMask, (ushort) FieldAttributes.Private); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) FieldAttributes.FieldAccessMask, (ushort) FieldAttributes.Private, value); } |
||||
} |
||||
|
||||
public bool IsFamilyAndAssembly { |
||||
get { return attributes.GetMaskedAttributes ((ushort) FieldAttributes.FieldAccessMask, (ushort) FieldAttributes.FamANDAssem); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) FieldAttributes.FieldAccessMask, (ushort) FieldAttributes.FamANDAssem, value); } |
||||
} |
||||
|
||||
public bool IsAssembly { |
||||
get { return attributes.GetMaskedAttributes ((ushort) FieldAttributes.FieldAccessMask, (ushort) FieldAttributes.Assembly); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) FieldAttributes.FieldAccessMask, (ushort) FieldAttributes.Assembly, value); } |
||||
} |
||||
|
||||
public bool IsFamily { |
||||
get { return attributes.GetMaskedAttributes ((ushort) FieldAttributes.FieldAccessMask, (ushort) FieldAttributes.Family); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) FieldAttributes.FieldAccessMask, (ushort) FieldAttributes.Family, value); } |
||||
} |
||||
|
||||
public bool IsFamilyOrAssembly { |
||||
get { return attributes.GetMaskedAttributes ((ushort) FieldAttributes.FieldAccessMask, (ushort) FieldAttributes.FamORAssem); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) FieldAttributes.FieldAccessMask, (ushort) FieldAttributes.FamORAssem, value); } |
||||
} |
||||
|
||||
public bool IsPublic { |
||||
get { return attributes.GetMaskedAttributes ((ushort) FieldAttributes.FieldAccessMask, (ushort) FieldAttributes.Public); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) FieldAttributes.FieldAccessMask, (ushort) FieldAttributes.Public, value); } |
||||
} |
||||
|
||||
public bool IsStatic { |
||||
get { return attributes.GetAttributes ((ushort) FieldAttributes.Static); } |
||||
set { attributes = attributes.SetAttributes ((ushort) FieldAttributes.Static, value); } |
||||
} |
||||
|
||||
public bool IsInitOnly { |
||||
get { return attributes.GetAttributes ((ushort) FieldAttributes.InitOnly); } |
||||
set { attributes = attributes.SetAttributes ((ushort) FieldAttributes.InitOnly, value); } |
||||
} |
||||
|
||||
public bool IsLiteral { |
||||
get { return attributes.GetAttributes ((ushort) FieldAttributes.Literal); } |
||||
set { attributes = attributes.SetAttributes ((ushort) FieldAttributes.Literal, value); } |
||||
} |
||||
|
||||
public bool IsNotSerialized { |
||||
get { return attributes.GetAttributes ((ushort) FieldAttributes.NotSerialized); } |
||||
set { attributes = attributes.SetAttributes ((ushort) FieldAttributes.NotSerialized, value); } |
||||
} |
||||
|
||||
public bool IsSpecialName { |
||||
get { return attributes.GetAttributes ((ushort) FieldAttributes.SpecialName); } |
||||
set { attributes = attributes.SetAttributes ((ushort) FieldAttributes.SpecialName, value); } |
||||
} |
||||
|
||||
public bool IsPInvokeImpl { |
||||
get { return attributes.GetAttributes ((ushort) FieldAttributes.PInvokeImpl); } |
||||
set { attributes = attributes.SetAttributes ((ushort) FieldAttributes.PInvokeImpl, value); } |
||||
} |
||||
|
||||
public bool IsRuntimeSpecialName { |
||||
get { return attributes.GetAttributes ((ushort) FieldAttributes.RTSpecialName); } |
||||
set { attributes = attributes.SetAttributes ((ushort) FieldAttributes.RTSpecialName, value); } |
||||
} |
||||
|
||||
public bool HasDefault { |
||||
get { return attributes.GetAttributes ((ushort) FieldAttributes.HasDefault); } |
||||
set { attributes = attributes.SetAttributes ((ushort) FieldAttributes.HasDefault, value); } |
||||
} |
||||
|
||||
#endregion
|
||||
|
||||
public override bool IsDefinition { |
||||
get { return true; } |
||||
} |
||||
|
||||
public new TypeDefinition DeclaringType { |
||||
get { return (TypeDefinition) base.DeclaringType; } |
||||
set { base.DeclaringType = value; } |
||||
} |
||||
|
||||
public FieldDefinition (string name, FieldAttributes attributes, TypeReference fieldType) |
||||
: base (name, fieldType) |
||||
{ |
||||
this.attributes = (ushort) attributes; |
||||
} |
||||
|
||||
public override FieldDefinition Resolve () |
||||
{ |
||||
return this; |
||||
} |
||||
} |
||||
|
||||
static partial class Mixin { |
||||
|
||||
public const int NotResolvedMarker = -2; |
||||
public const int NoDataMarker = -1; |
||||
} |
||||
} |
@ -0,0 +1,83 @@
@@ -0,0 +1,83 @@
|
||||
//
|
||||
// FieldReference.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public class FieldReference : MemberReference { |
||||
|
||||
TypeReference field_type; |
||||
|
||||
public TypeReference FieldType { |
||||
get { return field_type; } |
||||
set { field_type = value; } |
||||
} |
||||
|
||||
public override string FullName { |
||||
get { return field_type.FullName + " " + MemberFullName (); } |
||||
} |
||||
|
||||
internal override bool ContainsGenericParameter { |
||||
get { return field_type.ContainsGenericParameter || base.ContainsGenericParameter; } |
||||
} |
||||
|
||||
internal FieldReference () |
||||
{ |
||||
this.token = new MetadataToken (TokenType.MemberRef); |
||||
} |
||||
|
||||
public FieldReference (string name, TypeReference fieldType) |
||||
: base (name) |
||||
{ |
||||
if (fieldType == null) |
||||
throw new ArgumentNullException ("fieldType"); |
||||
|
||||
this.field_type = fieldType; |
||||
this.token = new MetadataToken (TokenType.MemberRef); |
||||
} |
||||
|
||||
public FieldReference (string name, TypeReference fieldType, TypeReference declaringType) |
||||
: this (name, fieldType) |
||||
{ |
||||
if (declaringType == null) |
||||
throw new ArgumentNullException("declaringType"); |
||||
|
||||
this.DeclaringType = declaringType; |
||||
} |
||||
|
||||
public virtual FieldDefinition Resolve () |
||||
{ |
||||
var module = this.Module; |
||||
if (module == null) |
||||
throw new NotSupportedException (); |
||||
|
||||
return module.Resolve (this); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,35 @@
@@ -0,0 +1,35 @@
|
||||
//
|
||||
// FileAttributes.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
enum FileAttributes : uint { |
||||
ContainsMetaData = 0x0000, // This is not a resource file
|
||||
ContainsNoMetaData = 0x0001, // This is a resource file or other non-metadata-containing file
|
||||
} |
||||
} |
@ -0,0 +1,128 @@
@@ -0,0 +1,128 @@
|
||||
//
|
||||
// FunctionPointerType.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Text; |
||||
using Mono.Collections.Generic; |
||||
using MD = Mono.Cecil.Metadata; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public sealed class FunctionPointerType : TypeSpecification, IMethodSignature { |
||||
|
||||
readonly MethodReference function; |
||||
|
||||
public bool HasThis { |
||||
get { return function.HasThis; } |
||||
set { function.HasThis = value; } |
||||
} |
||||
|
||||
public bool ExplicitThis { |
||||
get { return function.ExplicitThis; } |
||||
set { function.ExplicitThis = value; } |
||||
} |
||||
|
||||
public MethodCallingConvention CallingConvention { |
||||
get { return function.CallingConvention; } |
||||
set { function.CallingConvention = value; } |
||||
} |
||||
|
||||
public bool HasParameters { |
||||
get { return function.HasParameters; } |
||||
} |
||||
|
||||
public Collection<ParameterDefinition> Parameters { |
||||
get { return function.Parameters; } |
||||
} |
||||
|
||||
public TypeReference ReturnType { |
||||
get { return function.MethodReturnType.ReturnType; } |
||||
set { function.MethodReturnType.ReturnType = value; } |
||||
} |
||||
|
||||
public MethodReturnType MethodReturnType { |
||||
get { return function.MethodReturnType; } |
||||
} |
||||
|
||||
public override string Name { |
||||
get { return function.Name; } |
||||
set { throw new InvalidOperationException (); } |
||||
} |
||||
|
||||
public override string Namespace { |
||||
get { return string.Empty; } |
||||
set { throw new InvalidOperationException (); } |
||||
} |
||||
|
||||
public override ModuleDefinition Module { |
||||
get { return ReturnType.Module; } |
||||
} |
||||
|
||||
public override IMetadataScope Scope { |
||||
get { return function.ReturnType.Scope; } |
||||
} |
||||
|
||||
public override bool IsFunctionPointer { |
||||
get { return true; } |
||||
} |
||||
|
||||
internal override bool ContainsGenericParameter { |
||||
get { return function.ContainsGenericParameter; } |
||||
} |
||||
|
||||
public override string FullName { |
||||
get { |
||||
var signature = new StringBuilder (); |
||||
signature.Append (function.Name); |
||||
signature.Append (" "); |
||||
signature.Append (function.ReturnType.FullName); |
||||
signature.Append (" *"); |
||||
this.MethodSignatureFullName (signature); |
||||
return signature.ToString (); |
||||
} |
||||
} |
||||
|
||||
public FunctionPointerType () |
||||
: base (null) |
||||
{ |
||||
this.function = new MethodReference (); |
||||
this.function.Name = "method"; |
||||
this.etype = MD.ElementType.FnPtr; |
||||
} |
||||
|
||||
public override TypeDefinition Resolve () |
||||
{ |
||||
return null; |
||||
} |
||||
|
||||
public override TypeReference GetElementType () |
||||
{ |
||||
return this; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,90 @@
@@ -0,0 +1,90 @@
|
||||
//
|
||||
// GenericInstanceMethod.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Text; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public sealed class GenericInstanceMethod : MethodSpecification, IGenericInstance, IGenericContext { |
||||
|
||||
Collection<TypeReference> arguments; |
||||
|
||||
public bool HasGenericArguments { |
||||
get { return !arguments.IsNullOrEmpty (); } |
||||
} |
||||
|
||||
public Collection<TypeReference> GenericArguments { |
||||
get { |
||||
if (arguments == null) |
||||
arguments = new Collection<TypeReference> (); |
||||
|
||||
return arguments; |
||||
} |
||||
} |
||||
|
||||
public override bool IsGenericInstance { |
||||
get { return true; } |
||||
} |
||||
|
||||
IGenericParameterProvider IGenericContext.Method { |
||||
get { return ElementMethod; } |
||||
} |
||||
|
||||
IGenericParameterProvider IGenericContext.Type { |
||||
get { return ElementMethod.DeclaringType; } |
||||
} |
||||
|
||||
internal override bool ContainsGenericParameter { |
||||
get { return this.ContainsGenericParameter () || base.ContainsGenericParameter; } |
||||
} |
||||
|
||||
public override string FullName { |
||||
get { |
||||
var signature = new StringBuilder (); |
||||
var method = this.ElementMethod; |
||||
signature.Append (method.ReturnType.FullName) |
||||
.Append (" ") |
||||
.Append (method.DeclaringType.FullName) |
||||
.Append ("::") |
||||
.Append (method.Name); |
||||
this.GenericInstanceFullName (signature); |
||||
this.MethodSignatureFullName (signature); |
||||
return signature.ToString (); |
||||
|
||||
} |
||||
} |
||||
|
||||
public GenericInstanceMethod (MethodReference method) |
||||
: base (method) |
||||
{ |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,88 @@
@@ -0,0 +1,88 @@
|
||||
//
|
||||
// GenericInstanceType.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Text; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
using MD = Mono.Cecil.Metadata; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public sealed class GenericInstanceType : TypeSpecification, IGenericInstance, IGenericContext { |
||||
|
||||
Collection<TypeReference> arguments; |
||||
|
||||
public bool HasGenericArguments { |
||||
get { return !arguments.IsNullOrEmpty (); } |
||||
} |
||||
|
||||
public Collection<TypeReference> GenericArguments { |
||||
get { |
||||
if (arguments == null) |
||||
arguments = new Collection<TypeReference> (); |
||||
|
||||
return arguments; |
||||
} |
||||
} |
||||
|
||||
public override TypeReference DeclaringType { |
||||
get { return ElementType.DeclaringType; } |
||||
set { throw new NotSupportedException (); } |
||||
} |
||||
|
||||
public override string FullName { |
||||
get { |
||||
var name = new StringBuilder (); |
||||
name.Append (base.FullName); |
||||
this.GenericInstanceFullName (name); |
||||
return name.ToString (); |
||||
} |
||||
} |
||||
|
||||
public override bool IsGenericInstance { |
||||
get { return true; } |
||||
} |
||||
|
||||
internal override bool ContainsGenericParameter { |
||||
get { return this.ContainsGenericParameter () || base.ContainsGenericParameter; } |
||||
} |
||||
|
||||
IGenericParameterProvider IGenericContext.Type { |
||||
get { return ElementType; } |
||||
} |
||||
|
||||
public GenericInstanceType (TypeReference type) |
||||
: base (type) |
||||
{ |
||||
base.IsValueType = type.IsValueType; |
||||
this.etype = MD.ElementType.GenericInst; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,201 @@
@@ -0,0 +1,201 @@
|
||||
//
|
||||
// GenericParameter.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
using Mono.Cecil.Metadata; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public sealed class GenericParameter : TypeReference, ICustomAttributeProvider { |
||||
|
||||
readonly IGenericParameterProvider owner; |
||||
|
||||
ushort attributes; |
||||
Collection<TypeReference> constraints; |
||||
Collection<CustomAttribute> custom_attributes; |
||||
|
||||
public GenericParameterAttributes Attributes { |
||||
get { return (GenericParameterAttributes) attributes; } |
||||
set { attributes = (ushort) value; } |
||||
} |
||||
|
||||
public int Position { |
||||
get { |
||||
if (owner == null) |
||||
return -1; |
||||
|
||||
return owner.GenericParameters.IndexOf (this); |
||||
} |
||||
} |
||||
|
||||
public IGenericParameterProvider Owner { |
||||
get { return owner; } |
||||
} |
||||
|
||||
public bool HasConstraints { |
||||
get { |
||||
if (constraints != null) |
||||
return constraints.Count > 0; |
||||
|
||||
if (HasImage) |
||||
return Module.Read (this, (generic_parameter, reader) => reader.HasGenericConstraints (generic_parameter)); |
||||
|
||||
return false; |
||||
} |
||||
} |
||||
|
||||
public Collection<TypeReference> Constraints { |
||||
get { |
||||
if (constraints != null) |
||||
return constraints; |
||||
|
||||
if (HasImage) |
||||
return constraints = Module.Read (this, (generic_parameter, reader) => reader.ReadGenericConstraints (generic_parameter)); |
||||
|
||||
return constraints = new Collection<TypeReference> (); |
||||
} |
||||
} |
||||
|
||||
public bool HasCustomAttributes { |
||||
get { |
||||
if (custom_attributes != null) |
||||
return custom_attributes.Count > 0; |
||||
|
||||
return this.GetHasCustomAttributes (Module); |
||||
} |
||||
} |
||||
|
||||
public Collection<CustomAttribute> CustomAttributes { |
||||
get { return custom_attributes ?? (custom_attributes = this.GetCustomAttributes (Module)); } |
||||
} |
||||
|
||||
internal new bool HasImage { |
||||
get { return Module != null && Module.HasImage; } |
||||
} |
||||
|
||||
public override IMetadataScope Scope { |
||||
get { |
||||
if (owner.GenericParameterType == GenericParameterType.Method) |
||||
return ((MethodReference) owner).DeclaringType.Scope; |
||||
|
||||
return ((TypeReference) owner).Scope; |
||||
} |
||||
} |
||||
|
||||
public override ModuleDefinition Module { |
||||
get { return ((MemberReference) owner).Module; } |
||||
} |
||||
|
||||
public override string Name { |
||||
get { |
||||
if (!string.IsNullOrEmpty (base.Name)) |
||||
return base.Name; |
||||
|
||||
return base.Name = (owner.GenericParameterType == GenericParameterType.Type ? "!" : "!!") + Position; |
||||
} |
||||
} |
||||
|
||||
public override string Namespace { |
||||
get { return string.Empty; } |
||||
set { throw new InvalidOperationException (); } |
||||
} |
||||
|
||||
public override string FullName { |
||||
get { return Name; } |
||||
} |
||||
|
||||
public override bool IsGenericParameter { |
||||
get { return true; } |
||||
} |
||||
|
||||
internal override bool ContainsGenericParameter { |
||||
get { return true; } |
||||
} |
||||
|
||||
public override MetadataType MetadataType { |
||||
get { return (MetadataType) etype; } |
||||
} |
||||
|
||||
#region GenericParameterAttributes
|
||||
|
||||
public bool IsNonVariant { |
||||
get { return attributes.GetMaskedAttributes ((ushort) GenericParameterAttributes.VarianceMask, (ushort) GenericParameterAttributes.NonVariant); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) GenericParameterAttributes.VarianceMask, (ushort) GenericParameterAttributes.NonVariant, value); } |
||||
} |
||||
|
||||
public bool IsCovariant { |
||||
get { return attributes.GetMaskedAttributes ((ushort) GenericParameterAttributes.VarianceMask, (ushort) GenericParameterAttributes.Covariant); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) GenericParameterAttributes.VarianceMask, (ushort) GenericParameterAttributes.Covariant, value); } |
||||
} |
||||
|
||||
public bool IsContravariant { |
||||
get { return attributes.GetMaskedAttributes ((ushort) GenericParameterAttributes.VarianceMask, (ushort) GenericParameterAttributes.Contravariant); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) GenericParameterAttributes.VarianceMask, (ushort) GenericParameterAttributes.Contravariant, value); } |
||||
} |
||||
|
||||
public bool HasReferenceTypeConstraint { |
||||
get { return attributes.GetAttributes ((ushort) GenericParameterAttributes.ReferenceTypeConstraint); } |
||||
set { attributes = attributes.SetAttributes ((ushort) GenericParameterAttributes.ReferenceTypeConstraint, value); } |
||||
} |
||||
|
||||
public bool HasNotNullableValueTypeConstraint { |
||||
get { return attributes.GetAttributes ((ushort) GenericParameterAttributes.NotNullableValueTypeConstraint); } |
||||
set { attributes = attributes.SetAttributes ((ushort) GenericParameterAttributes.NotNullableValueTypeConstraint, value); } |
||||
} |
||||
|
||||
public bool HasDefaultConstructorConstraint { |
||||
get { return attributes.GetAttributes ((ushort) GenericParameterAttributes.DefaultConstructorConstraint); } |
||||
set { attributes = attributes.SetAttributes ((ushort) GenericParameterAttributes.DefaultConstructorConstraint, value); } |
||||
} |
||||
|
||||
#endregion
|
||||
|
||||
public GenericParameter (IGenericParameterProvider owner) |
||||
: this (string.Empty, owner) |
||||
{ |
||||
} |
||||
|
||||
public GenericParameter (string name, IGenericParameterProvider owner) |
||||
: base (string.Empty, name) |
||||
{ |
||||
if (owner == null) |
||||
throw new ArgumentNullException (); |
||||
|
||||
this.owner = owner; |
||||
this.etype = owner.GenericParameterType == GenericParameterType.Type ? ElementType.Var : ElementType.MVar; |
||||
} |
||||
|
||||
public override TypeDefinition Resolve () |
||||
{ |
||||
return null; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,45 @@
@@ -0,0 +1,45 @@
|
||||
//
|
||||
// GenericParameterAttributes.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
[Flags] |
||||
public enum GenericParameterAttributes : ushort { |
||||
VarianceMask = 0x0003, |
||||
NonVariant = 0x0000, |
||||
Covariant = 0x0001, |
||||
Contravariant = 0x0002, |
||||
|
||||
SpecialConstraintMask = 0x001c, |
||||
ReferenceTypeConstraint = 0x0004, |
||||
NotNullableValueTypeConstraint = 0x0008, |
||||
DefaultConstructorConstraint = 0x0010 |
||||
} |
||||
} |
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
//
|
||||
// IConstantProvider.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public interface IConstantProvider : IMetadataTokenProvider { |
||||
|
||||
bool HasConstant { get; set; } |
||||
object Constant { get; set; } |
||||
} |
||||
|
||||
static partial class Mixin { |
||||
|
||||
internal static object NoValue = new object (); |
||||
internal static object NotResolved = new object (); |
||||
|
||||
public static void ResolveConstant ( |
||||
this IConstantProvider self, |
||||
ref object constant, |
||||
ModuleDefinition module) |
||||
{ |
||||
constant = module.HasImage () |
||||
? module.Read (self, (provider, reader) => reader.ReadConstant (provider)) |
||||
: Mixin.NoValue; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,62 @@
@@ -0,0 +1,62 @@
|
||||
//
|
||||
// ICustomAttributeProvider.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public interface ICustomAttributeProvider : IMetadataTokenProvider { |
||||
|
||||
Collection<CustomAttribute> CustomAttributes { get; } |
||||
|
||||
bool HasCustomAttributes { get; } |
||||
} |
||||
|
||||
static partial class Mixin { |
||||
|
||||
public static bool GetHasCustomAttributes ( |
||||
this ICustomAttributeProvider self, |
||||
ModuleDefinition module) |
||||
{ |
||||
return module.HasImage () |
||||
? module.Read (self, (provider, reader) => reader.HasCustomAttributes (provider)) |
||||
: false; |
||||
} |
||||
|
||||
public static Collection<CustomAttribute> GetCustomAttributes ( |
||||
this ICustomAttributeProvider self, |
||||
ModuleDefinition module) |
||||
{ |
||||
return module.HasImage () |
||||
? module.Read (self, (provider, reader) => reader.ReadCustomAttributes (provider)) |
||||
: new Collection<CustomAttribute> (); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,66 @@
@@ -0,0 +1,66 @@
|
||||
//
|
||||
// IGenericInstance.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System.Text; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public interface IGenericInstance : IMetadataTokenProvider { |
||||
|
||||
bool HasGenericArguments { get; } |
||||
Collection<TypeReference> GenericArguments { get; } |
||||
} |
||||
|
||||
static partial class Mixin { |
||||
|
||||
public static bool ContainsGenericParameter (this IGenericInstance self) |
||||
{ |
||||
var arguments = self.GenericArguments; |
||||
|
||||
for (int i = 0; i < arguments.Count; i++) |
||||
if (arguments [i].ContainsGenericParameter) |
||||
return true; |
||||
|
||||
return false; |
||||
} |
||||
|
||||
public static void GenericInstanceFullName (this IGenericInstance self, StringBuilder builder) |
||||
{ |
||||
builder.Append ("<"); |
||||
var arguments = self.GenericArguments; |
||||
for (int i = 0; i < arguments.Count; i++) { |
||||
if (i > 0) |
||||
builder.Append (","); |
||||
builder.Append (arguments [i].FullName); |
||||
} |
||||
builder.Append (">"); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,75 @@
@@ -0,0 +1,75 @@
|
||||
//
|
||||
// IGenericParameterProvider.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public interface IGenericParameterProvider : IMetadataTokenProvider { |
||||
|
||||
bool HasGenericParameters { get; } |
||||
bool IsDefinition { get; } |
||||
ModuleDefinition Module { get; } |
||||
Collection<GenericParameter> GenericParameters { get; } |
||||
GenericParameterType GenericParameterType { get; } |
||||
} |
||||
|
||||
public enum GenericParameterType { |
||||
Type, |
||||
Method |
||||
} |
||||
|
||||
interface IGenericContext { |
||||
|
||||
bool IsDefinition { get; } |
||||
IGenericParameterProvider Type { get; } |
||||
IGenericParameterProvider Method { get; } |
||||
} |
||||
|
||||
static partial class Mixin { |
||||
|
||||
public static bool GetHasGenericParameters ( |
||||
this IGenericParameterProvider self, |
||||
ModuleDefinition module) |
||||
{ |
||||
return module.HasImage () |
||||
? module.Read (self, (provider, reader) => reader.HasGenericParameters (provider)) |
||||
: false; |
||||
} |
||||
|
||||
public static Collection<GenericParameter> GetGenericParameters ( |
||||
this IGenericParameterProvider self, |
||||
ModuleDefinition module) |
||||
{ |
||||
return module.HasImage () |
||||
? module.Read (self, (provider, reader) => reader.ReadGenericParameters (provider)) |
||||
: new Collection<GenericParameter> (); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,57 @@
@@ -0,0 +1,57 @@
|
||||
//
|
||||
// IMarshalInfoProvider.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public interface IMarshalInfoProvider : IMetadataTokenProvider { |
||||
|
||||
bool HasMarshalInfo { get; } |
||||
MarshalInfo MarshalInfo { get; set; } |
||||
} |
||||
|
||||
static partial class Mixin { |
||||
|
||||
public static bool GetHasMarshalInfo ( |
||||
this IMarshalInfoProvider self, |
||||
ModuleDefinition module) |
||||
{ |
||||
return module.HasImage () |
||||
? module.Read (self, (provider, reader) => reader.HasMarshalInfo (provider)) |
||||
: false; |
||||
} |
||||
|
||||
public static MarshalInfo GetMarshalInfo ( |
||||
this IMarshalInfoProvider self, |
||||
ModuleDefinition module) |
||||
{ |
||||
return module.HasImage () |
||||
? module.Read (self, (provider, reader) => reader.ReadMarshalInfo (provider)) |
||||
: null; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,100 @@
@@ -0,0 +1,100 @@
|
||||
//
|
||||
// IMemberDefinition.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public interface IMemberDefinition : ICustomAttributeProvider { |
||||
|
||||
string Name { get; set; } |
||||
string FullName { get; } |
||||
|
||||
bool IsSpecialName { get; set; } |
||||
bool IsRuntimeSpecialName { get; set; } |
||||
|
||||
TypeDefinition DeclaringType { get; set; } |
||||
} |
||||
|
||||
static partial class Mixin { |
||||
|
||||
public static bool GetAttributes (this uint self, uint attributes) |
||||
{ |
||||
return (self & attributes) != 0; |
||||
} |
||||
|
||||
public static uint SetAttributes (this uint self, uint attributes, bool value) |
||||
{ |
||||
if (value) |
||||
return self | attributes; |
||||
|
||||
return self & ~attributes; |
||||
} |
||||
|
||||
public static bool GetMaskedAttributes (this uint self, uint mask, uint attributes) |
||||
{ |
||||
return (self & mask) == attributes; |
||||
} |
||||
|
||||
public static uint SetMaskedAttributes (this uint self, uint mask, uint attributes, bool value) |
||||
{ |
||||
if (value) { |
||||
self &= ~mask; |
||||
return self | attributes; |
||||
} |
||||
|
||||
return self & ~(mask & attributes); |
||||
} |
||||
|
||||
public static bool GetAttributes (this ushort self, ushort attributes) |
||||
{ |
||||
return (self & attributes) != 0; |
||||
} |
||||
|
||||
public static ushort SetAttributes (this ushort self, ushort attributes, bool value) |
||||
{ |
||||
if (value) |
||||
return (ushort) (self | attributes); |
||||
|
||||
return (ushort) (self & ~attributes); |
||||
} |
||||
|
||||
public static bool GetMaskedAttributes (this ushort self, ushort mask, uint attributes) |
||||
{ |
||||
return (self & mask) == attributes; |
||||
} |
||||
|
||||
public static ushort SetMaskedAttributes (this ushort self, ushort mask, uint attributes, bool value) |
||||
{ |
||||
if (value) { |
||||
self = (ushort) (self & ~mask); |
||||
return (ushort) (self | attributes); |
||||
} |
||||
|
||||
return (ushort) (self & ~(mask & attributes)); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,41 @@
@@ -0,0 +1,41 @@
|
||||
//
|
||||
// IMetadataScope.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public enum MetadataScopeType { |
||||
AssemblyNameReference, |
||||
ModuleReference, |
||||
ModuleDefinition, |
||||
} |
||||
|
||||
public interface IMetadataScope : IMetadataTokenProvider { |
||||
MetadataScopeType MetadataScopeType { get; } |
||||
string Name { get; set; } |
||||
} |
||||
} |
@ -0,0 +1,35 @@
@@ -0,0 +1,35 @@
|
||||
//
|
||||
// IMetadataTokenProvider.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public interface IMetadataTokenProvider { |
||||
|
||||
MetadataToken MetadataToken { get; set; } |
||||
} |
||||
} |
@ -0,0 +1,70 @@
@@ -0,0 +1,70 @@
|
||||
//
|
||||
// IMethodSignature.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System.Text; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public interface IMethodSignature : IMetadataTokenProvider { |
||||
|
||||
bool HasThis { get; set; } |
||||
bool ExplicitThis { get; set; } |
||||
MethodCallingConvention CallingConvention { get; set; } |
||||
|
||||
bool HasParameters { get; } |
||||
Collection<ParameterDefinition> Parameters { get; } |
||||
TypeReference ReturnType { get; set; } |
||||
MethodReturnType MethodReturnType { get; } |
||||
} |
||||
|
||||
static partial class Mixin { |
||||
|
||||
public static void MethodSignatureFullName (this IMethodSignature self, StringBuilder builder) |
||||
{ |
||||
builder.Append ("("); |
||||
|
||||
if (self.HasParameters) { |
||||
var parameters = self.Parameters; |
||||
for (int i = 0; i < parameters.Count; i++) { |
||||
var parameter = parameters [i]; |
||||
if (i > 0) |
||||
builder.Append (","); |
||||
|
||||
if (parameter.ParameterType.IsSentinel) |
||||
builder.Append ("...,"); |
||||
|
||||
builder.Append (parameter.ParameterType.FullName); |
||||
} |
||||
} |
||||
|
||||
builder.Append (")"); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,566 @@
@@ -0,0 +1,566 @@
|
||||
//
|
||||
// Import.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using SR = System.Reflection; |
||||
|
||||
using Mono.Cecil.Metadata; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
enum ImportGenericKind { |
||||
Definition, |
||||
Open, |
||||
} |
||||
|
||||
class MetadataImporter { |
||||
|
||||
readonly ModuleDefinition module; |
||||
|
||||
public MetadataImporter (ModuleDefinition module) |
||||
{ |
||||
this.module = module; |
||||
} |
||||
|
||||
#if !CF
|
||||
static readonly Dictionary<Type, ElementType> type_etype_mapping = new Dictionary<Type, ElementType> (18) { |
||||
{ typeof (void), ElementType.Void }, |
||||
{ typeof (bool), ElementType.Boolean }, |
||||
{ typeof (char), ElementType.Char }, |
||||
{ typeof (sbyte), ElementType.I1 }, |
||||
{ typeof (byte), ElementType.U1 }, |
||||
{ typeof (short), ElementType.I2 }, |
||||
{ typeof (ushort), ElementType.U2 }, |
||||
{ typeof (int), ElementType.I4 }, |
||||
{ typeof (uint), ElementType.U4 }, |
||||
{ typeof (long), ElementType.I8 }, |
||||
{ typeof (ulong), ElementType.U8 }, |
||||
{ typeof (float), ElementType.R4 }, |
||||
{ typeof (double), ElementType.R8 }, |
||||
{ typeof (string), ElementType.String }, |
||||
{ typeof (TypedReference), ElementType.TypedByRef }, |
||||
{ typeof (IntPtr), ElementType.I }, |
||||
{ typeof (UIntPtr), ElementType.U }, |
||||
{ typeof (object), ElementType.Object }, |
||||
}; |
||||
|
||||
public TypeReference ImportType (Type type, IGenericContext context) |
||||
{ |
||||
return ImportType (type, context, ImportGenericKind.Open); |
||||
} |
||||
|
||||
public TypeReference ImportType (Type type, IGenericContext context, ImportGenericKind import_kind) |
||||
{ |
||||
if (IsTypeSpecification (type) || ImportOpenGenericType (type, import_kind)) |
||||
return ImportTypeSpecification (type, context); |
||||
|
||||
var reference = new TypeReference ( |
||||
string.Empty, |
||||
type.Name, |
||||
module, |
||||
ImportScope (type.Assembly), |
||||
type.IsValueType); |
||||
|
||||
reference.etype = ImportElementType (type); |
||||
|
||||
if (IsNestedType (type)) |
||||
reference.DeclaringType = ImportType (type.DeclaringType, context, import_kind); |
||||
else |
||||
reference.Namespace = type.Namespace; |
||||
|
||||
if (type.IsGenericType) |
||||
ImportGenericParameters (reference, type.GetGenericArguments ()); |
||||
|
||||
return reference; |
||||
} |
||||
|
||||
static bool ImportOpenGenericType (Type type, ImportGenericKind import_kind) |
||||
{ |
||||
return type.IsGenericType && type.IsGenericTypeDefinition && import_kind == ImportGenericKind.Open; |
||||
} |
||||
|
||||
static bool ImportOpenGenericMethod (SR.MethodBase method, ImportGenericKind import_kind) |
||||
{ |
||||
return method.IsGenericMethod && method.IsGenericMethodDefinition && import_kind == ImportGenericKind.Open; |
||||
} |
||||
|
||||
static bool IsNestedType (Type type) |
||||
{ |
||||
#if !SILVERLIGHT
|
||||
return type.IsNested; |
||||
#else
|
||||
return type.DeclaringType != null; |
||||
#endif
|
||||
} |
||||
|
||||
TypeReference ImportTypeSpecification (Type type, IGenericContext context) |
||||
{ |
||||
if (type.IsByRef) |
||||
return new ByReferenceType (ImportType (type.GetElementType (), context)); |
||||
|
||||
if (type.IsPointer) |
||||
return new PointerType (ImportType (type.GetElementType (), context)); |
||||
|
||||
if (type.IsArray) |
||||
return new ArrayType (ImportType (type.GetElementType (), context), type.GetArrayRank ()); |
||||
|
||||
if (type.IsGenericType) |
||||
return ImportGenericInstance (type, context); |
||||
|
||||
if (type.IsGenericParameter) |
||||
return ImportGenericParameter (type, context); |
||||
|
||||
throw new NotSupportedException (type.FullName); |
||||
} |
||||
|
||||
static TypeReference ImportGenericParameter (Type type, IGenericContext context) |
||||
{ |
||||
if (context == null) |
||||
throw new InvalidOperationException (); |
||||
|
||||
var owner = type.DeclaringMethod != null |
||||
? context.Method |
||||
: context.Type; |
||||
|
||||
if (owner == null) |
||||
throw new InvalidOperationException (); |
||||
|
||||
return owner.GenericParameters [type.GenericParameterPosition]; |
||||
} |
||||
|
||||
TypeReference ImportGenericInstance (Type type, IGenericContext context) |
||||
{ |
||||
var element_type = ImportType (type.GetGenericTypeDefinition (), context, ImportGenericKind.Definition); |
||||
var instance = new GenericInstanceType (element_type); |
||||
var arguments = type.GetGenericArguments (); |
||||
var instance_arguments = instance.GenericArguments; |
||||
|
||||
for (int i = 0; i < arguments.Length; i++) |
||||
instance_arguments.Add (ImportType (arguments [i], context ?? element_type)); |
||||
|
||||
return instance; |
||||
} |
||||
|
||||
static bool IsTypeSpecification (Type type) |
||||
{ |
||||
return type.HasElementType |
||||
|| IsGenericInstance (type) |
||||
|| type.IsGenericParameter; |
||||
} |
||||
|
||||
static bool IsGenericInstance (Type type) |
||||
{ |
||||
return type.IsGenericType && !type.IsGenericTypeDefinition; |
||||
} |
||||
|
||||
static ElementType ImportElementType (Type type) |
||||
{ |
||||
ElementType etype; |
||||
if (!type_etype_mapping.TryGetValue (type, out etype)) |
||||
return ElementType.None; |
||||
|
||||
return etype; |
||||
} |
||||
|
||||
AssemblyNameReference ImportScope (SR.Assembly assembly) |
||||
{ |
||||
AssemblyNameReference scope; |
||||
#if !SILVERLIGHT
|
||||
var name = assembly.GetName (); |
||||
|
||||
if (TryGetAssemblyNameReference (name, out scope)) |
||||
return scope; |
||||
|
||||
scope = new AssemblyNameReference (name.Name, name.Version) { |
||||
Culture = name.CultureInfo.Name, |
||||
PublicKeyToken = name.GetPublicKeyToken (), |
||||
HashAlgorithm = (AssemblyHashAlgorithm) name.HashAlgorithm, |
||||
}; |
||||
|
||||
module.AssemblyReferences.Add (scope); |
||||
|
||||
return scope; |
||||
#else
|
||||
var name = AssemblyNameReference.Parse (assembly.FullName); |
||||
|
||||
if (TryGetAssemblyNameReference (name, out scope)) |
||||
return scope; |
||||
|
||||
module.AssemblyReferences.Add (name); |
||||
|
||||
return name; |
||||
#endif
|
||||
} |
||||
|
||||
#if !SILVERLIGHT
|
||||
bool TryGetAssemblyNameReference (SR.AssemblyName name, out AssemblyNameReference assembly_reference) |
||||
{ |
||||
var references = module.AssemblyReferences; |
||||
|
||||
for (int i = 0; i < references.Count; i++) { |
||||
var reference = references [i]; |
||||
if (name.FullName != reference.FullName) // TODO compare field by field
|
||||
continue; |
||||
|
||||
assembly_reference = reference; |
||||
return true; |
||||
} |
||||
|
||||
assembly_reference = null; |
||||
return false; |
||||
} |
||||
#endif
|
||||
|
||||
public FieldReference ImportField (SR.FieldInfo field, IGenericContext context) |
||||
{ |
||||
var declaring_type = ImportType (field.DeclaringType, context); |
||||
|
||||
if (IsGenericInstance (field.DeclaringType)) |
||||
field = ResolveFieldDefinition (field); |
||||
|
||||
return new FieldReference { |
||||
Name = field.Name, |
||||
DeclaringType = declaring_type, |
||||
FieldType = ImportType (field.FieldType, context ?? declaring_type), |
||||
}; |
||||
} |
||||
|
||||
static SR.FieldInfo ResolveFieldDefinition (SR.FieldInfo field) |
||||
{ |
||||
#if !SILVERLIGHT
|
||||
return field.Module.ResolveField (field.MetadataToken); |
||||
#else
|
||||
return field.DeclaringType.GetGenericTypeDefinition ().GetField (field.Name, |
||||
SR.BindingFlags.Public |
||||
| SR.BindingFlags.NonPublic |
||||
| (field.IsStatic ? SR.BindingFlags.Static : SR.BindingFlags.Instance)); |
||||
#endif
|
||||
} |
||||
|
||||
public MethodReference ImportMethod (SR.MethodBase method, IGenericContext context, ImportGenericKind import_kind) |
||||
{ |
||||
if (IsMethodSpecification (method) || ImportOpenGenericMethod (method, import_kind)) |
||||
return ImportMethodSpecification (method, context); |
||||
|
||||
var declaring_type = ImportType (method.DeclaringType, context); |
||||
|
||||
if (IsGenericInstance (method.DeclaringType)) |
||||
method = method.Module.ResolveMethod (method.MetadataToken); |
||||
|
||||
var reference = new MethodReference { |
||||
Name = method.Name, |
||||
HasThis = HasCallingConvention (method, SR.CallingConventions.HasThis), |
||||
ExplicitThis = HasCallingConvention (method, SR.CallingConventions.ExplicitThis), |
||||
DeclaringType = ImportType (method.DeclaringType, context, ImportGenericKind.Definition), |
||||
}; |
||||
|
||||
if (HasCallingConvention (method, SR.CallingConventions.VarArgs)) |
||||
reference.CallingConvention &= MethodCallingConvention.VarArg; |
||||
|
||||
if (method.IsGenericMethod) |
||||
ImportGenericParameters (reference, method.GetGenericArguments ()); |
||||
|
||||
var method_info = method as SR.MethodInfo; |
||||
reference.ReturnType = method_info != null |
||||
? ImportType (method_info.ReturnType, context ?? reference) |
||||
: ImportType (typeof (void), null); |
||||
|
||||
var parameters = method.GetParameters (); |
||||
var reference_parameters = reference.Parameters; |
||||
|
||||
for (int i = 0; i < parameters.Length; i++) |
||||
reference_parameters.Add ( |
||||
new ParameterDefinition (ImportType (parameters [i].ParameterType, context ?? reference))); |
||||
|
||||
reference.DeclaringType = declaring_type; |
||||
|
||||
return reference; |
||||
} |
||||
|
||||
static void ImportGenericParameters (IGenericParameterProvider provider, Type [] arguments) |
||||
{ |
||||
var provider_parameters = provider.GenericParameters; |
||||
|
||||
for (int i = 0; i < arguments.Length; i++) |
||||
provider_parameters.Add (new GenericParameter (arguments [i].Name, provider)); |
||||
} |
||||
|
||||
static bool IsMethodSpecification (SR.MethodBase method) |
||||
{ |
||||
return method.IsGenericMethod && !method.IsGenericMethodDefinition; |
||||
} |
||||
|
||||
MethodReference ImportMethodSpecification (SR.MethodBase method, IGenericContext context) |
||||
{ |
||||
var method_info = method as SR.MethodInfo; |
||||
if (method_info == null) |
||||
throw new InvalidOperationException (); |
||||
|
||||
var element_method = ImportMethod (method_info.GetGenericMethodDefinition (), context, ImportGenericKind.Definition); |
||||
var instance = new GenericInstanceMethod (element_method); |
||||
var arguments = method.GetGenericArguments (); |
||||
var instance_arguments = instance.GenericArguments; |
||||
|
||||
for (int i = 0; i < arguments.Length; i++) |
||||
instance_arguments.Add (ImportType (arguments [i], context ?? element_method)); |
||||
|
||||
return instance; |
||||
} |
||||
|
||||
static bool HasCallingConvention (SR.MethodBase method, SR.CallingConventions conventions) |
||||
{ |
||||
return (method.CallingConvention & conventions) != 0; |
||||
} |
||||
#endif
|
||||
|
||||
public TypeReference ImportType (TypeReference type, IGenericContext context) |
||||
{ |
||||
if (type.IsTypeSpecification ()) |
||||
return ImportTypeSpecification (type, context); |
||||
|
||||
var reference = new TypeReference ( |
||||
type.Namespace, |
||||
type.Name, |
||||
module, |
||||
ImportScope (type.Scope), |
||||
type.IsValueType); |
||||
|
||||
MetadataSystem.TryProcessPrimitiveType (reference); |
||||
|
||||
if (type.IsNested) |
||||
reference.DeclaringType = ImportType (type.DeclaringType, context); |
||||
|
||||
if (type.HasGenericParameters) |
||||
ImportGenericParameters (reference, type); |
||||
|
||||
return reference; |
||||
} |
||||
|
||||
IMetadataScope ImportScope (IMetadataScope scope) |
||||
{ |
||||
switch (scope.MetadataScopeType) { |
||||
case MetadataScopeType.AssemblyNameReference: |
||||
return ImportAssemblyName ((AssemblyNameReference) scope); |
||||
case MetadataScopeType.ModuleDefinition: |
||||
return ImportAssemblyName (((ModuleDefinition) scope).Assembly.Name); |
||||
case MetadataScopeType.ModuleReference: |
||||
throw new NotImplementedException (); |
||||
} |
||||
|
||||
throw new NotSupportedException (); |
||||
} |
||||
|
||||
AssemblyNameReference ImportAssemblyName (AssemblyNameReference name) |
||||
{ |
||||
AssemblyNameReference reference; |
||||
if (TryGetAssemblyNameReference (name, out reference)) |
||||
return reference; |
||||
|
||||
reference = new AssemblyNameReference (name.Name, name.Version) { |
||||
Culture = name.Culture, |
||||
HashAlgorithm = name.HashAlgorithm, |
||||
}; |
||||
|
||||
var pk_token = !name.PublicKeyToken.IsNullOrEmpty () |
||||
? new byte [name.PublicKeyToken.Length] |
||||
: Empty<byte>.Array; |
||||
|
||||
if (pk_token.Length > 0) |
||||
Buffer.BlockCopy (name.PublicKeyToken, 0, pk_token, 0, pk_token.Length); |
||||
|
||||
reference.PublicKeyToken = pk_token; |
||||
|
||||
module.AssemblyReferences.Add (reference); |
||||
|
||||
return reference; |
||||
} |
||||
|
||||
bool TryGetAssemblyNameReference (AssemblyNameReference name_reference, out AssemblyNameReference assembly_reference) |
||||
{ |
||||
var references = module.AssemblyReferences; |
||||
|
||||
for (int i = 0; i < references.Count; i++) { |
||||
var reference = references [i]; |
||||
if (name_reference.FullName != reference.FullName) // TODO compare field by field
|
||||
continue; |
||||
|
||||
assembly_reference = reference; |
||||
return true; |
||||
} |
||||
|
||||
assembly_reference = null; |
||||
return false; |
||||
} |
||||
|
||||
static void ImportGenericParameters (IGenericParameterProvider imported, IGenericParameterProvider original) |
||||
{ |
||||
var parameters = original.GenericParameters; |
||||
var imported_parameters = imported.GenericParameters; |
||||
|
||||
for (int i = 0; i < parameters.Count; i++) |
||||
imported_parameters.Add (new GenericParameter (parameters [i].Name, imported)); |
||||
} |
||||
|
||||
TypeReference ImportTypeSpecification (TypeReference type, IGenericContext context) |
||||
{ |
||||
switch (type.etype) { |
||||
case ElementType.SzArray: |
||||
var vector = (ArrayType) type; |
||||
return new ArrayType (ImportType (vector.ElementType, context)); |
||||
case ElementType.Ptr: |
||||
var pointer = (PointerType) type; |
||||
return new PointerType (ImportType (pointer.ElementType, context)); |
||||
case ElementType.ByRef: |
||||
var byref = (ByReferenceType) type; |
||||
return new ByReferenceType (ImportType (byref.ElementType, context)); |
||||
case ElementType.Pinned: |
||||
var pinned = (PinnedType) type; |
||||
return new PinnedType (ImportType (pinned.ElementType, context)); |
||||
case ElementType.Sentinel: |
||||
var sentinel = (SentinelType) type; |
||||
return new SentinelType (ImportType (sentinel.ElementType, context)); |
||||
case ElementType.CModOpt: |
||||
var modopt = (OptionalModifierType) type; |
||||
return new OptionalModifierType ( |
||||
ImportType (modopt.ModifierType, context), |
||||
ImportType (modopt.ElementType, context)); |
||||
case ElementType.CModReqD: |
||||
var modreq = (RequiredModifierType) type; |
||||
return new RequiredModifierType ( |
||||
ImportType (modreq.ModifierType, context), |
||||
ImportType (modreq.ElementType, context)); |
||||
case ElementType.Array: |
||||
var array = (ArrayType) type; |
||||
var imported_array = new ArrayType (ImportType (array.ElementType, context)); |
||||
if (array.IsVector) |
||||
return imported_array; |
||||
|
||||
var dimensions = array.Dimensions; |
||||
var imported_dimensions = imported_array.Dimensions; |
||||
|
||||
imported_dimensions.Clear (); |
||||
|
||||
for (int i = 0; i < dimensions.Count; i++) { |
||||
var dimension = dimensions [i]; |
||||
|
||||
imported_dimensions.Add (new ArrayDimension (dimension.LowerBound, dimension.UpperBound)); |
||||
} |
||||
|
||||
return imported_array; |
||||
case ElementType.GenericInst: |
||||
var instance = (GenericInstanceType) type; |
||||
var element_type = ImportType (instance.ElementType, context); |
||||
var imported_instance = new GenericInstanceType (element_type); |
||||
|
||||
var arguments = instance.GenericArguments; |
||||
var imported_arguments = imported_instance.GenericArguments; |
||||
|
||||
for (int i = 0; i < arguments.Count; i++) |
||||
imported_arguments.Add (ImportType (arguments [i], context)); |
||||
|
||||
return imported_instance; |
||||
case ElementType.Var: |
||||
if (context == null || context.Type == null) |
||||
throw new InvalidOperationException (); |
||||
|
||||
return ((TypeReference) context.Type).GetElementType ().GenericParameters [((GenericParameter) type).Position]; |
||||
case ElementType.MVar: |
||||
if (context == null || context.Method == null) |
||||
throw new InvalidOperationException (); |
||||
|
||||
return context.Method.GenericParameters [((GenericParameter) type).Position]; |
||||
} |
||||
|
||||
throw new NotSupportedException (type.etype.ToString ()); |
||||
} |
||||
|
||||
public FieldReference ImportField (FieldReference field, IGenericContext context) |
||||
{ |
||||
var declaring_type = ImportType (field.DeclaringType, context); |
||||
|
||||
return new FieldReference { |
||||
Name = field.Name, |
||||
DeclaringType = declaring_type, |
||||
FieldType = ImportType (field.FieldType, context ?? declaring_type), |
||||
}; |
||||
} |
||||
|
||||
public MethodReference ImportMethod (MethodReference method, IGenericContext context) |
||||
{ |
||||
if (method.IsGenericInstance) |
||||
return ImportMethodSpecification (method, context); |
||||
|
||||
var declaring_type = ImportType (method.DeclaringType, context); |
||||
|
||||
var reference = new MethodReference { |
||||
Name = method.Name, |
||||
HasThis = method.HasThis, |
||||
ExplicitThis = method.ExplicitThis, |
||||
DeclaringType = declaring_type, |
||||
}; |
||||
|
||||
reference.CallingConvention = method.CallingConvention; |
||||
|
||||
if (method.HasGenericParameters) |
||||
ImportGenericParameters (reference, method); |
||||
|
||||
reference.ReturnType = ImportType (method.ReturnType, context ?? reference); |
||||
|
||||
if (!method.HasParameters) |
||||
return reference; |
||||
|
||||
var reference_parameters = reference.Parameters; |
||||
|
||||
var parameters = method.Parameters; |
||||
for (int i = 0; i < parameters.Count; i++) |
||||
reference_parameters.Add ( |
||||
new ParameterDefinition (ImportType (parameters [i].ParameterType, context ?? reference))); |
||||
|
||||
return reference; |
||||
} |
||||
|
||||
MethodSpecification ImportMethodSpecification (MethodReference method, IGenericContext context) |
||||
{ |
||||
if (!method.IsGenericInstance) |
||||
throw new NotSupportedException (); |
||||
|
||||
var instance = (GenericInstanceMethod) method; |
||||
var element_method = ImportMethod (instance.ElementMethod, context); |
||||
var imported_instance = new GenericInstanceMethod (element_method); |
||||
|
||||
var arguments = instance.GenericArguments; |
||||
var imported_arguments = imported_instance.GenericArguments; |
||||
|
||||
for (int i = 0; i < arguments.Count; i++) |
||||
imported_arguments.Add (ImportType (arguments [i], context)); |
||||
|
||||
return imported_instance; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,60 @@
@@ -0,0 +1,60 @@
|
||||
//
|
||||
// LinkedResource.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public sealed class LinkedResource : Resource { |
||||
|
||||
internal byte [] hash; |
||||
string file; |
||||
|
||||
public byte [] Hash { |
||||
get { return hash; } |
||||
} |
||||
|
||||
public string File { |
||||
get { return file; } |
||||
set { file = value; } |
||||
} |
||||
|
||||
public override ResourceType ResourceType { |
||||
get { return ResourceType.Linked; } |
||||
} |
||||
|
||||
public LinkedResource (string name, ManifestResourceAttributes flags) |
||||
: base (name, flags) |
||||
{ |
||||
} |
||||
|
||||
public LinkedResource (string name, ManifestResourceAttributes flags, string file) |
||||
: base (name, flags) |
||||
{ |
||||
this.file = file; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,39 @@
@@ -0,0 +1,39 @@
|
||||
//
|
||||
// ManifestResourceAttributes.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
[Flags] |
||||
public enum ManifestResourceAttributes : uint { |
||||
VisibilityMask = 0x0007, |
||||
Public = 0x0001, // The resource is exported from the Assembly
|
||||
Private = 0x0002 // The resource is private to the Assembly
|
||||
} |
||||
} |
@ -0,0 +1,171 @@
@@ -0,0 +1,171 @@
|
||||
//
|
||||
// MarshalInfo.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public class MarshalInfo { |
||||
|
||||
internal NativeType native; |
||||
|
||||
public NativeType NativeType { |
||||
get { return native; } |
||||
set { native = value; } |
||||
} |
||||
|
||||
public MarshalInfo (NativeType native) |
||||
{ |
||||
this.native = native; |
||||
} |
||||
} |
||||
|
||||
public sealed class ArrayMarshalInfo : MarshalInfo { |
||||
|
||||
internal NativeType element_type; |
||||
internal int size_parameter_index; |
||||
internal int size; |
||||
internal int size_parameter_multiplier; |
||||
|
||||
public NativeType ElementType { |
||||
get { return element_type; } |
||||
set { element_type = value; } |
||||
} |
||||
|
||||
public int SizeParameterIndex { |
||||
get { return size_parameter_index; } |
||||
set { size_parameter_index = value; } |
||||
} |
||||
|
||||
public int Size { |
||||
get { return size; } |
||||
set { size = value; } |
||||
} |
||||
|
||||
public int SizeParameterMultiplier { |
||||
get { return size_parameter_multiplier; } |
||||
set { size_parameter_multiplier = value; } |
||||
} |
||||
|
||||
public ArrayMarshalInfo () |
||||
: base (NativeType.Array) |
||||
{ |
||||
element_type = NativeType.None; |
||||
size_parameter_index = -1; |
||||
size = -1; |
||||
size_parameter_multiplier = -1; |
||||
} |
||||
} |
||||
|
||||
public sealed class CustomMarshalInfo : MarshalInfo { |
||||
|
||||
internal Guid guid; |
||||
internal string unmanaged_type; |
||||
internal TypeReference managed_type; |
||||
internal string cookie; |
||||
|
||||
public Guid Guid { |
||||
get { return guid; } |
||||
set { guid = value; } |
||||
} |
||||
|
||||
public string UnmanagedType { |
||||
get { return unmanaged_type; } |
||||
set { unmanaged_type = value; } |
||||
} |
||||
|
||||
public TypeReference ManagedType { |
||||
get { return managed_type; } |
||||
set { managed_type = value; } |
||||
} |
||||
|
||||
public string Cookie { |
||||
get { return cookie; } |
||||
set { cookie = value; } |
||||
} |
||||
|
||||
public CustomMarshalInfo () |
||||
: base (NativeType.CustomMarshaler) |
||||
{ |
||||
} |
||||
} |
||||
|
||||
public sealed class SafeArrayMarshalInfo : MarshalInfo { |
||||
|
||||
internal VariantType element_type; |
||||
|
||||
public VariantType ElementType { |
||||
get { return element_type; } |
||||
set { element_type = value; } |
||||
} |
||||
|
||||
public SafeArrayMarshalInfo () |
||||
: base (NativeType.SafeArray) |
||||
{ |
||||
element_type = VariantType.None; |
||||
} |
||||
} |
||||
|
||||
public sealed class FixedArrayMarshalInfo : MarshalInfo { |
||||
|
||||
internal NativeType element_type; |
||||
internal int size; |
||||
|
||||
public NativeType ElementType { |
||||
get { return element_type; } |
||||
set { element_type = value; } |
||||
} |
||||
|
||||
public int Size { |
||||
get { return size; } |
||||
set { size = value; } |
||||
} |
||||
|
||||
public FixedArrayMarshalInfo () |
||||
: base (NativeType.FixedArray) |
||||
{ |
||||
element_type = NativeType.None; |
||||
} |
||||
} |
||||
|
||||
public sealed class FixedSysStringMarshalInfo : MarshalInfo { |
||||
|
||||
internal int size; |
||||
|
||||
public int Size { |
||||
get { return size; } |
||||
set { size = value; } |
||||
} |
||||
|
||||
public FixedSysStringMarshalInfo () |
||||
: base (NativeType.FixedSysString) |
||||
{ |
||||
size = -1; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,92 @@
@@ -0,0 +1,92 @@
|
||||
//
|
||||
// MemberDefinitionCollection.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
class MemberDefinitionCollection<T> : Collection<T> where T : IMemberDefinition { |
||||
|
||||
TypeDefinition container; |
||||
|
||||
internal MemberDefinitionCollection (TypeDefinition container) |
||||
{ |
||||
this.container = container; |
||||
} |
||||
|
||||
internal MemberDefinitionCollection (TypeDefinition container, int capacity) |
||||
: base (capacity) |
||||
{ |
||||
this.container = container; |
||||
} |
||||
|
||||
protected override void OnAdd (T item, int index) |
||||
{ |
||||
Attach (item); |
||||
} |
||||
|
||||
protected sealed override void OnSet (T item, int index) |
||||
{ |
||||
Attach (item); |
||||
} |
||||
|
||||
protected sealed override void OnInsert (T item, int index) |
||||
{ |
||||
Attach (item); |
||||
} |
||||
|
||||
protected sealed override void OnRemove (T item, int index) |
||||
{ |
||||
Detach (item); |
||||
} |
||||
|
||||
protected sealed override void OnClear () |
||||
{ |
||||
foreach (var definition in this) |
||||
Detach (definition); |
||||
} |
||||
|
||||
void Attach (T element) |
||||
{ |
||||
if (element.DeclaringType == container) |
||||
return; |
||||
|
||||
if (element.DeclaringType != null) |
||||
throw new ArgumentException ("Member already attached"); |
||||
|
||||
element.DeclaringType = this.container; |
||||
} |
||||
|
||||
static void Detach (T element) |
||||
{ |
||||
element.DeclaringType = null; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,101 @@
@@ -0,0 +1,101 @@
|
||||
//
|
||||
// MemberReference.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public abstract class MemberReference : IMetadataTokenProvider { |
||||
|
||||
string name; |
||||
TypeReference declaring_type; |
||||
|
||||
internal MetadataToken token; |
||||
|
||||
public virtual string Name { |
||||
get { return name; } |
||||
set { name = value; } |
||||
} |
||||
|
||||
public abstract string FullName { |
||||
get; |
||||
} |
||||
|
||||
public virtual TypeReference DeclaringType { |
||||
get { return declaring_type; } |
||||
set { declaring_type = value; } |
||||
} |
||||
|
||||
public MetadataToken MetadataToken { |
||||
get { return token; } |
||||
set { token = value; } |
||||
} |
||||
|
||||
internal bool HasImage { |
||||
get { |
||||
var module = Module; |
||||
if (module == null) |
||||
return false; |
||||
|
||||
return module.HasImage; |
||||
} |
||||
} |
||||
|
||||
public virtual ModuleDefinition Module { |
||||
get { return declaring_type != null ? declaring_type.Module : null; } |
||||
} |
||||
|
||||
public virtual bool IsDefinition { |
||||
get { return false; } |
||||
} |
||||
|
||||
internal virtual bool ContainsGenericParameter { |
||||
get { return declaring_type != null && declaring_type.ContainsGenericParameter; } |
||||
} |
||||
|
||||
internal MemberReference () |
||||
{ |
||||
} |
||||
|
||||
internal MemberReference (string name) |
||||
{ |
||||
this.name = name ?? string.Empty; |
||||
} |
||||
|
||||
internal string MemberFullName () |
||||
{ |
||||
if (declaring_type == null) |
||||
return name; |
||||
|
||||
return declaring_type.FullName + "::" + name; |
||||
} |
||||
|
||||
public override string ToString () |
||||
{ |
||||
return FullName; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,313 @@
@@ -0,0 +1,313 @@
|
||||
//
|
||||
// MetadataResolver.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public interface IAssemblyResolver { |
||||
AssemblyDefinition Resolve (AssemblyNameReference name); |
||||
AssemblyDefinition Resolve (AssemblyNameReference name, ReaderParameters parameters); |
||||
|
||||
AssemblyDefinition Resolve (string fullName); |
||||
AssemblyDefinition Resolve (string fullName, ReaderParameters parameters); |
||||
} |
||||
|
||||
public class ResolutionException : Exception { |
||||
|
||||
readonly MemberReference member; |
||||
|
||||
public MemberReference Member { |
||||
get { return member; } |
||||
} |
||||
|
||||
public ResolutionException (MemberReference member) |
||||
: base ("Failed to resolve " + member.FullName) |
||||
{ |
||||
this.member = member; |
||||
} |
||||
} |
||||
|
||||
static class MetadataResolver { |
||||
|
||||
public static TypeDefinition Resolve (IAssemblyResolver resolver, TypeReference type) |
||||
{ |
||||
type = type.GetElementType (); |
||||
|
||||
var scope = type.Scope; |
||||
switch (scope.MetadataScopeType) { |
||||
case MetadataScopeType.AssemblyNameReference: |
||||
var assembly = resolver.Resolve ((AssemblyNameReference) scope); |
||||
if (assembly == null) |
||||
return null; |
||||
|
||||
return GetType (resolver, assembly.MainModule, type); |
||||
case MetadataScopeType.ModuleDefinition: |
||||
return GetType (resolver, (ModuleDefinition) scope, type); |
||||
case MetadataScopeType.ModuleReference: |
||||
var modules = type.Module.Assembly.Modules; |
||||
var module_ref = (ModuleReference) scope; |
||||
for (int i = 0; i < modules.Count; i++) { |
||||
var netmodule = modules [i]; |
||||
if (netmodule.Name == module_ref.Name) |
||||
return GetType (resolver, netmodule, type); |
||||
} |
||||
break; |
||||
} |
||||
|
||||
throw new NotSupportedException (); |
||||
} |
||||
|
||||
static TypeDefinition GetType (IAssemblyResolver resolver, ModuleDefinition module, TypeReference reference) |
||||
{ |
||||
var type = GetType (module, reference); |
||||
if (type != null) |
||||
return type; |
||||
|
||||
if (!module.HasExportedTypes) |
||||
return null; |
||||
|
||||
var exported_types = module.ExportedTypes; |
||||
|
||||
for (int i = 0; i < exported_types.Count; i++) { |
||||
var exported_type = exported_types [i]; |
||||
if (exported_type.Name != reference.Name) |
||||
continue; |
||||
|
||||
if (exported_type.Namespace != reference.Namespace) |
||||
continue; |
||||
|
||||
return exported_type.Resolve (); |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
static TypeDefinition GetType (ModuleDefinition module, TypeReference type) |
||||
{ |
||||
if (!type.IsNested) |
||||
return module.GetType (type.Namespace, type.Name); |
||||
|
||||
var declaring_type = type.DeclaringType.Resolve (); |
||||
if (declaring_type == null) |
||||
return null; |
||||
|
||||
return declaring_type.GetNestedType (type.Name); |
||||
} |
||||
|
||||
public static FieldDefinition Resolve (IAssemblyResolver resolver, FieldReference field) |
||||
{ |
||||
var type = Resolve (resolver, field.DeclaringType); |
||||
if (type == null) |
||||
return null; |
||||
|
||||
if (!type.HasFields) |
||||
return null; |
||||
|
||||
return GetField (resolver, type, field); |
||||
} |
||||
|
||||
static FieldDefinition GetField (IAssemblyResolver resolver, TypeDefinition type, FieldReference reference) |
||||
{ |
||||
while (type != null) { |
||||
var field = GetField (type.Fields, reference); |
||||
if (field != null) |
||||
return field; |
||||
|
||||
if (type.BaseType == null) |
||||
return null; |
||||
|
||||
type = Resolve (resolver, type.BaseType); |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
static FieldDefinition GetField (IList<FieldDefinition> fields, FieldReference reference) |
||||
{ |
||||
for (int i = 0; i < fields.Count; i++) { |
||||
var field = fields [i]; |
||||
|
||||
if (field.Name != reference.Name) |
||||
continue; |
||||
|
||||
if (!AreSame (field.FieldType, reference.FieldType)) |
||||
continue; |
||||
|
||||
return field; |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
public static MethodDefinition Resolve (IAssemblyResolver resolver, MethodReference method) |
||||
{ |
||||
var type = Resolve (resolver, method.DeclaringType); |
||||
if (type == null) |
||||
return null; |
||||
|
||||
method = method.GetElementMethod (); |
||||
|
||||
if (!type.HasMethods) |
||||
return null; |
||||
|
||||
return GetMethod (resolver, type, method); |
||||
} |
||||
|
||||
static MethodDefinition GetMethod (IAssemblyResolver resolver, TypeDefinition type, MethodReference reference) |
||||
{ |
||||
while (type != null) { |
||||
var method = GetMethod (type.Methods, reference); |
||||
if (method != null) |
||||
return method; |
||||
|
||||
if (type.BaseType == null) |
||||
return null; |
||||
|
||||
type = Resolve (resolver, type.BaseType); |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
public static MethodDefinition GetMethod (IList<MethodDefinition> methods, MethodReference reference) |
||||
{ |
||||
for (int i = 0; i < methods.Count; i++) { |
||||
var method = methods [i]; |
||||
|
||||
if (method.Name != reference.Name) |
||||
continue; |
||||
|
||||
if (!AreSame (method.ReturnType, reference.ReturnType)) |
||||
continue; |
||||
|
||||
if (method.HasParameters != reference.HasParameters) |
||||
continue; |
||||
|
||||
if (!method.HasParameters && !reference.HasParameters) |
||||
return method; |
||||
|
||||
if (!AreSame (method.Parameters, reference.Parameters)) |
||||
continue; |
||||
|
||||
return method; |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
static bool AreSame (Collection<ParameterDefinition> a, Collection<ParameterDefinition> b) |
||||
{ |
||||
var count = a.Count; |
||||
|
||||
if (count != b.Count) |
||||
return false; |
||||
|
||||
if (count == 0) |
||||
return true; |
||||
|
||||
for (int i = 0; i < count; i++) |
||||
if (!AreSame (a [i].ParameterType, b [i].ParameterType)) |
||||
return false; |
||||
|
||||
return true; |
||||
} |
||||
|
||||
static bool AreSame (TypeSpecification a, TypeSpecification b) |
||||
{ |
||||
if (!AreSame (a.ElementType, b.ElementType)) |
||||
return false; |
||||
|
||||
if (a.IsGenericInstance) |
||||
return AreSame ((GenericInstanceType) a, (GenericInstanceType) b); |
||||
|
||||
if (a.IsRequiredModifier || a.IsOptionalModifier) |
||||
return AreSame ((IModifierType) a, (IModifierType) b); |
||||
|
||||
if (a.IsArray) |
||||
return AreSame ((ArrayType) a, (ArrayType) b); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
static bool AreSame (ArrayType a, ArrayType b) |
||||
{ |
||||
if (a.Rank != b.Rank) |
||||
return false; |
||||
|
||||
// TODO: dimensions
|
||||
|
||||
return true; |
||||
} |
||||
|
||||
static bool AreSame (IModifierType a, IModifierType b) |
||||
{ |
||||
return AreSame (a.ModifierType, b.ModifierType); |
||||
} |
||||
|
||||
static bool AreSame (GenericInstanceType a, GenericInstanceType b) |
||||
{ |
||||
if (!a.HasGenericArguments) |
||||
return !b.HasGenericArguments; |
||||
|
||||
if (!b.HasGenericArguments) |
||||
return false; |
||||
|
||||
if (a.GenericArguments.Count != b.GenericArguments.Count) |
||||
return false; |
||||
|
||||
for (int i = 0; i < a.GenericArguments.Count; i++) |
||||
if (!AreSame (a.GenericArguments [i], b.GenericArguments [i])) |
||||
return false; |
||||
|
||||
return true; |
||||
} |
||||
|
||||
static bool AreSame (GenericParameter a, GenericParameter b) |
||||
{ |
||||
return a.Position == b.Position; |
||||
} |
||||
|
||||
static bool AreSame (TypeReference a, TypeReference b) |
||||
{ |
||||
if (a.etype != b.etype) |
||||
return false; |
||||
|
||||
if (a.IsGenericParameter) |
||||
return AreSame ((GenericParameter) a, (GenericParameter) b); |
||||
|
||||
if (a.IsTypeSpecification ()) |
||||
return AreSame ((TypeSpecification) a, (TypeSpecification) b); |
||||
|
||||
return a.FullName == b.FullName; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,380 @@
@@ -0,0 +1,380 @@
|
||||
//
|
||||
// MetadataSystem.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
|
||||
using Mono.Cecil.Metadata; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
struct Range { |
||||
public uint Start; |
||||
public uint Length; |
||||
|
||||
public Range (uint index, uint length) |
||||
{ |
||||
this.Start = index; |
||||
this.Length = length; |
||||
} |
||||
} |
||||
|
||||
sealed class MetadataSystem { |
||||
|
||||
internal AssemblyNameReference [] AssemblyReferences; |
||||
internal ModuleReference [] ModuleReferences; |
||||
|
||||
internal TypeDefinition [] Types; |
||||
internal TypeReference [] TypeReferences; |
||||
|
||||
internal FieldDefinition [] Fields; |
||||
internal MethodDefinition [] Methods; |
||||
internal MemberReference [] MemberReferences; |
||||
|
||||
internal Dictionary<uint, uint []> NestedTypes; |
||||
internal Dictionary<uint, uint> ReverseNestedTypes; |
||||
internal Dictionary<uint, MetadataToken []> Interfaces; |
||||
internal Dictionary<uint, Row<ushort, uint>> ClassLayouts; |
||||
internal Dictionary<uint, uint> FieldLayouts; |
||||
internal Dictionary<uint, uint> FieldRVAs; |
||||
internal Dictionary<MetadataToken, uint> FieldMarshals; |
||||
internal Dictionary<MetadataToken, Row<ElementType, uint>> Constants; |
||||
internal Dictionary<uint, MetadataToken []> Overrides; |
||||
internal Dictionary<MetadataToken, Range> CustomAttributes; |
||||
internal Dictionary<MetadataToken, Range> SecurityDeclarations; |
||||
internal Dictionary<uint, Range> Events; |
||||
internal Dictionary<uint, Range> Properties; |
||||
internal Dictionary<uint, Row<MethodSemanticsAttributes, MetadataToken>> Semantics; |
||||
internal Dictionary<uint, Row<PInvokeAttributes, uint, uint>> PInvokes; |
||||
internal Dictionary<MetadataToken, Range> GenericParameters; |
||||
internal Dictionary<uint, MetadataToken []> GenericConstraints; |
||||
|
||||
static Dictionary<string, Row<ElementType, bool>> primitive_value_types; |
||||
|
||||
static void InitializePrimitives () |
||||
{ |
||||
primitive_value_types = new Dictionary<string, Row<ElementType, bool>> (18) { |
||||
{ "Void", new Row<ElementType, bool> (ElementType.Void, false) }, |
||||
{ "Boolean", new Row<ElementType, bool> (ElementType.Boolean, true) }, |
||||
{ "Char", new Row<ElementType, bool> (ElementType.Char, true) }, |
||||
{ "SByte", new Row<ElementType, bool> (ElementType.I1, true) }, |
||||
{ "Byte", new Row<ElementType, bool> (ElementType.U1, true) }, |
||||
{ "Int16", new Row<ElementType, bool> (ElementType.I2, true) }, |
||||
{ "UInt16", new Row<ElementType, bool> (ElementType.U2, true) }, |
||||
{ "Int32", new Row<ElementType, bool> (ElementType.I4, true) }, |
||||
{ "UInt32", new Row<ElementType, bool> (ElementType.U4, true) }, |
||||
{ "Int64", new Row<ElementType, bool> (ElementType.I8, true) }, |
||||
{ "UInt64", new Row<ElementType, bool> (ElementType.U8, true) }, |
||||
{ "Single", new Row<ElementType, bool> (ElementType.R4, true) }, |
||||
{ "Double", new Row<ElementType, bool> (ElementType.R8, true) }, |
||||
{ "String", new Row<ElementType, bool> (ElementType.String, false) }, |
||||
{ "TypedReference", new Row<ElementType, bool> (ElementType.TypedByRef, false) }, |
||||
{ "IntPtr", new Row<ElementType, bool> (ElementType.I, true) }, |
||||
{ "UIntPtr", new Row<ElementType, bool> (ElementType.U, true) }, |
||||
{ "Object", new Row<ElementType, bool> (ElementType.Object, false) }, |
||||
}; |
||||
} |
||||
|
||||
public static void TryProcessPrimitiveType (TypeReference type) |
||||
{ |
||||
var scope = type.scope; |
||||
if (scope == null) |
||||
return; |
||||
|
||||
if (scope.MetadataScopeType != MetadataScopeType.AssemblyNameReference) |
||||
return; |
||||
|
||||
if (scope.Name != "mscorlib") |
||||
return; |
||||
|
||||
if (type.Namespace != "System") |
||||
return; |
||||
|
||||
if (primitive_value_types == null) |
||||
InitializePrimitives (); |
||||
|
||||
Row<ElementType, bool> primitive_data; |
||||
if (!primitive_value_types.TryGetValue (type.Name, out primitive_data)) |
||||
return; |
||||
|
||||
type.etype = primitive_data.Col1; |
||||
type.IsValueType = primitive_data.Col2; |
||||
} |
||||
|
||||
public void Clear () |
||||
{ |
||||
if (NestedTypes != null) NestedTypes.Clear (); |
||||
if (ReverseNestedTypes != null) ReverseNestedTypes.Clear (); |
||||
if (Interfaces != null) Interfaces.Clear (); |
||||
if (ClassLayouts != null) ClassLayouts.Clear (); |
||||
if (FieldLayouts != null) FieldLayouts.Clear (); |
||||
if (FieldRVAs != null) FieldRVAs.Clear (); |
||||
if (FieldMarshals != null) FieldMarshals.Clear (); |
||||
if (Constants != null) Constants.Clear (); |
||||
if (Overrides != null) Overrides.Clear (); |
||||
if (CustomAttributes != null) CustomAttributes.Clear (); |
||||
if (SecurityDeclarations != null) SecurityDeclarations.Clear (); |
||||
if (Events != null) Events.Clear (); |
||||
if (Properties != null) Properties.Clear (); |
||||
if (Semantics != null) Semantics.Clear (); |
||||
if (PInvokes != null) PInvokes.Clear (); |
||||
if (GenericParameters != null) GenericParameters.Clear (); |
||||
if (GenericConstraints != null) GenericConstraints.Clear (); |
||||
} |
||||
|
||||
public TypeDefinition GetTypeDefinition (uint rid) |
||||
{ |
||||
if (rid < 1 || rid > Types.Length) |
||||
return null; |
||||
|
||||
return Types [rid - 1]; |
||||
} |
||||
|
||||
public void AddTypeDefinition (TypeDefinition type) |
||||
{ |
||||
Types [type.token.RID - 1] = type; |
||||
} |
||||
|
||||
public TypeReference GetTypeReference (uint rid) |
||||
{ |
||||
if (rid < 1 || rid > TypeReferences.Length) |
||||
return null; |
||||
|
||||
return TypeReferences [rid - 1]; |
||||
} |
||||
|
||||
public void AddTypeReference (TypeReference type) |
||||
{ |
||||
TypeReferences [type.token.RID - 1] = type; |
||||
} |
||||
|
||||
public FieldDefinition GetFieldDefinition (uint rid) |
||||
{ |
||||
if (rid < 1 || rid > Fields.Length) |
||||
return null; |
||||
|
||||
return Fields [rid - 1]; |
||||
} |
||||
|
||||
public void AddFieldDefinition (FieldDefinition field) |
||||
{ |
||||
Fields [field.token.RID - 1] = field; |
||||
} |
||||
|
||||
public MethodDefinition GetMethodDefinition (uint rid) |
||||
{ |
||||
if (rid < 1 || rid > Methods.Length) |
||||
return null; |
||||
|
||||
return Methods [rid - 1]; |
||||
} |
||||
|
||||
public void AddMethodDefinition (MethodDefinition method) |
||||
{ |
||||
Methods [method.token.RID - 1] = method; |
||||
} |
||||
|
||||
public MemberReference GetMemberReference (uint rid) |
||||
{ |
||||
if (rid < 1 || rid > MemberReferences.Length) |
||||
return null; |
||||
|
||||
return MemberReferences [rid - 1]; |
||||
} |
||||
|
||||
public void AddMemberReference (MemberReference member) |
||||
{ |
||||
MemberReferences [member.token.RID - 1] = member; |
||||
} |
||||
|
||||
public bool TryGetNestedTypeMapping (TypeDefinition type, out uint [] mapping) |
||||
{ |
||||
return NestedTypes.TryGetValue (type.token.RID, out mapping); |
||||
} |
||||
|
||||
public void SetNestedTypeMapping (uint type_rid, uint [] mapping) |
||||
{ |
||||
NestedTypes [type_rid] = mapping; |
||||
} |
||||
|
||||
public void RemoveNestedTypeMapping (TypeDefinition type) |
||||
{ |
||||
NestedTypes.Remove (type.token.RID); |
||||
} |
||||
|
||||
public bool TryGetReverseNestedTypeMapping (TypeDefinition type, out uint declaring) |
||||
{ |
||||
return ReverseNestedTypes.TryGetValue (type.token.RID, out declaring); |
||||
} |
||||
|
||||
public void SetReverseNestedTypeMapping (uint nested, uint declaring) |
||||
{ |
||||
ReverseNestedTypes.Add (nested, declaring); |
||||
} |
||||
|
||||
public void RemoveReverseNestedTypeMapping (TypeDefinition type) |
||||
{ |
||||
ReverseNestedTypes.Remove (type.token.RID); |
||||
} |
||||
|
||||
public bool TryGetInterfaceMapping (TypeDefinition type, out MetadataToken [] mapping) |
||||
{ |
||||
return Interfaces.TryGetValue (type.token.RID, out mapping); |
||||
} |
||||
|
||||
public void SetInterfaceMapping (uint type_rid, MetadataToken [] mapping) |
||||
{ |
||||
Interfaces [type_rid] = mapping; |
||||
} |
||||
|
||||
public void RemoveInterfaceMapping (TypeDefinition type) |
||||
{ |
||||
Interfaces.Remove (type.token.RID); |
||||
} |
||||
|
||||
public void AddPropertiesRange (uint type_rid, Range range) |
||||
{ |
||||
Properties.Add (type_rid, range); |
||||
} |
||||
|
||||
public bool TryGetPropertiesRange (TypeDefinition type, out Range range) |
||||
{ |
||||
return Properties.TryGetValue (type.token.RID, out range); |
||||
} |
||||
|
||||
public void RemovePropertiesRange (TypeDefinition type) |
||||
{ |
||||
Properties.Remove (type.token.RID); |
||||
} |
||||
|
||||
public void AddEventsRange (uint type_rid, Range range) |
||||
{ |
||||
Events.Add (type_rid, range); |
||||
} |
||||
|
||||
public bool TryGetEventsRange (TypeDefinition type, out Range range) |
||||
{ |
||||
return Events.TryGetValue (type.token.RID, out range); |
||||
} |
||||
|
||||
public void RemoveEventsRange (TypeDefinition type) |
||||
{ |
||||
Events.Remove (type.token.RID); |
||||
} |
||||
|
||||
public bool TryGetGenericParameterRange (IGenericParameterProvider owner, out Range range) |
||||
{ |
||||
return GenericParameters.TryGetValue (owner.MetadataToken, out range); |
||||
} |
||||
|
||||
public void RemoveGenericParameterRange (IGenericParameterProvider owner) |
||||
{ |
||||
GenericParameters.Remove (owner.MetadataToken); |
||||
} |
||||
|
||||
public bool TryGetCustomAttributeRange (ICustomAttributeProvider owner, out Range range) |
||||
{ |
||||
return CustomAttributes.TryGetValue (owner.MetadataToken, out range); |
||||
} |
||||
|
||||
public void RemoveCustomAttributeRange (ICustomAttributeProvider owner) |
||||
{ |
||||
CustomAttributes.Remove (owner.MetadataToken); |
||||
} |
||||
|
||||
public bool TryGetSecurityDeclarationRange (ISecurityDeclarationProvider owner, out Range range) |
||||
{ |
||||
return SecurityDeclarations.TryGetValue (owner.MetadataToken, out range); |
||||
} |
||||
|
||||
public void RemoveSecurityDeclarationRange (ISecurityDeclarationProvider owner) |
||||
{ |
||||
SecurityDeclarations.Remove (owner.MetadataToken); |
||||
} |
||||
|
||||
public bool TryGetGenericConstraintMapping (GenericParameter generic_parameter, out MetadataToken [] mapping) |
||||
{ |
||||
return GenericConstraints.TryGetValue (generic_parameter.token.RID, out mapping); |
||||
} |
||||
|
||||
public void SetGenericConstraintMapping (uint gp_rid, MetadataToken [] mapping) |
||||
{ |
||||
GenericConstraints [gp_rid] = mapping; |
||||
} |
||||
|
||||
public void RemoveGenericConstraintMapping (GenericParameter generic_parameter) |
||||
{ |
||||
GenericConstraints.Remove (generic_parameter.token.RID); |
||||
} |
||||
|
||||
public bool TryGetOverrideMapping (MethodDefinition method, out MetadataToken [] mapping) |
||||
{ |
||||
return Overrides.TryGetValue (method.token.RID, out mapping); |
||||
} |
||||
|
||||
public void SetOverrideMapping (uint rid, MetadataToken [] mapping) |
||||
{ |
||||
Overrides [rid] = mapping; |
||||
} |
||||
|
||||
public void RemoveOverrideMapping (MethodDefinition method) |
||||
{ |
||||
Overrides.Remove (method.token.RID); |
||||
} |
||||
|
||||
public TypeDefinition GetFieldDeclaringType (uint field_rid) |
||||
{ |
||||
return BinaryRangeSearch (Types, field_rid, true); |
||||
} |
||||
|
||||
public TypeDefinition GetMethodDeclaringType (uint method_rid) |
||||
{ |
||||
return BinaryRangeSearch (Types, method_rid, false); |
||||
} |
||||
|
||||
static TypeDefinition BinaryRangeSearch (TypeDefinition [] types, uint rid, bool field) |
||||
{ |
||||
int min = 0; |
||||
int max = types.Length - 1; |
||||
while (min <= max) { |
||||
int mid = min + ((max - min) / 2); |
||||
var type = types [mid]; |
||||
var range = field ? type.fields_range : type.methods_range; |
||||
|
||||
if (rid < range.Start) |
||||
max = mid - 1; |
||||
else if (rid >= range.Start + range.Length) |
||||
min = mid + 1; |
||||
else |
||||
return type; |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,66 @@
@@ -0,0 +1,66 @@
|
||||
//
|
||||
// MethodAttributes.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
[Flags] |
||||
public enum MethodAttributes : ushort { |
||||
MemberAccessMask = 0x0007, |
||||
CompilerControlled = 0x0000, // Member not referenceable
|
||||
Private = 0x0001, // Accessible only by the parent type
|
||||
FamANDAssem = 0x0002, // Accessible by sub-types only in this Assembly
|
||||
Assembly = 0x0003, // Accessibly by anyone in the Assembly
|
||||
Family = 0x0004, // Accessible only by type and sub-types
|
||||
FamORAssem = 0x0005, // Accessibly by sub-types anywhere, plus anyone in assembly
|
||||
Public = 0x0006, // Accessibly by anyone who has visibility to this scope
|
||||
|
||||
Static = 0x0010, // Defined on type, else per instance
|
||||
Final = 0x0020, // Method may not be overridden
|
||||
Virtual = 0x0040, // Method is virtual
|
||||
HideBySig = 0x0080, // Method hides by name+sig, else just by name
|
||||
|
||||
VtableLayoutMask = 0x0100, // Use this mask to retrieve vtable attributes
|
||||
ReuseSlot = 0x0000, // Method reuses existing slot in vtable
|
||||
NewSlot = 0x0100, // Method always gets a new slot in the vtable
|
||||
|
||||
CheckAccessOnOverride = 0x0200, // Method can only be overriden if also accessible
|
||||
Abstract = 0x0400, // Method does not provide an implementation
|
||||
SpecialName = 0x0800, // Method is special
|
||||
|
||||
// Interop Attributes
|
||||
PInvokeImpl = 0x2000, // Implementation is forwarded through PInvoke
|
||||
UnmanagedExport = 0x0008, // Reserved: shall be zero for conforming implementations
|
||||
|
||||
// Additional flags
|
||||
RTSpecialName = 0x1000, // CLI provides 'special' behavior, depending upon the name of the method
|
||||
HasSecurity = 0x4000, // Method has security associate with it
|
||||
RequireSecObject = 0x8000 // Method calls another method containing security code
|
||||
} |
||||
} |
@ -0,0 +1,40 @@
@@ -0,0 +1,40 @@
|
||||
//
|
||||
// MethodCallingConvention.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public enum MethodCallingConvention : byte { |
||||
Default = 0x0, |
||||
C = 0x1, |
||||
StdCall = 0x2, |
||||
ThisCall = 0x3, |
||||
FastCall = 0x4, |
||||
VarArg = 0x5, |
||||
Generic = 0x10, |
||||
} |
||||
} |
@ -0,0 +1,487 @@
@@ -0,0 +1,487 @@
|
||||
//
|
||||
// MethodDefinition.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using Mono.Cecil.Cil; |
||||
using Mono.Collections.Generic; |
||||
|
||||
using RVA = System.UInt32; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public sealed class MethodDefinition : MethodReference, IMemberDefinition, ISecurityDeclarationProvider { |
||||
|
||||
ushort attributes; |
||||
ushort impl_attributes; |
||||
internal MethodSemanticsAttributes? sem_attrs; |
||||
Collection<CustomAttribute> custom_attributes; |
||||
Collection<SecurityDeclaration> security_declarations; |
||||
|
||||
internal RVA rva; |
||||
internal PInvokeInfo pinvoke; |
||||
Collection<MethodReference> overrides; |
||||
|
||||
internal MethodBody body; |
||||
|
||||
public MethodAttributes Attributes { |
||||
get { return (MethodAttributes) attributes; } |
||||
set { attributes = (ushort) value; } |
||||
} |
||||
|
||||
public MethodImplAttributes ImplAttributes { |
||||
get { return (MethodImplAttributes) impl_attributes; } |
||||
set { impl_attributes = (ushort) value; } |
||||
} |
||||
|
||||
public MethodSemanticsAttributes SemanticsAttributes { |
||||
get { |
||||
if (sem_attrs.HasValue) |
||||
return sem_attrs.Value; |
||||
|
||||
if (HasImage) { |
||||
ReadSemantics (); |
||||
return sem_attrs.Value; |
||||
} |
||||
|
||||
sem_attrs = MethodSemanticsAttributes.None; |
||||
return sem_attrs.Value; |
||||
} |
||||
set { sem_attrs = value; } |
||||
} |
||||
|
||||
internal void ReadSemantics () |
||||
{ |
||||
if (sem_attrs.HasValue) |
||||
return; |
||||
|
||||
var module = this.Module; |
||||
if (module == null) |
||||
return; |
||||
|
||||
if (!module.HasImage) |
||||
return; |
||||
|
||||
module.Read (this, (method, reader) => reader.ReadAllSemantics (method)); |
||||
} |
||||
|
||||
public bool HasSecurityDeclarations { |
||||
get { |
||||
if (security_declarations != null) |
||||
return security_declarations.Count > 0; |
||||
|
||||
return this.GetHasSecurityDeclarations (Module); |
||||
} |
||||
} |
||||
|
||||
public Collection<SecurityDeclaration> SecurityDeclarations { |
||||
get { return security_declarations ?? (security_declarations = this.GetSecurityDeclarations (Module)); } |
||||
} |
||||
|
||||
public bool HasCustomAttributes { |
||||
get { |
||||
if (custom_attributes != null) |
||||
return custom_attributes.Count > 0; |
||||
|
||||
return this.GetHasCustomAttributes (Module); |
||||
} |
||||
} |
||||
|
||||
public Collection<CustomAttribute> CustomAttributes { |
||||
get { return custom_attributes ?? (custom_attributes = this.GetCustomAttributes (Module)); } |
||||
} |
||||
|
||||
public int RVA { |
||||
get { return (int) rva; } |
||||
} |
||||
|
||||
public bool HasBody { |
||||
get { |
||||
return (attributes & (ushort) MethodAttributes.Abstract) == 0 && |
||||
(attributes & (ushort) MethodAttributes.PInvokeImpl) == 0 && |
||||
(impl_attributes & (ushort) MethodImplAttributes.InternalCall) == 0 && |
||||
(impl_attributes & (ushort) MethodImplAttributes.Native) == 0 && |
||||
(impl_attributes & (ushort) MethodImplAttributes.Unmanaged) == 0 && |
||||
(impl_attributes & (ushort) MethodImplAttributes.Runtime) == 0; |
||||
} |
||||
} |
||||
|
||||
public MethodBody Body { |
||||
get { |
||||
if (body != null) |
||||
return body; |
||||
|
||||
if (!HasBody) |
||||
return null; |
||||
|
||||
if (HasImage && rva != 0) |
||||
return body = Module.Read (this, (method, reader) => reader.ReadMethodBody (method)); |
||||
|
||||
return body = new MethodBody (this); |
||||
} |
||||
set { body = value; } |
||||
} |
||||
|
||||
public bool HasPInvokeInfo { |
||||
get { |
||||
if (pinvoke != null) |
||||
return true; |
||||
|
||||
return IsPInvokeImpl; |
||||
} |
||||
} |
||||
|
||||
public PInvokeInfo PInvokeInfo { |
||||
get { |
||||
if (pinvoke != null) |
||||
return pinvoke; |
||||
|
||||
if (HasImage && IsPInvokeImpl) |
||||
return pinvoke = Module.Read (this, (method, reader) => reader.ReadPInvokeInfo (method)); |
||||
|
||||
return null; |
||||
} |
||||
set { |
||||
IsPInvokeImpl = true; |
||||
pinvoke = value; |
||||
} |
||||
} |
||||
|
||||
public bool HasOverrides { |
||||
get { |
||||
if (overrides != null) |
||||
return overrides.Count > 0; |
||||
|
||||
if (HasImage) |
||||
return Module.Read (this, (method, reader) => reader.HasOverrides (method)); |
||||
|
||||
return false; |
||||
} |
||||
} |
||||
|
||||
public Collection<MethodReference> Overrides { |
||||
get { |
||||
if (overrides != null) |
||||
return overrides; |
||||
|
||||
if (HasImage) |
||||
return overrides = Module.Read (this, (method, reader) => reader.ReadOverrides (method)); |
||||
|
||||
return overrides = new Collection<MethodReference> (); |
||||
} |
||||
} |
||||
|
||||
public override bool HasGenericParameters { |
||||
get { |
||||
if (generic_parameters != null) |
||||
return generic_parameters.Count > 0; |
||||
|
||||
return this.GetHasGenericParameters (Module); |
||||
} |
||||
} |
||||
|
||||
public override Collection<GenericParameter> GenericParameters { |
||||
get { return generic_parameters ?? (generic_parameters = this.GetGenericParameters (Module)); } |
||||
} |
||||
|
||||
#region MethodAttributes
|
||||
|
||||
public bool IsCompilerControlled { |
||||
get { return attributes.GetMaskedAttributes ((ushort) MethodAttributes.MemberAccessMask, (ushort) MethodAttributes.CompilerControlled); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) MethodAttributes.MemberAccessMask, (ushort) MethodAttributes.CompilerControlled, value); } |
||||
} |
||||
|
||||
public bool IsPrivate { |
||||
get { return attributes.GetMaskedAttributes ((ushort) MethodAttributes.MemberAccessMask, (ushort) MethodAttributes.Private); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) MethodAttributes.MemberAccessMask, (ushort) MethodAttributes.Private, value); } |
||||
} |
||||
|
||||
public bool IsFamilyAndAssembly { |
||||
get { return attributes.GetMaskedAttributes ((ushort) MethodAttributes.MemberAccessMask, (ushort) MethodAttributes.FamANDAssem); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) MethodAttributes.MemberAccessMask, (ushort) MethodAttributes.FamANDAssem, value); } |
||||
} |
||||
|
||||
public bool IsAssembly { |
||||
get { return attributes.GetMaskedAttributes ((ushort) MethodAttributes.MemberAccessMask, (ushort) MethodAttributes.Assembly); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) MethodAttributes.MemberAccessMask, (ushort) MethodAttributes.Assembly, value); } |
||||
} |
||||
|
||||
public bool IsFamily { |
||||
get { return attributes.GetMaskedAttributes ((ushort) MethodAttributes.MemberAccessMask, (ushort) MethodAttributes.Family); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) MethodAttributes.MemberAccessMask, (ushort) MethodAttributes.Family, value); } |
||||
} |
||||
|
||||
public bool IsFamilyOrAssembly { |
||||
get { return attributes.GetMaskedAttributes ((ushort) MethodAttributes.MemberAccessMask, (ushort) MethodAttributes.FamORAssem); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) MethodAttributes.MemberAccessMask, (ushort) MethodAttributes.FamORAssem, value); } |
||||
} |
||||
|
||||
public bool IsPublic { |
||||
get { return attributes.GetMaskedAttributes ((ushort) MethodAttributes.MemberAccessMask, (ushort) MethodAttributes.Public); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) MethodAttributes.MemberAccessMask, (ushort) MethodAttributes.Public, value); } |
||||
} |
||||
|
||||
public bool IsStatic { |
||||
get { return attributes.GetAttributes ((ushort) MethodAttributes.Static); } |
||||
set { attributes = attributes.SetAttributes ((ushort) MethodAttributes.Static, value); } |
||||
} |
||||
|
||||
public bool IsFinal { |
||||
get { return attributes.GetAttributes ((ushort) MethodAttributes.Final); } |
||||
set { attributes = attributes.SetAttributes ((ushort) MethodAttributes.Final, value); } |
||||
} |
||||
|
||||
public bool IsVirtual { |
||||
get { return attributes.GetAttributes ((ushort) MethodAttributes.Virtual); } |
||||
set { attributes = attributes.SetAttributes ((ushort) MethodAttributes.Virtual, value); } |
||||
} |
||||
|
||||
public bool IsHideBySig { |
||||
get { return attributes.GetAttributes ((ushort) MethodAttributes.HideBySig); } |
||||
set { attributes = attributes.SetAttributes ((ushort) MethodAttributes.HideBySig, value); } |
||||
} |
||||
|
||||
public bool IsReuseSlot { |
||||
get { return attributes.GetMaskedAttributes ((ushort) MethodAttributes.VtableLayoutMask, (ushort) MethodAttributes.ReuseSlot); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) MethodAttributes.VtableLayoutMask, (ushort) MethodAttributes.ReuseSlot, value); } |
||||
} |
||||
|
||||
public bool IsNewSlot { |
||||
get { return attributes.GetMaskedAttributes ((ushort) MethodAttributes.VtableLayoutMask, (ushort) MethodAttributes.NewSlot); } |
||||
set { attributes = attributes.SetMaskedAttributes ((ushort) MethodAttributes.VtableLayoutMask, (ushort) MethodAttributes.NewSlot, value); } |
||||
} |
||||
|
||||
public bool IsCheckAccessOnOverride { |
||||
get { return attributes.GetAttributes ((ushort) MethodAttributes.CheckAccessOnOverride); } |
||||
set { attributes = attributes.SetAttributes ((ushort) MethodAttributes.CheckAccessOnOverride, value); } |
||||
} |
||||
|
||||
public bool IsAbstract { |
||||
get { return attributes.GetAttributes ((ushort) MethodAttributes.Abstract); } |
||||
set { attributes = attributes.SetAttributes ((ushort) MethodAttributes.Abstract, value); } |
||||
} |
||||
|
||||
public bool IsSpecialName { |
||||
get { return attributes.GetAttributes ((ushort) MethodAttributes.SpecialName); } |
||||
set { attributes = attributes.SetAttributes ((ushort) MethodAttributes.SpecialName, value); } |
||||
} |
||||
|
||||
public bool IsPInvokeImpl { |
||||
get { return attributes.GetAttributes ((ushort) MethodAttributes.PInvokeImpl); } |
||||
set { attributes = attributes.SetAttributes ((ushort) MethodAttributes.PInvokeImpl, value); } |
||||
} |
||||
|
||||
public bool IsUnmanagedExport { |
||||
get { return attributes.GetAttributes ((ushort) MethodAttributes.UnmanagedExport); } |
||||
set { attributes = attributes.SetAttributes ((ushort) MethodAttributes.UnmanagedExport, value); } |
||||
} |
||||
|
||||
public bool IsRuntimeSpecialName { |
||||
get { return attributes.GetAttributes ((ushort) MethodAttributes.RTSpecialName); } |
||||
set { attributes = attributes.SetAttributes ((ushort) MethodAttributes.RTSpecialName, value); } |
||||
} |
||||
|
||||
public bool HasSecurity { |
||||
get { return attributes.GetAttributes ((ushort) MethodAttributes.HasSecurity); } |
||||
set { attributes = attributes.SetAttributes ((ushort) MethodAttributes.HasSecurity, value); } |
||||
} |
||||
|
||||
#endregion
|
||||
|
||||
#region MethodImplAttributes
|
||||
|
||||
public bool IsIL { |
||||
get { return impl_attributes.GetMaskedAttributes ((ushort) MethodImplAttributes.CodeTypeMask, (ushort) MethodImplAttributes.IL); } |
||||
set { impl_attributes = impl_attributes.SetMaskedAttributes ((ushort) MethodImplAttributes.CodeTypeMask, (ushort) MethodImplAttributes.IL, value); } |
||||
} |
||||
|
||||
public bool IsNative { |
||||
get { return impl_attributes.GetMaskedAttributes ((ushort) MethodImplAttributes.CodeTypeMask, (ushort) MethodImplAttributes.Native); } |
||||
set { impl_attributes = impl_attributes.SetMaskedAttributes ((ushort) MethodImplAttributes.CodeTypeMask, (ushort) MethodImplAttributes.Native, value); } |
||||
} |
||||
|
||||
public bool IsRuntime { |
||||
get { return impl_attributes.GetMaskedAttributes ((ushort) MethodImplAttributes.CodeTypeMask, (ushort) MethodImplAttributes.Runtime); } |
||||
set { impl_attributes = impl_attributes.SetMaskedAttributes ((ushort) MethodImplAttributes.CodeTypeMask, (ushort) MethodImplAttributes.Runtime, value); } |
||||
} |
||||
|
||||
public bool IsUnmanaged { |
||||
get { return impl_attributes.GetMaskedAttributes ((ushort) MethodImplAttributes.ManagedMask, (ushort) MethodImplAttributes.Unmanaged); } |
||||
set { impl_attributes = impl_attributes.SetMaskedAttributes ((ushort) MethodImplAttributes.ManagedMask, (ushort) MethodImplAttributes.Unmanaged, value); } |
||||
} |
||||
|
||||
public bool IsManaged { |
||||
get { return impl_attributes.GetMaskedAttributes ((ushort) MethodImplAttributes.ManagedMask, (ushort) MethodImplAttributes.Managed); } |
||||
set { impl_attributes = impl_attributes.SetMaskedAttributes ((ushort) MethodImplAttributes.ManagedMask, (ushort) MethodImplAttributes.Managed, value); } |
||||
} |
||||
|
||||
public bool IsForwardRef { |
||||
get { return impl_attributes.GetAttributes ((ushort) MethodImplAttributes.ForwardRef); } |
||||
set { impl_attributes = impl_attributes.SetAttributes ((ushort) MethodImplAttributes.ForwardRef, value); } |
||||
} |
||||
|
||||
public bool IsPreserveSig { |
||||
get { return impl_attributes.GetAttributes ((ushort) MethodImplAttributes.PreserveSig); } |
||||
set { impl_attributes = impl_attributes.SetAttributes ((ushort) MethodImplAttributes.PreserveSig, value); } |
||||
} |
||||
|
||||
public bool IsInternalCall { |
||||
get { return impl_attributes.GetAttributes ((ushort) MethodImplAttributes.InternalCall); } |
||||
set { impl_attributes = impl_attributes.SetAttributes ((ushort) MethodImplAttributes.InternalCall, value); } |
||||
} |
||||
|
||||
public bool IsSynchronized { |
||||
get { return impl_attributes.GetAttributes ((ushort) MethodImplAttributes.Synchronized); } |
||||
set { impl_attributes = impl_attributes.SetAttributes ((ushort) MethodImplAttributes.Synchronized, value); } |
||||
} |
||||
|
||||
public bool NoInlining { |
||||
get { return impl_attributes.GetAttributes ((ushort) MethodImplAttributes.NoInlining); } |
||||
set { impl_attributes = impl_attributes.SetAttributes ((ushort) MethodImplAttributes.NoInlining, value); } |
||||
} |
||||
|
||||
public bool NoOptimization { |
||||
get { return impl_attributes.GetAttributes ((ushort) MethodImplAttributes.NoOptimization); } |
||||
set { impl_attributes = impl_attributes.SetAttributes ((ushort) MethodImplAttributes.NoOptimization, value); } |
||||
} |
||||
|
||||
#endregion
|
||||
|
||||
#region MethodSemanticsAttributes
|
||||
|
||||
public bool IsSetter { |
||||
get { return this.GetSemantics (MethodSemanticsAttributes.Setter); } |
||||
set { this.SetSemantics (MethodSemanticsAttributes.Setter, value); } |
||||
} |
||||
|
||||
public bool IsGetter { |
||||
get { return this.GetSemantics (MethodSemanticsAttributes.Getter); } |
||||
set { this.SetSemantics (MethodSemanticsAttributes.Getter, value); } |
||||
} |
||||
|
||||
public bool IsOther { |
||||
get { return this.GetSemantics (MethodSemanticsAttributes.Other); } |
||||
set { this.SetSemantics (MethodSemanticsAttributes.Other, value); } |
||||
} |
||||
|
||||
public bool IsAddOn { |
||||
get { return this.GetSemantics (MethodSemanticsAttributes.AddOn); } |
||||
set { this.SetSemantics (MethodSemanticsAttributes.AddOn, value); } |
||||
} |
||||
|
||||
public bool IsRemoveOn { |
||||
get { return this.GetSemantics (MethodSemanticsAttributes.RemoveOn); } |
||||
set { this.SetSemantics (MethodSemanticsAttributes.RemoveOn, value); } |
||||
} |
||||
|
||||
public bool IsFire { |
||||
get { return this.GetSemantics (MethodSemanticsAttributes.Fire); } |
||||
set { this.SetSemantics (MethodSemanticsAttributes.Fire, value); } |
||||
} |
||||
|
||||
#endregion
|
||||
|
||||
public new TypeDefinition DeclaringType { |
||||
get { return (TypeDefinition) base.DeclaringType; } |
||||
set { base.DeclaringType = value; } |
||||
} |
||||
|
||||
public bool IsConstructor { |
||||
get { |
||||
return this.IsRuntimeSpecialName |
||||
&& this.IsSpecialName |
||||
&& (this.Name == ".cctor" || this.Name == ".ctor"); |
||||
} |
||||
} |
||||
|
||||
public override bool IsDefinition { |
||||
get { return true; } |
||||
} |
||||
|
||||
internal MethodDefinition () |
||||
{ |
||||
this.token = new MetadataToken (TokenType.Method); |
||||
} |
||||
|
||||
public MethodDefinition (string name, MethodAttributes attributes, TypeReference returnType) |
||||
: base (name, returnType) |
||||
{ |
||||
this.attributes = (ushort) attributes; |
||||
this.HasThis = !this.IsStatic; |
||||
this.token = new MetadataToken (TokenType.Method); |
||||
} |
||||
|
||||
public override MethodDefinition Resolve () |
||||
{ |
||||
return this; |
||||
} |
||||
} |
||||
|
||||
static partial class Mixin { |
||||
|
||||
public static ParameterDefinition GetParameter (this MethodBody self, int index) |
||||
{ |
||||
var method = self.method; |
||||
|
||||
if (method.HasThis) { |
||||
if (index == 0) |
||||
return self.ThisParameter; |
||||
|
||||
index--; |
||||
} |
||||
|
||||
var parameters = method.Parameters; |
||||
|
||||
if (index < 0 || index >= parameters.size) |
||||
return null; |
||||
|
||||
return parameters [index]; |
||||
} |
||||
|
||||
public static VariableDefinition GetVariable (this MethodBody self, int index) |
||||
{ |
||||
var variables = self.Variables; |
||||
|
||||
if (index < 0 || index >= variables.size) |
||||
return null; |
||||
|
||||
return variables [index]; |
||||
} |
||||
|
||||
public static bool GetSemantics (this MethodDefinition self, MethodSemanticsAttributes semantics) |
||||
{ |
||||
return (self.SemanticsAttributes & semantics) != 0; |
||||
} |
||||
|
||||
public static void SetSemantics (this MethodDefinition self, MethodSemanticsAttributes semantics, bool value) |
||||
{ |
||||
if (value) |
||||
self.SemanticsAttributes |= semantics; |
||||
else |
||||
self.SemanticsAttributes &= ~semantics; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,54 @@
@@ -0,0 +1,54 @@
|
||||
//
|
||||
// MethodImplAttributes.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
[Flags] |
||||
public enum MethodImplAttributes : ushort { |
||||
CodeTypeMask = 0x0003, |
||||
IL = 0x0000, // Method impl is CIL
|
||||
Native = 0x0001, // Method impl is native
|
||||
OPTIL = 0x0002, // Reserved: shall be zero in conforming implementations
|
||||
Runtime = 0x0003, // Method impl is provided by the runtime
|
||||
|
||||
ManagedMask = 0x0004, // Flags specifying whether the code is managed or unmanaged
|
||||
Unmanaged = 0x0004, // Method impl is unmanaged, otherwise managed
|
||||
Managed = 0x0000, // Method impl is managed
|
||||
|
||||
// Implementation info and interop
|
||||
ForwardRef = 0x0010, // Indicates method is defined; used primarily in merge scenarios
|
||||
PreserveSig = 0x0080, // Reserved: conforming implementations may ignore
|
||||
InternalCall = 0x1000, // Reserved: shall be zero in conforming implementations
|
||||
Synchronized = 0x0020, // Method is single threaded through the body
|
||||
NoOptimization = 0x0040, // Method is not optimized by the JIT.
|
||||
NoInlining = 0x0008, // Method may not be inlined
|
||||
MaxMethodImplVal = 0xffff // Range check value
|
||||
} |
||||
} |
@ -0,0 +1,214 @@
@@ -0,0 +1,214 @@
|
||||
//
|
||||
// MethodReference.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Text; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public class MethodReference : MemberReference, IMethodSignature, IGenericParameterProvider, IGenericContext { |
||||
|
||||
internal ParameterDefinitionCollection parameters; |
||||
MethodReturnType return_type; |
||||
|
||||
bool has_this; |
||||
bool explicit_this; |
||||
MethodCallingConvention calling_convention; |
||||
internal Collection<GenericParameter> generic_parameters; |
||||
|
||||
public virtual bool HasThis { |
||||
get { return has_this; } |
||||
set { has_this = value; } |
||||
} |
||||
|
||||
public virtual bool ExplicitThis { |
||||
get { return explicit_this; } |
||||
set { explicit_this = value; } |
||||
} |
||||
|
||||
public virtual MethodCallingConvention CallingConvention { |
||||
get { return calling_convention; } |
||||
set { calling_convention = value; } |
||||
} |
||||
|
||||
public virtual bool HasParameters { |
||||
get { return !parameters.IsNullOrEmpty (); } |
||||
} |
||||
|
||||
public virtual Collection<ParameterDefinition> Parameters { |
||||
get { |
||||
if (parameters == null) |
||||
parameters = new ParameterDefinitionCollection (this); |
||||
|
||||
return parameters; |
||||
} |
||||
} |
||||
|
||||
IGenericParameterProvider IGenericContext.Type { |
||||
get { |
||||
var declaring_type = this.DeclaringType; |
||||
var instance = declaring_type as GenericInstanceType; |
||||
if (instance != null) |
||||
return instance.ElementType; |
||||
|
||||
return declaring_type; |
||||
} |
||||
} |
||||
|
||||
IGenericParameterProvider IGenericContext.Method { |
||||
get { return this; } |
||||
} |
||||
|
||||
GenericParameterType IGenericParameterProvider.GenericParameterType { |
||||
get { return GenericParameterType.Method; } |
||||
} |
||||
|
||||
public virtual bool HasGenericParameters { |
||||
get { return !generic_parameters.IsNullOrEmpty (); } |
||||
} |
||||
|
||||
public virtual Collection<GenericParameter> GenericParameters { |
||||
get { |
||||
if (generic_parameters != null) |
||||
return generic_parameters; |
||||
|
||||
return generic_parameters = new Collection<GenericParameter> (); |
||||
} |
||||
} |
||||
|
||||
public TypeReference ReturnType { |
||||
get { |
||||
var return_type = MethodReturnType; |
||||
return return_type != null ? return_type.ReturnType : null; |
||||
} |
||||
set { |
||||
var return_type = MethodReturnType; |
||||
if (return_type != null) |
||||
return_type.ReturnType = value; |
||||
} |
||||
} |
||||
|
||||
public virtual MethodReturnType MethodReturnType { |
||||
get { return return_type; } |
||||
set { return_type = value; } |
||||
} |
||||
|
||||
public override string FullName { |
||||
get { |
||||
var builder = new StringBuilder (); |
||||
builder.Append (ReturnType.FullName) |
||||
.Append (" ") |
||||
.Append (MemberFullName ()); |
||||
this.MethodSignatureFullName (builder); |
||||
return builder.ToString (); |
||||
} |
||||
} |
||||
|
||||
public virtual bool IsGenericInstance { |
||||
get { return false; } |
||||
} |
||||
|
||||
internal override bool ContainsGenericParameter { |
||||
get { |
||||
if (this.ReturnType.ContainsGenericParameter || base.ContainsGenericParameter) |
||||
return true; |
||||
|
||||
var parameters = this.Parameters; |
||||
|
||||
for (int i = 0; i < parameters.Count; i++) |
||||
if (parameters [i].ParameterType.ContainsGenericParameter) |
||||
return true; |
||||
|
||||
return false; |
||||
} |
||||
} |
||||
|
||||
internal MethodReference () |
||||
{ |
||||
this.return_type = new MethodReturnType (this); |
||||
this.token = new MetadataToken (TokenType.MemberRef); |
||||
} |
||||
|
||||
public MethodReference (string name, TypeReference returnType) |
||||
: base (name) |
||||
{ |
||||
if (returnType == null) |
||||
throw new ArgumentNullException ("returnType"); |
||||
|
||||
this.return_type = new MethodReturnType (this); |
||||
this.return_type.ReturnType = returnType; |
||||
this.token = new MetadataToken (TokenType.MemberRef); |
||||
} |
||||
|
||||
public MethodReference (string name, TypeReference returnType, TypeReference declaringType) |
||||
: this (name, returnType) |
||||
{ |
||||
if (declaringType == null) |
||||
throw new ArgumentNullException ("declaringType"); |
||||
|
||||
this.DeclaringType = declaringType; |
||||
} |
||||
|
||||
public virtual MethodReference GetElementMethod () |
||||
{ |
||||
return this; |
||||
} |
||||
|
||||
public virtual MethodDefinition Resolve () |
||||
{ |
||||
var module = this.Module; |
||||
if (module == null) |
||||
throw new NotSupportedException (); |
||||
|
||||
return module.Resolve (this); |
||||
} |
||||
} |
||||
|
||||
static partial class Mixin { |
||||
|
||||
public static bool IsVarArg (this IMethodSignature self) |
||||
{ |
||||
return (self.CallingConvention & MethodCallingConvention.VarArg) != 0; |
||||
} |
||||
|
||||
public static int GetSentinelPosition (this IMethodSignature self) |
||||
{ |
||||
if (!self.HasParameters) |
||||
return -1; |
||||
|
||||
var parameters = self.Parameters; |
||||
for (int i = 0; i < parameters.Count; i++) |
||||
if (parameters [i].ParameterType.IsSentinel) |
||||
return i; |
||||
|
||||
return -1; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,100 @@
@@ -0,0 +1,100 @@
|
||||
//
|
||||
// MethodReturnType.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public sealed class MethodReturnType : IConstantProvider, ICustomAttributeProvider, IMarshalInfoProvider { |
||||
|
||||
internal IMethodSignature method; |
||||
internal ParameterDefinition parameter; |
||||
TypeReference return_type; |
||||
|
||||
public IMethodSignature Method { |
||||
get { return method; } |
||||
} |
||||
|
||||
public TypeReference ReturnType { |
||||
get { return return_type; } |
||||
set { return_type = value; } |
||||
} |
||||
|
||||
internal ParameterDefinition Parameter { |
||||
get { return parameter ?? (parameter = new ParameterDefinition (return_type)); } |
||||
set { parameter = value; } |
||||
} |
||||
|
||||
public MetadataToken MetadataToken { |
||||
get { return Parameter.MetadataToken; } |
||||
set { Parameter.MetadataToken = value; } |
||||
} |
||||
|
||||
public bool HasCustomAttributes { |
||||
get { return parameter != null && parameter.HasCustomAttributes; } |
||||
} |
||||
|
||||
public Collection<CustomAttribute> CustomAttributes { |
||||
get { return Parameter.CustomAttributes; } |
||||
} |
||||
|
||||
public bool HasDefault { |
||||
get { return parameter != null && parameter.HasDefault; } |
||||
set { Parameter.HasDefault = value; } |
||||
} |
||||
|
||||
public bool HasConstant { |
||||
get { return parameter != null && parameter.HasConstant; } |
||||
set { Parameter.HasConstant = value; } |
||||
} |
||||
|
||||
public object Constant { |
||||
get { return Parameter.Constant; } |
||||
set { Parameter.Constant = value; } |
||||
} |
||||
|
||||
public bool HasFieldMarshal { |
||||
get { return parameter != null && parameter.HasFieldMarshal; } |
||||
set { Parameter.HasFieldMarshal = value; } |
||||
} |
||||
|
||||
public bool HasMarshalInfo { |
||||
get { return parameter != null && parameter.HasMarshalInfo; } |
||||
} |
||||
|
||||
public MarshalInfo MarshalInfo { |
||||
get { return Parameter.MarshalInfo; } |
||||
set { Parameter.MarshalInfo = value; } |
||||
} |
||||
|
||||
public MethodReturnType (IMethodSignature method) |
||||
{ |
||||
this.method = method; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,43 @@
@@ -0,0 +1,43 @@
|
||||
//
|
||||
// MethodSemanticsattributes.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
[Flags] |
||||
public enum MethodSemanticsAttributes : ushort { |
||||
None = 0x0000, |
||||
Setter = 0x0001, // Setter for property
|
||||
Getter = 0x0002, // Getter for property
|
||||
Other = 0x0004, // Other method for property or event
|
||||
AddOn = 0x0008, // AddOn method for event
|
||||
RemoveOn = 0x0010, // RemoveOn method for event
|
||||
Fire = 0x0020 // Fire method for event
|
||||
} |
||||
} |
@ -0,0 +1,103 @@
@@ -0,0 +1,103 @@
|
||||
//
|
||||
// MethodSpecification.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public abstract class MethodSpecification : MethodReference { |
||||
|
||||
readonly MethodReference method; |
||||
|
||||
public MethodReference ElementMethod { |
||||
get { return method; } |
||||
} |
||||
|
||||
public override string Name { |
||||
get { return method.Name; } |
||||
set { throw new InvalidOperationException (); } |
||||
} |
||||
|
||||
public override MethodCallingConvention CallingConvention { |
||||
get { return method.CallingConvention; } |
||||
set { throw new InvalidOperationException (); } |
||||
} |
||||
|
||||
public override bool HasThis { |
||||
get { return method.HasThis; } |
||||
set { throw new InvalidOperationException (); } |
||||
} |
||||
|
||||
public override bool ExplicitThis { |
||||
get { return method.ExplicitThis; } |
||||
set { throw new InvalidOperationException (); } |
||||
} |
||||
|
||||
public override MethodReturnType MethodReturnType { |
||||
get { return method.MethodReturnType; } |
||||
set { throw new InvalidOperationException (); } |
||||
} |
||||
|
||||
public override TypeReference DeclaringType { |
||||
get { return method.DeclaringType; } |
||||
set { throw new InvalidOperationException (); } |
||||
} |
||||
|
||||
public override ModuleDefinition Module { |
||||
get { return method.Module; } |
||||
} |
||||
|
||||
public override bool HasParameters { |
||||
get { return method.HasParameters; } |
||||
} |
||||
|
||||
public override Collection<ParameterDefinition> Parameters { |
||||
get { return method.Parameters; } |
||||
} |
||||
|
||||
internal override bool ContainsGenericParameter { |
||||
get { return method.ContainsGenericParameter; } |
||||
} |
||||
|
||||
internal MethodSpecification (MethodReference method) |
||||
{ |
||||
if (method == null) |
||||
throw new ArgumentNullException ("method"); |
||||
|
||||
this.method = method; |
||||
this.token = new MetadataToken (TokenType.MethodSpec); |
||||
} |
||||
|
||||
public sealed override MethodReference GetElementMethod () |
||||
{ |
||||
return method.GetElementMethod (); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,137 @@
@@ -0,0 +1,137 @@
|
||||
//
|
||||
// Modifiers.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
using MD = Mono.Cecil.Metadata; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public interface IModifierType { |
||||
TypeReference ModifierType { get; } |
||||
TypeReference ElementType { get; } |
||||
} |
||||
|
||||
public sealed class OptionalModifierType : TypeSpecification, IModifierType { |
||||
|
||||
TypeReference modifier_type; |
||||
|
||||
public TypeReference ModifierType { |
||||
get { return modifier_type; } |
||||
set { modifier_type = value; } |
||||
} |
||||
|
||||
public override string Name { |
||||
get { return base.Name + Suffix; } |
||||
} |
||||
|
||||
public override string FullName { |
||||
get { return base.FullName + Suffix; } |
||||
} |
||||
|
||||
string Suffix { |
||||
get { return " modopt(" + modifier_type + ")"; } |
||||
} |
||||
|
||||
public override bool IsValueType { |
||||
get { return false; } |
||||
set { throw new InvalidOperationException (); } |
||||
} |
||||
|
||||
public override bool IsOptionalModifier { |
||||
get { return true; } |
||||
} |
||||
|
||||
internal override bool ContainsGenericParameter { |
||||
get { return modifier_type.ContainsGenericParameter || base.ContainsGenericParameter; } |
||||
} |
||||
|
||||
public OptionalModifierType (TypeReference modifierType, TypeReference type) |
||||
: base (type) |
||||
{ |
||||
Mixin.CheckModifier (modifierType, type); |
||||
this.modifier_type = modifierType; |
||||
this.etype = MD.ElementType.CModOpt; |
||||
} |
||||
} |
||||
|
||||
public sealed class RequiredModifierType : TypeSpecification, IModifierType { |
||||
|
||||
TypeReference modifier_type; |
||||
|
||||
public TypeReference ModifierType { |
||||
get { return modifier_type; } |
||||
set { modifier_type = value; } |
||||
} |
||||
|
||||
public override string Name { |
||||
get { return base.Name + Suffix; } |
||||
} |
||||
|
||||
public override string FullName { |
||||
get { return base.FullName + Suffix; } |
||||
} |
||||
|
||||
string Suffix { |
||||
get { return " modreq(" + modifier_type + ")"; } |
||||
} |
||||
|
||||
public override bool IsValueType { |
||||
get { return false; } |
||||
set { throw new InvalidOperationException (); } |
||||
} |
||||
|
||||
public override bool IsRequiredModifier { |
||||
get { return true; } |
||||
} |
||||
|
||||
internal override bool ContainsGenericParameter { |
||||
get { return modifier_type.ContainsGenericParameter || base.ContainsGenericParameter; } |
||||
} |
||||
|
||||
public RequiredModifierType (TypeReference modifierType, TypeReference type) |
||||
: base (type) |
||||
{ |
||||
Mixin.CheckModifier (modifierType, type); |
||||
this.modifier_type = modifierType; |
||||
this.etype = MD.ElementType.CModReqD; |
||||
} |
||||
|
||||
} |
||||
|
||||
static partial class Mixin { |
||||
|
||||
public static void CheckModifier (TypeReference modifierType, TypeReference type) |
||||
{ |
||||
if (modifierType == null) |
||||
throw new ArgumentNullException ("modifierType"); |
||||
if (type == null) |
||||
throw new ArgumentNullException ("type"); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,965 @@
@@ -0,0 +1,965 @@
|
||||
//
|
||||
// ModuleDefinition.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
using SR = System.Reflection; |
||||
|
||||
using Mono.Cecil.Cil; |
||||
using Mono.Cecil.Metadata; |
||||
using Mono.Cecil.PE; |
||||
using Mono.Collections.Generic; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public enum ReadingMode { |
||||
Immediate = 1, |
||||
Deferred = 2, |
||||
} |
||||
|
||||
public sealed class ReaderParameters { |
||||
|
||||
ReadingMode reading_mode; |
||||
IAssemblyResolver assembly_resolver; |
||||
Stream symbol_stream; |
||||
ISymbolReaderProvider symbol_reader_provider; |
||||
bool read_symbols; |
||||
|
||||
public ReadingMode ReadingMode { |
||||
get { return reading_mode; } |
||||
set { reading_mode = value; } |
||||
} |
||||
|
||||
public IAssemblyResolver AssemblyResolver { |
||||
get { return assembly_resolver; } |
||||
set { assembly_resolver = value; } |
||||
} |
||||
|
||||
public Stream SymbolStream { |
||||
get { return symbol_stream; } |
||||
set { symbol_stream = value; } |
||||
} |
||||
|
||||
public ISymbolReaderProvider SymbolReaderProvider { |
||||
get { return symbol_reader_provider; } |
||||
set { symbol_reader_provider = value; } |
||||
} |
||||
|
||||
public bool ReadSymbols { |
||||
get { return read_symbols; } |
||||
set { read_symbols = value; } |
||||
} |
||||
|
||||
public ReaderParameters () |
||||
: this (ReadingMode.Deferred) |
||||
{ |
||||
} |
||||
|
||||
public ReaderParameters (ReadingMode readingMode) |
||||
{ |
||||
this.reading_mode = readingMode; |
||||
} |
||||
} |
||||
|
||||
#if !READ_ONLY
|
||||
|
||||
public sealed class ModuleParameters { |
||||
|
||||
ModuleKind kind; |
||||
TargetRuntime runtime; |
||||
TargetArchitecture architecture; |
||||
IAssemblyResolver assembly_resolver; |
||||
|
||||
public ModuleKind Kind { |
||||
get { return kind; } |
||||
set { kind = value; } |
||||
} |
||||
|
||||
public TargetRuntime Runtime { |
||||
get { return runtime; } |
||||
set { runtime = value; } |
||||
} |
||||
|
||||
public TargetArchitecture Architecture { |
||||
get { return architecture; } |
||||
set { architecture = value; } |
||||
} |
||||
|
||||
public IAssemblyResolver AssemblyResolver { |
||||
get { return assembly_resolver; } |
||||
set { assembly_resolver = value; } |
||||
} |
||||
|
||||
public ModuleParameters () |
||||
{ |
||||
this.kind = ModuleKind.Dll; |
||||
this.runtime = GetCurrentRuntime (); |
||||
this.architecture = TargetArchitecture.I386; |
||||
} |
||||
|
||||
static TargetRuntime GetCurrentRuntime () |
||||
{ |
||||
#if !CF
|
||||
return typeof (object).Assembly.ImageRuntimeVersion.ParseRuntime (); |
||||
#else
|
||||
var corlib_version = typeof (object).Assembly.GetName ().Version; |
||||
switch (corlib_version.Major) { |
||||
case 1: |
||||
return corlib_version.Minor == 0 |
||||
? TargetRuntime.Net_1_0 |
||||
: TargetRuntime.Net_1_1; |
||||
case 2: |
||||
return TargetRuntime.Net_2_0; |
||||
case 4: |
||||
return TargetRuntime.Net_4_0; |
||||
default: |
||||
throw new NotSupportedException (); |
||||
} |
||||
#endif
|
||||
} |
||||
} |
||||
|
||||
public sealed class WriterParameters { |
||||
|
||||
Stream symbol_stream; |
||||
ISymbolWriterProvider symbol_writer_provider; |
||||
bool write_symbols; |
||||
#if !SILVERLIGHT && !CF
|
||||
SR.StrongNameKeyPair key_pair; |
||||
#endif
|
||||
public Stream SymbolStream { |
||||
get { return symbol_stream; } |
||||
set { symbol_stream = value; } |
||||
} |
||||
|
||||
public ISymbolWriterProvider SymbolWriterProvider { |
||||
get { return symbol_writer_provider; } |
||||
set { symbol_writer_provider = value; } |
||||
} |
||||
|
||||
public bool WriteSymbols { |
||||
get { return write_symbols; } |
||||
set { write_symbols = value; } |
||||
} |
||||
#if !SILVERLIGHT && !CF
|
||||
public SR.StrongNameKeyPair StrongNameKeyPair { |
||||
get { return key_pair; } |
||||
set { key_pair = value; } |
||||
} |
||||
#endif
|
||||
} |
||||
|
||||
#endif
|
||||
|
||||
public sealed class ModuleDefinition : ModuleReference, ICustomAttributeProvider { |
||||
|
||||
internal Image Image; |
||||
internal MetadataSystem MetadataSystem; |
||||
internal ReadingMode ReadingMode; |
||||
internal ISymbolReaderProvider SymbolReaderProvider; |
||||
internal ISymbolReader SymbolReader; |
||||
|
||||
internal IAssemblyResolver assembly_resolver; |
||||
internal TypeSystem type_system; |
||||
|
||||
readonly MetadataReader reader; |
||||
readonly string fq_name; |
||||
|
||||
internal ModuleKind kind; |
||||
TargetRuntime runtime; |
||||
TargetArchitecture architecture; |
||||
ModuleAttributes attributes; |
||||
Guid mvid; |
||||
|
||||
internal AssemblyDefinition assembly; |
||||
MethodDefinition entry_point; |
||||
|
||||
#if !READ_ONLY
|
||||
MetadataImporter importer; |
||||
#endif
|
||||
Collection<CustomAttribute> custom_attributes; |
||||
Collection<AssemblyNameReference> references; |
||||
Collection<ModuleReference> modules; |
||||
Collection<Resource> resources; |
||||
Collection<ExportedType> exported_types; |
||||
TypeDefinitionCollection types; |
||||
|
||||
public bool IsMain { |
||||
get { return kind != ModuleKind.NetModule; } |
||||
} |
||||
|
||||
public ModuleKind Kind { |
||||
get { return kind; } |
||||
set { kind = value; } |
||||
} |
||||
|
||||
public TargetRuntime Runtime { |
||||
get { return runtime; } |
||||
set { runtime = value; } |
||||
} |
||||
|
||||
public TargetArchitecture Architecture { |
||||
get { return architecture; } |
||||
set { architecture = value; } |
||||
} |
||||
|
||||
public ModuleAttributes Attributes { |
||||
get { return attributes; } |
||||
set { attributes = value; } |
||||
} |
||||
|
||||
public string FullyQualifiedName { |
||||
get { return fq_name; } |
||||
} |
||||
|
||||
public Guid Mvid { |
||||
get { return mvid; } |
||||
set { mvid = value; } |
||||
} |
||||
|
||||
internal bool HasImage { |
||||
get { return Image != null; } |
||||
} |
||||
|
||||
public bool HasSymbols { |
||||
get { return SymbolReader != null; } |
||||
} |
||||
|
||||
public override MetadataScopeType MetadataScopeType { |
||||
get { return MetadataScopeType.ModuleDefinition; } |
||||
} |
||||
|
||||
public AssemblyDefinition Assembly { |
||||
get { return assembly; } |
||||
} |
||||
|
||||
#if !READ_ONLY
|
||||
internal MetadataImporter MetadataImporter { |
||||
get { return importer ?? (importer = new MetadataImporter (this)); } |
||||
} |
||||
#endif
|
||||
|
||||
public IAssemblyResolver AssemblyResolver { |
||||
get { return assembly_resolver; } |
||||
} |
||||
|
||||
public TypeSystem TypeSystem { |
||||
get { return type_system ?? (type_system = TypeSystem.CreateTypeSystem (this)); } |
||||
} |
||||
|
||||
public bool HasAssemblyReferences { |
||||
get { |
||||
if (references != null) |
||||
return references.Count > 0; |
||||
|
||||
return HasImage && Image.HasTable (Table.AssemblyRef); |
||||
} |
||||
} |
||||
|
||||
public Collection<AssemblyNameReference> AssemblyReferences { |
||||
get { |
||||
if (references != null) |
||||
return references; |
||||
|
||||
if (HasImage) |
||||
return references = Read (this, (_, reader) => reader.ReadAssemblyReferences ()); |
||||
|
||||
return references = new Collection<AssemblyNameReference> (); |
||||
} |
||||
} |
||||
|
||||
public bool HasModuleReferences { |
||||
get { |
||||
if (modules != null) |
||||
return modules.Count > 0; |
||||
|
||||
return HasImage && Image.HasTable (Table.ModuleRef); |
||||
} |
||||
} |
||||
|
||||
public Collection<ModuleReference> ModuleReferences { |
||||
get { |
||||
if (modules != null) |
||||
return modules; |
||||
|
||||
if (HasImage) |
||||
return modules = Read (this, (_, reader) => reader.ReadModuleReferences ()); |
||||
|
||||
return modules = new Collection<ModuleReference> (); |
||||
} |
||||
} |
||||
|
||||
public bool HasResources { |
||||
get { |
||||
if (resources != null) |
||||
return resources.Count > 0; |
||||
|
||||
if (HasImage) |
||||
return Image.HasTable (Table.ManifestResource) || Read (this, (_, reader) => reader.HasFileResource ()); |
||||
|
||||
return false; |
||||
} |
||||
} |
||||
|
||||
public Collection<Resource> Resources { |
||||
get { |
||||
if (resources != null) |
||||
return resources; |
||||
|
||||
if (HasImage) |
||||
return resources = Read (this, (_, reader) => reader.ReadResources ()); |
||||
|
||||
return resources = new Collection<Resource> (); |
||||
} |
||||
} |
||||
|
||||
public bool HasCustomAttributes { |
||||
get { |
||||
if (custom_attributes != null) |
||||
return custom_attributes.Count > 0; |
||||
|
||||
return this.GetHasCustomAttributes (this); |
||||
} |
||||
} |
||||
|
||||
public Collection<CustomAttribute> CustomAttributes { |
||||
get { return custom_attributes ?? (custom_attributes = this.GetCustomAttributes (this)); } |
||||
} |
||||
|
||||
public bool HasTypes { |
||||
get { |
||||
if (types != null) |
||||
return types.Count > 0; |
||||
|
||||
return HasImage && Image.HasTable (Table.TypeDef); |
||||
} |
||||
} |
||||
|
||||
public Collection<TypeDefinition> Types { |
||||
get { |
||||
if (types != null) |
||||
return types; |
||||
|
||||
if (HasImage) |
||||
return types = Read (this, (_, reader) => reader.ReadTypes ()); |
||||
|
||||
return types = new TypeDefinitionCollection (this); |
||||
} |
||||
} |
||||
|
||||
public bool HasExportedTypes { |
||||
get { |
||||
if (exported_types != null) |
||||
return exported_types.Count > 0; |
||||
|
||||
return HasImage && Image.HasTable (Table.ExportedType); |
||||
} |
||||
} |
||||
|
||||
public Collection<ExportedType> ExportedTypes { |
||||
get { |
||||
if (exported_types != null) |
||||
return exported_types; |
||||
|
||||
if (HasImage) |
||||
return exported_types = Read (this, (_, reader) => reader.ReadExportedTypes ()); |
||||
|
||||
return exported_types = new Collection<ExportedType> (); |
||||
} |
||||
} |
||||
|
||||
public MethodDefinition EntryPoint { |
||||
get { |
||||
if (entry_point != null) |
||||
return entry_point; |
||||
|
||||
if (HasImage) |
||||
return entry_point = Read (this, (_, reader) => reader.ReadEntryPoint ()); |
||||
|
||||
return entry_point = null; |
||||
} |
||||
set { entry_point = value; } |
||||
} |
||||
|
||||
internal ModuleDefinition () |
||||
{ |
||||
this.MetadataSystem = new MetadataSystem (); |
||||
this.token = new MetadataToken (TokenType.Module, 1); |
||||
this.assembly_resolver = GlobalAssemblyResolver.Instance; |
||||
} |
||||
|
||||
internal ModuleDefinition (Image image) |
||||
: this () |
||||
{ |
||||
this.Image = image; |
||||
this.kind = image.Kind; |
||||
this.runtime = image.Runtime; |
||||
this.architecture = image.Architecture; |
||||
this.attributes = image.Attributes; |
||||
this.fq_name = image.FileName; |
||||
|
||||
this.reader = new MetadataReader (this); |
||||
} |
||||
|
||||
public bool HasTypeReference (string fullName) |
||||
{ |
||||
return HasTypeReference (string.Empty, fullName); |
||||
} |
||||
|
||||
public bool HasTypeReference (string scope, string fullName) |
||||
{ |
||||
CheckFullName (fullName); |
||||
|
||||
if (!HasImage) |
||||
return false; |
||||
|
||||
return Read (this, (_, reader) => reader.GetTypeReference (scope, fullName) != null); |
||||
} |
||||
|
||||
public bool TryGetTypeReference (string fullName, out TypeReference type) |
||||
{ |
||||
return TryGetTypeReference (string.Empty, fullName, out type); |
||||
} |
||||
|
||||
public bool TryGetTypeReference (string scope, string fullName, out TypeReference type) |
||||
{ |
||||
CheckFullName (fullName); |
||||
|
||||
if (!HasImage) { |
||||
type = null; |
||||
return false; |
||||
} |
||||
|
||||
return (type = Read (this, (_, reader) => reader.GetTypeReference (scope, fullName))) != null; |
||||
} |
||||
|
||||
public IEnumerable<TypeReference> GetTypeReferences () |
||||
{ |
||||
if (!HasImage) |
||||
return Empty<TypeReference>.Array; |
||||
|
||||
return Read (this, (_, reader) => reader.GetTypeReferences ()); |
||||
} |
||||
|
||||
public IEnumerable<MemberReference> GetMemberReferences () |
||||
{ |
||||
if (!HasImage) |
||||
return Empty<MemberReference>.Array; |
||||
|
||||
return Read (this, (_, reader) => reader.GetMemberReferences ()); |
||||
} |
||||
|
||||
public TypeDefinition GetType (string fullName) |
||||
{ |
||||
CheckFullName (fullName); |
||||
|
||||
var position = fullName.IndexOf ('/'); |
||||
if (position > 0) |
||||
return GetNestedType (fullName); |
||||
|
||||
return ((TypeDefinitionCollection) this.Types).GetType (fullName); |
||||
} |
||||
|
||||
public TypeDefinition GetType (string @namespace, string name) |
||||
{ |
||||
Mixin.CheckName (name); |
||||
|
||||
return ((TypeDefinitionCollection) this.Types).GetType (@namespace ?? string.Empty, name); |
||||
} |
||||
|
||||
static void CheckFullName (string fullName) |
||||
{ |
||||
if (fullName == null) |
||||
throw new ArgumentNullException ("fullName"); |
||||
if (fullName.Length == 0) |
||||
throw new ArgumentException (); |
||||
} |
||||
|
||||
TypeDefinition GetNestedType (string fullname) |
||||
{ |
||||
var names = fullname.Split ('/'); |
||||
var type = GetType (names [0]); |
||||
|
||||
if (type == null) |
||||
return null; |
||||
|
||||
for (int i = 1; i < names.Length; i++) { |
||||
var nested_type = type.GetNestedType (names [i]); |
||||
if (nested_type == null) |
||||
return null; |
||||
|
||||
type = nested_type; |
||||
} |
||||
|
||||
return type; |
||||
} |
||||
|
||||
internal FieldDefinition Resolve (FieldReference field) |
||||
{ |
||||
return MetadataResolver.Resolve (AssemblyResolver, field); |
||||
} |
||||
|
||||
internal MethodDefinition Resolve (MethodReference method) |
||||
{ |
||||
return MetadataResolver.Resolve (AssemblyResolver, method); |
||||
} |
||||
|
||||
internal TypeDefinition Resolve (TypeReference type) |
||||
{ |
||||
return MetadataResolver.Resolve (AssemblyResolver, type); |
||||
} |
||||
|
||||
#if !READ_ONLY
|
||||
|
||||
static void CheckType (object type) |
||||
{ |
||||
if (type == null) |
||||
throw new ArgumentNullException ("type"); |
||||
} |
||||
|
||||
static void CheckField (object field) |
||||
{ |
||||
if (field == null) |
||||
throw new ArgumentNullException ("field"); |
||||
} |
||||
|
||||
static void CheckMethod (object method) |
||||
{ |
||||
if (method == null) |
||||
throw new ArgumentNullException ("method"); |
||||
} |
||||
|
||||
static void CheckContext (IGenericParameterProvider context, ModuleDefinition module) |
||||
{ |
||||
if (context == null) |
||||
return; |
||||
|
||||
if (context.Module != module) |
||||
throw new ArgumentException (); |
||||
} |
||||
|
||||
#if !CF
|
||||
public TypeReference Import (Type type) |
||||
{ |
||||
CheckType (type); |
||||
|
||||
return MetadataImporter.ImportType (type, null, ImportGenericKind.Definition); |
||||
} |
||||
|
||||
public TypeReference Import (Type type, TypeReference context) |
||||
{ |
||||
return Import (type, (IGenericParameterProvider) context); |
||||
} |
||||
|
||||
public TypeReference Import (Type type, MethodReference context) |
||||
{ |
||||
return Import (type, (IGenericParameterProvider) context); |
||||
} |
||||
|
||||
TypeReference Import (Type type, IGenericParameterProvider context) |
||||
{ |
||||
CheckType (type); |
||||
CheckContext (context, this); |
||||
|
||||
return MetadataImporter.ImportType ( |
||||
type, |
||||
(IGenericContext) context, |
||||
context != null |
||||
? ImportGenericKind.Open |
||||
: ImportGenericKind.Definition); |
||||
} |
||||
|
||||
public FieldReference Import (SR.FieldInfo field) |
||||
{ |
||||
CheckField (field); |
||||
|
||||
return MetadataImporter.ImportField (field, null); |
||||
} |
||||
|
||||
public FieldReference Import (SR.FieldInfo field, TypeReference context) |
||||
{ |
||||
return Import (field, (IGenericParameterProvider) context); |
||||
} |
||||
|
||||
public FieldReference Import (SR.FieldInfo field, MethodReference context) |
||||
{ |
||||
return Import (field, (IGenericParameterProvider) context); |
||||
} |
||||
|
||||
FieldReference Import (SR.FieldInfo field, IGenericParameterProvider context) |
||||
{ |
||||
CheckField (field); |
||||
CheckContext (context, this); |
||||
|
||||
return MetadataImporter.ImportField (field, (IGenericContext) context); |
||||
} |
||||
|
||||
public MethodReference Import (SR.MethodBase method) |
||||
{ |
||||
CheckMethod (method); |
||||
|
||||
return MetadataImporter.ImportMethod (method, null, ImportGenericKind.Definition); |
||||
} |
||||
|
||||
public MethodReference Import (SR.MethodBase method, TypeReference context) |
||||
{ |
||||
return Import (method, (IGenericParameterProvider) context); |
||||
} |
||||
|
||||
public MethodReference Import (SR.MethodBase method, MethodReference context) |
||||
{ |
||||
return Import (method, (IGenericParameterProvider) context); |
||||
} |
||||
|
||||
MethodReference Import (SR.MethodBase method, IGenericParameterProvider context) |
||||
{ |
||||
CheckMethod (method); |
||||
CheckContext (context, this); |
||||
|
||||
return MetadataImporter.ImportMethod (method, |
||||
(IGenericContext) context, |
||||
context != null |
||||
? ImportGenericKind.Open |
||||
: ImportGenericKind.Definition); |
||||
} |
||||
#endif
|
||||
|
||||
public TypeReference Import (TypeReference type) |
||||
{ |
||||
CheckType (type); |
||||
|
||||
if (type.Module == this) |
||||
return type; |
||||
|
||||
return MetadataImporter.ImportType (type, null); |
||||
} |
||||
|
||||
public TypeReference Import (TypeReference type, TypeReference context) |
||||
{ |
||||
return Import (type, (IGenericParameterProvider) context); |
||||
} |
||||
|
||||
public TypeReference Import (TypeReference type, MethodReference context) |
||||
{ |
||||
return Import (type, (IGenericParameterProvider) context); |
||||
} |
||||
|
||||
TypeReference Import (TypeReference type, IGenericParameterProvider context) |
||||
{ |
||||
CheckType (type); |
||||
|
||||
if (type.Module == this) |
||||
return type; |
||||
|
||||
CheckContext (context, this); |
||||
|
||||
return MetadataImporter.ImportType (type, (IGenericContext) context); |
||||
} |
||||
|
||||
public FieldReference Import (FieldReference field) |
||||
{ |
||||
CheckField (field); |
||||
|
||||
if (field.Module == this) |
||||
return field; |
||||
|
||||
return MetadataImporter.ImportField (field, null); |
||||
} |
||||
|
||||
public FieldReference Import (FieldReference field, TypeReference context) |
||||
{ |
||||
return Import (field, (IGenericParameterProvider) context); |
||||
} |
||||
|
||||
public FieldReference Import (FieldReference field, MethodReference context) |
||||
{ |
||||
return Import (field, (IGenericParameterProvider) context); |
||||
} |
||||
|
||||
FieldReference Import (FieldReference field, IGenericParameterProvider context) |
||||
{ |
||||
CheckField (field); |
||||
|
||||
if (field.Module == this) |
||||
return field; |
||||
|
||||
CheckContext (context, this); |
||||
|
||||
return MetadataImporter.ImportField (field, (IGenericContext) context); |
||||
} |
||||
|
||||
public MethodReference Import (MethodReference method) |
||||
{ |
||||
CheckMethod (method); |
||||
|
||||
if (method.Module == this) |
||||
return method; |
||||
|
||||
return MetadataImporter.ImportMethod (method, null); |
||||
} |
||||
|
||||
public MethodReference Import (MethodReference method, TypeReference context) |
||||
{ |
||||
return Import (method, (IGenericParameterProvider) context); |
||||
} |
||||
|
||||
public MethodReference Import (MethodReference method, MethodReference context) |
||||
{ |
||||
return Import (method, (IGenericParameterProvider) context); |
||||
} |
||||
|
||||
MethodReference Import (MethodReference method, IGenericParameterProvider context) |
||||
{ |
||||
CheckMethod (method); |
||||
|
||||
if (method.Module == this) |
||||
return method; |
||||
|
||||
CheckContext (context, this); |
||||
|
||||
return MetadataImporter.ImportMethod (method, (IGenericContext) context); |
||||
} |
||||
|
||||
#endif
|
||||
|
||||
public IMetadataTokenProvider LookupToken (int token) |
||||
{ |
||||
return LookupToken (new MetadataToken ((uint) token)); |
||||
} |
||||
|
||||
public IMetadataTokenProvider LookupToken (MetadataToken token) |
||||
{ |
||||
return Read (this, (_, reader) => reader.LookupToken (token)); |
||||
} |
||||
|
||||
internal TRet Read<TItem, TRet> (TItem item, Func<TItem, MetadataReader, TRet> read) |
||||
{ |
||||
var position = reader.position; |
||||
var context = reader.context; |
||||
|
||||
var ret = read (item, reader); |
||||
|
||||
reader.position = position; |
||||
reader.context = context; |
||||
|
||||
return ret; |
||||
} |
||||
|
||||
void ProcessDebugHeader () |
||||
{ |
||||
if (Image == null || Image.Debug.IsZero) |
||||
return; |
||||
|
||||
byte [] header; |
||||
var directory = Image.GetDebugHeader (out header); |
||||
|
||||
if (!SymbolReader.ProcessDebugHeader (directory, header)) |
||||
throw new InvalidOperationException (); |
||||
} |
||||
|
||||
#if !READ_ONLY
|
||||
|
||||
public static ModuleDefinition CreateModule (string name, ModuleKind kind) |
||||
{ |
||||
return CreateModule (name, new ModuleParameters { Kind = kind }); |
||||
} |
||||
|
||||
public static ModuleDefinition CreateModule (string name, ModuleParameters parameters) |
||||
{ |
||||
Mixin.CheckName (name); |
||||
Mixin.CheckParameters (parameters); |
||||
|
||||
var module = new ModuleDefinition { |
||||
Name = name, |
||||
kind = parameters.Kind, |
||||
runtime = parameters.Runtime, |
||||
architecture = parameters.Architecture, |
||||
mvid = Guid.NewGuid (), |
||||
Attributes = ModuleAttributes.ILOnly, |
||||
}; |
||||
|
||||
if (parameters.AssemblyResolver != null) |
||||
module.assembly_resolver = parameters.AssemblyResolver; |
||||
|
||||
if (parameters.Kind != ModuleKind.NetModule) { |
||||
var assembly = new AssemblyDefinition (); |
||||
module.assembly = assembly; |
||||
module.assembly.Name = new AssemblyNameDefinition (name, new Version (0, 0)); |
||||
assembly.main_module = module; |
||||
} |
||||
|
||||
module.Types.Add (new TypeDefinition (string.Empty, "<Module>", TypeAttributes.NotPublic)); |
||||
|
||||
return module; |
||||
} |
||||
|
||||
#endif
|
||||
|
||||
public void ReadSymbols () |
||||
{ |
||||
if (string.IsNullOrEmpty (fq_name)) |
||||
throw new InvalidOperationException (); |
||||
|
||||
var provider = SymbolProvider.GetPlatformReaderProvider (); |
||||
|
||||
SymbolReader = provider.GetSymbolReader (this, fq_name); |
||||
|
||||
ProcessDebugHeader (); |
||||
} |
||||
|
||||
public void ReadSymbols (ISymbolReader reader) |
||||
{ |
||||
if (reader == null) |
||||
throw new ArgumentNullException ("reader"); |
||||
|
||||
SymbolReader = reader; |
||||
|
||||
ProcessDebugHeader (); |
||||
} |
||||
|
||||
public static ModuleDefinition ReadModule (string fileName) |
||||
{ |
||||
return ReadModule (fileName, new ReaderParameters (ReadingMode.Deferred)); |
||||
} |
||||
|
||||
public static ModuleDefinition ReadModule (Stream stream) |
||||
{ |
||||
return ReadModule (stream, new ReaderParameters (ReadingMode.Deferred)); |
||||
} |
||||
|
||||
public static ModuleDefinition ReadModule (string fileName, ReaderParameters parameters) |
||||
{ |
||||
using (var stream = GetFileStream (fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) { |
||||
return ReadModule (stream, parameters); |
||||
} |
||||
} |
||||
|
||||
static void CheckStream (object stream) |
||||
{ |
||||
if (stream == null) |
||||
throw new ArgumentNullException ("stream"); |
||||
} |
||||
|
||||
public static ModuleDefinition ReadModule (Stream stream, ReaderParameters parameters) |
||||
{ |
||||
CheckStream (stream); |
||||
if (!stream.CanRead || !stream.CanSeek) |
||||
throw new ArgumentException (); |
||||
Mixin.CheckParameters (parameters); |
||||
|
||||
return ModuleReader.CreateModuleFrom ( |
||||
ImageReader.ReadImageFrom (stream), |
||||
parameters); |
||||
} |
||||
|
||||
static Stream GetFileStream (string fileName, FileMode mode, FileAccess access, FileShare share) |
||||
{ |
||||
if (fileName == null) |
||||
throw new ArgumentNullException ("fileName"); |
||||
if (fileName.Length == 0) |
||||
throw new ArgumentException (); |
||||
|
||||
return new FileStream (fileName, mode, access, share); |
||||
} |
||||
|
||||
#if !READ_ONLY
|
||||
|
||||
public void Write (string fileName) |
||||
{ |
||||
Write (fileName, new WriterParameters ()); |
||||
} |
||||
|
||||
public void Write (Stream stream) |
||||
{ |
||||
Write (stream, new WriterParameters ()); |
||||
} |
||||
|
||||
public void Write (string fileName, WriterParameters parameters) |
||||
{ |
||||
using (var stream = GetFileStream (fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) { |
||||
Write (stream, parameters); |
||||
} |
||||
} |
||||
|
||||
public void Write (Stream stream, WriterParameters parameters) |
||||
{ |
||||
CheckStream (stream); |
||||
if (!stream.CanWrite || !stream.CanSeek) |
||||
throw new ArgumentException (); |
||||
Mixin.CheckParameters (parameters); |
||||
|
||||
ModuleWriter.WriteModuleTo (this, stream, parameters); |
||||
} |
||||
|
||||
#endif
|
||||
|
||||
} |
||||
|
||||
static partial class Mixin { |
||||
|
||||
public static void CheckParameters (object parameters) |
||||
{ |
||||
if (parameters == null) |
||||
throw new ArgumentNullException ("parameters"); |
||||
} |
||||
|
||||
public static bool HasImage (this ModuleDefinition self) |
||||
{ |
||||
return self != null && self.HasImage; |
||||
} |
||||
|
||||
public static string GetFullyQualifiedName (this Stream self) |
||||
{ |
||||
#if !SILVERLIGHT
|
||||
var file_stream = self as FileStream; |
||||
if (file_stream == null) |
||||
return string.Empty; |
||||
|
||||
return Path.GetFullPath (file_stream.Name); |
||||
#else
|
||||
return string.Empty; |
||||
#endif
|
||||
} |
||||
|
||||
public static TargetRuntime ParseRuntime (this string self) |
||||
{ |
||||
switch (self [1]) { |
||||
case '1': |
||||
return self [3] == '0' |
||||
? TargetRuntime.Net_1_0 |
||||
: TargetRuntime.Net_1_1; |
||||
case '2': |
||||
return TargetRuntime.Net_2_0; |
||||
case '4': |
||||
default: |
||||
return TargetRuntime.Net_4_0; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
//
|
||||
// ModuleKind.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public enum ModuleKind { |
||||
Dll, |
||||
Console, |
||||
Windows, |
||||
NetModule, |
||||
} |
||||
|
||||
public enum TargetArchitecture { |
||||
I386, |
||||
AMD64, |
||||
IA64, |
||||
} |
||||
|
||||
[Flags] |
||||
public enum ModuleAttributes { |
||||
ILOnly = 1, |
||||
Required32Bit = 2, |
||||
StrongNameSigned = 8, |
||||
} |
||||
} |
@ -0,0 +1,67 @@
@@ -0,0 +1,67 @@
|
||||
//
|
||||
// ModuleReference.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public class ModuleReference : IMetadataScope { |
||||
|
||||
string name; |
||||
|
||||
internal MetadataToken token; |
||||
|
||||
public string Name { |
||||
get { return name; } |
||||
set { name = value; } |
||||
} |
||||
|
||||
public virtual MetadataScopeType MetadataScopeType { |
||||
get { return MetadataScopeType.ModuleReference; } |
||||
} |
||||
|
||||
public MetadataToken MetadataToken { |
||||
get { return token; } |
||||
set { token = value; } |
||||
} |
||||
|
||||
internal ModuleReference () |
||||
{ |
||||
this.token = new MetadataToken (TokenType.ModuleRef); |
||||
} |
||||
|
||||
public ModuleReference (string name) |
||||
: this () |
||||
{ |
||||
this.name = name; |
||||
} |
||||
|
||||
public override string ToString () |
||||
{ |
||||
return name; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
//
|
||||
// NativeType.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
public enum NativeType { |
||||
None = 0x66, |
||||
|
||||
Boolean = 0x02, |
||||
I1 = 0x03, |
||||
U1 = 0x04, |
||||
I2 = 0x05, |
||||
U2 = 0x06, |
||||
I4 = 0x07, |
||||
U4 = 0x08, |
||||
I8 = 0x09, |
||||
U8 = 0x0a, |
||||
R4 = 0x0b, |
||||
R8 = 0x0c, |
||||
LPStr = 0x14, |
||||
Int = 0x1f, |
||||
UInt = 0x20, |
||||
Func = 0x26, |
||||
Array = 0x2a, |
||||
|
||||
// Msft specific
|
||||
Currency = 0x0f, |
||||
BStr = 0x13, |
||||
LPWStr = 0x15, |
||||
LPTStr = 0x16, |
||||
FixedSysString = 0x17, |
||||
IUnknown = 0x19, |
||||
IDispatch = 0x1a, |
||||
Struct = 0x1b, |
||||
IntF = 0x1c, |
||||
SafeArray = 0x1d, |
||||
FixedArray = 0x1e, |
||||
ByValStr = 0x22, |
||||
ANSIBStr = 0x23, |
||||
TBStr = 0x24, |
||||
VariantBool = 0x25, |
||||
ASAny = 0x28, |
||||
LPStruct = 0x2b, |
||||
CustomMarshaler = 0x2c, |
||||
Error = 0x2d, |
||||
Max = 0x50 |
||||
} |
||||
} |
@ -0,0 +1,62 @@
@@ -0,0 +1,62 @@
|
||||
//
|
||||
// PInvokeAttributes.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2010 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
using System; |
||||
|
||||
namespace Mono.Cecil { |
||||
|
||||
[Flags] |
||||
public enum PInvokeAttributes : ushort { |
||||
NoMangle = 0x0001, // PInvoke is to use the member name as specified
|
||||
|
||||
// Character set
|
||||
CharSetMask = 0x0006, |
||||
CharSetNotSpec = 0x0000, |
||||
CharSetAnsi = 0x0002, |
||||
CharSetUnicode = 0x0004, |
||||
CharSetAuto = 0x0006, |
||||
|
||||
SupportsLastError = 0x0040, // Information about target function. Not relevant for fields
|
||||
|
||||
// Calling convetion
|
||||
CallConvMask = 0x0700, |
||||
CallConvWinapi = 0x0100, |
||||
CallConvCdecl = 0x0200, |
||||
CallConvStdCall = 0x0300, |
||||
CallConvThiscall = 0x0400, |
||||
CallConvFastcall = 0x0500, |
||||
|
||||
BestFitMask = 0x0030, |
||||
BestFitEnabled = 0x0010, |
||||
BestFidDisabled = 0x0020, |
||||
|
||||
ThrowOnUnmappableCharMask = 0x3000, |
||||
ThrowOnUnmappableCharEnabled = 0x1000, |
||||
ThrowOnUnmappableCharDisabled = 0x2000, |
||||
} |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue