+2003-10-18 Jackson Harper <jackson@ximian.com>
+
+ * PEAPI.cs: Add proper support for short instructions, removing
+ PEAPI's auto selection of short/long branch operations feature.
+
2003-10-10 Jackson Harper <jackson@ximian.com>
* PEAPI.cs: New GenericMethodSig class for creating generic method
/// <summary>\r
/// CIL branch instructions\r
/// </summary>\r
- public enum BranchOp {br = 0x2B, brfalse, brtrue, beq, bge, bgt, ble, blt,\r
- bne_un, bge_un, bgt_un, ble_un, blt_un, leave = 0xDE }\r
+ public enum BranchOp {
+ // short branches
+ br_s = 0x2B, 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,
+ // long branches
+ br = 0x38, brfalse, brtrue, beq, bge, bgt, ble, blt,\r
+ bne_un, bge_un, bgt_un, ble_un, blt_un,
+
+ leave = 0xDD, leave_s }\r
\r
/// <summary>\r
/// Index for all the tables in the meta data\r
dest = dst;\r
dest.AddBranch(this);\r
size++;\r
+
+ if (inst >= (int) BranchOp.br && inst != (int) BranchOp.leave_s) {
+ shortVer = false;
+ size += 3;
+ }
}\r
\r
internal sealed override bool Check(MetaData md) {\r
target = (int)dest.GetLabelOffset() - (int)(offset + size);\r
- if (shortVer && ((target < minByteVal) || (target > maxByteVal))) {\r
- if (instr < (int)BranchOp.leave) instr += longInstrOffset;\r
- else instr--;\r
- shortVer = false;\r
- size += 3;\r
- return true;\r
- }\r
- return false;\r
+ return false;
}\r
-\r
+
internal sealed override void Write(FileImage output) {\r
base.Write(output);\r
if (shortVer)\r