Module: ElfUtils::Types::ULEB128 Private
- Extended by:
- CTypes::Type
- Defined in:
- lib/elf_utils/types/uleb128.rb,
ext/elf_utils/elf_utils.c
This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.
Class Method Summary collapse
- .fixed_size? ⇒ Boolean private
- .greedy? ⇒ Boolean private
-
.pack(value, endian: default_endian, validate: true) ⇒ Object
private
provide a method for packing the ruby value into the binary representation.
- .size ⇒ Object private
-
.unpack_one(*args) ⇒ Object
private
Define the class method (static function) in the class.
-
.unpack_one_ruby(buf, endian: default_endian) ⇒ Object
private
provide a method for unpacking an instance of this type from a String, and returning both the unpacked value, and any unused input.
Class Method Details
.fixed_size? ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
17 18 19 |
# File 'lib/elf_utils/types/uleb128.rb', line 17 def self.fixed_size? false end |
.greedy? ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
25 26 27 |
# File 'lib/elf_utils/types/uleb128.rb', line 25 def self.greedy? false end |
.pack(value, endian: default_endian, validate: true) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
provide a method for packing the ruby value into the binary representation
30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/elf_utils/types/uleb128.rb', line 30 def self.pack(value, endian: default_endian, validate: true) return "\0" if value == 0 buf = +"" while value != 0 byte = (value & 0x7f) value >>= 7 byte |= 0x80 if value != 0 buf << byte end buf end |
.size ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
21 22 23 |
# File 'lib/elf_utils/types/uleb128.rb', line 21 def self.size @size end |
.unpack_one(*args) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Define the class method (static function) in the class
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'ext/elf_utils/elf_utils.c', line 8
static VALUE
uleb128_unpack_one(int argc, VALUE *argv, VALUE self)
{
if (argc < 1) {
rb_raise(rb_eArgError,
"wrong number of arguments (given %d, expected at least 1)", argc);
}
char *buf = StringValuePtr(argv[0]);
size_t len = rb_str_length(argv[0]);
size_t offset = 0;
uint64_t result = 0; // ran into conversion issues when using 128bit
int shift = 0;
while (offset < len) {
uint8_t byte = *(buf + offset++);
result |= (uint64_t)(byte & 0x7F) << shift;
// If the MSB is not set, we're done
if ((byte & 0x80) == 0) {
// not returning a bigint here because the dry-types enum does not
// return the correct value for BigInts.
return rb_ary_new3(2, rb_uint2inum(result),
rb_str_substr(argv[0], offset, len - offset));
}
// Move to the next 7 bits
shift += 7;
}
rb_raise(rb_eRuntimeError, "ULEB128 string did not contain a terminator");
}
|
.unpack_one_ruby(buf, endian: default_endian) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
provide a method for unpacking an instance of this type from a String, and returning both the unpacked value, and any unused input
44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/elf_utils/types/uleb128.rb', line 44 def self.unpack_one_ruby(buf, endian: default_endian) value = 0 shift = 0 len = 0 buf.each_byte do |b| len += 1 value |= ((b & 0x7f) << shift) return value, buf.byteslice(len...) if (b & 0x80) == 0 shift += 7 end raise TerminatorNotFoundError end |