diff options
| -rw-r--r-- | include/mruby/boxing_word.h | 34 | ||||
| -rw-r--r-- | src/numeric.c | 3 | ||||
| -rw-r--r-- | test/t/float.rb | 14 |
3 files changed, 29 insertions, 22 deletions
diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h index de48278da..1a0c59ddb 100644 --- a/include/mruby/boxing_word.h +++ b/include/mruby/boxing_word.h @@ -27,21 +27,20 @@ struct RCptr { void *p; }; -#define MRB_FIXNUM_SHIFT 1 - enum mrb_special_consts { - MRB_Qnil = 0, - MRB_Qfalse = 2, - MRB_Qtrue = 4, - MRB_Qundef = 6, + MRB_Qnil = 0, + MRB_Qfalse = 4, + MRB_Qtrue = 12, + MRB_Qundef = 20, }; +#define MRB_FIXNUM_SHIFT 1 +#define MRB_SYMBOL_SHIFT 2 +#define MRB_FIXNUM_FLAG (1 << (MRB_FIXNUM_SHIFT - 1)) +#define MRB_SYMBOL_FLAG (1 << (MRB_SYMBOL_SHIFT - 1)) +#define MRB_FIXNUM_MASK ((1 << MRB_FIXNUM_SHIFT) - 1) +#define MRB_SYMBOL_MASK ((1 << MRB_SYMBOL_SHIFT) - 1) #define MRB_IMMEDIATE_MASK 0x07 -#define MRB_FIXNUM_MASK 0x01 -#define MRB_SYMBOL_MASK 0x0f -#define MRB_FIXNUM_FLAG 0x01 -#define MRB_SYMBOL_FLAG 0x0e -#define MRB_SYMBOL_SHIFT 8 #ifdef MRB_64BIT #define MRB_SYMBOL_BITSIZE (sizeof(mrb_sym) * CHAR_BIT) @@ -58,6 +57,17 @@ enum mrb_special_consts { #define BOXWORD_SHIFT_VALUE_P(o,n) \ (((o).w & MRB_##n##_MASK) == MRB_##n##_FLAG) +/* + * mrb_value representation: + * + * nil : ...0000 0000 (all bits are zero) + * false : ...0000 0100 + * true : ...0000 1100 + * undef : ...0001 0100 + * fixnum: ...IIII III1 + * symbol: ...SSSS SS10 (high-order 32-bit are symbol value in 64-bit mode) + * object: ...PPPP P000 + */ typedef union mrb_value { union { void *p; @@ -100,7 +110,7 @@ MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float); #else #define mrb_symbol(o) BOXWORD_SHIFT_VALUE(o, SYMBOL, mrb_sym) #endif -#define mrb_bool(o) ((o).w != MRB_Qnil && (o).w != MRB_Qfalse) +#define mrb_bool(o) (((o).w & ~(unsigned long)MRB_Qfalse) != 0) #define mrb_immediate_p(o) ((o).w & MRB_IMMEDIATE_MASK || (o).w == MRB_Qnil) #define mrb_fixnum_p(o) BOXWORD_SHIFT_VALUE_P(o, FIXNUM) diff --git a/src/numeric.c b/src/numeric.c index 18b8ff461..638f75fd8 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -246,9 +246,6 @@ flo_to_s(mrb_state *mrb, mrb_value flt) str = mrb_float_to_str(mrb, flt, fmt); goto insert_dot_zero; } - else { - mrb_str_cat(mrb, str, ".0", 2); - } return str; } diff --git a/test/t/float.rb b/test/t/float.rb index 63bf83f40..dc989636f 100644 --- a/test/t/float.rb +++ b/test/t/float.rb @@ -212,10 +212,10 @@ assert('Float#to_s') do assert_equal("Infinity", Float::INFINITY.to_s) assert_equal("-Infinity", (-Float::INFINITY).to_s) assert_equal("NaN", Float::NAN.to_s) - assert_equal("0.0", 0.0.to_s) - assert_equal("-0.0", -0.0.to_s) + assert_equal("0", 0.0.to_s) + assert_equal("-0", -0.0.to_s) assert_equal("-3.25", -3.25.to_s) - assert_equal("50.0", 50.0.to_s) + assert_equal("50", 50.0.to_s) assert_equal("0.0125", 0.0125.to_s) assert_equal("-0.0125", -0.0125.to_s) assert_equal("1.0e-10", 0.0000000001.to_s) @@ -224,8 +224,8 @@ assert('Float#to_s') do assert_equal("-1.0e+20", -1e20.to_s) assert_equal("1.0e+16", 10000000000000000.0.to_s) assert_equal("-1.0e+16", -10000000000000000.0.to_s) - assert_equal("100000.0", 100000.0.to_s) - assert_equal("-100000.0", -100000.0.to_s) + assert_equal("100000", 100000.0.to_s) + assert_equal("-100000", -100000.0.to_s) if uses_float assert_equal("1.0e+08", 100000000.0.to_s) assert_equal("-1.0e+08", -100000000.0.to_s) @@ -234,8 +234,8 @@ assert('Float#to_s') do else assert_equal("1.0e+15", 1000000000000000.0.to_s) assert_equal("-1.0e+15", -1000000000000000.0.to_s) - assert_equal("100000000000000.0", 100000000000000.0.to_s) - assert_equal("-100000000000000.0", -100000000000000.0.to_s) + assert_equal("100000000000000", 100000000000000.0.to_s) + assert_equal("-100000000000000", -100000000000000.0.to_s) end end |
