mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
455 lines
14 KiB
455 lines
14 KiB
// |
|
// OpCode.cs |
|
// |
|
// Author: |
|
// Jb Evain (jbevain@gmail.com) |
|
// |
|
// Copyright (c) 2008 - 2011 Jb Evain |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining |
|
// a copy of this software and associated documentation files (the |
|
// "Software"), to deal in the Software without restriction, including |
|
// without limitation the rights to use, copy, modify, merge, publish, |
|
// distribute, sublicense, and/or sell copies of the Software, and to |
|
// permit persons to whom the Software is furnished to do so, subject to |
|
// the following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be |
|
// included in all copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
// |
|
|
|
namespace Mono.Cecil.Cil { |
|
|
|
public enum FlowControl { |
|
Branch, |
|
Break, |
|
Call, |
|
Cond_Branch, |
|
Meta, |
|
Next, |
|
Phi, |
|
Return, |
|
Throw, |
|
} |
|
|
|
public enum OpCodeType { |
|
Annotation, |
|
Macro, |
|
Nternal, |
|
Objmodel, |
|
Prefix, |
|
Primitive, |
|
} |
|
|
|
public enum OperandType { |
|
InlineBrTarget, |
|
InlineField, |
|
InlineI, |
|
InlineI8, |
|
InlineMethod, |
|
InlineNone, |
|
InlinePhi, |
|
InlineR, |
|
InlineSig, |
|
InlineString, |
|
InlineSwitch, |
|
InlineTok, |
|
InlineType, |
|
InlineVar, |
|
InlineArg, |
|
ShortInlineBrTarget, |
|
ShortInlineI, |
|
ShortInlineR, |
|
ShortInlineVar, |
|
ShortInlineArg, |
|
} |
|
|
|
public enum StackBehaviour { |
|
Pop0, |
|
Pop1, |
|
Pop1_pop1, |
|
Popi, |
|
Popi_pop1, |
|
Popi_popi, |
|
Popi_popi8, |
|
Popi_popi_popi, |
|
Popi_popr4, |
|
Popi_popr8, |
|
Popref, |
|
Popref_pop1, |
|
Popref_popi, |
|
Popref_popi_popi, |
|
Popref_popi_popi8, |
|
Popref_popi_popr4, |
|
Popref_popi_popr8, |
|
Popref_popi_popref, |
|
PopAll, |
|
Push0, |
|
Push1, |
|
Push1_push1, |
|
Pushi, |
|
Pushi8, |
|
Pushr4, |
|
Pushr8, |
|
Pushref, |
|
Varpop, |
|
Varpush, |
|
} |
|
|
|
public struct OpCode { |
|
|
|
readonly byte op1; |
|
readonly byte op2; |
|
readonly byte code; |
|
readonly byte flow_control; |
|
readonly byte opcode_type; |
|
readonly byte operand_type; |
|
readonly byte stack_behavior_pop; |
|
readonly byte stack_behavior_push; |
|
|
|
public string Name { |
|
get { return OpCodeNames.names [(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); |
|
} |
|
} |
|
} |
|
}
|
|
|