summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-07-17 04:30:21 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-07-17 04:30:21 +0000
commit9e09b370c1cb15e94137e834e52d0ef00aed59c9 (patch)
tree41c2bfbe5d494034d45ae7b94b401d18076d1ef9 /parse.y
parentf180814e9dcd1d92e804331d92505b4c694ae1c8 (diff)
parse.y: parse_rational
* parse.y (parse_rational): extract from parse_numeric(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46844 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y17
1 files changed, 12 insertions, 5 deletions
diff --git a/parse.y b/parse.y
index f94bce378f..081cb3e291 100644
--- a/parse.y
+++ b/parse.y
@@ -6938,6 +6938,17 @@ parser_prepare(struct parser_params *parser)
space_seen && !ISSPACE(c) && \
(ambiguous_operator(op, syn), 0)))
+static VALUE
+parse_rational(struct parser_params *parser, char *str, int len, int seen_point)
+{
+ VALUE v;
+ char *point = &str[seen_point];
+ size_t fraclen = len-seen_point-1;
+ memmove(point, point+1, fraclen+1);
+ v = rb_cstr_to_inum(str, 10, FALSE);
+ return rb_rational_new(v, rb_int_positive_pow(10, fraclen));
+}
+
static int
parse_numeric(struct parser_params *parser, int c)
{
@@ -7156,12 +7167,8 @@ parse_numeric(struct parser_params *parser, int c)
suffix = number_literal_suffix(seen_e ? NUM_SUFFIX_I : NUM_SUFFIX_ALL);
if (suffix & NUM_SUFFIX_R) {
- char *point = &tok()[seen_point];
- size_t fraclen = toklen()-seen_point-1;
type = tRATIONAL;
- memmove(point, point+1, fraclen+1);
- v = rb_cstr_to_inum(tok(), 10, FALSE);
- v = rb_rational_new(v, rb_int_positive_pow(10, fraclen));
+ v = parse_rational(parser, tok(), toklen(), seen_point);
}
else {
double d = strtod(tok(), 0);