summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <[email protected]>2024-05-21 11:53:24 -0400
committerKevin Newton <[email protected]>2024-05-21 14:27:46 -0400
commit7a8f797cd4bf7bec1c6d9cba48971b63b1cb839c (patch)
tree096a2291bfa1750b6513516ee18cca52fdafe223
parent89efb94fec9c78caab7ec4079bfe9e3f4e56a9a4 (diff)
[PRISM] Use new rational layout
-rw-r--r--prism_compile.c47
1 files changed, 14 insertions, 33 deletions
diff --git a/prism_compile.c b/prism_compile.c
index 18f1d38b7d..b6e43d37f6 100644
--- a/prism_compile.c
+++ b/prism_compile.c
@@ -152,12 +152,11 @@ pm_location_line_number(const pm_parser_t *parser, const pm_location_t *location
}
/**
- * Convert the value of an integer node into a Ruby Integer.
+ * Parse the value of a pm_integer_t into a Ruby Integer.
*/
static VALUE
-parse_integer(const pm_integer_node_t *node)
+parse_integer_value(const pm_integer_t *integer)
{
- const pm_integer_t *integer = &node->value;
VALUE result;
if (integer->values == NULL) {
@@ -188,6 +187,15 @@ parse_integer(const pm_integer_node_t *node)
}
/**
+ * Convert the value of an integer node into a Ruby Integer.
+ */
+static inline VALUE
+parse_integer(const pm_integer_node_t *node)
+{
+ return parse_integer_value(&node->value);
+}
+
+/**
* Convert the value of a float node into a Ruby Float.
*/
static VALUE
@@ -205,36 +213,9 @@ parse_float(const pm_float_node_t *node)
static VALUE
parse_rational(const pm_rational_node_t *node)
{
- VALUE result;
-
- if (PM_NODE_TYPE_P(node->numeric, PM_FLOAT_NODE)) {
- const uint8_t *start = node->base.location.start;
- const uint8_t *end = node->base.location.end - 1;
- size_t length = end - start;
-
- char *buffer = malloc(length + 1);
- memcpy(buffer, start, length);
-
- buffer[length] = '\0';
-
- char *decimal = memchr(buffer, '.', length);
- RUBY_ASSERT(decimal);
- size_t seen_decimal = decimal - buffer;
- size_t fraclen = length - seen_decimal - 1;
- memmove(decimal, decimal + 1, fraclen + 1);
-
- VALUE numerator = rb_cstr_to_inum(buffer, 10, false);
- result = rb_rational_new(numerator, rb_int_positive_pow(10, fraclen));
-
- free(buffer);
- }
- else {
- RUBY_ASSERT(PM_NODE_TYPE_P(node->numeric, PM_INTEGER_NODE));
- VALUE numerator = parse_integer((const pm_integer_node_t *) node->numeric);
- result = rb_rational_raw(numerator, INT2FIX(1));
- }
-
- return result;
+ VALUE numerator = parse_integer_value(&node->numerator);
+ VALUE denominator = parse_integer_value(&node->denominator);
+ return rb_rational_new(numerator, denominator);
}
/**