Module: Wardite::Leb128Helper
- Included in:
- BinaryLoader
- Defined in:
- lib/wardite/leb128.rb
Class Method Summary collapse
Class Method Details
.fetch_sleb128(buf, max_level: 8) ⇒ Object
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/wardite/leb128.rb', line 32 def fetch_sleb128(buf, max_level: 8) dest = 0 level = 0 while b = buf.read(1) raise LoadError, "buffer too short" unless b c = b.ord upper, lower = (c >> 7), (c & (1 << 7) - 1) dest |= lower << (7 * level) if upper == 0 break end if level > max_level raise "unreachable! debug: dest = #{dest} level = #{level}" end level += 1 end shift = 7 * (level + 1) - 1 return dest | -(dest & (1 << shift)) end |
.fetch_uleb128(buf, max_level: 8) ⇒ Object
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/wardite/leb128.rb', line 7 def fetch_uleb128(buf, max_level: 8) dest = 0 level = 0 while b = buf.read(1) raise LoadError, "buffer too short" unless b c = b.ord return c if c < 0x80 && level.zero? upper, lower = (c >> 7), (c & (1 << 7) - 1) dest |= lower << (7 * level) if upper == 0 return dest end if level > max_level break end level += 1 end # unreachable but... raise "unreachable! debug: dest = #{dest} level = #{level}" end |