From 811296b4afd0b5a65f30dbf572413c5be407b4c4 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Thu, 7 Mar 2024 16:11:04 -0500 Subject: [PATCH] [PRISM] Use new integer logic --- prism_compile.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index fff43d6f13..8b65ae7a7a 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -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; }