[PRISM] Use new integer logic

This commit is contained in:
Kevin Newton 2024-03-07 16:11:04 -05:00
parent f5294ebbdb
commit 811296b4af

View File

@ -125,16 +125,31 @@ static VALUE
parse_integer(const pm_integer_node_t *node)
{
const pm_integer_t *integer = &node->value;
VALUE result;
VALUE result = UINT2NUM(integer->head.value);
size_t shift = 0;
if (integer->values == NULL) {
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) {
VALUE receiver = rb_funcall(UINT2NUM(node->value), rb_intern("<<"), 1, ULONG2NUM(++shift * 32));
result = rb_funcall(receiver, rb_intern("|"), 1, result);
size_t offset = integer->length * 8;
for (size_t value_index = 0; value_index < integer->length; value_index++) {
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;
}