Add StickGame Assets
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<EnableDefaultItems>false</EnableDefaultItems>
|
||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||
<IsPackable>false</IsPackable>
|
||||
<Configurations>Debug;Release</Configurations>
|
||||
<PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
|
||||
<SignAssembly>true</SignAssembly>
|
||||
<AssemblyOriginatorKeyFile>$(MSBuildThisFileDirectory)\cecil.snk</AssemblyOriginatorKeyFile>
|
||||
<DefineConstants Condition=" '$(TargetFramework)' == 'netstandard2.0' OR '$(TargetFramework)' == 'netcoreapp2.1' ">$(DefineConstants);NET_CORE</DefineConstants>
|
||||
<RootNamespace></RootNamespace>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(TargetFramework)' == 'net40' ">
|
||||
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
|
||||
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies.net40" Version="1.0.0" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
|
||||
</ItemGroup>
|
||||
<ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<CecilOverrides Condition="'$(CecilOverrides)' == ''">$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), Mono.Cecil.overrides))\Mono.Cecil.overrides</CecilOverrides>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(CecilOverrides)" Condition="Exists('$(CecilOverrides)')" />
|
||||
</Project>
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c3a066bef0608d24987201601e20a905
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,21 @@
|
||||
Copyright (c) 2008 - 2015 Jb Evain
|
||||
Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
|
||||
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.
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 65323af257ddec3409ed36503b853604
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 23bfd4374c8423f4ebf6716985b8c720
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,234 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
namespace MonoFN.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,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2619210c5ef352b4aac70d8e5fab7a43
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,663 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using MonoFN.Cecil.PE;
|
||||
using MonoFN.Collections.Generic;
|
||||
using System;
|
||||
|
||||
namespace MonoFN.Cecil.Cil {
|
||||
|
||||
sealed class CodeReader : BinaryStreamReader {
|
||||
|
||||
readonly internal MetadataReader reader;
|
||||
|
||||
int start;
|
||||
|
||||
MethodDefinition method;
|
||||
MethodBody body;
|
||||
|
||||
int Offset {
|
||||
get { return Position - start; }
|
||||
}
|
||||
|
||||
public CodeReader (MetadataReader reader)
|
||||
: base (reader.image.Stream.value)
|
||||
{
|
||||
this.reader = reader;
|
||||
}
|
||||
|
||||
public int MoveTo (MethodDefinition method)
|
||||
{
|
||||
this.method = method;
|
||||
this.reader.context = method;
|
||||
var position = this.Position;
|
||||
this.Position = (int)reader.image.ResolveVirtualAddress ((uint)method.RVA);
|
||||
return position;
|
||||
}
|
||||
|
||||
public void MoveBackTo (int position)
|
||||
{
|
||||
this.reader.context = null;
|
||||
this.Position = position;
|
||||
}
|
||||
|
||||
public MethodBody ReadMethodBody (MethodDefinition method)
|
||||
{
|
||||
var position = MoveTo (method);
|
||||
this.body = new MethodBody (method);
|
||||
|
||||
ReadMethodBody ();
|
||||
|
||||
MoveBackTo (position);
|
||||
return this.body;
|
||||
}
|
||||
|
||||
public int ReadCodeSize (MethodDefinition method)
|
||||
{
|
||||
var position = MoveTo (method);
|
||||
|
||||
var code_size = ReadCodeSize ();
|
||||
|
||||
MoveBackTo (position);
|
||||
return code_size;
|
||||
}
|
||||
|
||||
int ReadCodeSize ()
|
||||
{
|
||||
var flags = ReadByte ();
|
||||
switch (flags & 0x3) {
|
||||
case 0x2: // tiny
|
||||
return flags >> 2;
|
||||
case 0x3: // fat
|
||||
Advance (-1 + 2 + 2); // go back, 2 bytes flags, 2 bytes stack size
|
||||
return (int)ReadUInt32 ();
|
||||
default:
|
||||
throw new InvalidOperationException ();
|
||||
}
|
||||
}
|
||||
|
||||
void ReadMethodBody ()
|
||||
{
|
||||
var flags = ReadByte ();
|
||||
switch (flags & 0x3) {
|
||||
case 0x2: // tiny
|
||||
body.code_size = flags >> 2;
|
||||
body.MaxStackSize = 8;
|
||||
ReadCode ();
|
||||
break;
|
||||
case 0x3: // fat
|
||||
Advance (-1);
|
||||
ReadFatMethod ();
|
||||
break;
|
||||
default:
|
||||
throw new InvalidOperationException ();
|
||||
}
|
||||
|
||||
var symbol_reader = reader.module.symbol_reader;
|
||||
|
||||
if (symbol_reader != null && method.debug_info == null)
|
||||
method.debug_info = symbol_reader.Read (method);
|
||||
|
||||
if (method.debug_info != null)
|
||||
ReadDebugInfo ();
|
||||
}
|
||||
|
||||
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, method);
|
||||
reader.position = position;
|
||||
|
||||
return variables;
|
||||
}
|
||||
|
||||
void ReadCode ()
|
||||
{
|
||||
start = Position;
|
||||
var code_size = body.code_size;
|
||||
|
||||
if (code_size < 0 || Length <= (uint)(code_size + Position))
|
||||
code_size = 0;
|
||||
|
||||
var end = start + code_size;
|
||||
var instructions = body.instructions = new InstructionCollection (method, (code_size + 1) / 2);
|
||||
|
||||
while (Position < end) {
|
||||
var offset = 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 ()
|
||||
{
|
||||
Advance (-1);
|
||||
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 ());
|
||||
break;
|
||||
default:
|
||||
Advance (4);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public MetadataToken ReadToken ()
|
||||
{
|
||||
return new MetadataToken (ReadUInt32 ());
|
||||
}
|
||||
|
||||
void ReadDebugInfo ()
|
||||
{
|
||||
if (method.debug_info.sequence_points != null)
|
||||
ReadSequencePoints ();
|
||||
|
||||
if (method.debug_info.scope != null)
|
||||
ReadScope (method.debug_info.scope);
|
||||
|
||||
if (method.custom_infos != null)
|
||||
ReadCustomDebugInformations (method);
|
||||
}
|
||||
|
||||
void ReadCustomDebugInformations (MethodDefinition method)
|
||||
{
|
||||
var custom_infos = method.custom_infos;
|
||||
|
||||
for (int i = 0; i < custom_infos.Count; i++) {
|
||||
var state_machine_scope = custom_infos [i] as StateMachineScopeDebugInformation;
|
||||
if (state_machine_scope != null)
|
||||
ReadStateMachineScope (state_machine_scope);
|
||||
|
||||
var async_method = custom_infos [i] as AsyncMethodBodyDebugInformation;
|
||||
if (async_method != null)
|
||||
ReadAsyncMethodBody (async_method);
|
||||
}
|
||||
}
|
||||
|
||||
void ReadAsyncMethodBody (AsyncMethodBodyDebugInformation async_method)
|
||||
{
|
||||
if (async_method.catch_handler.Offset > -1)
|
||||
async_method.catch_handler = new InstructionOffset (GetInstruction (async_method.catch_handler.Offset));
|
||||
|
||||
if (!async_method.yields.IsNullOrEmpty ())
|
||||
for (int i = 0; i < async_method.yields.Count; i++)
|
||||
async_method.yields [i] = new InstructionOffset (GetInstruction (async_method.yields [i].Offset));
|
||||
|
||||
if (!async_method.resumes.IsNullOrEmpty ())
|
||||
for (int i = 0; i < async_method.resumes.Count; i++)
|
||||
async_method.resumes [i] = new InstructionOffset (GetInstruction (async_method.resumes [i].Offset));
|
||||
}
|
||||
|
||||
void ReadStateMachineScope (StateMachineScopeDebugInformation state_machine_scope)
|
||||
{
|
||||
if (state_machine_scope.scopes.IsNullOrEmpty ())
|
||||
return;
|
||||
|
||||
foreach (var scope in state_machine_scope.scopes) {
|
||||
scope.start = new InstructionOffset (GetInstruction (scope.start.Offset));
|
||||
|
||||
var end_instruction = GetInstruction (scope.end.Offset);
|
||||
scope.end = end_instruction == null
|
||||
? new InstructionOffset ()
|
||||
: new InstructionOffset (end_instruction);
|
||||
}
|
||||
}
|
||||
|
||||
void ReadSequencePoints ()
|
||||
{
|
||||
var symbol = method.debug_info;
|
||||
|
||||
for (int i = 0; i < symbol.sequence_points.Count; i++) {
|
||||
var sequence_point = symbol.sequence_points [i];
|
||||
var instruction = GetInstruction (sequence_point.Offset);
|
||||
if (instruction != null)
|
||||
sequence_point.offset = new InstructionOffset (instruction);
|
||||
}
|
||||
}
|
||||
|
||||
void ReadScopes (Collection<ScopeDebugInformation> scopes)
|
||||
{
|
||||
for (int i = 0; i < scopes.Count; i++)
|
||||
ReadScope (scopes [i]);
|
||||
}
|
||||
|
||||
void ReadScope (ScopeDebugInformation scope)
|
||||
{
|
||||
var start_instruction = GetInstruction (scope.Start.Offset);
|
||||
if (start_instruction != null)
|
||||
scope.Start = new InstructionOffset (start_instruction);
|
||||
|
||||
var end_instruction = GetInstruction (scope.End.Offset);
|
||||
scope.End = end_instruction != null
|
||||
? new InstructionOffset (end_instruction)
|
||||
: new InstructionOffset ();
|
||||
|
||||
if (!scope.variables.IsNullOrEmpty ()) {
|
||||
for (int i = 0; i < scope.variables.Count; i++) {
|
||||
var variable_info = scope.variables [i];
|
||||
var variable = GetVariable (variable_info.Index);
|
||||
if (variable != null)
|
||||
variable_info.index = new VariableIndex (variable);
|
||||
}
|
||||
}
|
||||
|
||||
if (!scope.scopes.IsNullOrEmpty ())
|
||||
ReadScopes (scope.scopes);
|
||||
}
|
||||
|
||||
public ByteBuffer PatchRawMethodBody (MethodDefinition method, CodeWriter writer, out int code_size, out MetadataToken local_var_token)
|
||||
{
|
||||
var position = MoveTo (method);
|
||||
|
||||
var buffer = new ByteBuffer ();
|
||||
|
||||
var flags = ReadByte ();
|
||||
|
||||
switch (flags & 0x3) {
|
||||
case 0x2: // tiny
|
||||
buffer.WriteByte (flags);
|
||||
local_var_token = MetadataToken.Zero;
|
||||
code_size = flags >> 2;
|
||||
PatchRawCode (buffer, code_size, writer);
|
||||
break;
|
||||
case 0x3: // fat
|
||||
Advance (-1);
|
||||
PatchRawFatMethod (buffer, writer, out code_size, out local_var_token);
|
||||
break;
|
||||
default:
|
||||
throw new NotSupportedException ();
|
||||
}
|
||||
|
||||
MoveBackTo (position);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void PatchRawFatMethod (ByteBuffer buffer, CodeWriter writer, out int code_size, out MetadataToken local_var_token)
|
||||
{
|
||||
var flags = ReadUInt16 ();
|
||||
buffer.WriteUInt16 (flags);
|
||||
buffer.WriteUInt16 (ReadUInt16 ());
|
||||
code_size = ReadInt32 ();
|
||||
buffer.WriteInt32 (code_size);
|
||||
local_var_token = ReadToken ();
|
||||
|
||||
if (local_var_token.RID > 0) {
|
||||
var variables = ReadVariables (local_var_token);
|
||||
buffer.WriteUInt32 (variables != null
|
||||
? writer.GetStandAloneSignature (variables).ToUInt32 ()
|
||||
: 0);
|
||||
} else
|
||||
buffer.WriteUInt32 (0);
|
||||
|
||||
PatchRawCode (buffer, code_size, writer);
|
||||
|
||||
if ((flags & 0x8) != 0)
|
||||
PatchRawSection (buffer, writer.metadata);
|
||||
}
|
||||
|
||||
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 = Position;
|
||||
Align (4);
|
||||
buffer.WriteBytes (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)
|
||||
{
|
||||
Advance (-1);
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 451f6a2407c53554f9a16eeb62d806ce
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,651 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using MonoFN.Cecil.Metadata;
|
||||
using MonoFN.Cecil.PE;
|
||||
using MonoFN.Collections.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using RVA = System.UInt32;
|
||||
|
||||
namespace MonoFN.Cecil.Cil {
|
||||
|
||||
sealed class CodeWriter : ByteBuffer {
|
||||
|
||||
readonly RVA code_base;
|
||||
internal readonly MetadataBuilder metadata;
|
||||
readonly Dictionary<uint, MetadataToken> standalone_signatures;
|
||||
readonly Dictionary<ByteBuffer, RVA> tiny_method_bodies;
|
||||
|
||||
MethodBody body;
|
||||
|
||||
public CodeWriter (MetadataBuilder metadata)
|
||||
: base (0)
|
||||
{
|
||||
this.code_base = metadata.text_map.GetNextRVA (TextSegment.CLIHeader);
|
||||
this.metadata = metadata;
|
||||
this.standalone_signatures = new Dictionary<uint, MetadataToken> ();
|
||||
this.tiny_method_bodies = new Dictionary<ByteBuffer, RVA> (new ByteBufferEqualityComparer ());
|
||||
}
|
||||
|
||||
public RVA WriteMethodBody (MethodDefinition method)
|
||||
{
|
||||
RVA rva;
|
||||
|
||||
if (IsUnresolved (method)) {
|
||||
if (method.rva == 0)
|
||||
return 0;
|
||||
|
||||
rva = WriteUnresolvedMethodBody (method);
|
||||
} else {
|
||||
if (IsEmptyMethodBody (method.Body))
|
||||
return 0;
|
||||
|
||||
rva = WriteResolvedMethodBody (method);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
RVA WriteUnresolvedMethodBody (MethodDefinition method)
|
||||
{
|
||||
var code_reader = metadata.module.reader.code;
|
||||
|
||||
int code_size;
|
||||
MetadataToken local_var_token;
|
||||
var raw_body = code_reader.PatchRawMethodBody (method, this, out code_size, out local_var_token);
|
||||
var fat_header = (raw_body.buffer [0] & 0x3) == 0x3;
|
||||
if (fat_header)
|
||||
Align (4);
|
||||
|
||||
var rva = BeginMethod ();
|
||||
|
||||
if (fat_header || !GetOrMapTinyMethodBody (raw_body, ref rva)) {
|
||||
WriteBytes (raw_body);
|
||||
}
|
||||
|
||||
if (method.debug_info == null)
|
||||
return rva;
|
||||
|
||||
var symbol_writer = metadata.symbol_writer;
|
||||
if (symbol_writer != null) {
|
||||
method.debug_info.code_size = code_size;
|
||||
method.debug_info.local_var_token = local_var_token;
|
||||
symbol_writer.Write (method.debug_info);
|
||||
}
|
||||
|
||||
return rva;
|
||||
}
|
||||
|
||||
RVA WriteResolvedMethodBody (MethodDefinition method)
|
||||
{
|
||||
RVA rva;
|
||||
|
||||
body = method.Body;
|
||||
ComputeHeader ();
|
||||
if (RequiresFatHeader ()) {
|
||||
Align (4);
|
||||
rva = BeginMethod ();
|
||||
WriteFatHeader ();
|
||||
WriteInstructions ();
|
||||
|
||||
if (body.HasExceptionHandlers)
|
||||
WriteExceptionHandlers ();
|
||||
} else {
|
||||
rva = BeginMethod ();
|
||||
WriteByte ((byte)(0x2 | (body.CodeSize << 2))); // tiny
|
||||
WriteInstructions ();
|
||||
|
||||
var start_position = (int)(rva - code_base);
|
||||
var body_size = position - start_position;
|
||||
var body_bytes = new byte [body_size];
|
||||
|
||||
Array.Copy (buffer, start_position, body_bytes, 0, body_size);
|
||||
|
||||
if (GetOrMapTinyMethodBody (new ByteBuffer (body_bytes), ref rva))
|
||||
position = start_position;
|
||||
}
|
||||
|
||||
var symbol_writer = metadata.symbol_writer;
|
||||
if (symbol_writer != null && method.debug_info != null) {
|
||||
method.debug_info.code_size = body.CodeSize;
|
||||
method.debug_info.local_var_token = body.local_var_token;
|
||||
symbol_writer.Write (method.debug_info);
|
||||
}
|
||||
|
||||
return rva;
|
||||
}
|
||||
|
||||
bool GetOrMapTinyMethodBody (ByteBuffer body, ref RVA rva)
|
||||
{
|
||||
RVA existing_rva;
|
||||
if (tiny_method_bodies.TryGetValue (body, out existing_rva)) {
|
||||
rva = existing_rva;
|
||||
return true;
|
||||
}
|
||||
|
||||
tiny_method_bodies.Add (body, rva);
|
||||
return false;
|
||||
}
|
||||
|
||||
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 && !(operand_type == OperandType.InlineBrTarget || operand_type == OperandType.ShortInlineBrTarget)) {
|
||||
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;
|
||||
var offset = target != null ? GetTargetOffset (target) : body.code_size;
|
||||
WriteSByte ((sbyte)(offset - (instruction.Offset + opcode.Size + 1)));
|
||||
break;
|
||||
}
|
||||
case OperandType.InlineBrTarget: {
|
||||
var target = (Instruction)operand;
|
||||
var offset = target != null ? GetTargetOffset (target) : body.code_size;
|
||||
WriteInt32 (offset - (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.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;
|
||||
// pop 'this' argument
|
||||
if (method.HasImplicitThis () && instruction.opcode.Code != Code.Newobj)
|
||||
stack_size--;
|
||||
// pop normal arguments
|
||||
if (method.HasParameters)
|
||||
stack_size -= method.Parameters.Count;
|
||||
// pop function pointer
|
||||
if (instruction.opcode.Code == Code.Calli)
|
||||
stack_size--;
|
||||
// push return value
|
||||
if (method.ReturnType.etype != ElementType.Void || instruction.opcode.Code == Code.Newobj)
|
||||
stack_size++;
|
||||
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.HandlerStart))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool IsFatRange (Instruction start, Instruction end)
|
||||
{
|
||||
if (start == null)
|
||||
throw new ArgumentException ();
|
||||
|
||||
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 (RVA)(code_base + position);
|
||||
}
|
||||
|
||||
void WriteMetadataToken (MetadataToken token)
|
||||
{
|
||||
WriteUInt32 (token.ToUInt32 ());
|
||||
}
|
||||
|
||||
void Align (int align)
|
||||
{
|
||||
align--;
|
||||
WriteBytes (((position + align) & ~align) - position);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 278f89c983a1bc6429c65a1d49dff091
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,123 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
|
||||
namespace MonoFN.Cecil.Cil {
|
||||
|
||||
public enum DocumentType {
|
||||
Other,
|
||||
Text,
|
||||
}
|
||||
|
||||
public enum DocumentHashAlgorithm {
|
||||
None,
|
||||
MD5,
|
||||
SHA1,
|
||||
SHA256,
|
||||
}
|
||||
|
||||
public enum DocumentLanguage {
|
||||
Other,
|
||||
C,
|
||||
Cpp,
|
||||
CSharp,
|
||||
Basic,
|
||||
Java,
|
||||
Cobol,
|
||||
Pascal,
|
||||
Cil,
|
||||
JScript,
|
||||
Smc,
|
||||
MCpp,
|
||||
FSharp,
|
||||
}
|
||||
|
||||
public enum DocumentLanguageVendor {
|
||||
Other,
|
||||
Microsoft,
|
||||
}
|
||||
|
||||
public sealed class Document : DebugInformation {
|
||||
|
||||
string url;
|
||||
|
||||
Guid type;
|
||||
Guid hash_algorithm;
|
||||
Guid language;
|
||||
Guid language_vendor;
|
||||
|
||||
byte [] hash;
|
||||
byte [] embedded_source;
|
||||
|
||||
public string Url {
|
||||
get { return url; }
|
||||
set { url = value; }
|
||||
}
|
||||
|
||||
public DocumentType Type {
|
||||
get { return type.ToType (); }
|
||||
set { type = value.ToGuid (); }
|
||||
}
|
||||
|
||||
public Guid TypeGuid {
|
||||
get { return type; }
|
||||
set { type = value; }
|
||||
}
|
||||
|
||||
public DocumentHashAlgorithm HashAlgorithm {
|
||||
get { return hash_algorithm.ToHashAlgorithm (); }
|
||||
set { hash_algorithm = value.ToGuid (); }
|
||||
}
|
||||
|
||||
public Guid HashAlgorithmGuid {
|
||||
get { return hash_algorithm; }
|
||||
set { hash_algorithm = value; }
|
||||
}
|
||||
|
||||
public DocumentLanguage Language {
|
||||
get { return language.ToLanguage (); }
|
||||
set { language = value.ToGuid (); }
|
||||
}
|
||||
|
||||
public Guid LanguageGuid {
|
||||
get { return language; }
|
||||
set { language = value; }
|
||||
}
|
||||
|
||||
public DocumentLanguageVendor LanguageVendor {
|
||||
get { return language_vendor.ToVendor (); }
|
||||
set { language_vendor = value.ToGuid (); }
|
||||
}
|
||||
|
||||
public Guid LanguageVendorGuid {
|
||||
get { return language_vendor; }
|
||||
set { language_vendor = value; }
|
||||
}
|
||||
|
||||
public byte [] Hash {
|
||||
get { return hash; }
|
||||
set { hash = value; }
|
||||
}
|
||||
|
||||
public byte [] EmbeddedSource {
|
||||
get { return embedded_source; }
|
||||
set { embedded_source = value; }
|
||||
}
|
||||
|
||||
public Document (string url)
|
||||
{
|
||||
this.url = url;
|
||||
this.hash = Empty<byte>.Array;
|
||||
this.embedded_source = Empty<byte>.Array;
|
||||
this.token = new MetadataToken (TokenType.Document);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 86b3083301304a341b6059ea8c29be7a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,71 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
namespace MonoFN.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 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 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,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eb17bcae1a67ec344b65d6ed78ffb704
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,291 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using MonoFN.Collections.Generic;
|
||||
using System;
|
||||
|
||||
namespace MonoFN.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 InsertAfter (int index, Instruction instruction)
|
||||
{
|
||||
if (index < 0 || index >= instructions.Count)
|
||||
throw new ArgumentOutOfRangeException ("index");
|
||||
if (instruction == null)
|
||||
throw new ArgumentNullException ("instruction");
|
||||
|
||||
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 Replace (int index, Instruction instruction)
|
||||
{
|
||||
if (instruction == null)
|
||||
throw new ArgumentNullException ("instruction");
|
||||
|
||||
InsertAfter (index, instruction);
|
||||
RemoveAt (index);
|
||||
}
|
||||
|
||||
public void Remove (Instruction instruction)
|
||||
{
|
||||
if (instruction == null)
|
||||
throw new ArgumentNullException ("instruction");
|
||||
|
||||
if (!instructions.Remove (instruction))
|
||||
throw new ArgumentOutOfRangeException ("instruction");
|
||||
}
|
||||
|
||||
public void RemoveAt (int index)
|
||||
{
|
||||
if (index < 0 || index >= instructions.Count)
|
||||
throw new ArgumentOutOfRangeException ("index");
|
||||
|
||||
instructions.RemoveAt (index);
|
||||
}
|
||||
|
||||
public void Clear ()
|
||||
{
|
||||
instructions.Clear ();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 26902ea42064c624d82727d9ef9a8f5e
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,296 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Text;
|
||||
|
||||
namespace MonoFN.Cecil.Cil {
|
||||
|
||||
public sealed class Instruction {
|
||||
|
||||
internal int offset;
|
||||
internal OpCode opcode;
|
||||
internal object operand;
|
||||
|
||||
internal Instruction previous;
|
||||
internal Instruction next;
|
||||
|
||||
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; }
|
||||
}
|
||||
|
||||
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,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2d1536adbd2ca174abbd624473e722c3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,426 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using MonoFN.Collections.Generic;
|
||||
using System;
|
||||
using System.Threading;
|
||||
|
||||
namespace MonoFN.Cecil.Cil {
|
||||
|
||||
public sealed class MethodBody {
|
||||
|
||||
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;
|
||||
|
||||
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 {
|
||||
if (instructions == null)
|
||||
Interlocked.CompareExchange (ref instructions, new InstructionCollection (method), null);
|
||||
|
||||
return instructions;
|
||||
}
|
||||
}
|
||||
|
||||
public bool HasExceptionHandlers {
|
||||
get { return !exceptions.IsNullOrEmpty (); }
|
||||
}
|
||||
|
||||
public Collection<ExceptionHandler> ExceptionHandlers {
|
||||
get {
|
||||
if (exceptions == null)
|
||||
Interlocked.CompareExchange (ref exceptions, new Collection<ExceptionHandler> (), null);
|
||||
|
||||
return exceptions;
|
||||
}
|
||||
}
|
||||
|
||||
public bool HasVariables {
|
||||
get { return !variables.IsNullOrEmpty (); }
|
||||
}
|
||||
|
||||
public Collection<VariableDefinition> Variables {
|
||||
get {
|
||||
if (variables == null)
|
||||
Interlocked.CompareExchange (ref variables, new VariableDefinitionCollection (this.method), null);
|
||||
|
||||
return variables;
|
||||
}
|
||||
}
|
||||
|
||||
public ParameterDefinition ThisParameter {
|
||||
get {
|
||||
if (method == null || method.DeclaringType == null)
|
||||
throw new NotSupportedException ();
|
||||
|
||||
if (!method.HasThis)
|
||||
return null;
|
||||
|
||||
if (this_parameter == null)
|
||||
Interlocked.CompareExchange (ref this_parameter, CreateThisParameter (method), null);
|
||||
|
||||
return this_parameter;
|
||||
}
|
||||
}
|
||||
|
||||
static ParameterDefinition CreateThisParameter (MethodDefinition method)
|
||||
{
|
||||
var parameter_type = method.DeclaringType as TypeReference;
|
||||
|
||||
if (parameter_type.HasGenericParameters) {
|
||||
var instance = new GenericInstanceType (parameter_type, parameter_type.GenericParameters.Count);
|
||||
for (int i = 0; i < parameter_type.GenericParameters.Count; i++)
|
||||
instance.GenericArguments.Add (parameter_type.GenericParameters [i]);
|
||||
|
||||
parameter_type = instance;
|
||||
|
||||
}
|
||||
|
||||
if (parameter_type.IsValueType || parameter_type.IsPrimitive)
|
||||
parameter_type = new ByReferenceType (parameter_type);
|
||||
|
||||
return new ParameterDefinition (parameter_type, method);
|
||||
}
|
||||
|
||||
public MethodBody (MethodDefinition method)
|
||||
{
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
public ILProcessor GetILProcessor ()
|
||||
{
|
||||
return new ILProcessor (this);
|
||||
}
|
||||
}
|
||||
|
||||
sealed class VariableDefinitionCollection : Collection<VariableDefinition> {
|
||||
|
||||
readonly MethodDefinition method;
|
||||
|
||||
internal VariableDefinitionCollection (MethodDefinition method)
|
||||
{
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
internal VariableDefinitionCollection (MethodDefinition method, int capacity)
|
||||
: base (capacity)
|
||||
{
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
protected override void OnAdd (VariableDefinition item, int index)
|
||||
{
|
||||
item.index = index;
|
||||
}
|
||||
|
||||
protected override void OnInsert (VariableDefinition item, int index)
|
||||
{
|
||||
item.index = index;
|
||||
UpdateVariableIndices (index, 1);
|
||||
}
|
||||
|
||||
protected override void OnSet (VariableDefinition item, int index)
|
||||
{
|
||||
item.index = index;
|
||||
}
|
||||
|
||||
protected override void OnRemove (VariableDefinition item, int index)
|
||||
{
|
||||
UpdateVariableIndices (index + 1, -1, item);
|
||||
item.index = -1;
|
||||
}
|
||||
|
||||
void UpdateVariableIndices (int startIndex, int offset, VariableDefinition variableToRemove = null)
|
||||
{
|
||||
for (int i = startIndex; i < size; i++)
|
||||
items [i].index = i + offset;
|
||||
|
||||
var debug_info = method == null ? null : method.debug_info;
|
||||
if (debug_info == null || debug_info.Scope == null)
|
||||
return;
|
||||
|
||||
foreach (var scope in debug_info.GetScopes ()) {
|
||||
if (!scope.HasVariables)
|
||||
continue;
|
||||
|
||||
var variables = scope.Variables;
|
||||
int variableDebugInfoIndexToRemove = -1;
|
||||
for (int i = 0; i < variables.Count; i++) {
|
||||
var variable = variables [i];
|
||||
|
||||
// If a variable is being removed detect if it has debug info counterpart, if so remove that as well.
|
||||
// Note that the debug info can be either resolved (has direct reference to the VariableDefinition)
|
||||
// or unresolved (has only the number index of the variable) - this needs to handle both cases.
|
||||
if (variableToRemove != null &&
|
||||
((variable.index.IsResolved && variable.index.ResolvedVariable == variableToRemove) ||
|
||||
(!variable.index.IsResolved && variable.Index == variableToRemove.Index))) {
|
||||
variableDebugInfoIndexToRemove = i;
|
||||
continue;
|
||||
}
|
||||
|
||||
// For unresolved debug info updates indeces to keep them pointing to the same variable.
|
||||
if (!variable.index.IsResolved && variable.Index >= startIndex) {
|
||||
variable.index = new VariableIndex (variable.Index + offset);
|
||||
}
|
||||
}
|
||||
|
||||
if (variableDebugInfoIndexToRemove >= 0)
|
||||
variables.RemoveAt (variableDebugInfoIndexToRemove);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class InstructionCollection : Collection<Instruction> {
|
||||
|
||||
readonly MethodDefinition method;
|
||||
|
||||
internal InstructionCollection (MethodDefinition method)
|
||||
{
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
internal InstructionCollection (MethodDefinition method, int capacity)
|
||||
: base (capacity)
|
||||
{
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
int startOffset = 0;
|
||||
if (size != 0) {
|
||||
var current = items [index];
|
||||
if (current == null) {
|
||||
var last = items [index - 1];
|
||||
last.next = item;
|
||||
item.previous = last;
|
||||
return;
|
||||
}
|
||||
|
||||
startOffset = current.Offset;
|
||||
|
||||
var previous = current.previous;
|
||||
if (previous != null) {
|
||||
previous.next = item;
|
||||
item.previous = previous;
|
||||
}
|
||||
|
||||
current.previous = item;
|
||||
item.next = current;
|
||||
}
|
||||
|
||||
UpdateLocalScopes (null, null);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
UpdateLocalScopes (item, current);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
RemoveSequencePoint (item);
|
||||
UpdateLocalScopes (item, next ?? previous);
|
||||
|
||||
item.previous = null;
|
||||
item.next = null;
|
||||
}
|
||||
|
||||
void RemoveSequencePoint (Instruction instruction)
|
||||
{
|
||||
var debug_info = method.debug_info;
|
||||
if (debug_info == null || !debug_info.HasSequencePoints)
|
||||
return;
|
||||
|
||||
var sequence_points = debug_info.sequence_points;
|
||||
for (int i = 0; i < sequence_points.Count; i++) {
|
||||
if (sequence_points [i].Offset == instruction.offset) {
|
||||
sequence_points.RemoveAt (i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateLocalScopes (Instruction removedInstruction, Instruction existingInstruction)
|
||||
{
|
||||
var debug_info = method.debug_info;
|
||||
if (debug_info == null)
|
||||
return;
|
||||
|
||||
// Local scopes store start/end pair of "instruction offsets". Instruction offset can be either resolved, in which case it
|
||||
// has a reference to Instruction, or unresolved in which case it stores numerical offset (instruction offset in the body).
|
||||
// Typically local scopes loaded from PE/PDB files will be resolved, but it's not a requirement.
|
||||
// Each instruction has its own offset, which is populated on load, but never updated (this would be pretty expensive to do).
|
||||
// Instructions created during the editting will typically have offset 0 (so incorrect).
|
||||
// Local scopes created during editing will also likely be resolved (so no numerical offsets).
|
||||
// So while local scopes which are unresolved are relatively rare if they appear, manipulating them based
|
||||
// on the offsets allone is pretty hard (since we can't rely on correct offsets of instructions).
|
||||
// On the other hand resolved local scopes are easy to maintain, since they point to instructions and thus inserting
|
||||
// instructions is basically a no-op and removing instructions is as easy as changing the pointer.
|
||||
// For this reason the algorithm here is:
|
||||
// - First make sure that all instruction offsets are resolved - if not - resolve them
|
||||
// - First time this will be relatively expensinve as it will walk the entire method body to convert offsets to instruction pointers
|
||||
// Almost all local scopes are stored in the "right" order (sequentially per start offsets), so the code uses a simple one-item
|
||||
// cache instruction<->offset to avoid walking instructions multiple times (that would only happen for scopes which are out of order).
|
||||
// - Subsequent calls should be cheap as it will only walk all local scopes without doing anything
|
||||
// - If there was an edit on local scope which makes some of them unresolved, the cost is proportional
|
||||
// - Then update as necessary by manipulaitng instruction references alone
|
||||
|
||||
InstructionOffsetCache cache = new InstructionOffsetCache () {
|
||||
Offset = 0,
|
||||
Index = 0,
|
||||
Instruction = items [0]
|
||||
};
|
||||
|
||||
UpdateLocalScope (debug_info.Scope, removedInstruction, existingInstruction, ref cache);
|
||||
}
|
||||
|
||||
void UpdateLocalScope (ScopeDebugInformation scope, Instruction removedInstruction, Instruction existingInstruction, ref InstructionOffsetCache cache)
|
||||
{
|
||||
if (scope == null)
|
||||
return;
|
||||
|
||||
if (!scope.Start.IsResolved)
|
||||
scope.Start = ResolveInstructionOffset (scope.Start, ref cache);
|
||||
|
||||
if (!scope.Start.IsEndOfMethod && scope.Start.ResolvedInstruction == removedInstruction)
|
||||
scope.Start = new InstructionOffset (existingInstruction);
|
||||
|
||||
if (scope.HasScopes) {
|
||||
foreach (var subScope in scope.Scopes)
|
||||
UpdateLocalScope (subScope, removedInstruction, existingInstruction, ref cache);
|
||||
}
|
||||
|
||||
if (!scope.End.IsResolved)
|
||||
scope.End = ResolveInstructionOffset (scope.End, ref cache);
|
||||
|
||||
if (!scope.End.IsEndOfMethod && scope.End.ResolvedInstruction == removedInstruction)
|
||||
scope.End = new InstructionOffset (existingInstruction);
|
||||
}
|
||||
|
||||
struct InstructionOffsetCache {
|
||||
public int Offset;
|
||||
public int Index;
|
||||
public Instruction Instruction;
|
||||
}
|
||||
|
||||
InstructionOffset ResolveInstructionOffset (InstructionOffset inputOffset, ref InstructionOffsetCache cache)
|
||||
{
|
||||
if (inputOffset.IsResolved)
|
||||
return inputOffset;
|
||||
|
||||
int offset = inputOffset.Offset;
|
||||
|
||||
if (cache.Offset == offset)
|
||||
return new InstructionOffset (cache.Instruction);
|
||||
|
||||
if (cache.Offset > offset) {
|
||||
// This should be rare - we're resolving offset pointing to a place before the current cache position
|
||||
// resolve by walking the instructions from start and don't cache the result.
|
||||
int size = 0;
|
||||
for (int i = 0; i < items.Length; i++) {
|
||||
if (size == offset)
|
||||
return new InstructionOffset (items [i]);
|
||||
|
||||
if (size > offset)
|
||||
return new InstructionOffset (items [i - 1]);
|
||||
|
||||
size += items [i].GetSize ();
|
||||
}
|
||||
|
||||
// Offset is larger than the size of the body - so it points after the end
|
||||
return new InstructionOffset ();
|
||||
} else {
|
||||
// The offset points after the current cache position - so continue counting and update the cache
|
||||
int size = cache.Offset;
|
||||
for (int i = cache.Index; i < items.Length; i++) {
|
||||
cache.Index = i;
|
||||
cache.Offset = size;
|
||||
|
||||
var item = items [i];
|
||||
|
||||
// Allow for trailing null values in the case of
|
||||
// instructions.Size < instructions.Capacity
|
||||
if (item == null)
|
||||
break;
|
||||
|
||||
cache.Instruction = item;
|
||||
|
||||
if (cache.Offset == offset)
|
||||
return new InstructionOffset (cache.Instruction);
|
||||
|
||||
if (cache.Offset > offset)
|
||||
return new InstructionOffset (items [i - 1]);
|
||||
|
||||
size += item.GetSize ();
|
||||
}
|
||||
|
||||
return new InstructionOffset ();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4be4045de2c6a0e428e5910f4e76cfac
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,439 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
|
||||
namespace MonoFN.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 : IEquatable<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 [(int)Code]; }
|
||||
}
|
||||
|
||||
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 op1 == 0xff ? op2 : (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;
|
||||
|
||||
static OpCodeNames ()
|
||||
{
|
||||
var table = new byte [] {
|
||||
3, 110, 111, 112,
|
||||
5, 98, 114, 101, 97, 107,
|
||||
7, 108, 100, 97, 114, 103, 46, 48,
|
||||
7, 108, 100, 97, 114, 103, 46, 49,
|
||||
7, 108, 100, 97, 114, 103, 46, 50,
|
||||
7, 108, 100, 97, 114, 103, 46, 51,
|
||||
7, 108, 100, 108, 111, 99, 46, 48,
|
||||
7, 108, 100, 108, 111, 99, 46, 49,
|
||||
7, 108, 100, 108, 111, 99, 46, 50,
|
||||
7, 108, 100, 108, 111, 99, 46, 51,
|
||||
7, 115, 116, 108, 111, 99, 46, 48,
|
||||
7, 115, 116, 108, 111, 99, 46, 49,
|
||||
7, 115, 116, 108, 111, 99, 46, 50,
|
||||
7, 115, 116, 108, 111, 99, 46, 51,
|
||||
7, 108, 100, 97, 114, 103, 46, 115,
|
||||
8, 108, 100, 97, 114, 103, 97, 46, 115,
|
||||
7, 115, 116, 97, 114, 103, 46, 115,
|
||||
7, 108, 100, 108, 111, 99, 46, 115,
|
||||
8, 108, 100, 108, 111, 99, 97, 46, 115,
|
||||
7, 115, 116, 108, 111, 99, 46, 115,
|
||||
6, 108, 100, 110, 117, 108, 108,
|
||||
9, 108, 100, 99, 46, 105, 52, 46, 109, 49,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 48,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 49,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 50,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 51,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 52,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 53,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 54,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 55,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 56,
|
||||
8, 108, 100, 99, 46, 105, 52, 46, 115,
|
||||
6, 108, 100, 99, 46, 105, 52,
|
||||
6, 108, 100, 99, 46, 105, 56,
|
||||
6, 108, 100, 99, 46, 114, 52,
|
||||
6, 108, 100, 99, 46, 114, 56,
|
||||
3, 100, 117, 112,
|
||||
3, 112, 111, 112,
|
||||
3, 106, 109, 112,
|
||||
4, 99, 97, 108, 108,
|
||||
5, 99, 97, 108, 108, 105,
|
||||
3, 114, 101, 116,
|
||||
4, 98, 114, 46, 115,
|
||||
9, 98, 114, 102, 97, 108, 115, 101, 46, 115,
|
||||
8, 98, 114, 116, 114, 117, 101, 46, 115,
|
||||
5, 98, 101, 113, 46, 115,
|
||||
5, 98, 103, 101, 46, 115,
|
||||
5, 98, 103, 116, 46, 115,
|
||||
5, 98, 108, 101, 46, 115,
|
||||
5, 98, 108, 116, 46, 115,
|
||||
8, 98, 110, 101, 46, 117, 110, 46, 115,
|
||||
8, 98, 103, 101, 46, 117, 110, 46, 115,
|
||||
8, 98, 103, 116, 46, 117, 110, 46, 115,
|
||||
8, 98, 108, 101, 46, 117, 110, 46, 115,
|
||||
8, 98, 108, 116, 46, 117, 110, 46, 115,
|
||||
2, 98, 114,
|
||||
7, 98, 114, 102, 97, 108, 115, 101,
|
||||
6, 98, 114, 116, 114, 117, 101,
|
||||
3, 98, 101, 113,
|
||||
3, 98, 103, 101,
|
||||
3, 98, 103, 116,
|
||||
3, 98, 108, 101,
|
||||
3, 98, 108, 116,
|
||||
6, 98, 110, 101, 46, 117, 110,
|
||||
6, 98, 103, 101, 46, 117, 110,
|
||||
6, 98, 103, 116, 46, 117, 110,
|
||||
6, 98, 108, 101, 46, 117, 110,
|
||||
6, 98, 108, 116, 46, 117, 110,
|
||||
6, 115, 119, 105, 116, 99, 104,
|
||||
8, 108, 100, 105, 110, 100, 46, 105, 49,
|
||||
8, 108, 100, 105, 110, 100, 46, 117, 49,
|
||||
8, 108, 100, 105, 110, 100, 46, 105, 50,
|
||||
8, 108, 100, 105, 110, 100, 46, 117, 50,
|
||||
8, 108, 100, 105, 110, 100, 46, 105, 52,
|
||||
8, 108, 100, 105, 110, 100, 46, 117, 52,
|
||||
8, 108, 100, 105, 110, 100, 46, 105, 56,
|
||||
7, 108, 100, 105, 110, 100, 46, 105,
|
||||
8, 108, 100, 105, 110, 100, 46, 114, 52,
|
||||
8, 108, 100, 105, 110, 100, 46, 114, 56,
|
||||
9, 108, 100, 105, 110, 100, 46, 114, 101, 102,
|
||||
9, 115, 116, 105, 110, 100, 46, 114, 101, 102,
|
||||
8, 115, 116, 105, 110, 100, 46, 105, 49,
|
||||
8, 115, 116, 105, 110, 100, 46, 105, 50,
|
||||
8, 115, 116, 105, 110, 100, 46, 105, 52,
|
||||
8, 115, 116, 105, 110, 100, 46, 105, 56,
|
||||
8, 115, 116, 105, 110, 100, 46, 114, 52,
|
||||
8, 115, 116, 105, 110, 100, 46, 114, 56,
|
||||
3, 97, 100, 100,
|
||||
3, 115, 117, 98,
|
||||
3, 109, 117, 108,
|
||||
3, 100, 105, 118,
|
||||
6, 100, 105, 118, 46, 117, 110,
|
||||
3, 114, 101, 109,
|
||||
6, 114, 101, 109, 46, 117, 110,
|
||||
3, 97, 110, 100,
|
||||
2, 111, 114,
|
||||
3, 120, 111, 114,
|
||||
3, 115, 104, 108,
|
||||
3, 115, 104, 114,
|
||||
6, 115, 104, 114, 46, 117, 110,
|
||||
3, 110, 101, 103,
|
||||
3, 110, 111, 116,
|
||||
7, 99, 111, 110, 118, 46, 105, 49,
|
||||
7, 99, 111, 110, 118, 46, 105, 50,
|
||||
7, 99, 111, 110, 118, 46, 105, 52,
|
||||
7, 99, 111, 110, 118, 46, 105, 56,
|
||||
7, 99, 111, 110, 118, 46, 114, 52,
|
||||
7, 99, 111, 110, 118, 46, 114, 56,
|
||||
7, 99, 111, 110, 118, 46, 117, 52,
|
||||
7, 99, 111, 110, 118, 46, 117, 56,
|
||||
8, 99, 97, 108, 108, 118, 105, 114, 116,
|
||||
5, 99, 112, 111, 98, 106,
|
||||
5, 108, 100, 111, 98, 106,
|
||||
5, 108, 100, 115, 116, 114,
|
||||
6, 110, 101, 119, 111, 98, 106,
|
||||
9, 99, 97, 115, 116, 99, 108, 97, 115, 115,
|
||||
6, 105, 115, 105, 110, 115, 116,
|
||||
9, 99, 111, 110, 118, 46, 114, 46, 117, 110,
|
||||
5, 117, 110, 98, 111, 120,
|
||||
5, 116, 104, 114, 111, 119,
|
||||
5, 108, 100, 102, 108, 100,
|
||||
6, 108, 100, 102, 108, 100, 97,
|
||||
5, 115, 116, 102, 108, 100,
|
||||
6, 108, 100, 115, 102, 108, 100,
|
||||
7, 108, 100, 115, 102, 108, 100, 97,
|
||||
6, 115, 116, 115, 102, 108, 100,
|
||||
5, 115, 116, 111, 98, 106,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 49, 46, 117, 110,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 50, 46, 117, 110,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 52, 46, 117, 110,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 56, 46, 117, 110,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 49, 46, 117, 110,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 50, 46, 117, 110,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 52, 46, 117, 110,
|
||||
14, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 56, 46, 117, 110,
|
||||
13, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 46, 117, 110,
|
||||
13, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 46, 117, 110,
|
||||
3, 98, 111, 120,
|
||||
6, 110, 101, 119, 97, 114, 114,
|
||||
5, 108, 100, 108, 101, 110,
|
||||
7, 108, 100, 101, 108, 101, 109, 97,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 105, 49,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 117, 49,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 105, 50,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 117, 50,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 105, 52,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 117, 52,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 105, 56,
|
||||
8, 108, 100, 101, 108, 101, 109, 46, 105,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 114, 52,
|
||||
9, 108, 100, 101, 108, 101, 109, 46, 114, 56,
|
||||
10, 108, 100, 101, 108, 101, 109, 46, 114, 101, 102,
|
||||
8, 115, 116, 101, 108, 101, 109, 46, 105,
|
||||
9, 115, 116, 101, 108, 101, 109, 46, 105, 49,
|
||||
9, 115, 116, 101, 108, 101, 109, 46, 105, 50,
|
||||
9, 115, 116, 101, 108, 101, 109, 46, 105, 52,
|
||||
9, 115, 116, 101, 108, 101, 109, 46, 105, 56,
|
||||
9, 115, 116, 101, 108, 101, 109, 46, 114, 52,
|
||||
9, 115, 116, 101, 108, 101, 109, 46, 114, 56,
|
||||
10, 115, 116, 101, 108, 101, 109, 46, 114, 101, 102,
|
||||
10, 108, 100, 101, 108, 101, 109, 46, 97, 110, 121,
|
||||
10, 115, 116, 101, 108, 101, 109, 46, 97, 110, 121,
|
||||
9, 117, 110, 98, 111, 120, 46, 97, 110, 121,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 49,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 49,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 50,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 50,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 52,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 52,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105, 56,
|
||||
11, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117, 56,
|
||||
9, 114, 101, 102, 97, 110, 121, 118, 97, 108,
|
||||
8, 99, 107, 102, 105, 110, 105, 116, 101,
|
||||
8, 109, 107, 114, 101, 102, 97, 110, 121,
|
||||
7, 108, 100, 116, 111, 107, 101, 110,
|
||||
7, 99, 111, 110, 118, 46, 117, 50,
|
||||
7, 99, 111, 110, 118, 46, 117, 49,
|
||||
6, 99, 111, 110, 118, 46, 105,
|
||||
10, 99, 111, 110, 118, 46, 111, 118, 102, 46, 105,
|
||||
10, 99, 111, 110, 118, 46, 111, 118, 102, 46, 117,
|
||||
7, 97, 100, 100, 46, 111, 118, 102,
|
||||
10, 97, 100, 100, 46, 111, 118, 102, 46, 117, 110,
|
||||
7, 109, 117, 108, 46, 111, 118, 102,
|
||||
10, 109, 117, 108, 46, 111, 118, 102, 46, 117, 110,
|
||||
7, 115, 117, 98, 46, 111, 118, 102,
|
||||
10, 115, 117, 98, 46, 111, 118, 102, 46, 117, 110,
|
||||
10, 101, 110, 100, 102, 105, 110, 97, 108, 108, 121,
|
||||
5, 108, 101, 97, 118, 101,
|
||||
7, 108, 101, 97, 118, 101, 46, 115,
|
||||
7, 115, 116, 105, 110, 100, 46, 105,
|
||||
6, 99, 111, 110, 118, 46, 117,
|
||||
7, 97, 114, 103, 108, 105, 115, 116,
|
||||
3, 99, 101, 113,
|
||||
3, 99, 103, 116,
|
||||
6, 99, 103, 116, 46, 117, 110,
|
||||
3, 99, 108, 116,
|
||||
6, 99, 108, 116, 46, 117, 110,
|
||||
5, 108, 100, 102, 116, 110,
|
||||
9, 108, 100, 118, 105, 114, 116, 102, 116, 110,
|
||||
5, 108, 100, 97, 114, 103,
|
||||
6, 108, 100, 97, 114, 103, 97,
|
||||
5, 115, 116, 97, 114, 103,
|
||||
5, 108, 100, 108, 111, 99,
|
||||
6, 108, 100, 108, 111, 99, 97,
|
||||
5, 115, 116, 108, 111, 99,
|
||||
8, 108, 111, 99, 97, 108, 108, 111, 99,
|
||||
9, 101, 110, 100, 102, 105, 108, 116, 101, 114,
|
||||
10, 117, 110, 97, 108, 105, 103, 110, 101, 100, 46,
|
||||
9, 118, 111, 108, 97, 116, 105, 108, 101, 46,
|
||||
5, 116, 97, 105, 108, 46,
|
||||
7, 105, 110, 105, 116, 111, 98, 106,
|
||||
12, 99, 111, 110, 115, 116, 114, 97, 105, 110, 101, 100, 46,
|
||||
5, 99, 112, 98, 108, 107,
|
||||
7, 105, 110, 105, 116, 98, 108, 107,
|
||||
3, 110, 111, 46,
|
||||
7, 114, 101, 116, 104, 114, 111, 119,
|
||||
6, 115, 105, 122, 101, 111, 102,
|
||||
10, 114, 101, 102, 97, 110, 121, 116, 121, 112, 101,
|
||||
9, 114, 101, 97, 100, 111, 110, 108, 121, 46,
|
||||
};
|
||||
|
||||
names = new string [219];
|
||||
|
||||
for (int i = 0, p = 0; i < names.Length; i++) {
|
||||
var buffer = new char [table [p++]];
|
||||
|
||||
for (int j = 0; j < buffer.Length; j++)
|
||||
buffer [j] = (char)table [p++];
|
||||
|
||||
names [i] = new string (buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5d8b234c106529441912c10b87502175
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,894 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
namespace MonoFN.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,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 52c19a62321778c438d2f6b483f18e73
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,591 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using MonoFN.Cecil.Metadata;
|
||||
using MonoFN.Cecil.PE;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
|
||||
namespace MonoFN.Cecil.Cil {
|
||||
|
||||
public sealed class PortablePdbReaderProvider : ISymbolReaderProvider {
|
||||
|
||||
public ISymbolReader GetSymbolReader (ModuleDefinition module, string fileName)
|
||||
{
|
||||
Mixin.CheckModule (module);
|
||||
Mixin.CheckFileName (fileName);
|
||||
|
||||
var file = File.OpenRead (Mixin.GetPdbFileName (fileName));
|
||||
return GetSymbolReader (module, Disposable.Owned (file as Stream), file.Name);
|
||||
}
|
||||
|
||||
public ISymbolReader GetSymbolReader (ModuleDefinition module, Stream symbolStream)
|
||||
{
|
||||
Mixin.CheckModule (module);
|
||||
Mixin.CheckStream (symbolStream);
|
||||
|
||||
return GetSymbolReader (module, Disposable.NotOwned (symbolStream), symbolStream.GetFileName ());
|
||||
}
|
||||
|
||||
ISymbolReader GetSymbolReader (ModuleDefinition module, Disposable<Stream> symbolStream, string fileName)
|
||||
{
|
||||
return new PortablePdbReader (ImageReader.ReadPortablePdb (symbolStream, fileName), module);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class PortablePdbReader : ISymbolReader {
|
||||
|
||||
readonly Image image;
|
||||
readonly ModuleDefinition module;
|
||||
readonly MetadataReader reader;
|
||||
readonly MetadataReader debug_reader;
|
||||
|
||||
bool IsEmbedded { get { return reader.image == debug_reader.image; } }
|
||||
|
||||
internal PortablePdbReader (Image image, ModuleDefinition module)
|
||||
{
|
||||
this.image = image;
|
||||
this.module = module;
|
||||
this.reader = module.reader;
|
||||
this.debug_reader = new MetadataReader (image, module, this.reader);
|
||||
}
|
||||
|
||||
public ISymbolWriterProvider GetWriterProvider ()
|
||||
{
|
||||
return new PortablePdbWriterProvider ();
|
||||
}
|
||||
|
||||
public bool ProcessDebugHeader (ImageDebugHeader header)
|
||||
{
|
||||
if (image == module.Image)
|
||||
return true;
|
||||
|
||||
foreach (var entry in header.Entries) {
|
||||
if (!IsMatchingEntry (image.PdbHeap, entry))
|
||||
continue;
|
||||
|
||||
ReadModule ();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool IsMatchingEntry (PdbHeap heap, ImageDebugHeaderEntry entry)
|
||||
{
|
||||
if (entry.Directory.Type != ImageDebugType.CodeView)
|
||||
return false;
|
||||
|
||||
var data = entry.Data;
|
||||
|
||||
if (data.Length < 24)
|
||||
return false;
|
||||
|
||||
var magic = ReadInt32 (data, 0);
|
||||
if (magic != 0x53445352)
|
||||
return false;
|
||||
|
||||
var buffer = new byte [16];
|
||||
Buffer.BlockCopy (data, 4, buffer, 0, 16);
|
||||
|
||||
var module_guid = new Guid (buffer);
|
||||
|
||||
Buffer.BlockCopy (heap.Id, 0, buffer, 0, 16);
|
||||
|
||||
var pdb_guid = new Guid (buffer);
|
||||
|
||||
return module_guid == pdb_guid;
|
||||
}
|
||||
|
||||
static int ReadInt32 (byte [] bytes, int start)
|
||||
{
|
||||
return (bytes [start]
|
||||
| (bytes [start + 1] << 8)
|
||||
| (bytes [start + 2] << 16)
|
||||
| (bytes [start + 3] << 24));
|
||||
}
|
||||
|
||||
void ReadModule ()
|
||||
{
|
||||
module.custom_infos = debug_reader.GetCustomDebugInformation (module);
|
||||
}
|
||||
|
||||
public MethodDebugInformation Read (MethodDefinition method)
|
||||
{
|
||||
var info = new MethodDebugInformation (method);
|
||||
ReadSequencePoints (info);
|
||||
ReadScope (info);
|
||||
ReadStateMachineKickOffMethod (info);
|
||||
ReadCustomDebugInformations (info);
|
||||
return info;
|
||||
}
|
||||
|
||||
void ReadSequencePoints (MethodDebugInformation method_info)
|
||||
{
|
||||
method_info.sequence_points = debug_reader.ReadSequencePoints (method_info.method);
|
||||
}
|
||||
|
||||
void ReadScope (MethodDebugInformation method_info)
|
||||
{
|
||||
method_info.scope = debug_reader.ReadScope (method_info.method);
|
||||
}
|
||||
|
||||
void ReadStateMachineKickOffMethod (MethodDebugInformation method_info)
|
||||
{
|
||||
method_info.kickoff_method = debug_reader.ReadStateMachineKickoffMethod (method_info.method);
|
||||
}
|
||||
|
||||
void ReadCustomDebugInformations (MethodDebugInformation info)
|
||||
{
|
||||
info.method.custom_infos = debug_reader.GetCustomDebugInformation (info.method);
|
||||
}
|
||||
|
||||
public void Dispose ()
|
||||
{
|
||||
if (IsEmbedded)
|
||||
return;
|
||||
|
||||
image.Dispose ();
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class EmbeddedPortablePdbReaderProvider : ISymbolReaderProvider {
|
||||
|
||||
public ISymbolReader GetSymbolReader (ModuleDefinition module, string fileName)
|
||||
{
|
||||
Mixin.CheckModule (module);
|
||||
|
||||
var header = module.GetDebugHeader ();
|
||||
var entry = header.GetEmbeddedPortablePdbEntry ();
|
||||
if (entry == null)
|
||||
throw new InvalidOperationException ();
|
||||
|
||||
return new EmbeddedPortablePdbReader (
|
||||
(PortablePdbReader)new PortablePdbReaderProvider ().GetSymbolReader (module, GetPortablePdbStream (entry)));
|
||||
}
|
||||
|
||||
static Stream GetPortablePdbStream (ImageDebugHeaderEntry entry)
|
||||
{
|
||||
var compressed_stream = new MemoryStream (entry.Data);
|
||||
var reader = new BinaryStreamReader (compressed_stream);
|
||||
reader.ReadInt32 (); // signature
|
||||
var length = reader.ReadInt32 ();
|
||||
var decompressed_stream = new MemoryStream (length);
|
||||
|
||||
using (var deflate_stream = new DeflateStream (compressed_stream, CompressionMode.Decompress, leaveOpen: true))
|
||||
deflate_stream.CopyTo (decompressed_stream);
|
||||
|
||||
return decompressed_stream;
|
||||
}
|
||||
|
||||
public ISymbolReader GetSymbolReader (ModuleDefinition module, Stream symbolStream)
|
||||
{
|
||||
throw new NotSupportedException ();
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class EmbeddedPortablePdbReader : ISymbolReader {
|
||||
private readonly PortablePdbReader reader;
|
||||
|
||||
internal EmbeddedPortablePdbReader (PortablePdbReader reader)
|
||||
{
|
||||
if (reader == null)
|
||||
throw new ArgumentNullException ();
|
||||
|
||||
this.reader = reader;
|
||||
}
|
||||
|
||||
public ISymbolWriterProvider GetWriterProvider ()
|
||||
{
|
||||
return new EmbeddedPortablePdbWriterProvider ();
|
||||
}
|
||||
|
||||
public bool ProcessDebugHeader (ImageDebugHeader header)
|
||||
{
|
||||
return reader.ProcessDebugHeader (header);
|
||||
}
|
||||
|
||||
public MethodDebugInformation Read (MethodDefinition method)
|
||||
{
|
||||
return reader.Read (method);
|
||||
}
|
||||
|
||||
public void Dispose ()
|
||||
{
|
||||
reader.Dispose ();
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class PortablePdbWriterProvider : ISymbolWriterProvider {
|
||||
public ISymbolWriter GetSymbolWriter (ModuleDefinition module, string fileName)
|
||||
{
|
||||
Mixin.CheckModule (module);
|
||||
Mixin.CheckFileName (fileName);
|
||||
|
||||
var file = File.OpenWrite (Mixin.GetPdbFileName (fileName));
|
||||
return GetSymbolWriter (module, Disposable.Owned (file as Stream));
|
||||
}
|
||||
|
||||
public ISymbolWriter GetSymbolWriter (ModuleDefinition module, Stream symbolStream)
|
||||
{
|
||||
Mixin.CheckModule (module);
|
||||
Mixin.CheckStream (symbolStream);
|
||||
|
||||
return GetSymbolWriter (module, Disposable.NotOwned (symbolStream));
|
||||
}
|
||||
|
||||
ISymbolWriter GetSymbolWriter (ModuleDefinition module, Disposable<Stream> stream)
|
||||
{
|
||||
var metadata = new MetadataBuilder (module, this);
|
||||
var writer = ImageWriter.CreateDebugWriter (module, metadata, stream);
|
||||
|
||||
return new PortablePdbWriter (metadata, module, writer);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class PortablePdbWriter : ISymbolWriter {
|
||||
|
||||
readonly MetadataBuilder pdb_metadata;
|
||||
readonly ModuleDefinition module;
|
||||
readonly ImageWriter writer;
|
||||
|
||||
MetadataBuilder module_metadata;
|
||||
|
||||
bool IsEmbedded { get { return writer == null; } }
|
||||
|
||||
internal PortablePdbWriter (MetadataBuilder pdb_metadata, ModuleDefinition module)
|
||||
{
|
||||
this.pdb_metadata = pdb_metadata;
|
||||
this.module = module;
|
||||
|
||||
this.module_metadata = module.metadata_builder;
|
||||
|
||||
if (module_metadata != pdb_metadata)
|
||||
this.pdb_metadata.metadata_builder = this.module_metadata;
|
||||
|
||||
pdb_metadata.AddCustomDebugInformations (module);
|
||||
}
|
||||
|
||||
internal PortablePdbWriter (MetadataBuilder pdb_metadata, ModuleDefinition module, ImageWriter writer)
|
||||
: this (pdb_metadata, module)
|
||||
{
|
||||
this.writer = writer;
|
||||
}
|
||||
|
||||
public ISymbolReaderProvider GetReaderProvider ()
|
||||
{
|
||||
return new PortablePdbReaderProvider ();
|
||||
}
|
||||
|
||||
public ImageDebugHeader GetDebugHeader ()
|
||||
{
|
||||
if (IsEmbedded)
|
||||
return new ImageDebugHeader ();
|
||||
|
||||
var directory = new ImageDebugDirectory () {
|
||||
MajorVersion = 256,
|
||||
MinorVersion = 20557,
|
||||
Type = ImageDebugType.CodeView,
|
||||
TimeDateStamp = (int)module.timestamp,
|
||||
};
|
||||
|
||||
var buffer = new ByteBuffer ();
|
||||
// RSDS
|
||||
buffer.WriteUInt32 (0x53445352);
|
||||
// Module ID
|
||||
buffer.WriteBytes (module.Mvid.ToByteArray ());
|
||||
// PDB Age
|
||||
buffer.WriteUInt32 (1);
|
||||
// PDB Path
|
||||
var fileName = writer.BaseStream.GetFileName ();
|
||||
if (string.IsNullOrEmpty (fileName)) {
|
||||
fileName = module.Assembly.Name.Name + ".pdb";
|
||||
}
|
||||
buffer.WriteBytes (System.Text.Encoding.UTF8.GetBytes (fileName));
|
||||
buffer.WriteByte (0);
|
||||
|
||||
var data = new byte [buffer.length];
|
||||
Buffer.BlockCopy (buffer.buffer, 0, data, 0, buffer.length);
|
||||
directory.SizeOfData = data.Length;
|
||||
|
||||
return new ImageDebugHeader (new ImageDebugHeaderEntry (directory, data));
|
||||
}
|
||||
|
||||
public void Write (MethodDebugInformation info)
|
||||
{
|
||||
CheckMethodDebugInformationTable ();
|
||||
|
||||
pdb_metadata.AddMethodDebugInformation (info);
|
||||
}
|
||||
|
||||
void CheckMethodDebugInformationTable ()
|
||||
{
|
||||
var mdi = pdb_metadata.table_heap.GetTable<MethodDebugInformationTable> (Table.MethodDebugInformation);
|
||||
if (mdi.length > 0)
|
||||
return;
|
||||
|
||||
// The MethodDebugInformation table has the same length as the Method table
|
||||
mdi.rows = new Row<uint, uint> [module_metadata.method_rid - 1];
|
||||
mdi.length = mdi.rows.Length;
|
||||
}
|
||||
|
||||
public void Dispose ()
|
||||
{
|
||||
if (IsEmbedded)
|
||||
return;
|
||||
|
||||
WritePdbFile ();
|
||||
}
|
||||
|
||||
void WritePdbFile ()
|
||||
{
|
||||
WritePdbHeap ();
|
||||
|
||||
WriteTableHeap ();
|
||||
|
||||
writer.BuildMetadataTextMap ();
|
||||
writer.WriteMetadataHeader ();
|
||||
writer.WriteMetadata ();
|
||||
|
||||
writer.Flush ();
|
||||
writer.stream.Dispose ();
|
||||
}
|
||||
|
||||
void WritePdbHeap ()
|
||||
{
|
||||
var pdb_heap = pdb_metadata.pdb_heap;
|
||||
|
||||
pdb_heap.WriteBytes (module.Mvid.ToByteArray ());
|
||||
pdb_heap.WriteUInt32 (module_metadata.timestamp);
|
||||
|
||||
pdb_heap.WriteUInt32 (module_metadata.entry_point.ToUInt32 ());
|
||||
|
||||
var table_heap = module_metadata.table_heap;
|
||||
var tables = table_heap.tables;
|
||||
|
||||
ulong valid = 0;
|
||||
for (int i = 0; i < tables.Length; i++) {
|
||||
if (tables [i] == null || tables [i].Length == 0)
|
||||
continue;
|
||||
|
||||
valid |= (1UL << i);
|
||||
}
|
||||
|
||||
pdb_heap.WriteUInt64 (valid);
|
||||
|
||||
for (int i = 0; i < tables.Length; i++) {
|
||||
if (tables [i] == null || tables [i].Length == 0)
|
||||
continue;
|
||||
|
||||
pdb_heap.WriteUInt32 ((uint)tables [i].Length);
|
||||
}
|
||||
}
|
||||
|
||||
void WriteTableHeap ()
|
||||
{
|
||||
pdb_metadata.table_heap.string_offsets = pdb_metadata.string_heap.WriteStrings ();
|
||||
pdb_metadata.table_heap.ComputeTableInformations ();
|
||||
pdb_metadata.table_heap.WriteTableHeap ();
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class EmbeddedPortablePdbWriterProvider : ISymbolWriterProvider {
|
||||
|
||||
public ISymbolWriter GetSymbolWriter (ModuleDefinition module, string fileName)
|
||||
{
|
||||
Mixin.CheckModule (module);
|
||||
Mixin.CheckFileName (fileName);
|
||||
|
||||
var stream = new MemoryStream ();
|
||||
var pdb_writer = (PortablePdbWriter)new PortablePdbWriterProvider ().GetSymbolWriter (module, stream);
|
||||
return new EmbeddedPortablePdbWriter (stream, pdb_writer);
|
||||
}
|
||||
|
||||
public ISymbolWriter GetSymbolWriter (ModuleDefinition module, Stream symbolStream)
|
||||
{
|
||||
throw new NotSupportedException ();
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class EmbeddedPortablePdbWriter : ISymbolWriter {
|
||||
|
||||
readonly Stream stream;
|
||||
readonly PortablePdbWriter writer;
|
||||
|
||||
internal EmbeddedPortablePdbWriter (Stream stream, PortablePdbWriter writer)
|
||||
{
|
||||
this.stream = stream;
|
||||
this.writer = writer;
|
||||
}
|
||||
|
||||
public ISymbolReaderProvider GetReaderProvider ()
|
||||
{
|
||||
return new EmbeddedPortablePdbReaderProvider ();
|
||||
}
|
||||
|
||||
public ImageDebugHeader GetDebugHeader ()
|
||||
{
|
||||
writer.Dispose ();
|
||||
|
||||
var directory = new ImageDebugDirectory {
|
||||
Type = ImageDebugType.EmbeddedPortablePdb,
|
||||
MajorVersion = 0x0100,
|
||||
MinorVersion = 0x0100,
|
||||
};
|
||||
|
||||
var data = new MemoryStream ();
|
||||
|
||||
var w = new BinaryStreamWriter (data);
|
||||
w.WriteByte (0x4d);
|
||||
w.WriteByte (0x50);
|
||||
w.WriteByte (0x44);
|
||||
w.WriteByte (0x42);
|
||||
|
||||
w.WriteInt32 ((int)stream.Length);
|
||||
|
||||
stream.Position = 0;
|
||||
|
||||
using (var compress_stream = new DeflateStream (data, CompressionMode.Compress, leaveOpen: true))
|
||||
stream.CopyTo (compress_stream);
|
||||
|
||||
directory.SizeOfData = (int)data.Length;
|
||||
|
||||
return new ImageDebugHeader (new [] {
|
||||
writer.GetDebugHeader ().Entries [0],
|
||||
new ImageDebugHeaderEntry (directory, data.ToArray ())
|
||||
});
|
||||
}
|
||||
|
||||
public void Write (MethodDebugInformation info)
|
||||
{
|
||||
writer.Write (info);
|
||||
}
|
||||
|
||||
public void Dispose ()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
static class PdbGuidMapping {
|
||||
|
||||
static readonly Dictionary<Guid, DocumentLanguage> guid_language = new Dictionary<Guid, DocumentLanguage> ();
|
||||
static readonly Dictionary<DocumentLanguage, Guid> language_guid = new Dictionary<DocumentLanguage, Guid> ();
|
||||
|
||||
static PdbGuidMapping ()
|
||||
{
|
||||
AddMapping (DocumentLanguage.C, new Guid ("63a08714-fc37-11d2-904c-00c04fa302a1"));
|
||||
AddMapping (DocumentLanguage.Cpp, new Guid ("3a12d0b7-c26c-11d0-b442-00a0244a1dd2"));
|
||||
AddMapping (DocumentLanguage.CSharp, new Guid ("3f5162f8-07c6-11d3-9053-00c04fa302a1"));
|
||||
AddMapping (DocumentLanguage.Basic, new Guid ("3a12d0b8-c26c-11d0-b442-00a0244a1dd2"));
|
||||
AddMapping (DocumentLanguage.Java, new Guid ("3a12d0b4-c26c-11d0-b442-00a0244a1dd2"));
|
||||
AddMapping (DocumentLanguage.Cobol, new Guid ("af046cd1-d0e1-11d2-977c-00a0c9b4d50c"));
|
||||
AddMapping (DocumentLanguage.Pascal, new Guid ("af046cd2-d0e1-11d2-977c-00a0c9b4d50c"));
|
||||
AddMapping (DocumentLanguage.Cil, new Guid ("af046cd3-d0e1-11d2-977c-00a0c9b4d50c"));
|
||||
AddMapping (DocumentLanguage.JScript, new Guid ("3a12d0b6-c26c-11d0-b442-00a0244a1dd2"));
|
||||
AddMapping (DocumentLanguage.Smc, new Guid ("0d9b9f7b-6611-11d3-bd2a-0000f80849bd"));
|
||||
AddMapping (DocumentLanguage.MCpp, new Guid ("4b35fde8-07c6-11d3-9053-00c04fa302a1"));
|
||||
AddMapping (DocumentLanguage.FSharp, new Guid ("ab4f38c9-b6e6-43ba-be3b-58080b2ccce3"));
|
||||
}
|
||||
|
||||
static void AddMapping (DocumentLanguage language, Guid guid)
|
||||
{
|
||||
guid_language.Add (guid, language);
|
||||
language_guid.Add (language, guid);
|
||||
}
|
||||
|
||||
static readonly Guid type_text = new Guid ("5a869d0b-6611-11d3-bd2a-0000f80849bd");
|
||||
|
||||
public static DocumentType ToType (this Guid guid)
|
||||
{
|
||||
if (guid == type_text)
|
||||
return DocumentType.Text;
|
||||
|
||||
return DocumentType.Other;
|
||||
}
|
||||
|
||||
public static Guid ToGuid (this DocumentType type)
|
||||
{
|
||||
if (type == DocumentType.Text)
|
||||
return type_text;
|
||||
|
||||
return new Guid ();
|
||||
}
|
||||
|
||||
static readonly Guid hash_md5 = new Guid ("406ea660-64cf-4c82-b6f0-42d48172a799");
|
||||
static readonly Guid hash_sha1 = new Guid ("ff1816ec-aa5e-4d10-87f7-6f4963833460");
|
||||
static readonly Guid hash_sha256 = new Guid ("8829d00f-11b8-4213-878b-770e8597ac16");
|
||||
|
||||
public static DocumentHashAlgorithm ToHashAlgorithm (this Guid guid)
|
||||
{
|
||||
if (guid == hash_md5)
|
||||
return DocumentHashAlgorithm.MD5;
|
||||
|
||||
if (guid == hash_sha1)
|
||||
return DocumentHashAlgorithm.SHA1;
|
||||
|
||||
if (guid == hash_sha256)
|
||||
return DocumentHashAlgorithm.SHA256;
|
||||
|
||||
return DocumentHashAlgorithm.None;
|
||||
}
|
||||
|
||||
public static Guid ToGuid (this DocumentHashAlgorithm hash_algo)
|
||||
{
|
||||
if (hash_algo == DocumentHashAlgorithm.MD5)
|
||||
return hash_md5;
|
||||
|
||||
if (hash_algo == DocumentHashAlgorithm.SHA1)
|
||||
return hash_sha1;
|
||||
|
||||
if (hash_algo == DocumentHashAlgorithm.SHA256)
|
||||
return hash_sha256;
|
||||
|
||||
return new Guid ();
|
||||
}
|
||||
|
||||
public static DocumentLanguage ToLanguage (this Guid guid)
|
||||
{
|
||||
DocumentLanguage language;
|
||||
if (!guid_language.TryGetValue (guid, out language))
|
||||
return DocumentLanguage.Other;
|
||||
|
||||
return language;
|
||||
}
|
||||
|
||||
public static Guid ToGuid (this DocumentLanguage language)
|
||||
{
|
||||
Guid guid;
|
||||
if (!language_guid.TryGetValue (language, out guid))
|
||||
return new Guid ();
|
||||
|
||||
return guid;
|
||||
}
|
||||
|
||||
static readonly Guid vendor_ms = new Guid ("994b45c4-e6e9-11d2-903f-00c04fa302a1");
|
||||
|
||||
public static DocumentLanguageVendor ToVendor (this Guid guid)
|
||||
{
|
||||
if (guid == vendor_ms)
|
||||
return DocumentLanguageVendor.Microsoft;
|
||||
|
||||
return DocumentLanguageVendor.Other;
|
||||
}
|
||||
|
||||
public static Guid ToGuid (this DocumentLanguageVendor vendor)
|
||||
{
|
||||
if (vendor == DocumentLanguageVendor.Microsoft)
|
||||
return vendor_ms;
|
||||
|
||||
return new Guid ();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 34e2f5d4b9b9ea542bec15f2d9acc3ed
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,76 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
|
||||
namespace MonoFN.Cecil.Cil {
|
||||
|
||||
public sealed class SequencePoint {
|
||||
|
||||
internal InstructionOffset offset;
|
||||
Document document;
|
||||
|
||||
int start_line;
|
||||
int start_column;
|
||||
int end_line;
|
||||
int end_column;
|
||||
|
||||
public int Offset {
|
||||
get { return offset.Offset; }
|
||||
}
|
||||
|
||||
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 bool IsHidden {
|
||||
get { return start_line == 0xfeefee && start_line == end_line; }
|
||||
}
|
||||
|
||||
public Document Document {
|
||||
get { return document; }
|
||||
set { document = value; }
|
||||
}
|
||||
|
||||
internal SequencePoint (int offset, Document document)
|
||||
{
|
||||
if (document == null)
|
||||
throw new ArgumentNullException ("document");
|
||||
|
||||
this.offset = new InstructionOffset (offset);
|
||||
this.document = document;
|
||||
}
|
||||
|
||||
public SequencePoint (Instruction instruction, Document document)
|
||||
{
|
||||
if (document == null)
|
||||
throw new ArgumentNullException ("document");
|
||||
|
||||
this.offset = new InstructionOffset (instruction);
|
||||
this.document = document;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 612e6675dca63a84b9e8aaeb3e3b9ec6
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: de9ae158807f471449a81d9b8b3e3c4e
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,29 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
namespace MonoFN.Cecil.Cil {
|
||||
|
||||
public sealed class VariableDefinition : VariableReference {
|
||||
|
||||
public bool IsPinned {
|
||||
get { return variable_type.IsPinned; }
|
||||
}
|
||||
|
||||
public VariableDefinition (TypeReference variableType)
|
||||
: base (variableType)
|
||||
{
|
||||
}
|
||||
|
||||
public override VariableDefinition Resolve ()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1346fa5ba8ac9e8418cc20d2d7d0ad21
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,42 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
namespace MonoFN.Cecil.Cil {
|
||||
|
||||
public abstract class VariableReference {
|
||||
|
||||
internal int index = -1;
|
||||
protected TypeReference variable_type;
|
||||
|
||||
public TypeReference VariableType {
|
||||
get { return variable_type; }
|
||||
set { variable_type = value; }
|
||||
}
|
||||
|
||||
public int Index {
|
||||
get { return index; }
|
||||
}
|
||||
|
||||
internal VariableReference (TypeReference variable_type)
|
||||
{
|
||||
this.variable_type = variable_type;
|
||||
}
|
||||
|
||||
public abstract VariableDefinition Resolve ();
|
||||
|
||||
public override string ToString ()
|
||||
{
|
||||
if (index >= 0)
|
||||
return "V_" + index;
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b5dca1eaac23bfd4ba8e881302a72e33
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cf18653914b5e6f429d4566a7897264c
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,54 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
|
||||
namespace MonoFN.Cecil.Metadata {
|
||||
|
||||
sealed class BlobHeap : Heap {
|
||||
|
||||
public BlobHeap (byte [] data)
|
||||
: base (data)
|
||||
{
|
||||
}
|
||||
|
||||
public byte [] Read (uint index)
|
||||
{
|
||||
if (index == 0 || index > this.data.Length - 1)
|
||||
return Empty<byte>.Array;
|
||||
|
||||
int position = (int)index;
|
||||
int length = (int)data.ReadCompressedUInt32 (ref position);
|
||||
|
||||
if (length > data.Length - position)
|
||||
return Empty<byte>.Array;
|
||||
|
||||
var buffer = new byte [length];
|
||||
|
||||
Buffer.BlockCopy (data, position, buffer, 0, length);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
public void GetView (uint signature, out byte [] buffer, out int index, out int length)
|
||||
{
|
||||
if (signature == 0 || signature > data.Length - 1) {
|
||||
buffer = null;
|
||||
index = length = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
buffer = data;
|
||||
|
||||
index = (int)signature;
|
||||
length = (int)buffer.ReadCompressedUInt32 (ref index);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 33eef67f4a74e1c40a6bdb3da9d22d00
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,499 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using MonoFN.Cecil.PE;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using RVA = System.UInt32;
|
||||
|
||||
namespace MonoFN.Cecil.Metadata {
|
||||
|
||||
sealed class TableHeapBuffer : HeapBuffer {
|
||||
|
||||
readonly ModuleDefinition module;
|
||||
readonly MetadataBuilder metadata;
|
||||
|
||||
readonly internal TableInformation [] table_infos = new TableInformation [Mixin.TableCount];
|
||||
readonly internal MetadataTable [] tables = new MetadataTable [Mixin.TableCount];
|
||||
|
||||
bool large_string;
|
||||
bool large_blob;
|
||||
bool large_guid;
|
||||
|
||||
readonly int [] coded_index_sizes = new int [Mixin.CodedIndexCount];
|
||||
readonly Func<Table, int> counter;
|
||||
|
||||
internal uint [] string_offsets;
|
||||
|
||||
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)
|
||||
{
|
||||
return (int)table_infos [(int)table].Length;
|
||||
}
|
||||
|
||||
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_offsets [@string], large_string);
|
||||
}
|
||||
|
||||
public void WriteBlob (uint blob)
|
||||
{
|
||||
WriteBySize (blob, large_blob);
|
||||
}
|
||||
|
||||
public void WriteGuid (uint guid)
|
||||
{
|
||||
WriteBySize (guid, large_guid);
|
||||
}
|
||||
|
||||
public void WriteRID (uint rid, Table table)
|
||||
{
|
||||
WriteBySize (rid, table_infos [(int)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 (0xc416003301fa00); // 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;
|
||||
}
|
||||
|
||||
public void ComputeTableInformations ()
|
||||
{
|
||||
if (metadata.metadata_builder != null)
|
||||
ComputeTableInformations (metadata.metadata_builder.table_heap);
|
||||
|
||||
ComputeTableInformations (metadata.table_heap);
|
||||
}
|
||||
|
||||
void ComputeTableInformations (TableHeapBuffer table_heap)
|
||||
{
|
||||
var tables = table_heap.tables;
|
||||
for (int i = 0; i < tables.Length; i++) {
|
||||
var table = tables [i];
|
||||
if (table != null && table.Length > 0)
|
||||
table_infos [i].Length = (uint)table.Length;
|
||||
}
|
||||
}
|
||||
|
||||
byte GetHeapSizes ()
|
||||
{
|
||||
byte heap_sizes = 0;
|
||||
|
||||
if (metadata.string_heap.IsLarge) {
|
||||
large_string = true;
|
||||
heap_sizes |= 0x01;
|
||||
}
|
||||
|
||||
if (metadata.guid_heap.IsLarge) {
|
||||
large_guid = true;
|
||||
heap_sizes |= 0x02;
|
||||
}
|
||||
|
||||
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 > 65535; }
|
||||
}
|
||||
|
||||
public abstract bool IsEmpty { get; }
|
||||
|
||||
protected HeapBuffer (int length)
|
||||
: base (length)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
sealed class GuidHeapBuffer : HeapBuffer {
|
||||
|
||||
readonly Dictionary<Guid, uint> guids = new Dictionary<Guid, uint> ();
|
||||
|
||||
public override bool IsEmpty {
|
||||
get { return length == 0; }
|
||||
}
|
||||
|
||||
public GuidHeapBuffer ()
|
||||
: base (16)
|
||||
{
|
||||
}
|
||||
|
||||
public uint GetGuidIndex (Guid guid)
|
||||
{
|
||||
uint index;
|
||||
if (guids.TryGetValue (guid, out index))
|
||||
return index;
|
||||
|
||||
index = (uint)guids.Count + 1;
|
||||
WriteGuid (guid);
|
||||
guids.Add (guid, index);
|
||||
return index;
|
||||
}
|
||||
|
||||
void WriteGuid (Guid guid)
|
||||
{
|
||||
WriteBytes (guid.ToByteArray ());
|
||||
}
|
||||
}
|
||||
|
||||
class StringHeapBuffer : HeapBuffer {
|
||||
|
||||
protected Dictionary<string, uint> strings = new Dictionary<string, uint> (StringComparer.Ordinal);
|
||||
|
||||
public sealed override bool IsEmpty {
|
||||
get { return length <= 1; }
|
||||
}
|
||||
|
||||
public StringHeapBuffer ()
|
||||
: base (1)
|
||||
{
|
||||
WriteByte (0);
|
||||
}
|
||||
|
||||
public virtual uint GetStringIndex (string @string)
|
||||
{
|
||||
uint index;
|
||||
if (strings.TryGetValue (@string, out index))
|
||||
return index;
|
||||
|
||||
index = (uint)strings.Count + 1;
|
||||
strings.Add (@string, index);
|
||||
return index;
|
||||
}
|
||||
|
||||
public uint [] WriteStrings ()
|
||||
{
|
||||
var sorted = SortStrings (strings);
|
||||
strings = null;
|
||||
|
||||
// Add 1 for empty string whose index and offset are both 0
|
||||
var string_offsets = new uint [sorted.Count + 1];
|
||||
string_offsets [0] = 0;
|
||||
|
||||
// Find strings that can be folded
|
||||
var previous = string.Empty;
|
||||
foreach (var entry in sorted) {
|
||||
var @string = entry.Key;
|
||||
var index = entry.Value;
|
||||
var position = base.position;
|
||||
|
||||
if (previous.EndsWith (@string, StringComparison.Ordinal) && !IsLowSurrogateChar (entry.Key [0])) {
|
||||
// Map over the tail of prev string. Watch for null-terminator of prev string.
|
||||
string_offsets [index] = (uint)(position - (Encoding.UTF8.GetByteCount (entry.Key) + 1));
|
||||
} else {
|
||||
string_offsets [index] = (uint)position;
|
||||
WriteString (@string);
|
||||
}
|
||||
|
||||
previous = entry.Key;
|
||||
}
|
||||
|
||||
return string_offsets;
|
||||
}
|
||||
|
||||
static List<KeyValuePair<string, uint>> SortStrings (Dictionary<string, uint> strings)
|
||||
{
|
||||
var sorted = new List<KeyValuePair<string, uint>> (strings);
|
||||
sorted.Sort (new SuffixSort ());
|
||||
return sorted;
|
||||
}
|
||||
|
||||
static bool IsLowSurrogateChar (int c)
|
||||
{
|
||||
return unchecked((uint)(c - 0xDC00)) <= 0xDFFF - 0xDC00;
|
||||
}
|
||||
|
||||
protected virtual void WriteString (string @string)
|
||||
{
|
||||
WriteBytes (Encoding.UTF8.GetBytes (@string));
|
||||
WriteByte (0);
|
||||
}
|
||||
|
||||
// Sorts strings such that a string is followed immediately by all strings
|
||||
// that are a suffix of it.
|
||||
private class SuffixSort : IComparer<KeyValuePair<string, uint>> {
|
||||
|
||||
public int Compare (KeyValuePair<string, uint> xPair, KeyValuePair<string, uint> yPair)
|
||||
{
|
||||
var x = xPair.Key;
|
||||
var y = yPair.Key;
|
||||
|
||||
for (int i = x.Length - 1, j = y.Length - 1; i >= 0 & j >= 0; i--, j--) {
|
||||
if (x [i] < y [j]) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (x [i] > y [j]) {
|
||||
return +1;
|
||||
}
|
||||
}
|
||||
|
||||
return y.Length.CompareTo (x.Length);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 {
|
||||
|
||||
public override 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 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);
|
||||
}
|
||||
}
|
||||
|
||||
sealed class PdbHeapBuffer : HeapBuffer {
|
||||
|
||||
public override bool IsEmpty {
|
||||
get { return false; }
|
||||
}
|
||||
|
||||
public PdbHeapBuffer ()
|
||||
: base (0)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4b1d0a81b66e78341ab77acdd3b15234
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,29 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
namespace MonoFN.Cecil.Metadata {
|
||||
|
||||
enum CodedIndex {
|
||||
TypeDefOrRef,
|
||||
HasConstant,
|
||||
HasCustomAttribute,
|
||||
HasFieldMarshal,
|
||||
HasDeclSecurity,
|
||||
MemberRefParent,
|
||||
HasSemantics,
|
||||
MethodDefOrRef,
|
||||
MemberForwarded,
|
||||
Implementation,
|
||||
CustomAttributeType,
|
||||
ResolutionScope,
|
||||
TypeOrMethodDef,
|
||||
HasCustomDebugInformation,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dd50ffa8272dac444831e33b1b9d7f56
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,55 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
namespace MonoFN.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,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 94c4cb498ef60034d83bb60d3f743832
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,36 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
|
||||
namespace MonoFN.Cecil.Metadata {
|
||||
|
||||
sealed class GuidHeap : Heap {
|
||||
|
||||
public GuidHeap (byte [] data)
|
||||
: base (data)
|
||||
{
|
||||
}
|
||||
|
||||
public Guid Read (uint index)
|
||||
{
|
||||
const int guid_size = 16;
|
||||
|
||||
if (index == 0 || ((index - 1) + guid_size) > data.Length)
|
||||
return new Guid ();
|
||||
|
||||
var buffer = new byte [guid_size];
|
||||
|
||||
Buffer.BlockCopy (this.data, (int)((index - 1) * guid_size), buffer, 0, guid_size);
|
||||
|
||||
return new Guid (buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4bb39ab6484eb114b91a85d4b53f0f28
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,24 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
namespace MonoFN.Cecil.Metadata {
|
||||
|
||||
abstract class Heap {
|
||||
|
||||
public int IndexSize;
|
||||
|
||||
readonly internal byte [] data;
|
||||
|
||||
protected Heap (byte [] data)
|
||||
{
|
||||
this.data = data;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c343466f40d68574499155a2acd05e6b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,94 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
|
||||
namespace MonoFN.Cecil {
|
||||
|
||||
public struct MetadataToken : IEquatable<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 bool Equals (MetadataToken other)
|
||||
{
|
||||
return other.token == 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,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 755d1954236c374458be77d93493faf8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,32 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using RID = System.UInt32;
|
||||
|
||||
namespace MonoFN.Cecil.Metadata {
|
||||
|
||||
sealed class PdbHeap : Heap {
|
||||
|
||||
public byte [] Id;
|
||||
public RID EntryPoint;
|
||||
public long TypeSystemTables;
|
||||
public uint [] TypeSystemTableRows;
|
||||
|
||||
public PdbHeap (byte [] data)
|
||||
: base (data)
|
||||
{
|
||||
}
|
||||
|
||||
public bool HasTable (Table table)
|
||||
{
|
||||
return (TypeSystemTables & (1L << (int)table)) != 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c64dd6e20a2b11c44ad424d29380c14c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,152 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MonoFN.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,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 89fd184bcc2b97840a2c0dfeec671be2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,59 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace MonoFN.Cecil.Metadata {
|
||||
|
||||
class StringHeap : Heap {
|
||||
|
||||
readonly Dictionary<uint, string> strings = new Dictionary<uint, string> ();
|
||||
|
||||
public StringHeap (byte [] data)
|
||||
: base (data)
|
||||
{
|
||||
}
|
||||
|
||||
public string Read (uint index)
|
||||
{
|
||||
if (index == 0)
|
||||
return string.Empty;
|
||||
|
||||
string @string;
|
||||
if (strings.TryGetValue (index, out @string))
|
||||
return @string;
|
||||
|
||||
if (index > data.Length - 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;
|
||||
int start = (int)index;
|
||||
|
||||
for (int i = start; ; i++) {
|
||||
if (data [i] == 0)
|
||||
break;
|
||||
|
||||
length++;
|
||||
}
|
||||
|
||||
return Encoding.UTF8.GetString (data, start, length);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e0fc64863ca825b4e994640b0be9a938
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,101 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
namespace MonoFN.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,
|
||||
EncLog = 0x1e,
|
||||
EncMap = 0x1f,
|
||||
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,
|
||||
|
||||
Document = 0x30,
|
||||
MethodDebugInformation = 0x31,
|
||||
LocalScope = 0x32,
|
||||
LocalVariable = 0x33,
|
||||
LocalConstant = 0x34,
|
||||
ImportScope = 0x35,
|
||||
StateMachineMethod = 0x36,
|
||||
CustomDebugInformation = 0x37,
|
||||
}
|
||||
|
||||
struct TableInformation {
|
||||
public uint Offset;
|
||||
public uint Length;
|
||||
public uint RowSize;
|
||||
|
||||
public bool IsLarge {
|
||||
get { return Length > ushort.MaxValue; }
|
||||
}
|
||||
}
|
||||
|
||||
sealed class TableHeap : Heap {
|
||||
|
||||
public long Valid;
|
||||
public long Sorted;
|
||||
|
||||
public readonly TableInformation [] Tables = new TableInformation [Mixin.TableCount];
|
||||
|
||||
public TableInformation this [Table table] {
|
||||
get { return Tables [(int)table]; }
|
||||
}
|
||||
|
||||
public TableHeap (byte [] data)
|
||||
: base (data)
|
||||
{
|
||||
}
|
||||
|
||||
public bool HasTable (Table table)
|
||||
{
|
||||
return (Valid & (1L << (int)table)) != 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 978b1609b2ddc0c4baf628cc608456a9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,49 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
namespace MonoFN.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,
|
||||
GenericParamConstraint = 0x2c000000,
|
||||
|
||||
Document = 0x30000000,
|
||||
MethodDebugInformation = 0x31000000,
|
||||
LocalScope = 0x32000000,
|
||||
LocalVariable = 0x33000000,
|
||||
LocalConstant = 0x34000000,
|
||||
ImportScope = 0x35000000,
|
||||
StateMachineMethod = 0x36000000,
|
||||
CustomDebugInformation = 0x37000000,
|
||||
|
||||
String = 0x70000000,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dba0af6138c6a084b8787e88b20b142a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,36 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
namespace MonoFN.Cecil.Metadata {
|
||||
|
||||
sealed class UserStringHeap : StringHeap {
|
||||
|
||||
public UserStringHeap (byte [] data)
|
||||
: base (data)
|
||||
{
|
||||
}
|
||||
|
||||
protected override string ReadStringAt (uint index)
|
||||
{
|
||||
int start = (int)index;
|
||||
|
||||
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,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2d89100b382ef8e4ea67917917d04db6
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,649 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using MonoFN.Cecil.Metadata;
|
||||
using System;
|
||||
|
||||
namespace MonoFN.Cecil {
|
||||
|
||||
static partial class Mixin {
|
||||
|
||||
public const int TableCount = 58;
|
||||
public const int CodedIndexCount = 14;
|
||||
|
||||
public static uint ReadCompressedUInt32 (this byte [] data, ref int position)
|
||||
{
|
||||
uint integer;
|
||||
if ((data [position] & 0x80) == 0) {
|
||||
integer = data [position];
|
||||
position++;
|
||||
} else if ((data [position] & 0x40) == 0) {
|
||||
integer = (uint)(data [position] & ~0x80) << 8;
|
||||
integer |= data [position + 1];
|
||||
position += 2;
|
||||
} else {
|
||||
integer = (uint)(data [position] & ~0xc0) << 24;
|
||||
integer |= (uint)data [position + 1] << 16;
|
||||
integer |= (uint)data [position + 2] << 8;
|
||||
integer |= (uint)data [position + 3];
|
||||
position += 4;
|
||||
}
|
||||
return integer;
|
||||
}
|
||||
|
||||
public static MetadataToken GetMetadataToken (this CodedIndex self, uint data)
|
||||
{
|
||||
uint rid;
|
||||
TokenType token_type;
|
||||
switch (self) {
|
||||
case CodedIndex.TypeDefOrRef:
|
||||
rid = data >> 2;
|
||||
switch (data & 3) {
|
||||
case 0:
|
||||
token_type = TokenType.TypeDef; goto ret;
|
||||
case 1:
|
||||
token_type = TokenType.TypeRef; goto ret;
|
||||
case 2:
|
||||
token_type = TokenType.TypeSpec; goto ret;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.HasConstant:
|
||||
rid = data >> 2;
|
||||
switch (data & 3) {
|
||||
case 0:
|
||||
token_type = TokenType.Field; goto ret;
|
||||
case 1:
|
||||
token_type = TokenType.Param; goto ret;
|
||||
case 2:
|
||||
token_type = TokenType.Property; goto ret;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.HasCustomAttribute:
|
||||
rid = data >> 5;
|
||||
switch (data & 31) {
|
||||
case 0:
|
||||
token_type = TokenType.Method; goto ret;
|
||||
case 1:
|
||||
token_type = TokenType.Field; goto ret;
|
||||
case 2:
|
||||
token_type = TokenType.TypeRef; goto ret;
|
||||
case 3:
|
||||
token_type = TokenType.TypeDef; goto ret;
|
||||
case 4:
|
||||
token_type = TokenType.Param; goto ret;
|
||||
case 5:
|
||||
token_type = TokenType.InterfaceImpl; goto ret;
|
||||
case 6:
|
||||
token_type = TokenType.MemberRef; goto ret;
|
||||
case 7:
|
||||
token_type = TokenType.Module; goto ret;
|
||||
case 8:
|
||||
token_type = TokenType.Permission; goto ret;
|
||||
case 9:
|
||||
token_type = TokenType.Property; goto ret;
|
||||
case 10:
|
||||
token_type = TokenType.Event; goto ret;
|
||||
case 11:
|
||||
token_type = TokenType.Signature; goto ret;
|
||||
case 12:
|
||||
token_type = TokenType.ModuleRef; goto ret;
|
||||
case 13:
|
||||
token_type = TokenType.TypeSpec; goto ret;
|
||||
case 14:
|
||||
token_type = TokenType.Assembly; goto ret;
|
||||
case 15:
|
||||
token_type = TokenType.AssemblyRef; goto ret;
|
||||
case 16:
|
||||
token_type = TokenType.File; goto ret;
|
||||
case 17:
|
||||
token_type = TokenType.ExportedType; goto ret;
|
||||
case 18:
|
||||
token_type = TokenType.ManifestResource; goto ret;
|
||||
case 19:
|
||||
token_type = TokenType.GenericParam; goto ret;
|
||||
case 20:
|
||||
token_type = TokenType.GenericParamConstraint; goto ret;
|
||||
case 21:
|
||||
token_type = TokenType.MethodSpec; goto ret;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.HasFieldMarshal:
|
||||
rid = data >> 1;
|
||||
switch (data & 1) {
|
||||
case 0:
|
||||
token_type = TokenType.Field; goto ret;
|
||||
case 1:
|
||||
token_type = TokenType.Param; goto ret;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.HasDeclSecurity:
|
||||
rid = data >> 2;
|
||||
switch (data & 3) {
|
||||
case 0:
|
||||
token_type = TokenType.TypeDef; goto ret;
|
||||
case 1:
|
||||
token_type = TokenType.Method; goto ret;
|
||||
case 2:
|
||||
token_type = TokenType.Assembly; goto ret;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.MemberRefParent:
|
||||
rid = data >> 3;
|
||||
switch (data & 7) {
|
||||
case 0:
|
||||
token_type = TokenType.TypeDef; goto ret;
|
||||
case 1:
|
||||
token_type = TokenType.TypeRef; goto ret;
|
||||
case 2:
|
||||
token_type = TokenType.ModuleRef; goto ret;
|
||||
case 3:
|
||||
token_type = TokenType.Method; goto ret;
|
||||
case 4:
|
||||
token_type = TokenType.TypeSpec; goto ret;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.HasSemantics:
|
||||
rid = data >> 1;
|
||||
switch (data & 1) {
|
||||
case 0:
|
||||
token_type = TokenType.Event; goto ret;
|
||||
case 1:
|
||||
token_type = TokenType.Property; goto ret;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.MethodDefOrRef:
|
||||
rid = data >> 1;
|
||||
switch (data & 1) {
|
||||
case 0:
|
||||
token_type = TokenType.Method; goto ret;
|
||||
case 1:
|
||||
token_type = TokenType.MemberRef; goto ret;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.MemberForwarded:
|
||||
rid = data >> 1;
|
||||
switch (data & 1) {
|
||||
case 0:
|
||||
token_type = TokenType.Field; goto ret;
|
||||
case 1:
|
||||
token_type = TokenType.Method; goto ret;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.Implementation:
|
||||
rid = data >> 2;
|
||||
switch (data & 3) {
|
||||
case 0:
|
||||
token_type = TokenType.File; goto ret;
|
||||
case 1:
|
||||
token_type = TokenType.AssemblyRef; goto ret;
|
||||
case 2:
|
||||
token_type = TokenType.ExportedType; goto ret;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.CustomAttributeType:
|
||||
rid = data >> 3;
|
||||
switch (data & 7) {
|
||||
case 2:
|
||||
token_type = TokenType.Method; goto ret;
|
||||
case 3:
|
||||
token_type = TokenType.MemberRef; goto ret;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.ResolutionScope:
|
||||
rid = data >> 2;
|
||||
switch (data & 3) {
|
||||
case 0:
|
||||
token_type = TokenType.Module; goto ret;
|
||||
case 1:
|
||||
token_type = TokenType.ModuleRef; goto ret;
|
||||
case 2:
|
||||
token_type = TokenType.AssemblyRef; goto ret;
|
||||
case 3:
|
||||
token_type = TokenType.TypeRef; goto ret;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.TypeOrMethodDef:
|
||||
rid = data >> 1;
|
||||
switch (data & 1) {
|
||||
case 0:
|
||||
token_type = TokenType.TypeDef; goto ret;
|
||||
case 1:
|
||||
token_type = TokenType.Method; goto ret;
|
||||
default: goto exit;
|
||||
}
|
||||
case CodedIndex.HasCustomDebugInformation:
|
||||
rid = data >> 5;
|
||||
switch (data & 31) {
|
||||
case 0:
|
||||
token_type = TokenType.Method; goto ret;
|
||||
case 1:
|
||||
token_type = TokenType.Field; goto ret;
|
||||
case 2:
|
||||
token_type = TokenType.TypeRef; goto ret;
|
||||
case 3:
|
||||
token_type = TokenType.TypeDef; goto ret;
|
||||
case 4:
|
||||
token_type = TokenType.Param; goto ret;
|
||||
case 5:
|
||||
token_type = TokenType.InterfaceImpl; goto ret;
|
||||
case 6:
|
||||
token_type = TokenType.MemberRef; goto ret;
|
||||
case 7:
|
||||
token_type = TokenType.Module; goto ret;
|
||||
case 8:
|
||||
token_type = TokenType.Permission; goto ret;
|
||||
case 9:
|
||||
token_type = TokenType.Property; goto ret;
|
||||
case 10:
|
||||
token_type = TokenType.Event; goto ret;
|
||||
case 11:
|
||||
token_type = TokenType.Signature; goto ret;
|
||||
case 12:
|
||||
token_type = TokenType.ModuleRef; goto ret;
|
||||
case 13:
|
||||
token_type = TokenType.TypeSpec; goto ret;
|
||||
case 14:
|
||||
token_type = TokenType.Assembly; goto ret;
|
||||
case 15:
|
||||
token_type = TokenType.AssemblyRef; goto ret;
|
||||
case 16:
|
||||
token_type = TokenType.File; goto ret;
|
||||
case 17:
|
||||
token_type = TokenType.ExportedType; goto ret;
|
||||
case 18:
|
||||
token_type = TokenType.ManifestResource; goto ret;
|
||||
case 19:
|
||||
token_type = TokenType.GenericParam; goto ret;
|
||||
case 20:
|
||||
token_type = TokenType.GenericParamConstraint; goto ret;
|
||||
case 21:
|
||||
token_type = TokenType.MethodSpec; goto ret;
|
||||
case 22:
|
||||
token_type = TokenType.Document; goto ret;
|
||||
case 23:
|
||||
token_type = TokenType.LocalScope; goto ret;
|
||||
case 24:
|
||||
token_type = TokenType.LocalVariable; goto ret;
|
||||
case 25:
|
||||
token_type = TokenType.LocalConstant; goto ret;
|
||||
case 26:
|
||||
token_type = TokenType.ImportScope; goto ret;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
ret:
|
||||
return new MetadataToken (token_type, rid);
|
||||
exit:
|
||||
return MetadataToken.Zero;
|
||||
}
|
||||
|
||||
public static uint CompressMetadataToken (this CodedIndex self, MetadataToken token)
|
||||
{
|
||||
uint ret = 0;
|
||||
if (token.RID == 0)
|
||||
return ret;
|
||||
switch (self) {
|
||||
case CodedIndex.TypeDefOrRef:
|
||||
ret = token.RID << 2;
|
||||
switch (token.TokenType) {
|
||||
case TokenType.TypeDef:
|
||||
return ret | 0;
|
||||
case TokenType.TypeRef:
|
||||
return ret | 1;
|
||||
case TokenType.TypeSpec:
|
||||
return ret | 2;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.HasConstant:
|
||||
ret = token.RID << 2;
|
||||
switch (token.TokenType) {
|
||||
case TokenType.Field:
|
||||
return ret | 0;
|
||||
case TokenType.Param:
|
||||
return ret | 1;
|
||||
case TokenType.Property:
|
||||
return ret | 2;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.HasCustomAttribute:
|
||||
ret = token.RID << 5;
|
||||
switch (token.TokenType) {
|
||||
case TokenType.Method:
|
||||
return ret | 0;
|
||||
case TokenType.Field:
|
||||
return ret | 1;
|
||||
case TokenType.TypeRef:
|
||||
return ret | 2;
|
||||
case TokenType.TypeDef:
|
||||
return ret | 3;
|
||||
case TokenType.Param:
|
||||
return ret | 4;
|
||||
case TokenType.InterfaceImpl:
|
||||
return ret | 5;
|
||||
case TokenType.MemberRef:
|
||||
return ret | 6;
|
||||
case TokenType.Module:
|
||||
return ret | 7;
|
||||
case TokenType.Permission:
|
||||
return ret | 8;
|
||||
case TokenType.Property:
|
||||
return ret | 9;
|
||||
case TokenType.Event:
|
||||
return ret | 10;
|
||||
case TokenType.Signature:
|
||||
return ret | 11;
|
||||
case TokenType.ModuleRef:
|
||||
return ret | 12;
|
||||
case TokenType.TypeSpec:
|
||||
return ret | 13;
|
||||
case TokenType.Assembly:
|
||||
return ret | 14;
|
||||
case TokenType.AssemblyRef:
|
||||
return ret | 15;
|
||||
case TokenType.File:
|
||||
return ret | 16;
|
||||
case TokenType.ExportedType:
|
||||
return ret | 17;
|
||||
case TokenType.ManifestResource:
|
||||
return ret | 18;
|
||||
case TokenType.GenericParam:
|
||||
return ret | 19;
|
||||
case TokenType.GenericParamConstraint:
|
||||
return ret | 20;
|
||||
case TokenType.MethodSpec:
|
||||
return ret | 21;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.HasFieldMarshal:
|
||||
ret = token.RID << 1;
|
||||
switch (token.TokenType) {
|
||||
case TokenType.Field:
|
||||
return ret | 0;
|
||||
case TokenType.Param:
|
||||
return ret | 1;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.HasDeclSecurity:
|
||||
ret = token.RID << 2;
|
||||
switch (token.TokenType) {
|
||||
case TokenType.TypeDef:
|
||||
return ret | 0;
|
||||
case TokenType.Method:
|
||||
return ret | 1;
|
||||
case TokenType.Assembly:
|
||||
return ret | 2;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.MemberRefParent:
|
||||
ret = token.RID << 3;
|
||||
switch (token.TokenType) {
|
||||
case TokenType.TypeDef:
|
||||
return ret | 0;
|
||||
case TokenType.TypeRef:
|
||||
return ret | 1;
|
||||
case TokenType.ModuleRef:
|
||||
return ret | 2;
|
||||
case TokenType.Method:
|
||||
return ret | 3;
|
||||
case TokenType.TypeSpec:
|
||||
return ret | 4;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.HasSemantics:
|
||||
ret = token.RID << 1;
|
||||
switch (token.TokenType) {
|
||||
case TokenType.Event:
|
||||
return ret | 0;
|
||||
case TokenType.Property:
|
||||
return ret | 1;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.MethodDefOrRef:
|
||||
ret = token.RID << 1;
|
||||
switch (token.TokenType) {
|
||||
case TokenType.Method:
|
||||
return ret | 0;
|
||||
case TokenType.MemberRef:
|
||||
return ret | 1;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.MemberForwarded:
|
||||
ret = token.RID << 1;
|
||||
switch (token.TokenType) {
|
||||
case TokenType.Field:
|
||||
return ret | 0;
|
||||
case TokenType.Method:
|
||||
return ret | 1;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.Implementation:
|
||||
ret = token.RID << 2;
|
||||
switch (token.TokenType) {
|
||||
case TokenType.File:
|
||||
return ret | 0;
|
||||
case TokenType.AssemblyRef:
|
||||
return ret | 1;
|
||||
case TokenType.ExportedType:
|
||||
return ret | 2;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.CustomAttributeType:
|
||||
ret = token.RID << 3;
|
||||
switch (token.TokenType) {
|
||||
case TokenType.Method:
|
||||
return ret | 2;
|
||||
case TokenType.MemberRef:
|
||||
return ret | 3;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.ResolutionScope:
|
||||
ret = token.RID << 2;
|
||||
switch (token.TokenType) {
|
||||
case TokenType.Module:
|
||||
return ret | 0;
|
||||
case TokenType.ModuleRef:
|
||||
return ret | 1;
|
||||
case TokenType.AssemblyRef:
|
||||
return ret | 2;
|
||||
case TokenType.TypeRef:
|
||||
return ret | 3;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.TypeOrMethodDef:
|
||||
ret = token.RID << 1;
|
||||
switch (token.TokenType) {
|
||||
case TokenType.TypeDef:
|
||||
return ret | 0;
|
||||
case TokenType.Method:
|
||||
return ret | 1;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
case CodedIndex.HasCustomDebugInformation:
|
||||
ret = token.RID << 5;
|
||||
switch (token.TokenType) {
|
||||
case TokenType.Method:
|
||||
return ret | 0;
|
||||
case TokenType.Field:
|
||||
return ret | 1;
|
||||
case TokenType.TypeRef:
|
||||
return ret | 2;
|
||||
case TokenType.TypeDef:
|
||||
return ret | 3;
|
||||
case TokenType.Param:
|
||||
return ret | 4;
|
||||
case TokenType.InterfaceImpl:
|
||||
return ret | 5;
|
||||
case TokenType.MemberRef:
|
||||
return ret | 6;
|
||||
case TokenType.Module:
|
||||
return ret | 7;
|
||||
case TokenType.Permission:
|
||||
return ret | 8;
|
||||
case TokenType.Property:
|
||||
return ret | 9;
|
||||
case TokenType.Event:
|
||||
return ret | 10;
|
||||
case TokenType.Signature:
|
||||
return ret | 11;
|
||||
case TokenType.ModuleRef:
|
||||
return ret | 12;
|
||||
case TokenType.TypeSpec:
|
||||
return ret | 13;
|
||||
case TokenType.Assembly:
|
||||
return ret | 14;
|
||||
case TokenType.AssemblyRef:
|
||||
return ret | 15;
|
||||
case TokenType.File:
|
||||
return ret | 16;
|
||||
case TokenType.ExportedType:
|
||||
return ret | 17;
|
||||
case TokenType.ManifestResource:
|
||||
return ret | 18;
|
||||
case TokenType.GenericParam:
|
||||
return ret | 19;
|
||||
case TokenType.GenericParamConstraint:
|
||||
return ret | 20;
|
||||
case TokenType.MethodSpec:
|
||||
return ret | 21;
|
||||
case TokenType.Document:
|
||||
return ret | 22;
|
||||
case TokenType.LocalScope:
|
||||
return ret | 23;
|
||||
case TokenType.LocalVariable:
|
||||
return ret | 24;
|
||||
case TokenType.LocalConstant:
|
||||
return ret | 25;
|
||||
case TokenType.ImportScope:
|
||||
return ret | 26;
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
default:
|
||||
goto exit;
|
||||
}
|
||||
exit:
|
||||
throw new ArgumentException ();
|
||||
}
|
||||
|
||||
public static int GetSize (this CodedIndex self, Func<Table, int> counter)
|
||||
{
|
||||
int bits;
|
||||
Table [] tables;
|
||||
|
||||
switch (self) {
|
||||
case CodedIndex.TypeDefOrRef:
|
||||
bits = 2;
|
||||
tables = new [] { Table.TypeDef, Table.TypeRef, Table.TypeSpec };
|
||||
break;
|
||||
case CodedIndex.HasConstant:
|
||||
bits = 2;
|
||||
tables = new [] { Table.Field, Table.Param, Table.Property };
|
||||
break;
|
||||
case CodedIndex.HasCustomAttribute:
|
||||
bits = 5;
|
||||
tables = new [] {
|
||||
Table.Method, Table.Field, Table.TypeRef, Table.TypeDef, Table.Param, Table.InterfaceImpl, Table.MemberRef,
|
||||
Table.Module, Table.DeclSecurity, Table.Property, Table.Event, Table.StandAloneSig, Table.ModuleRef,
|
||||
Table.TypeSpec, Table.Assembly, Table.AssemblyRef, Table.File, Table.ExportedType,
|
||||
Table.ManifestResource, Table.GenericParam, Table.GenericParamConstraint, Table.MethodSpec,
|
||||
};
|
||||
break;
|
||||
case CodedIndex.HasFieldMarshal:
|
||||
bits = 1;
|
||||
tables = new [] { Table.Field, Table.Param };
|
||||
break;
|
||||
case CodedIndex.HasDeclSecurity:
|
||||
bits = 2;
|
||||
tables = new [] { Table.TypeDef, Table.Method, Table.Assembly };
|
||||
break;
|
||||
case CodedIndex.MemberRefParent:
|
||||
bits = 3;
|
||||
tables = new [] { Table.TypeDef, Table.TypeRef, Table.ModuleRef, Table.Method, Table.TypeSpec };
|
||||
break;
|
||||
case CodedIndex.HasSemantics:
|
||||
bits = 1;
|
||||
tables = new [] { Table.Event, Table.Property };
|
||||
break;
|
||||
case CodedIndex.MethodDefOrRef:
|
||||
bits = 1;
|
||||
tables = new [] { Table.Method, Table.MemberRef };
|
||||
break;
|
||||
case CodedIndex.MemberForwarded:
|
||||
bits = 1;
|
||||
tables = new [] { Table.Field, Table.Method };
|
||||
break;
|
||||
case CodedIndex.Implementation:
|
||||
bits = 2;
|
||||
tables = new [] { Table.File, Table.AssemblyRef, Table.ExportedType };
|
||||
break;
|
||||
case CodedIndex.CustomAttributeType:
|
||||
bits = 3;
|
||||
tables = new [] { Table.Method, Table.MemberRef };
|
||||
break;
|
||||
case CodedIndex.ResolutionScope:
|
||||
bits = 2;
|
||||
tables = new [] { Table.Module, Table.ModuleRef, Table.AssemblyRef, Table.TypeRef };
|
||||
break;
|
||||
case CodedIndex.TypeOrMethodDef:
|
||||
bits = 1;
|
||||
tables = new [] { Table.TypeDef, Table.Method };
|
||||
break;
|
||||
case CodedIndex.HasCustomDebugInformation:
|
||||
bits = 5;
|
||||
tables = new [] {
|
||||
Table.Method, Table.Field, Table.TypeRef, Table.TypeDef, Table.Param, Table.InterfaceImpl, Table.MemberRef,
|
||||
Table.Module, Table.DeclSecurity, Table.Property, Table.Event, Table.StandAloneSig, Table.ModuleRef,
|
||||
Table.TypeSpec, Table.Assembly, Table.AssemblyRef, Table.File, Table.ExportedType,
|
||||
Table.ManifestResource, Table.GenericParam, Table.GenericParamConstraint, Table.MethodSpec,
|
||||
Table.Document, Table.LocalScope, Table.LocalVariable, Table.LocalConstant, Table.ImportScope,
|
||||
};
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentException ();
|
||||
}
|
||||
|
||||
int max = 0;
|
||||
|
||||
for (int i = 0; i < tables.Length; i++) {
|
||||
max = System.Math.Max (counter (tables [i]), max);
|
||||
}
|
||||
|
||||
return max < (1 << (16 - bits)) ? 2 : 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4785957c0c546de4680e1196a57f66d2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a1a250fa69b80b34c9ca9b9086296b97
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,53 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System.IO;
|
||||
|
||||
namespace MonoFN.Cecil.PE {
|
||||
|
||||
class BinaryStreamReader : BinaryReader {
|
||||
|
||||
public int Position {
|
||||
get { return (int)BaseStream.Position; }
|
||||
set { BaseStream.Position = value; }
|
||||
}
|
||||
|
||||
public int Length {
|
||||
get { return (int)BaseStream.Length; }
|
||||
}
|
||||
|
||||
public BinaryStreamReader (Stream stream)
|
||||
: base (stream)
|
||||
{
|
||||
}
|
||||
|
||||
public void Advance (int bytes)
|
||||
{
|
||||
BaseStream.Seek (bytes, SeekOrigin.Current);
|
||||
}
|
||||
|
||||
public void MoveTo (uint position)
|
||||
{
|
||||
BaseStream.Seek (position, SeekOrigin.Begin);
|
||||
}
|
||||
|
||||
public void Align (int align)
|
||||
{
|
||||
align--;
|
||||
var position = Position;
|
||||
Advance (((position + align) & ~align) - position);
|
||||
}
|
||||
|
||||
public DataDirectory ReadDataDirectory ()
|
||||
{
|
||||
return new DataDirectory (ReadUInt32 (), ReadUInt32 ());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7492ed3a048237443b99d7a25e806ce6
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,88 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System.IO;
|
||||
|
||||
namespace MonoFN.Cecil.PE {
|
||||
|
||||
class BinaryStreamWriter : BinaryWriter {
|
||||
|
||||
public int Position {
|
||||
get { return (int)BaseStream.Position; }
|
||||
set { BaseStream.Position = value; }
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
public void Align (int align)
|
||||
{
|
||||
align--;
|
||||
var position = Position;
|
||||
var bytes = ((position + align) & ~align) - position;
|
||||
|
||||
for (int i = 0; i < bytes; i++)
|
||||
WriteByte (0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 26d384e0dd0e44549a9faf09adbd0a41
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,335 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
|
||||
namespace MonoFN.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 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 b = buffer [position];
|
||||
var u = (int)ReadCompressedUInt32 ();
|
||||
var v = u >> 1;
|
||||
if ((u & 1) == 0)
|
||||
return v;
|
||||
|
||||
switch (b & 0xc0) {
|
||||
case 0:
|
||||
case 0x40:
|
||||
return v - 0x40;
|
||||
case 0x80:
|
||||
return v - 0x2000;
|
||||
default:
|
||||
return v - 0x10000000;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
if (value >= 0) {
|
||||
WriteCompressedUInt32 ((uint)(value << 1));
|
||||
return;
|
||||
}
|
||||
|
||||
if (value > -0x40)
|
||||
value = 0x40 + value;
|
||||
else if (value >= -0x2000)
|
||||
value = 0x2000 + value;
|
||||
else if (value >= -0x20000000)
|
||||
value = 0x20000000 + value;
|
||||
|
||||
WriteCompressedUInt32 ((uint)((value << 1) | 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3752816249ea16e4aba70adb03f01673
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,47 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MonoFN.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)
|
||||
{
|
||||
// See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function
|
||||
const int fnv_offset_bias = unchecked((int)2166136261);
|
||||
const int fnv_prime = 16777619;
|
||||
|
||||
var hash_code = fnv_offset_bias;
|
||||
var bytes = buffer.buffer;
|
||||
|
||||
for (int i = 0; i < buffer.length; i++)
|
||||
hash_code = unchecked((hash_code ^ bytes [i]) * fnv_prime);
|
||||
|
||||
return hash_code;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0db5f2f7f9a349d4d89e2329ffd563b2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,30 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using RVA = System.UInt32;
|
||||
|
||||
namespace MonoFN.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,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7cd272a7ff953734bbacab398dfc9fe8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,169 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using MonoFN.Cecil.Cil;
|
||||
using MonoFN.Cecil.Metadata;
|
||||
using System;
|
||||
using System.IO;
|
||||
using RVA = System.UInt32;
|
||||
|
||||
namespace MonoFN.Cecil.PE {
|
||||
|
||||
sealed class Image : IDisposable {
|
||||
|
||||
public Disposable<Stream> Stream;
|
||||
public string FileName;
|
||||
|
||||
public ModuleKind Kind;
|
||||
public uint Characteristics;
|
||||
public string RuntimeVersion;
|
||||
public TargetArchitecture Architecture;
|
||||
public ModuleCharacteristics DllCharacteristics;
|
||||
public ushort LinkerVersion;
|
||||
public ushort SubSystemMajor;
|
||||
public ushort SubSystemMinor;
|
||||
|
||||
public ImageDebugHeader DebugHeader;
|
||||
|
||||
public Section [] Sections;
|
||||
|
||||
public Section MetadataSection;
|
||||
|
||||
public uint EntryPointToken;
|
||||
public uint Timestamp;
|
||||
public ModuleAttributes Attributes;
|
||||
|
||||
public DataDirectory Win32Resources;
|
||||
public DataDirectory Debug;
|
||||
public DataDirectory Resources;
|
||||
public DataDirectory StrongName;
|
||||
|
||||
public StringHeap StringHeap;
|
||||
public BlobHeap BlobHeap;
|
||||
public UserStringHeap UserStringHeap;
|
||||
public GuidHeap GuidHeap;
|
||||
public TableHeap TableHeap;
|
||||
public PdbHeap PdbHeap;
|
||||
|
||||
readonly int [] coded_index_sizes = new int [14];
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
BinaryStreamReader GetReaderAt (RVA rva)
|
||||
{
|
||||
var section = GetSectionAtVirtualAddress (rva);
|
||||
if (section == null)
|
||||
return null;
|
||||
|
||||
var reader = new BinaryStreamReader (Stream.value);
|
||||
reader.MoveTo (ResolveVirtualAddressInSection (rva, section));
|
||||
return reader;
|
||||
}
|
||||
|
||||
public TRet GetReaderAt<TItem, TRet> (RVA rva, TItem item, Func<TItem, BinaryStreamReader, TRet> read) where TRet : class
|
||||
{
|
||||
var position = Stream.value.Position;
|
||||
try {
|
||||
var reader = GetReaderAt (rva);
|
||||
if (reader == null)
|
||||
return null;
|
||||
|
||||
return read (item, reader);
|
||||
}
|
||||
finally {
|
||||
Stream.value.Position = position;
|
||||
}
|
||||
}
|
||||
|
||||
public bool HasDebugTables ()
|
||||
{
|
||||
return HasTable (Table.Document)
|
||||
|| HasTable (Table.MethodDebugInformation)
|
||||
|| HasTable (Table.LocalScope)
|
||||
|| HasTable (Table.LocalVariable)
|
||||
|| HasTable (Table.LocalConstant)
|
||||
|| HasTable (Table.StateMachineMethod)
|
||||
|| HasTable (Table.CustomDebugInformation);
|
||||
}
|
||||
|
||||
public void Dispose ()
|
||||
{
|
||||
Stream.Dispose ();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: be7f3ca6a9f5ad34db68702bd99778fd
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,793 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using MonoFN.Cecil.Cil;
|
||||
using MonoFN.Cecil.Metadata;
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace MonoFN.Cecil.PE {
|
||||
|
||||
sealed class ImageReader : BinaryStreamReader {
|
||||
|
||||
readonly Image image;
|
||||
|
||||
DataDirectory cli;
|
||||
DataDirectory metadata;
|
||||
|
||||
uint table_heap_offset;
|
||||
|
||||
public ImageReader (Disposable<Stream> stream, string file_name)
|
||||
: base (stream.value)
|
||||
{
|
||||
image = new Image ();
|
||||
image.Stream = stream;
|
||||
image.FileName = file_name;
|
||||
}
|
||||
|
||||
void MoveTo (DataDirectory directory)
|
||||
{
|
||||
BaseStream.Position = image.ResolveVirtualAddress (directory.VirtualAddress);
|
||||
}
|
||||
|
||||
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
|
||||
image.Timestamp = ReadUInt32 ();
|
||||
// PointerToSymbolTable 4
|
||||
// NumberOfSymbols 4
|
||||
// OptionalHeaderSize 2
|
||||
Advance (10);
|
||||
|
||||
// Characteristics 2
|
||||
ushort characteristics = ReadUInt16 ();
|
||||
|
||||
ushort subsystem, dll_characteristics;
|
||||
ReadOptionalHeaders (out subsystem, out dll_characteristics);
|
||||
ReadSections (sections);
|
||||
ReadCLIHeader ();
|
||||
ReadMetadata ();
|
||||
ReadDebugHeader ();
|
||||
|
||||
image.Characteristics = characteristics;
|
||||
image.Kind = GetModuleKind (characteristics, subsystem);
|
||||
image.DllCharacteristics = (ModuleCharacteristics)dll_characteristics;
|
||||
}
|
||||
|
||||
TargetArchitecture ReadArchitecture ()
|
||||
{
|
||||
return (TargetArchitecture)ReadUInt16 ();
|
||||
}
|
||||
|
||||
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, out ushort dll_characteristics)
|
||||
{
|
||||
// - PEOptionalHeader
|
||||
// - StandardFieldsHeader
|
||||
|
||||
// Magic 2
|
||||
bool pe64 = ReadUInt16 () == 0x20b;
|
||||
|
||||
// pe32 || pe64
|
||||
|
||||
image.LinkerVersion = ReadUInt16 ();
|
||||
// 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
|
||||
Advance (44);
|
||||
|
||||
image.SubSystemMajor = ReadUInt16 ();
|
||||
image.SubSystemMinor = ReadUInt16 ();
|
||||
|
||||
// Reserved 4
|
||||
// ImageSize 4
|
||||
// HeaderSize 4
|
||||
// FileChecksum 4
|
||||
Advance (16);
|
||||
|
||||
// SubSystem 2
|
||||
subsystem = ReadUInt16 ();
|
||||
|
||||
// DLLFlags 2
|
||||
dll_characteristics = ReadUInt16 ();
|
||||
// StackReserveSize 4 || 8
|
||||
// StackCommitSize 4 || 8
|
||||
// HeapReserveSize 4 || 8
|
||||
// HeapCommitSize 4 || 8
|
||||
// LoaderFlags 4
|
||||
// NumberOfDataDir 4
|
||||
|
||||
// - DataDirectoriesHeader
|
||||
|
||||
// ExportTable 8
|
||||
// ImportTable 8
|
||||
|
||||
Advance (pe64 ? 56 : 40);
|
||||
|
||||
// ResourceTable 8
|
||||
|
||||
image.Win32Resources = ReadDataDirectory ();
|
||||
|
||||
// ExceptionTable 8
|
||||
// CertificateTable 8
|
||||
// BaseRelocationTable 8
|
||||
|
||||
Advance (24);
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
image.Sections = sections;
|
||||
}
|
||||
|
||||
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
|
||||
image.StrongName = ReadDataDirectory ();
|
||||
// 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);
|
||||
|
||||
image.RuntimeVersion = ReadZeroTerminatedString (ReadInt32 ());
|
||||
|
||||
// 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.PdbHeap != null)
|
||||
ReadPdbHeap ();
|
||||
|
||||
if (image.TableHeap != null)
|
||||
ReadTableHeap ();
|
||||
}
|
||||
|
||||
void ReadDebugHeader ()
|
||||
{
|
||||
if (image.Debug.IsZero) {
|
||||
image.DebugHeader = new ImageDebugHeader (Empty<ImageDebugHeaderEntry>.Array);
|
||||
return;
|
||||
}
|
||||
|
||||
MoveTo (image.Debug);
|
||||
|
||||
var entries = new ImageDebugHeaderEntry [(int)image.Debug.Size / ImageDebugDirectory.Size];
|
||||
|
||||
for (int i = 0; i < entries.Length; i++) {
|
||||
var directory = new ImageDebugDirectory {
|
||||
Characteristics = ReadInt32 (),
|
||||
TimeDateStamp = ReadInt32 (),
|
||||
MajorVersion = ReadInt16 (),
|
||||
MinorVersion = ReadInt16 (),
|
||||
Type = (ImageDebugType)ReadInt32 (),
|
||||
SizeOfData = ReadInt32 (),
|
||||
AddressOfRawData = ReadInt32 (),
|
||||
PointerToRawData = ReadInt32 (),
|
||||
};
|
||||
|
||||
if (directory.PointerToRawData == 0 || directory.SizeOfData < 0) {
|
||||
entries [i] = new ImageDebugHeaderEntry (directory, Empty<byte>.Array);
|
||||
continue;
|
||||
}
|
||||
|
||||
var position = Position;
|
||||
try {
|
||||
MoveTo ((uint)directory.PointerToRawData);
|
||||
var data = ReadBytes (directory.SizeOfData);
|
||||
entries [i] = new ImageDebugHeaderEntry (directory, data);
|
||||
}
|
||||
finally {
|
||||
Position = position;
|
||||
}
|
||||
}
|
||||
|
||||
image.DebugHeader = new ImageDebugHeader (entries);
|
||||
}
|
||||
|
||||
void ReadMetadataStream (Section section)
|
||||
{
|
||||
// Offset 4
|
||||
uint offset = metadata.VirtualAddress - section.VirtualAddress + ReadUInt32 (); // relative to the section start
|
||||
|
||||
// Size 4
|
||||
uint size = ReadUInt32 ();
|
||||
|
||||
var data = ReadHeapData (offset, size);
|
||||
|
||||
var name = ReadAlignedString (16);
|
||||
switch (name) {
|
||||
case "#~":
|
||||
case "#-":
|
||||
image.TableHeap = new TableHeap (data);
|
||||
table_heap_offset = offset;
|
||||
break;
|
||||
case "#Strings":
|
||||
image.StringHeap = new StringHeap (data);
|
||||
break;
|
||||
case "#Blob":
|
||||
image.BlobHeap = new BlobHeap (data);
|
||||
break;
|
||||
case "#GUID":
|
||||
image.GuidHeap = new GuidHeap (data);
|
||||
break;
|
||||
case "#US":
|
||||
image.UserStringHeap = new UserStringHeap (data);
|
||||
break;
|
||||
case "#Pdb":
|
||||
image.PdbHeap = new PdbHeap (data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
byte [] ReadHeapData (uint offset, uint size)
|
||||
{
|
||||
var position = BaseStream.Position;
|
||||
MoveTo (offset + image.MetadataSection.PointerToRawData);
|
||||
var data = ReadBytes ((int)size);
|
||||
BaseStream.Position = position;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
void ReadTableHeap ()
|
||||
{
|
||||
var heap = image.TableHeap;
|
||||
|
||||
MoveTo (table_heap_offset + image.MetadataSection.PointerToRawData);
|
||||
|
||||
// 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 ();
|
||||
|
||||
if (image.PdbHeap != null) {
|
||||
for (int i = 0; i < Mixin.TableCount; i++) {
|
||||
if (!image.PdbHeap.HasTable ((Table)i))
|
||||
continue;
|
||||
|
||||
heap.Tables [i].Length = image.PdbHeap.TypeSystemTableRows [i];
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < Mixin.TableCount; i++) {
|
||||
if (!heap.HasTable ((Table)i))
|
||||
continue;
|
||||
|
||||
heap.Tables [i].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 - table_heap_offset - image.MetadataSection.PointerToRawData; // header
|
||||
|
||||
int stridx_size = image.StringHeap != null ? image.StringHeap.IndexSize : 2;
|
||||
int guididx_size = image.GuidHeap != null ? image.GuidHeap.IndexSize : 2;
|
||||
int blobidx_size = image.BlobHeap != null ? image.BlobHeap.IndexSize : 2;
|
||||
|
||||
var heap = image.TableHeap;
|
||||
var tables = heap.Tables;
|
||||
|
||||
for (int i = 0; i < Mixin.TableCount; i++) {
|
||||
var table = (Table)i;
|
||||
if (!heap.HasTable (table))
|
||||
continue;
|
||||
|
||||
int size;
|
||||
switch (table) {
|
||||
case Table.Module:
|
||||
size = 2 // Generation
|
||||
+ stridx_size // Name
|
||||
+ (guididx_size * 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.EncLog:
|
||||
size = 8;
|
||||
break;
|
||||
case Table.EncMap:
|
||||
size = 4;
|
||||
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;
|
||||
case Table.Document:
|
||||
size = blobidx_size // Name
|
||||
+ guididx_size // HashAlgorithm
|
||||
+ blobidx_size // Hash
|
||||
+ guididx_size; // Language
|
||||
break;
|
||||
case Table.MethodDebugInformation:
|
||||
size = GetTableIndexSize (Table.Document) // Document
|
||||
+ blobidx_size; // SequencePoints
|
||||
break;
|
||||
case Table.LocalScope:
|
||||
size = GetTableIndexSize (Table.Method) // Method
|
||||
+ GetTableIndexSize (Table.ImportScope) // ImportScope
|
||||
+ GetTableIndexSize (Table.LocalVariable) // VariableList
|
||||
+ GetTableIndexSize (Table.LocalConstant) // ConstantList
|
||||
+ 4 * 2; // StartOffset, Length
|
||||
break;
|
||||
case Table.LocalVariable:
|
||||
size = 2 // Attributes
|
||||
+ 2 // Index
|
||||
+ stridx_size; // Name
|
||||
break;
|
||||
case Table.LocalConstant:
|
||||
size = stridx_size // Name
|
||||
+ blobidx_size; // Signature
|
||||
break;
|
||||
case Table.ImportScope:
|
||||
size = GetTableIndexSize (Table.ImportScope) // Parent
|
||||
+ blobidx_size;
|
||||
break;
|
||||
case Table.StateMachineMethod:
|
||||
size = GetTableIndexSize (Table.Method) // MoveNextMethod
|
||||
+ GetTableIndexSize (Table.Method); // KickOffMethod
|
||||
break;
|
||||
case Table.CustomDebugInformation:
|
||||
size = GetCodedIndexSize (CodedIndex.HasCustomDebugInformation) // Parent
|
||||
+ guididx_size // Kind
|
||||
+ blobidx_size; // Value
|
||||
break;
|
||||
default:
|
||||
throw new NotSupportedException ();
|
||||
}
|
||||
|
||||
tables [i].RowSize = (uint)size;
|
||||
tables [i].Offset = offset;
|
||||
|
||||
offset += (uint)size * tables [i].Length;
|
||||
}
|
||||
}
|
||||
|
||||
void ReadPdbHeap ()
|
||||
{
|
||||
var heap = image.PdbHeap;
|
||||
|
||||
var buffer = new ByteBuffer (heap.data);
|
||||
|
||||
heap.Id = buffer.ReadBytes (20);
|
||||
heap.EntryPoint = buffer.ReadUInt32 ();
|
||||
heap.TypeSystemTables = buffer.ReadInt64 ();
|
||||
heap.TypeSystemTableRows = new uint [Mixin.TableCount];
|
||||
|
||||
for (int i = 0; i < Mixin.TableCount; i++) {
|
||||
var table = (Table)i;
|
||||
if (!heap.HasTable (table))
|
||||
continue;
|
||||
|
||||
heap.TypeSystemTableRows [i] = buffer.ReadUInt32 ();
|
||||
}
|
||||
}
|
||||
|
||||
public static Image ReadImage (Disposable<Stream> stream, string file_name)
|
||||
{
|
||||
try {
|
||||
var reader = new ImageReader (stream, file_name);
|
||||
reader.ReadImage ();
|
||||
return reader.image;
|
||||
}
|
||||
catch (EndOfStreamException e) {
|
||||
throw new BadImageFormatException (stream.value.GetFileName (), e);
|
||||
}
|
||||
}
|
||||
|
||||
public static Image ReadPortablePdb (Disposable<Stream> stream, string file_name)
|
||||
{
|
||||
try {
|
||||
var reader = new ImageReader (stream, file_name);
|
||||
var length = (uint)stream.value.Length;
|
||||
|
||||
reader.image.Sections = new [] {
|
||||
new Section {
|
||||
PointerToRawData = 0,
|
||||
SizeOfRawData = length,
|
||||
VirtualAddress = 0,
|
||||
VirtualSize = length,
|
||||
}
|
||||
};
|
||||
|
||||
reader.metadata = new DataDirectory (0, length);
|
||||
reader.ReadMetadata ();
|
||||
return reader.image;
|
||||
}
|
||||
catch (EndOfStreamException e) {
|
||||
throw new BadImageFormatException (stream.value.GetFileName (), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ba04d4e3389423e47b35aaccee205576
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,860 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using MonoFN.Cecil.Cil;
|
||||
using MonoFN.Cecil.Metadata;
|
||||
using System;
|
||||
using System.IO;
|
||||
using RVA = System.UInt32;
|
||||
|
||||
namespace MonoFN.Cecil.PE {
|
||||
|
||||
sealed class ImageWriter : BinaryStreamWriter {
|
||||
|
||||
readonly ModuleDefinition module;
|
||||
readonly MetadataBuilder metadata;
|
||||
readonly TextMap text_map;
|
||||
readonly internal Disposable<Stream> stream;
|
||||
|
||||
readonly string runtime_version;
|
||||
|
||||
ImageDebugHeader debug_header;
|
||||
|
||||
ByteBuffer win32_resources;
|
||||
|
||||
const uint pe_header_size = 0x98u;
|
||||
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 bool has_reloc;
|
||||
|
||||
internal Section text;
|
||||
internal Section rsrc;
|
||||
internal Section reloc;
|
||||
|
||||
ushort sections;
|
||||
|
||||
ImageWriter (ModuleDefinition module, string runtime_version, MetadataBuilder metadata, Disposable<Stream> stream, bool metadataOnly = false)
|
||||
: base (stream.value)
|
||||
{
|
||||
this.module = module;
|
||||
this.runtime_version = runtime_version;
|
||||
this.text_map = metadata.text_map;
|
||||
this.stream = stream;
|
||||
this.metadata = metadata;
|
||||
if (metadataOnly)
|
||||
return;
|
||||
|
||||
this.pe64 = module.Architecture == TargetArchitecture.AMD64 || module.Architecture == TargetArchitecture.IA64 || module.Architecture == TargetArchitecture.ARM64;
|
||||
this.has_reloc = module.Architecture == TargetArchitecture.I386;
|
||||
this.GetDebugHeader ();
|
||||
this.GetWin32Resources ();
|
||||
this.BuildTextMap ();
|
||||
this.sections = (ushort)(has_reloc ? 2 : 1); // text + reloc?
|
||||
}
|
||||
|
||||
void GetDebugHeader ()
|
||||
{
|
||||
var symbol_writer = metadata.symbol_writer;
|
||||
if (symbol_writer != null)
|
||||
debug_header = symbol_writer.GetDebugHeader ();
|
||||
|
||||
if (module.HasDebugHeader) {
|
||||
var header = module.GetDebugHeader ();
|
||||
var deterministic = header.GetDeterministicEntry ();
|
||||
if (deterministic == null)
|
||||
return;
|
||||
|
||||
debug_header = debug_header.AddDeterministicEntry ();
|
||||
}
|
||||
}
|
||||
|
||||
void GetWin32Resources ()
|
||||
{
|
||||
if (!module.HasImage)
|
||||
return;
|
||||
|
||||
DataDirectory win32_resources_directory = module.Image.Win32Resources;
|
||||
var size = win32_resources_directory.Size;
|
||||
|
||||
if (size > 0) {
|
||||
win32_resources = module.Image.GetReaderAt (win32_resources_directory.VirtualAddress, size, (s, reader) => new ByteBuffer (reader.ReadBytes ((int)s)));
|
||||
}
|
||||
}
|
||||
|
||||
public static ImageWriter CreateWriter (ModuleDefinition module, MetadataBuilder metadata, Disposable<Stream> stream)
|
||||
{
|
||||
var writer = new ImageWriter (module, module.runtime_version, metadata, stream);
|
||||
writer.BuildSections ();
|
||||
return writer;
|
||||
}
|
||||
|
||||
public static ImageWriter CreateDebugWriter (ModuleDefinition module, MetadataBuilder metadata, Disposable<Stream> stream)
|
||||
{
|
||||
var writer = new ImageWriter (module, "PDB v1.0", metadata, stream, metadataOnly: true);
|
||||
var length = metadata.text_map.GetLength ();
|
||||
writer.text = new Section { SizeOfRawData = length, VirtualSize = length };
|
||||
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;
|
||||
}
|
||||
|
||||
if (has_reloc)
|
||||
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
|
||||
});
|
||||
}
|
||||
|
||||
ushort SizeOfOptionalHeader ()
|
||||
{
|
||||
return (ushort)(!pe64 ? 0xe0 : 0xf0);
|
||||
}
|
||||
|
||||
void WritePEFileHeader ()
|
||||
{
|
||||
WriteUInt32 (0x00004550); // Magic
|
||||
WriteUInt16 ((ushort)module.Architecture); // Machine
|
||||
WriteUInt16 (sections); // NumberOfSections
|
||||
WriteUInt32 (metadata.timestamp);
|
||||
WriteUInt32 (0); // PointerToSymbolTable
|
||||
WriteUInt32 (0); // NumberOfSymbols
|
||||
WriteUInt16 (SizeOfOptionalHeader ()); // SizeOfOptionalHeader
|
||||
|
||||
const ushort LargeAddressAware = 0x0020;
|
||||
|
||||
// ExecutableImage | (!pe64 ? 32BitsMachine : LargeAddressAware)
|
||||
var characteristics = (ushort)(0x0002 | (!pe64 ? 0x0100 : LargeAddressAware));
|
||||
if (module.Kind == ModuleKind.Dll || module.Kind == ModuleKind.NetModule)
|
||||
characteristics |= 0x2000;
|
||||
|
||||
if (module.Image != null && (module.Image.Characteristics & LargeAddressAware) != 0)
|
||||
characteristics |= LargeAddressAware;
|
||||
|
||||
WriteUInt16 (characteristics); // Characteristics
|
||||
}
|
||||
|
||||
Section LastSection ()
|
||||
{
|
||||
if (reloc != null)
|
||||
return reloc;
|
||||
|
||||
if (rsrc != null)
|
||||
return rsrc;
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
void WriteOptionalHeaders ()
|
||||
{
|
||||
WriteUInt16 ((ushort)(!pe64 ? 0x10b : 0x20b)); // Magic
|
||||
WriteUInt16 (module.linker_version);
|
||||
WriteUInt32 (text.SizeOfRawData); // CodeSize
|
||||
WriteUInt32 ((reloc != null ? reloc.SizeOfRawData : 0)
|
||||
+ (rsrc != null ? rsrc.SizeOfRawData : 0)); // InitializedDataSize
|
||||
WriteUInt32 (0); // UninitializedDataSize
|
||||
|
||||
var startub_stub = text_map.GetRange (TextSegment.StartupStub);
|
||||
WriteUInt32 (startub_stub.Length > 0 ? startub_stub.Start : 0); // 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 (module.subsystem_major); // SubSysMajor
|
||||
WriteUInt16 (module.subsystem_minor); // SubSysMinor
|
||||
WriteUInt32 (0); // Reserved
|
||||
|
||||
var last_section = LastSection ();
|
||||
WriteUInt32 (last_section.VirtualAddress + Align (last_section.VirtualSize, section_alignment)); // ImageSize
|
||||
WriteUInt32 (text.PointerToRawData); // HeaderSize
|
||||
|
||||
WriteUInt32 (0); // Checksum
|
||||
WriteUInt16 (GetSubSystem ()); // SubSystem
|
||||
WriteUInt16 ((ushort)module.Characteristics); // DLLFlags
|
||||
|
||||
if (!pe64) {
|
||||
const uint stack_reserve = 0x100000;
|
||||
const uint stack_commit = 0x1000;
|
||||
const uint heap_reserve = 0x100000;
|
||||
const uint heap_commit = 0x1000;
|
||||
|
||||
WriteUInt32 (stack_reserve);
|
||||
WriteUInt32 (stack_commit);
|
||||
WriteUInt32 (heap_reserve);
|
||||
WriteUInt32 (heap_commit);
|
||||
} else {
|
||||
const ulong stack_reserve = 0x400000;
|
||||
const ulong stack_commit = 0x4000;
|
||||
const ulong heap_reserve = 0x100000;
|
||||
const ulong heap_commit = 0x2000;
|
||||
|
||||
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 != null ? reloc.VirtualAddress : 0); // BaseRelocationTable
|
||||
WriteUInt32 (reloc != null ? reloc.VirtualSize : 0);
|
||||
|
||||
if (text_map.GetLength (TextSegment.DebugDirectory) > 0) {
|
||||
WriteUInt32 (text_map.GetRVA (TextSegment.DebugDirectory));
|
||||
WriteUInt32 ((uint)(debug_header.Entries.Length * ImageDebugDirectory.Size));
|
||||
} 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);
|
||||
|
||||
if (reloc != null)
|
||||
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);
|
||||
}
|
||||
|
||||
uint GetRVAFileOffset (Section section, RVA rva)
|
||||
{
|
||||
return section.PointerToRawData + rva - section.VirtualAddress;
|
||||
}
|
||||
|
||||
void MoveTo (uint pointer)
|
||||
{
|
||||
BaseStream.Seek (pointer, SeekOrigin.Begin);
|
||||
}
|
||||
|
||||
void MoveToRVA (Section section, RVA rva)
|
||||
{
|
||||
BaseStream.Seek (GetRVAFileOffset (section, rva), SeekOrigin.Begin);
|
||||
}
|
||||
|
||||
void MoveToRVA (TextSegment segment)
|
||||
{
|
||||
MoveToRVA (text, text_map.GetRVA (segment));
|
||||
}
|
||||
|
||||
void WriteRVA (RVA rva)
|
||||
{
|
||||
if (!pe64)
|
||||
WriteUInt32 (rva);
|
||||
else
|
||||
WriteUInt64 (rva);
|
||||
}
|
||||
|
||||
void PrepareSection (Section section)
|
||||
{
|
||||
MoveTo (section.PointerToRawData);
|
||||
|
||||
const int buffer_size = 4096;
|
||||
|
||||
if (section.SizeOfRawData <= buffer_size) {
|
||||
Write (new byte [section.SizeOfRawData]);
|
||||
MoveTo (section.PointerToRawData);
|
||||
return;
|
||||
}
|
||||
|
||||
var written = 0;
|
||||
var buffer = new byte [buffer_size];
|
||||
while (written != section.SizeOfRawData) {
|
||||
var write_size = System.Math.Min ((int)section.SizeOfRawData - written, buffer_size);
|
||||
Write (buffer, 0, write_size);
|
||||
written += write_size;
|
||||
}
|
||||
|
||||
MoveTo (section.PointerToRawData);
|
||||
}
|
||||
|
||||
void WriteText ()
|
||||
{
|
||||
PrepareSection (text);
|
||||
|
||||
// ImportAddressTable
|
||||
|
||||
if (has_reloc) {
|
||||
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 ();
|
||||
}
|
||||
|
||||
if (!has_reloc)
|
||||
return;
|
||||
|
||||
// ImportDirectory
|
||||
MoveToRVA (TextSegment.ImportDirectory);
|
||||
WriteImportDirectory ();
|
||||
|
||||
// StartupStub
|
||||
MoveToRVA (TextSegment.StartupStub);
|
||||
WriteStartupStub ();
|
||||
}
|
||||
|
||||
uint GetMetadataLength ()
|
||||
{
|
||||
return text_map.GetRVA (TextSegment.DebugDirectory) - text_map.GetRVA (TextSegment.MetadataHeader);
|
||||
}
|
||||
|
||||
public void WriteMetadataHeader ()
|
||||
{
|
||||
WriteUInt32 (0x424a5342); // Signature
|
||||
WriteUInt16 (1); // MajorVersion
|
||||
WriteUInt16 (1); // MinorVersion
|
||||
WriteUInt32 (0); // Reserved
|
||||
|
||||
var version = GetZeroTerminatedString (runtime_version);
|
||||
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");
|
||||
WriteStreamHeader (ref offset, TextSegment.PdbHeap, "#Pdb");
|
||||
}
|
||||
|
||||
ushort GetStreamCount ()
|
||||
{
|
||||
return (ushort)(
|
||||
1 // #~
|
||||
+ 1 // #Strings
|
||||
+ (metadata.user_string_heap.IsEmpty ? 0 : 1) // #US
|
||||
+ (metadata.guid_heap.IsEmpty ? 0 : 1) // GUID
|
||||
+ (metadata.blob_heap.IsEmpty ? 0 : 1)
|
||||
+ (metadata.pdb_heap == null ? 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 int GetZeroTerminatedStringLength (string @string)
|
||||
{
|
||||
return (@string.Length + 1 + 3) & ~3;
|
||||
}
|
||||
|
||||
static byte [] GetZeroTerminatedString (string @string)
|
||||
{
|
||||
return GetString (@string, GetZeroTerminatedStringLength (@string));
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
public void WriteMetadata ()
|
||||
{
|
||||
WriteHeap (TextSegment.TableHeap, metadata.table_heap);
|
||||
WriteHeap (TextSegment.StringHeap, metadata.string_heap);
|
||||
WriteHeap (TextSegment.UserStringHeap, metadata.user_string_heap);
|
||||
WriteHeap (TextSegment.GuidHeap, metadata.guid_heap);
|
||||
WriteHeap (TextSegment.BlobHeap, metadata.blob_heap);
|
||||
WriteHeap (TextSegment.PdbHeap, metadata.pdb_heap);
|
||||
}
|
||||
|
||||
void WriteHeap (TextSegment heap, HeapBuffer buffer)
|
||||
{
|
||||
if (buffer == null || buffer.IsEmpty)
|
||||
return;
|
||||
|
||||
MoveToRVA (heap);
|
||||
WriteBuffer (buffer);
|
||||
}
|
||||
|
||||
void WriteDebugDirectory ()
|
||||
{
|
||||
var data_start = (int)BaseStream.Position + (debug_header.Entries.Length * ImageDebugDirectory.Size);
|
||||
|
||||
for (var i = 0; i < debug_header.Entries.Length; i++) {
|
||||
var entry = debug_header.Entries [i];
|
||||
var directory = entry.Directory;
|
||||
WriteInt32 (directory.Characteristics);
|
||||
WriteInt32 (directory.TimeDateStamp);
|
||||
WriteInt16 (directory.MajorVersion);
|
||||
WriteInt16 (directory.MinorVersion);
|
||||
WriteInt32 ((int)directory.Type);
|
||||
WriteInt32 (directory.SizeOfData);
|
||||
WriteInt32 (directory.AddressOfRawData);
|
||||
WriteInt32 (data_start);
|
||||
|
||||
data_start += entry.Data.Length;
|
||||
}
|
||||
|
||||
for (var i = 0; i < debug_header.Entries.Length; i++) {
|
||||
var entry = debug_header.Entries [i];
|
||||
WriteBytes (entry.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;
|
||||
default:
|
||||
throw new NotSupportedException ();
|
||||
}
|
||||
}
|
||||
|
||||
void WriteRsrc ()
|
||||
{
|
||||
PrepareSection (rsrc);
|
||||
WriteBuffer (win32_resources);
|
||||
}
|
||||
|
||||
void WriteReloc ()
|
||||
{
|
||||
PrepareSection (reloc);
|
||||
|
||||
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;
|
||||
default:
|
||||
throw new NotSupportedException ();
|
||||
}
|
||||
}
|
||||
|
||||
public void WriteImage ()
|
||||
{
|
||||
WriteDOSHeader ();
|
||||
WritePEFileHeader ();
|
||||
WriteOptionalHeaders ();
|
||||
WriteSectionHeaders ();
|
||||
WriteText ();
|
||||
if (rsrc != null)
|
||||
WriteRsrc ();
|
||||
if (reloc != null)
|
||||
WriteReloc ();
|
||||
Flush ();
|
||||
}
|
||||
|
||||
void BuildTextMap ()
|
||||
{
|
||||
var map = 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);
|
||||
|
||||
BuildMetadataTextMap ();
|
||||
|
||||
int debug_dir_len = 0;
|
||||
if (debug_header != null && debug_header.HasEntries) {
|
||||
var directories_len = debug_header.Entries.Length * ImageDebugDirectory.Size;
|
||||
var data_address = (int)map.GetNextRVA (TextSegment.BlobHeap) + directories_len;
|
||||
var data_len = 0;
|
||||
|
||||
for (var i = 0; i < debug_header.Entries.Length; i++) {
|
||||
var entry = debug_header.Entries [i];
|
||||
var directory = entry.Directory;
|
||||
|
||||
directory.AddressOfRawData = entry.Data.Length == 0 ? 0 : data_address;
|
||||
entry.Directory = directory;
|
||||
|
||||
data_len += entry.Data.Length;
|
||||
data_address += data_len;
|
||||
}
|
||||
|
||||
debug_dir_len = directories_len + data_len;
|
||||
}
|
||||
|
||||
map.AddMap (TextSegment.DebugDirectory, debug_dir_len, 4);
|
||||
|
||||
if (!has_reloc) {
|
||||
var start = map.GetNextRVA (TextSegment.DebugDirectory);
|
||||
map.AddMap (TextSegment.ImportDirectory, new Range (start, 0));
|
||||
map.AddMap (TextSegment.ImportHintNameTable, new Range (start, 0));
|
||||
map.AddMap (TextSegment.StartupStub, new Range (start, 0));
|
||||
return;
|
||||
}
|
||||
|
||||
RVA import_dir_rva = map.GetNextRVA (TextSegment.DebugDirectory);
|
||||
RVA import_hnt_rva = import_dir_rva + 48u;
|
||||
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 ()));
|
||||
}
|
||||
|
||||
public void BuildMetadataTextMap ()
|
||||
{
|
||||
var map = text_map;
|
||||
|
||||
map.AddMap (TextSegment.MetadataHeader, GetMetadataHeaderLength (module.RuntimeVersion));
|
||||
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, metadata.guid_heap.length, 4);
|
||||
map.AddMap (TextSegment.BlobHeap, metadata.blob_heap.IsEmpty ? 0 : metadata.blob_heap.length, 4);
|
||||
map.AddMap (TextSegment.PdbHeap, metadata.pdb_heap == null ? 0 : metadata.pdb_heap.length, 4);
|
||||
}
|
||||
|
||||
uint GetStartupStubLength ()
|
||||
{
|
||||
switch (module.Architecture) {
|
||||
case TargetArchitecture.I386:
|
||||
return 6;
|
||||
default:
|
||||
throw new NotSupportedException ();
|
||||
}
|
||||
}
|
||||
|
||||
int GetMetadataHeaderLength (string runtimeVersion)
|
||||
{
|
||||
return
|
||||
// MetadataHeader
|
||||
20 + GetZeroTerminatedStringLength (runtimeVersion)
|
||||
// #~ 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)
|
||||
//
|
||||
+ (metadata.pdb_heap == null ? 0 : 16);
|
||||
}
|
||||
|
||||
int GetStrongNameLength ()
|
||||
{
|
||||
if (module.kind == ModuleKind.NetModule || module.Assembly == null)
|
||||
return 0;
|
||||
|
||||
var public_key = module.Assembly.Name.PublicKey;
|
||||
if (public_key.IsNullOrEmpty ())
|
||||
return 0;
|
||||
|
||||
// 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 + SizeOfOptionalHeader () + (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 rva = resources.ReadUInt32 ();
|
||||
resources.position -= 4;
|
||||
|
||||
resources.WriteUInt32 (rva - module.Image.Win32Resources.VirtualAddress + rsrc.VirtualAddress);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 88ebae078ed1c8346be0a945ce3b03b0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,22 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using RVA = System.UInt32;
|
||||
|
||||
namespace MonoFN.Cecil.PE {
|
||||
|
||||
sealed class Section {
|
||||
public string Name;
|
||||
public RVA VirtualAddress;
|
||||
public uint VirtualSize;
|
||||
public uint SizeOfRawData;
|
||||
public uint PointerToRawData;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dc33915bdaaf42a428f8a4694e9611a8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,106 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using RVA = System.UInt32;
|
||||
|
||||
namespace MonoFN.Cecil.PE {
|
||||
|
||||
enum TextSegment {
|
||||
ImportAddressTable,
|
||||
CLIHeader,
|
||||
Code,
|
||||
Resources,
|
||||
Data,
|
||||
StrongNameSignature,
|
||||
|
||||
// Metadata
|
||||
MetadataHeader,
|
||||
TableHeap,
|
||||
StringHeap,
|
||||
UserStringHeap,
|
||||
GuidHeap,
|
||||
BlobHeap,
|
||||
PdbHeap,
|
||||
// End Metadata
|
||||
|
||||
DebugDirectory,
|
||||
ImportDirectory,
|
||||
ImportHintNameTable,
|
||||
StartupStub,
|
||||
}
|
||||
|
||||
sealed class TextMap {
|
||||
|
||||
readonly Range [] map = new Range [17 /*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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1d36ca0589eb8014fa28bc58a88ae85f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,16 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<IsTestProject>true</IsTestProject>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="NUnit">
|
||||
<Version>3.11.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk">
|
||||
<Version>15.9.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="NUnit3TestAdapter">
|
||||
<Version>3.12.0</Version>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4304d9110a6c73049a70f3d001e1ac37
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 08f20128864a55d45abd8a30563f2f5c
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,9 @@
|
||||
<NUnitProject>
|
||||
<Settings activeconfig="Debug" />
|
||||
<Config name="Debug" runtimeFramework="v4.0.30319" domainUsage="Single">
|
||||
<assembly path="./Test/bin/Debug/net40/Mono.Cecil.Tests.dll" />
|
||||
<assembly path="./rocks/Test/bin/Debug/net40/Mono.Cecil.Rocks.Tests.dll" />
|
||||
<assembly path="./symbols/mdb/Test/bin/Debug/net40/Mono.Cecil.Mdb.Tests.dll" />
|
||||
<assembly path="./symbols/pdb/Test/bin/Debug/net40/Mono.Cecil.Pdb.Tests.dll" />
|
||||
</Config>
|
||||
</NUnitProject>
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 70249fc3714c2ba43bb69eeceaf02171
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0"?>
|
||||
<package xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<metadata xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
||||
<id>Mono.Cecil</id>
|
||||
<version>0.11.4.0</version>
|
||||
<title>Mono.Cecil</title>
|
||||
<authors>Jb Evain</authors>
|
||||
<owners>Jb Evain</owners>
|
||||
<license type="expression">MIT</license>
|
||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||
<projectUrl>http://github.com/jbevain/cecil/</projectUrl>
|
||||
<summary>Cecil is a library written by Jb Evain to generate and inspect programs and libraries in the ECMA CIL format.</summary>
|
||||
<description>Cecil is a library written by Jb Evain to generate and inspect programs and libraries in the ECMA CIL format. It has full support for generics, and support some debugging symbol format. In simple English, with Cecil, you can load existing managed assemblies, browse all the contained types, modify them on the fly and save back to the disk the modified assembly.</description>
|
||||
<language>en-US</language>
|
||||
<tags>assembly assemblies module modules il cil msil bytecode reflection injection cecil mono aop</tags>
|
||||
<dependencies>
|
||||
<group targetFramework=".NETFramework4.0" />
|
||||
<group targetFramework=".NETStandard2.0" />
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
<file src="bin\Release\net40\Mono.Cecil.dll" target="lib/net40" />
|
||||
<file src="bin\Release\net40\Mono.Cecil.pdb" target="lib/net40" />
|
||||
<file src="bin\Release\netstandard2.0\Mono.Cecil.dll" target="lib/netstandard2.0" />
|
||||
<file src="bin\Release\netstandard2.0\Mono.Cecil.pdb" target="lib/netstandard2.0" />
|
||||
|
||||
<file src="rocks\bin\Release\net40\Mono.Cecil.Rocks.dll" target="lib/net40" />
|
||||
<file src="rocks\bin\Release\net40\Mono.Cecil.Rocks.pdb" target="lib/net40" />
|
||||
<file src="rocks\bin\Release\netstandard2.0\Mono.Cecil.Rocks.dll" target="lib/netstandard2.0" />
|
||||
<file src="rocks\bin\Release\netstandard2.0\Mono.Cecil.Rocks.pdb" target="lib/netstandard2.0" />
|
||||
|
||||
<file src="symbols\mdb\bin\Release\net40\Mono.Cecil.Mdb.dll" target="lib/net40" />
|
||||
<file src="symbols\mdb\bin\Release\net40\Mono.Cecil.Mdb.pdb" target="lib/net40" />
|
||||
<file src="symbols\mdb\bin\Release\netstandard2.0\Mono.Cecil.Mdb.dll" target="lib/netstandard2.0" />
|
||||
<file src="symbols\mdb\bin\Release\netstandard2.0\Mono.Cecil.Mdb.pdb" target="lib/netstandard2.0" />
|
||||
|
||||
<file src="symbols\pdb\bin\Release\net40\Mono.Cecil.Pdb.dll" target="lib/net40" />
|
||||
<file src="symbols\pdb\bin\Release\net40\Mono.Cecil.Pdb.pdb" target="lib/net40" />
|
||||
<file src="symbols\pdb\bin\Release\netstandard2.0\Mono.Cecil.Pdb.dll" target="lib/netstandard2.0" />
|
||||
<file src="symbols\pdb\bin\Release\netstandard2.0\Mono.Cecil.Pdb.pdb" target="lib/netstandard2.0" />
|
||||
</files>
|
||||
</package>
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9ab5a3af6caf6d14da0bad821a809a27
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,67 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.28516.95
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Cecil", "Mono.Cecil.csproj", "{16C3FA32-4775-497F-8794-DD5AF13CFE22}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Cecil.Pdb", "symbols\pdb\Mono.Cecil.Pdb.csproj", "{4D22D51C-4230-46AF-8657-4FD757D9C8BC}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Cecil.Mdb", "symbols\mdb\Mono.Cecil.Mdb.csproj", "{5A5F84B1-DD1A-4134-932C-C3AF5BDAD391}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Cecil.Tests", "Test\Mono.Cecil.Tests.csproj", "{EA7ADB7D-9FC1-4B4C-BBE9-359DD5B2E345}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Cecil.Mdb.Tests", "symbols\mdb\Test\Mono.Cecil.Mdb.Tests.csproj", "{901E005D-CD64-4DC5-8CD0-4A49A7B0AF71}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Cecil.Pdb.Tests", "symbols\pdb\Test\Mono.Cecil.Pdb.Tests.csproj", "{50FC1815-A653-48D0-95E2-DB48CB01F4E1}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Cecil.Rocks", "rocks\Mono.Cecil.Rocks.csproj", "{70E05599-64EE-4C11-A2F8-EE4113309039}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Cecil.Rocks.Tests", "rocks\Test\Mono.Cecil.Rocks.Tests.csproj", "{EF768F7A-3C08-45EE-8A7E-BB5A81BADB7B}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{16C3FA32-4775-497F-8794-DD5AF13CFE22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{16C3FA32-4775-497F-8794-DD5AF13CFE22}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{16C3FA32-4775-497F-8794-DD5AF13CFE22}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{16C3FA32-4775-497F-8794-DD5AF13CFE22}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{4D22D51C-4230-46AF-8657-4FD757D9C8BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{4D22D51C-4230-46AF-8657-4FD757D9C8BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4D22D51C-4230-46AF-8657-4FD757D9C8BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{4D22D51C-4230-46AF-8657-4FD757D9C8BC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5A5F84B1-DD1A-4134-932C-C3AF5BDAD391}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5A5F84B1-DD1A-4134-932C-C3AF5BDAD391}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5A5F84B1-DD1A-4134-932C-C3AF5BDAD391}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5A5F84B1-DD1A-4134-932C-C3AF5BDAD391}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{EA7ADB7D-9FC1-4B4C-BBE9-359DD5B2E345}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{EA7ADB7D-9FC1-4B4C-BBE9-359DD5B2E345}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{EA7ADB7D-9FC1-4B4C-BBE9-359DD5B2E345}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{EA7ADB7D-9FC1-4B4C-BBE9-359DD5B2E345}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{901E005D-CD64-4DC5-8CD0-4A49A7B0AF71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{901E005D-CD64-4DC5-8CD0-4A49A7B0AF71}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{901E005D-CD64-4DC5-8CD0-4A49A7B0AF71}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{901E005D-CD64-4DC5-8CD0-4A49A7B0AF71}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{50FC1815-A653-48D0-95E2-DB48CB01F4E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{50FC1815-A653-48D0-95E2-DB48CB01F4E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{50FC1815-A653-48D0-95E2-DB48CB01F4E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{50FC1815-A653-48D0-95E2-DB48CB01F4E1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{70E05599-64EE-4C11-A2F8-EE4113309039}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{70E05599-64EE-4C11-A2F8-EE4113309039}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{70E05599-64EE-4C11-A2F8-EE4113309039}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{70E05599-64EE-4C11-A2F8-EE4113309039}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{EF768F7A-3C08-45EE-8A7E-BB5A81BADB7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{EF768F7A-3C08-45EE-8A7E-BB5A81BADB7B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{EF768F7A-3C08-45EE-8A7E-BB5A81BADB7B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{EF768F7A-3C08-45EE-8A7E-BB5A81BADB7B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {97A7013A-E1DE-4D11-93C5-212D0A7E85C9}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 246f31a0e00fea74a93125fec6d80da8
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,145 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using MonoFN.Collections.Generic;
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using MD = MonoFN.Cecil.Metadata;
|
||||
|
||||
namespace MonoFN.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;
|
||||
|
||||
var empty_dimensions = new Collection<ArrayDimension> ();
|
||||
empty_dimensions.Add (new ArrayDimension ());
|
||||
|
||||
Interlocked.CompareExchange (ref dimensions, empty_dimensions, null);
|
||||
|
||||
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,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7add098db82a032428c139b59f0878be
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,189 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using MonoFN.Collections.Generic;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
|
||||
namespace MonoFN.Cecil {
|
||||
|
||||
public sealed class AssemblyDefinition : ICustomAttributeProvider, ISecurityDeclarationProvider, IDisposable {
|
||||
|
||||
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 main_module.Read (ref modules, this, (_, reader) => reader.ReadModules ());
|
||||
|
||||
Interlocked.CompareExchange (ref modules, new Collection<ModuleDefinition> (1) { main_module }, null);
|
||||
return modules;
|
||||
}
|
||||
}
|
||||
|
||||
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 ?? (this.GetCustomAttributes (ref custom_attributes, 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 ?? (this.GetSecurityDeclarations (ref security_declarations, main_module)); }
|
||||
}
|
||||
|
||||
internal AssemblyDefinition ()
|
||||
{
|
||||
}
|
||||
|
||||
public void Dispose ()
|
||||
{
|
||||
if (this.modules == null) {
|
||||
main_module.Dispose ();
|
||||
return;
|
||||
}
|
||||
|
||||
var modules = this.Modules;
|
||||
for (int i = 0; i < modules.Count; i++)
|
||||
modules [i].Dispose ();
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
public void Write (string fileName)
|
||||
{
|
||||
Write (fileName, new WriterParameters ());
|
||||
}
|
||||
|
||||
public void Write (string fileName, WriterParameters parameters)
|
||||
{
|
||||
main_module.Write (fileName, parameters);
|
||||
}
|
||||
|
||||
public void Write ()
|
||||
{
|
||||
main_module.Write ();
|
||||
}
|
||||
|
||||
public void Write (WriterParameters parameters)
|
||||
{
|
||||
main_module.Write (parameters);
|
||||
}
|
||||
|
||||
public void Write (Stream stream)
|
||||
{
|
||||
Write (stream, new WriterParameters ());
|
||||
}
|
||||
|
||||
public void Write (Stream stream, WriterParameters parameters)
|
||||
{
|
||||
main_module.Write (stream, parameters);
|
||||
}
|
||||
|
||||
public override string ToString ()
|
||||
{
|
||||
return this.FullName;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1c1ac0fc48f2d424f9c0d9fa74b16b07
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,24 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
using System;
|
||||
|
||||
namespace MonoFN.Cecil {
|
||||
|
||||
[Flags]
|
||||
public enum AssemblyAttributes : uint {
|
||||
PublicKey = 0x0001,
|
||||
SideBySideCompatible = 0x0000,
|
||||
Retargetable = 0x0100,
|
||||
WindowsRuntime = 0x0200,
|
||||
DisableJITCompileOptimizer = 0x4000,
|
||||
EnableJITCompileTracking = 0x8000,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 257c8151138cda34dafbe0ca56ebedf4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user