[PRISM] Use new integer logic
This commit is contained in:
parent
f5294ebbdb
commit
811296b4af
@ -125,16 +125,31 @@ static VALUE
|
|||||||
parse_integer(const pm_integer_node_t *node)
|
parse_integer(const pm_integer_node_t *node)
|
||||||
{
|
{
|
||||||
const pm_integer_t *integer = &node->value;
|
const pm_integer_t *integer = &node->value;
|
||||||
|
VALUE result;
|
||||||
|
|
||||||
VALUE result = UINT2NUM(integer->head.value);
|
if (integer->values == NULL) {
|
||||||
size_t shift = 0;
|
result = UINT2NUM(integer->value);
|
||||||
|
} else {
|
||||||
|
VALUE string = rb_str_new(NULL, integer->length * 8);
|
||||||
|
unsigned char *bytes = (unsigned char *) RSTRING_PTR(string);
|
||||||
|
|
||||||
for (pm_integer_word_t *node = integer->head.next; node != NULL; node = node->next) {
|
size_t offset = integer->length * 8;
|
||||||
VALUE receiver = rb_funcall(UINT2NUM(node->value), rb_intern("<<"), 1, ULONG2NUM(++shift * 32));
|
for (size_t value_index = 0; value_index < integer->length; value_index++) {
|
||||||
result = rb_funcall(receiver, rb_intern("|"), 1, result);
|
uint32_t value = integer->values[value_index];
|
||||||
|
|
||||||
|
for (int index = 0; index < 8; index++) {
|
||||||
|
int byte = (value >> (4 * index)) & 0xf;
|
||||||
|
bytes[--offset] = byte < 10 ? byte + '0' : byte - 10 + 'a';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = rb_funcall(string, rb_intern("to_i"), 1, UINT2NUM(16));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (integer->negative) {
|
||||||
|
result = rb_funcall(result, rb_intern("-@"), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (integer->negative) result = rb_funcall(result, rb_intern("-@"), 0);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user