mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #1108 from monaka/pr-cleanup-numeric.c-20130329
Cleanup numeric.c
This commit is contained in:
@@ -7,6 +7,8 @@
|
||||
#ifndef MRUBY_NUMERIC_H
|
||||
#define MRUBY_NUMERIC_H
|
||||
|
||||
#include "mrbconf.h"
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -15,8 +17,10 @@ extern "C" {
|
||||
#define NEGFIXABLE(f) ((f) >= MRB_INT_MIN)
|
||||
#define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f))
|
||||
|
||||
mrb_value mrb_flt2big(mrb_state *mrb, mrb_float d);
|
||||
mrb_value mrb_fix2str(mrb_state *mrb, mrb_value x, int base);
|
||||
mrb_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val);
|
||||
mrb_value mrb_flo_to_str(mrb_state *mrb, mrb_value flo, int max_digit);
|
||||
|
||||
mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base);
|
||||
|
||||
mrb_value mrb_fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y);
|
||||
mrb_value mrb_fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y);
|
||||
|
||||
@@ -806,7 +806,7 @@ retry:
|
||||
val = mrb_fixnum_value((mrb_int)mrb_float(val));
|
||||
goto bin_retry;
|
||||
}
|
||||
val = mrb_flt2big(mrb, mrb_float(val));
|
||||
val = mrb_flo_to_fixnum(mrb, val);
|
||||
if (mrb_fixnum_p(val)) goto bin_retry;
|
||||
break;
|
||||
case MRB_TT_STRING:
|
||||
@@ -843,7 +843,7 @@ retry:
|
||||
dots = 1;
|
||||
}
|
||||
else {
|
||||
val = mrb_fix2str(mrb, mrb_fixnum_value(v), base);
|
||||
val = mrb_fixnum_to_str(mrb, mrb_fixnum_value(v), base);
|
||||
}
|
||||
v = mrb_fixnum(mrb_str_to_inum(mrb, val, 10, 0/*Qfalse*/));
|
||||
}
|
||||
|
||||
+1
-1
@@ -1868,7 +1868,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
||||
mrb_value str = mrb_str_buf_new(mrb, 4);
|
||||
|
||||
mrb_str_buf_cat(mrb, str, "$", 1);
|
||||
mrb_str_buf_append(mrb, str, mrb_fix2str(mrb, fix, 10));
|
||||
mrb_str_buf_append(mrb, str, mrb_fixnum_to_str(mrb, fix, 10));
|
||||
sym = new_sym(s, mrb_intern_str(mrb, str));
|
||||
genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
|
||||
push();
|
||||
|
||||
+2
-2
@@ -80,7 +80,7 @@ get_pool_block_size(mrb_state *mrb, mrb_irep *irep)
|
||||
|
||||
switch (mrb_type(irep->pool[pool_no])) {
|
||||
case MRB_TT_FIXNUM:
|
||||
str = mrb_fix2str(mrb, irep->pool[pool_no], 10);
|
||||
str = mrb_fixnum_to_str(mrb, irep->pool[pool_no], 10);
|
||||
size += RSTRING_LEN(str);
|
||||
break;
|
||||
|
||||
@@ -123,7 +123,7 @@ write_pool_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
|
||||
|
||||
switch (mrb_type(irep->pool[pool_no])) {
|
||||
case MRB_TT_FIXNUM:
|
||||
str = mrb_fix2str(mrb, irep->pool[pool_no], 10);
|
||||
str = mrb_fixnum_to_str(mrb, irep->pool[pool_no], 10);
|
||||
char_ptr = RSTRING_PTR(str);
|
||||
len = RSTRING_LEN(str);
|
||||
break;
|
||||
|
||||
+27
-19
@@ -163,13 +163,19 @@ num_abs(mrb_state *mrb, mrb_value num)
|
||||
*/
|
||||
|
||||
mrb_value
|
||||
mrb_flo_to_str(mrb_state *mrb, mrb_float n, int max_digit)
|
||||
mrb_flo_to_str(mrb_state *mrb, mrb_value flo, int max_digit)
|
||||
{
|
||||
mrb_value result;
|
||||
mrb_float n;
|
||||
|
||||
if (max_digit > 40) {
|
||||
mrb_raise(mrb, E_RANGE_ERROR, "Too large max_digit.");
|
||||
}
|
||||
else if (!mrb_float_p(flo)) {
|
||||
mrb_raise(mrb, E_TYPE_ERROR, "non float value");
|
||||
}
|
||||
|
||||
n = mrb_float(flo);
|
||||
|
||||
if (isnan(n)) {
|
||||
result = mrb_str_new(mrb, "NaN", 3);
|
||||
@@ -270,9 +276,9 @@ static mrb_value
|
||||
flo_to_s(mrb_state *mrb, mrb_value flt)
|
||||
{
|
||||
#ifdef MRB_USE_FLOAT
|
||||
return mrb_flo_to_str(mrb, mrb_float(flt), 7);
|
||||
return mrb_flo_to_str(mrb, flt, 7);
|
||||
#else
|
||||
return mrb_flo_to_str(mrb, mrb_float(flt), 14);
|
||||
return mrb_flo_to_str(mrb, flt, 14);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1175,25 +1181,27 @@ fix_to_f(mrb_state *mrb, mrb_value num)
|
||||
* FloatDomainError: Infinity
|
||||
*/
|
||||
/* ------------------------------------------------------------------------*/
|
||||
static mrb_int
|
||||
flt2big(mrb_state *mrb, mrb_float d)
|
||||
mrb_value
|
||||
mrb_flo_to_fixnum(mrb_state *mrb, mrb_value x)
|
||||
{
|
||||
mrb_int z;
|
||||
|
||||
if (isinf(d)) {
|
||||
mrb_raise(mrb, E_FLOATDOMAIN_ERROR, d < 0 ? "-Infinity" : "Infinity");
|
||||
if (mrb_float_p(x)) {
|
||||
mrb_raise(mrb, E_TYPE_ERROR, "non float value");
|
||||
z = 0; /* not reached. just supress warnings. */
|
||||
}
|
||||
if (isnan(d)) {
|
||||
mrb_raise(mrb, E_FLOATDOMAIN_ERROR, "NaN");
|
||||
}
|
||||
z = (mrb_int)d;
|
||||
return z;
|
||||
}
|
||||
else {
|
||||
mrb_float d = mrb_float(x);
|
||||
|
||||
mrb_value
|
||||
mrb_flt2big(mrb_state *mrb, mrb_float d)
|
||||
{
|
||||
return mrb_fixnum_value(flt2big(mrb, d));
|
||||
if (isinf(d)) {
|
||||
mrb_raise(mrb, E_FLOATDOMAIN_ERROR, d < 0 ? "-Infinity" : "Infinity");
|
||||
}
|
||||
if (isnan(d)) {
|
||||
mrb_raise(mrb, E_FLOATDOMAIN_ERROR, "NaN");
|
||||
}
|
||||
z = (mrb_int)d;
|
||||
}
|
||||
return mrb_fixnum_value(z);
|
||||
}
|
||||
|
||||
mrb_value
|
||||
@@ -1276,7 +1284,7 @@ fix_minus(mrb_state *mrb, mrb_value self)
|
||||
|
||||
|
||||
mrb_value
|
||||
mrb_fix2str(mrb_state *mrb, mrb_value x, int base)
|
||||
mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base)
|
||||
{
|
||||
char buf[sizeof(mrb_int)*CHAR_BIT+1];
|
||||
char *b = buf + sizeof buf;
|
||||
@@ -1324,7 +1332,7 @@ fix_to_s(mrb_state *mrb, mrb_value self)
|
||||
mrb_int base = 10;
|
||||
|
||||
mrb_get_args(mrb, "|i", &base);
|
||||
return mrb_fix2str(mrb, self, base);
|
||||
return mrb_fixnum_to_str(mrb, self, base);
|
||||
}
|
||||
|
||||
/* 15.2.9.3.6 */
|
||||
|
||||
+1
-1
@@ -530,7 +530,7 @@ mrb_convert_to_integer(mrb_state *mrb, mrb_value val, int base)
|
||||
if (FIXABLE(mrb_float(val))) {
|
||||
break;
|
||||
}
|
||||
return mrb_flt2big(mrb, mrb_float(val));
|
||||
return mrb_flo_to_fixnum(mrb, val);
|
||||
|
||||
case MRB_TT_FIXNUM:
|
||||
if (base != 0) goto arg_error;
|
||||
|
||||
+2
-2
@@ -2537,7 +2537,7 @@ mrb_str_dump(mrb_state *mrb, mrb_value str)
|
||||
const char *ptr;
|
||||
int len;
|
||||
chr = mrb_fixnum_value(c & 0xff);
|
||||
octstr = mrb_fix2str(mrb, chr, 8);
|
||||
octstr = mrb_fixnum_to_str(mrb, chr, 8);
|
||||
ptr = mrb_str_body(octstr, &len);
|
||||
memcpy(q, "\\000", 4);
|
||||
memcpy(q + 4 - len, ptr, len);
|
||||
@@ -2629,7 +2629,7 @@ mrb_str_inspect(mrb_state *mrb, mrb_value str)
|
||||
const char *ptr;
|
||||
int len;
|
||||
chr = mrb_fixnum_value(c & 0xff);
|
||||
octstr = mrb_fix2str(mrb, chr, 8);
|
||||
octstr = mrb_fixnum_to_str(mrb, chr, 8);
|
||||
ptr = mrb_str_body(octstr, &len);
|
||||
memcpy(buf, "\\000", 4);
|
||||
memcpy(buf + 4 - len, ptr, len);
|
||||
|
||||
Reference in New Issue
Block a user