summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--internal.h3
-rw-r--r--numeric.c6
-rw-r--r--parse.y4
4 files changed, 14 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 93a4c08a24..ae0a75ff34 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,7 @@
-Fri Aug 2 23:14:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Aug 2 23:48:36 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_yylex): calculate denominator directly as powers of
+ ten, not parsing string.
* parse.y (parser_number_literal_suffix): return bit set of found
suffixes.
diff --git a/internal.h b/internal.h
index 46d64b00fc..03acd3f8e1 100644
--- a/internal.h
+++ b/internal.h
@@ -503,6 +503,9 @@ VALUE rb_big_sq_fast(VALUE x);
/* io.c */
void rb_maygvl_fd_fix_cloexec(int fd);
+/* numeric.c */
+VALUE rb_int_positive_pow(long x, unsigned long y);
+
/* process.c */
int rb_exec_async_signal_safe(const struct rb_execarg *e, char *errmsg, size_t errmsg_buflen);
rb_pid_t rb_fork_async_signal_safe(int *status, int (*chfunc)(void*, char *, size_t), void *charg, VALUE fds, char *errmsg, size_t errmsg_buflen);
diff --git a/numeric.c b/numeric.c
index 05035b7c80..bdb0aaf854 100644
--- a/numeric.c
+++ b/numeric.c
@@ -2986,6 +2986,12 @@ int_pow(long x, unsigned long y)
return LONG2NUM(z);
}
+VALUE
+rb_int_positive_pow(long x, unsigned long y)
+{
+ return int_pow(x, y);
+}
+
/*
* call-seq:
* fix ** numeric -> numeric_result
diff --git a/parse.y b/parse.y
index e3c0caabfe..fa90c97ba9 100644
--- a/parse.y
+++ b/parse.y
@@ -7649,9 +7649,7 @@ parser_yylex(struct parser_params *parser)
type = tRATIONAL;
memmove(point, point+1, fraclen+1);
v = rb_cstr_to_inum(tok(), 10, FALSE);
- *point = '1';
- memset(point+1, '0', fraclen);
- v = rb_rational_new(v, rb_cstr_to_inum(point, 10, FALSE));
+ v = rb_rational_new(v, rb_int_positive_pow(10, fraclen));
}
else {
double d = strtod(tok(), 0);