1 /* 2 * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org> 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining 5 * a copy of this software and associated documentation files (the 6 * "Software"), to deal in the Software without restriction, including 7 * without limitation the rights to use, copy, modify, merge, publish, 8 * distribute, sublicense, and/or sell copies of the Software, and to 9 * permit persons to whom the Software is furnished to do so, subject to 10 * the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be 13 * included in all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 */ 24 25 using System; 26 27 class CodeElementJump : CodeElement { 28 29 uint jumpType; 30 CodeElement target; 31 CodeElementJump(uint jumpType)32 internal CodeElementJump(uint jumpType) 33 { 34 this.jumpType = jumpType; 35 } 36 37 /* obsolete 38 internal override int Length { 39 get { 40 int len = Encode7EUnsigned(jumpType, null); 41 int joff = JumpOff; 42 if (joff == Int32.MinValue) { 43 len ++; 44 } else { 45 len += Encode7ESigned(joff, null); 46 } 47 return len; 48 } 49 } 50 */ 51 GetLength(bool oneByteCode)52 internal override int GetLength(bool oneByteCode) 53 { 54 int len = oneByteCode ? 1 : Encode7EUnsigned(jumpType, null); 55 int joff = JumpOff; 56 if (joff == Int32.MinValue) { 57 len ++; 58 } else { 59 len += Encode7ESigned(joff, null); 60 } 61 return len; 62 } 63 SetJumpTarget(CodeElement target)64 internal override void SetJumpTarget(CodeElement target) 65 { 66 this.target = target; 67 } 68 69 int JumpOff { 70 get { 71 if (target == null || Address < 0 || target.Address < 0) 72 { 73 return Int32.MinValue; 74 } else { 75 return target.Address - (Address + LastLength); 76 } 77 } 78 } 79 Encode(BlobWriter bw, bool oneByteCode)80 internal override int Encode(BlobWriter bw, bool oneByteCode) 81 { 82 if (bw == null) { 83 return GetLength(oneByteCode); 84 } 85 int len; 86 if (oneByteCode) { 87 len = EncodeOneByte(jumpType, bw); 88 } else { 89 len = Encode7EUnsigned(jumpType, bw); 90 } 91 int joff = JumpOff; 92 if (joff == Int32.MinValue) { 93 throw new Exception("Unresolved addresses"); 94 } 95 return len + Encode7ESigned(joff, bw); 96 } 97 } 98