diff options
| -rw-r--r-- | build_config/no-float.rb | 21 | ||||
| -rw-r--r-- | mrbgems/mruby-bin-mruby/bintest/mruby.rb | 7 | ||||
| -rw-r--r-- | mrbgems/mruby-binding-core/src/binding-core.c | 5 | ||||
| -rw-r--r-- | mrbgems/mruby-enum-ext/test/enum.rb | 9 | ||||
| -rw-r--r-- | mrbgems/mruby-enum-lazy/test/lazy.rb | 2 | ||||
| -rw-r--r-- | mrbgems/mruby-enumerator/test/enumerator.rb | 4 | ||||
| -rw-r--r-- | mrbgems/mruby-method/test/method.rb | 3 | ||||
| -rw-r--r-- | mrbgems/mruby-pack/test/pack.rb | 3 | ||||
| -rw-r--r-- | mrbgems/mruby-random/src/random.c | 66 | ||||
| -rw-r--r-- | mrbgems/mruby-random/test/random.rb | 1 | ||||
| -rw-r--r-- | mrbgems/mruby-time/src/time.c | 2 | ||||
| -rw-r--r-- | mrbgems/mruby-time/test/time.rb | 28 | ||||
| -rw-r--r-- | mrblib/numeric.rb | 4 | ||||
| -rw-r--r-- | src/numeric.c | 13 | ||||
| -rw-r--r-- | test/t/integer.rb | 40 |
15 files changed, 100 insertions, 108 deletions
diff --git a/build_config/no-float.rb b/build_config/no-float.rb index e0738cac4..977bf4e12 100644 --- a/build_config/no-float.rb +++ b/build_config/no-float.rb @@ -1,17 +1,22 @@ -# Define cross build settings -MRuby::CrossBuild.new('no-float') do |conf| - conf.toolchain +MRuby::Build.new do |conf| + # load specific toolchain settings + toolchain :gcc + + # include the GEM box + conf.gembox "stdlib" + conf.gembox "stdlib-ext" + conf.gembox "stdlib-io" + conf.gembox "metaprog" + + conf.gem :core => 'mruby-bin-mruby' + conf.gem :core => 'mruby-bin-mirb' # Add configuration conf.compilers.each do |c| c.defines << "MRB_NO_FLOAT" end - conf.gem :core => "mruby-bin-mruby" - - conf.test_runner.command = 'env' - conf.enable_debug -# conf.enable_bintest conf.enable_test + conf.enable_bintest end diff --git a/mrbgems/mruby-bin-mruby/bintest/mruby.rb b/mrbgems/mruby-bin-mruby/bintest/mruby.rb index a1952ca6d..bc25f18c1 100644 --- a/mrbgems/mruby-bin-mruby/bintest/mruby.rb +++ b/mrbgems/mruby-bin-mruby/bintest/mruby.rb @@ -44,13 +44,6 @@ assert 'ARGV value' do assert_mruby("[]\n", "", true, %w[-e p(ARGV)]) end -assert('float literal') do - script, bin = Tempfile.new('test.rb'), Tempfile.new('test.mrb') - File.write script.path, 'p [3.21, 2e308.infinite?, -2e308.infinite?]' - system "#{cmd('mrbc')} -g -o #{bin.path} #{script.path}" - assert_equal "[3.21, 1, -1]", `#{cmd('mruby')} #{bin.path}`.chomp! -end - assert '__END__', '8.6' do script = Tempfile.new('test.rb') diff --git a/mrbgems/mruby-binding-core/src/binding-core.c b/mrbgems/mruby-binding-core/src/binding-core.c index 209da8bf9..1454f5945 100644 --- a/mrbgems/mruby-binding-core/src/binding-core.c +++ b/mrbgems/mruby-binding-core/src/binding-core.c @@ -188,10 +188,8 @@ binding_source_location(mrb_state *mrb, mrb_value self) if (!proc || MRB_PROC_CFUNC_P(proc) || !proc->upper || MRB_PROC_CFUNC_P(proc->upper)) { srcloc = mrb_nil_value(); - goto cache_source_location; } - - { + else { const mrb_irep *irep = proc->upper->body.irep; mrb_int pc = binding_extract_pc(mrb, self); if (pc < 0) { @@ -210,7 +208,6 @@ binding_source_location(mrb_state *mrb, mrb_value self) } } -cache_source_location: if (!mrb_frozen_p(mrb_obj_ptr(self))) { mrb_iv_set(mrb, self, MRB_SYM(source_location), srcloc); } diff --git a/mrbgems/mruby-enum-ext/test/enum.rb b/mrbgems/mruby-enum-ext/test/enum.rb index f0301a2d9..31181fe1a 100644 --- a/mrbgems/mruby-enum-ext/test/enum.rb +++ b/mrbgems/mruby-enum-ext/test/enum.rb @@ -100,7 +100,6 @@ end assert("Enumerable#none?") do assert_true %w(ant bear cat).none? { |word| word.length == 5 } assert_false %w(ant bear cat).none? { |word| word.length >= 4 } - assert_false [1, 3.14, 42].none?(Float) assert_true [].none? assert_true [nil, false].none? assert_false [nil, true].none? @@ -110,21 +109,21 @@ assert("Enumerable#one?") do assert_true %w(ant bear cat).one? { |word| word.length == 4 } assert_false %w(ant bear cat).one? { |word| word.length > 4 } assert_false %w(ant bear cat).one? { |word| word.length < 4 } - assert_true [1, 3.14, 42].one?(Float) assert_false [nil, true, 99].one? assert_true [nil, true, false].one? assert_true [ nil, true, 99 ].one?(Integer) assert_false [].one? + assert_true [nil, true, false].one?(NilClass) end assert("Enumerable#all? (enhancement)") do - assert_false [1, 2, 3.14].all?(Integer) - assert_true [1, 2, 3.14].all?(Numeric) + assert_false [1, 2, nil].all?(Integer) + assert_true [1, 2, 3].all?(Numeric) end assert("Enumerable#any? (enhancement)") do - assert_false [1, 2, 3].all?(Float) assert_true [nil, true, 99].any?(Integer) + assert_false [1, 2, 3].any?(Array) end assert("Enumerable#each_with_object") do diff --git a/mrbgems/mruby-enum-lazy/test/lazy.rb b/mrbgems/mruby-enum-lazy/test/lazy.rb index 1a55d30cf..e8277f3d3 100644 --- a/mrbgems/mruby-enum-lazy/test/lazy.rb +++ b/mrbgems/mruby-enum-lazy/test/lazy.rb @@ -41,7 +41,7 @@ assert("Enumerator::Lazy laziness") do end assert("Enumerator::Lazy#to_enum") do - lazy_enum = (0..Float::INFINITY).lazy.to_enum(:each_slice, 2) + lazy_enum = (0..).lazy.to_enum(:each_slice, 2) assert_kind_of Enumerator::Lazy, lazy_enum assert_equal [0*1, 2*3, 4*5, 6*7], lazy_enum.map { |a| a.first * a.last }.first(4) end diff --git a/mrbgems/mruby-enumerator/test/enumerator.rb b/mrbgems/mruby-enumerator/test/enumerator.rb index fa70f9eea..3e0c6c3be 100644 --- a/mrbgems/mruby-enumerator/test/enumerator.rb +++ b/mrbgems/mruby-enumerator/test/enumerator.rb @@ -552,10 +552,10 @@ assert 'Range#each' do end assert 'Enumerable#zip' do - assert_equal [[1, 10], [2, 11], [3, 12]], [1,2,3].zip(10..Float::INFINITY) + assert_equal [[1, 10], [2, 11], [3, 12]], [1,2,3].zip(10..) ret = [] - assert_equal nil, [1,2,3].zip(10..Float::INFINITY) { |i| ret << i } + assert_equal nil, [1,2,3].zip(10..) { |i| ret << i } assert_equal [[1, 10], [2, 11], [3, 12]], ret assert_raise(TypeError) { [1].zip(1) } diff --git a/mrbgems/mruby-method/test/method.rb b/mrbgems/mruby-method/test/method.rb index a7db20031..675277726 100644 --- a/mrbgems/mruby-method/test/method.rb +++ b/mrbgems/mruby-method/test/method.rb @@ -406,8 +406,9 @@ end assert 'UnboundMethod#==' do assert_false(Integer.instance_method(:+) == Integer.instance_method(:-)) assert_true(Integer.instance_method(:+) == Integer.instance_method(:+)) - assert_false(Integer.instance_method(:+) == Float.instance_method(:+)) assert_true(UnboundMethod.instance_method(:==) == UnboundMethod.instance_method(:eql?)) + skip unless Object.const_defined?(:Float) + assert_false(Integer.instance_method(:+) == Float.instance_method(:+)) end assert 'UnboundMethod#super_method' do diff --git a/mrbgems/mruby-pack/test/pack.rb b/mrbgems/mruby-pack/test/pack.rb index 6832adcc7..a248174a5 100644 --- a/mrbgems/mruby-pack/test/pack.rb +++ b/mrbgems/mruby-pack/test/pack.rb @@ -1,3 +1,4 @@ +# coding: utf-8 PACK_IS_LITTLE_ENDIAN = "\x01\00".unpack('S')[0] == 0x01 def assert_pack tmpl, packed, unpacked @@ -91,6 +92,7 @@ assert('issue #1') do end assert 'pack float' do + skip unless Object.const_defined?(:Float) assert_pack 'e', "\x00\x00@@", [3.0] assert_pack 'g', "@@\x00\x00", [3.0] @@ -104,6 +106,7 @@ assert 'pack float' do end assert 'pack double' do + skip unless Object.const_defined?(:Float) assert_pack 'E', "\x00\x00\x00\x00\x00\x00\b@", [3.0] assert_pack 'G', "@\b\x00\x00\x00\x00\x00\x00", [3.0] diff --git a/mrbgems/mruby-random/src/random.c b/mrbgems/mruby-random/src/random.c index 67c6395d7..9712fbd7e 100644 --- a/mrbgems/mruby-random/src/random.c +++ b/mrbgems/mruby-random/src/random.c @@ -120,43 +120,33 @@ rand_real(rand_state *t) #endif static mrb_value -random_rand(mrb_state *mrb, rand_state *t, mrb_value max) +random_rand(mrb_state *mrb, rand_state *t, mrb_int max) { - mrb_value value; - - if (mrb_integer(max) == 0) { + if (max == 0) { #ifndef MRB_NO_FLOAT - value = mrb_float_value(mrb, rand_real(t)); + return mrb_float_value(mrb, rand_real(t)); #else - mrb_raise(mrb, E_ARGUMENT_ERROR, "Float not supported"); + max = 100; #endif } - else { - value = mrb_int_value(mrb, rand_uint32(t) % mrb_integer(max)); - } + return mrb_int_value(mrb, rand_uint32(t) % max); +} - return value; +static mrb_int +random_rand_i(mrb_state *mrb, rand_state *t, mrb_int max) +{ + return rand_uint32(t) % max; } -static mrb_value +static mrb_int get_opt(mrb_state* mrb) { - mrb_value arg; + mrb_int arg; - arg = mrb_nil_value(); - mrb_get_args(mrb, "|o", &arg); - - if (!mrb_nil_p(arg)) { - mrb_int i; - - arg = mrb_to_int(mrb, arg); - i = mrb_integer(arg); - if (i < 0) { - if (i == MRB_INT_MIN) { - mrb_raise(mrb, E_RANGE_ERROR, "integer underflow"); - } - arg = mrb_fixnum_value(0 - i); - } + arg = 0; + mrb_get_args(mrb, "|i", &arg); + if (arg < 0) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument"); } return arg; } @@ -185,17 +175,15 @@ random_default(mrb_state *mrb) { static mrb_value random_m_init(mrb_state *mrb, mrb_value self) { - mrb_value seed; + mrb_int seed; rand_state *t; - seed = get_opt(mrb); - /* avoid memory leaks */ t = random_ptr(self); - if (mrb_nil_p(seed)) { + if (mrb_get_args(mrb, "|i", &seed) == 0) { rand_init(t); } else { - rand_seed(t, (uint32_t)mrb_integer(seed)); + rand_seed(t, (uint32_t)seed); } return self; @@ -204,7 +192,7 @@ random_m_init(mrb_state *mrb, mrb_value self) static mrb_value random_m_rand(mrb_state *mrb, mrb_value self) { - mrb_value max; + mrb_int max; rand_state *t = random_ptr(self); max = get_opt(mrb); @@ -216,15 +204,14 @@ random_m_srand(mrb_state *mrb, mrb_value self) { uint32_t seed; uint32_t old_seed; - mrb_value sv; + mrb_int i; rand_state *t = random_ptr(self); - sv = get_opt(mrb); - if (mrb_nil_p(sv)) { + if (mrb_get_args(mrb, "|i", &i) == 0) { seed = (uint32_t)time(NULL) + rand_uint32(t); } else { - seed = (uint32_t)mrb_integer(sv); + seed = (uint32_t)i; } old_seed = rand_seed(t, seed); @@ -241,8 +228,7 @@ random_m_srand(mrb_state *mrb, mrb_value self) static mrb_value mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary) { - mrb_int i; - mrb_value max; + mrb_int i, max; mrb_value r = mrb_nil_value(); rand_state *random; @@ -285,13 +271,13 @@ mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary) random = random_ptr(r); } mrb_ary_modify(mrb, mrb_ary_ptr(ary)); - max = mrb_fixnum_value(RARRAY_LEN(ary)); + max = RARRAY_LEN(ary); for (i = RARRAY_LEN(ary) - 1; i > 0; i--) { mrb_int j; mrb_value *ptr = RARRAY_PTR(ary); mrb_value tmp; - j = mrb_integer(random_rand(mrb, random, max)); + j = random_rand_i(mrb, random, max); tmp = ptr[i]; ptr[i] = ptr[j]; diff --git a/mrbgems/mruby-random/test/random.rb b/mrbgems/mruby-random/test/random.rb index f3067748b..37583c5d3 100644 --- a/mrbgems/mruby-random/test/random.rb +++ b/mrbgems/mruby-random/test/random.rb @@ -34,6 +34,7 @@ end assert("return class of Kernel.rand") do assert_kind_of(Integer, rand(3)) assert_kind_of(Integer, rand(1.5)) + skip unless Object.const_defined?(:Float) assert_kind_of(Float, rand) assert_kind_of(Float, rand(0.5)) end diff --git a/mrbgems/mruby-time/src/time.c b/mrbgems/mruby-time/src/time.c index 44bea5ffa..2a5e9dd6b 100644 --- a/mrbgems/mruby-time/src/time.c +++ b/mrbgems/mruby-time/src/time.c @@ -226,6 +226,7 @@ typedef mrb_int mrb_sec; (sizeof(time_t) <= 4 ? INT32_MAX : INT64_MAX) \ ) +#ifndef MRB_NO_FLOAT /* return true if time_t is fit in mrb_int */ static mrb_bool fixable_time_t_p(time_t v) @@ -236,6 +237,7 @@ fixable_time_t_p(time_t v) if (MRB_INT_MIN > (mrb_int)v) return FALSE; return TRUE; } +#endif static time_t mrb_to_time_t(mrb_state *mrb, mrb_value obj, time_t *usec) diff --git a/mrbgems/mruby-time/test/time.rb b/mrbgems/mruby-time/test/time.rb index be1de7bc6..e239dec28 100644 --- a/mrbgems/mruby-time/test/time.rb +++ b/mrbgems/mruby-time/test/time.rb @@ -12,6 +12,7 @@ end assert('Time.at', '15.2.19.6.1') do assert_kind_of(Time, Time.at(1300000000.0)) + skip unless Object.const_defined?(:Float) assert_raise(FloatDomainError) { Time.at(Float::NAN) } assert_raise(FloatDomainError) { Time.at(Float::INFINITY) } assert_raise(FloatDomainError) { Time.at(-Float::INFINITY) } @@ -69,31 +70,33 @@ assert('Time.utc', '15.2.19.6.6') do end assert('Time#+', '15.2.19.7.1') do - t1 = Time.at(1300000000.0) + t1 = Time.at(1300000000) t2 = t1.+(60) assert_equal("Sun Mar 13 07:07:40 2011", t2.utc.asctime) + skip unless Object.const_defined?(:Float) assert_raise(FloatDomainError) { Time.at(0) + Float::NAN } assert_raise(FloatDomainError) { Time.at(0) + Float::INFINITY } assert_raise(FloatDomainError) { Time.at(0) + -Float::INFINITY } end assert('Time#-', '15.2.19.7.2') do - t1 = Time.at(1300000000.0) + t1 = Time.at(1300000000) t2 = t1.-(60) assert_equal("Sun Mar 13 07:05:40 2011", t2.utc.asctime) + skip unless Object.const_defined?(:Float) assert_raise(FloatDomainError) { Time.at(0) - Float::NAN } assert_raise(FloatDomainError) { Time.at(0) - Float::INFINITY } assert_raise(FloatDomainError) { Time.at(0) - -Float::INFINITY } end assert('Time#<=>', '15.2.19.7.3') do - t1 = Time.at(1300000000.0) - t2 = Time.at(1400000000.0) - t3 = Time.at(1500000000.0) + t1 = Time.at(1300000000) + t2 = Time.at(1400000000) + t3 = Time.at(1500000000) assert_equal(1, t2 <=> t1) assert_equal(0, t2 <=> t2) @@ -118,7 +121,7 @@ assert('Time#dst?', '15.2.19.7.7') do end assert('Time#getgm', '15.2.19.7.8') do - assert_equal("Sun Mar 13 07:06:40 2011", Time.at(1300000000.0).getgm.asctime) + assert_equal("Sun Mar 13 07:06:40 2011", Time.at(1300000000).getgm.asctime) end assert('Time#getlocal', '15.2.19.7.9') do @@ -131,11 +134,11 @@ assert('Time#getlocal', '15.2.19.7.9') do end assert('Time#getutc', '15.2.19.7.10') do - assert_equal("Sun Mar 13 07:06:40 2011", Time.at(1300000000.0).getutc.asctime) + assert_equal("Sun Mar 13 07:06:40 2011", Time.at(1300000000).getutc.asctime) end assert('Time#gmt?', '15.2.19.7.11') do - assert_predicate(Time.at(1300000000.0).utc, :gmt?) + assert_predicate(Time.at(1300000000).utc, :gmt?) end # ATM not implemented @@ -192,14 +195,17 @@ assert('Times#sec', '15.2.19.7.23') do end assert('Time#to_f', '15.2.19.7.24') do + skip unless Object.const_defined?(:Float) assert_operator(2.0, :eql?, Time.at(2).to_f) end assert('Time#to_i', '15.2.19.7.25') do - assert_operator(2, :eql?, Time.at(2.0).to_i) + assert_operator(2, :eql?, Time.at(2).to_i) end assert('Time#usec', '15.2.19.7.26') do + assert_equal(0, Time.at(1300000000).usec) + skip unless Object.const_defined?(:Float) assert_equal(0, Time.at(1300000000.0).usec) end @@ -210,7 +216,7 @@ assert('Time#utc', '15.2.19.7.27') do end assert('Time#utc?', '15.2.19.7.28') do - assert_predicate(Time.at(1300000000.0).utc, :utc?) + assert_predicate(Time.at(1300000000).utc, :utc?) end # ATM not implemented @@ -229,7 +235,7 @@ assert('Time#year', '15.2.19.7.32') do end assert('Time#zone', '15.2.19.7.33') do - assert_equal('UTC', Time.at(1300000000.0).utc.zone) + assert_equal('UTC', Time.at(1300000000).utc.zone) end # Not ISO specified diff --git a/mrblib/numeric.rb b/mrblib/numeric.rb index 1bce9c204..71f788b83 100644 --- a/mrblib/numeric.rb +++ b/mrblib/numeric.rb @@ -130,7 +130,7 @@ class Integer # Returns the receiver simply. # # ISO 15.2.8.3.14 - def ceil + def ceil(n=0) self end @@ -138,7 +138,7 @@ class Integer # Returns the receiver simply. # # ISO 15.2.8.3.17 - def floor + def floor(n=0) self end diff --git a/src/numeric.c b/src/numeric.c index dfd5e14eb..fe1a18f04 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -76,12 +76,13 @@ int_zerodiv(mrb_state *mrb) static mrb_value int_pow(mrb_state *mrb, mrb_value x) { - mrb_value y = mrb_get_arg1(mrb); mrb_int base = mrb_integer(x); mrb_int result = 1; mrb_int exp; #ifndef MRB_NO_FLOAT + mrb_value y = mrb_get_arg1(mrb); + if (mrb_float_p(y)) { return mrb_float_value(mrb, pow((double)base, mrb_float(y))); } @@ -136,7 +137,9 @@ mrb_div_int(mrb_state *mrb, mrb_int x, mrb_int y) return 0; } +#ifndef MRB_NO_FLOAT mrb_float mrb_div_flo(mrb_float x, mrb_float y); +#endif /* 15.2.8.3.4 */ /* 15.2.9.3.4 */ @@ -1607,12 +1610,12 @@ cmpnum(mrb_state *mrb, mrb_value v1, mrb_value v2) case MRB_TT_FLOAT: y = mrb_float(v2); break; -#endif #ifdef MRB_USE_RATIONAL case MRB_TT_RATIONAL: y = mrb_to_flo(mrb, v2); break; #endif +#endif default: return -2; } @@ -1762,12 +1765,6 @@ mrb_init_numeric(mrb_state *mrb) mrb_define_method(mrb, integer, "to_i", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.24 */ mrb_define_method(mrb, integer, "to_int", int_to_i, MRB_ARGS_NONE()); -#ifndef MRB_NO_FLOAT - mrb_define_method(mrb, integer, "ceil", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.14 */ - mrb_define_method(mrb, integer, "floor", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.17 */ - mrb_define_method(mrb, integer, "round", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.20 */ - mrb_define_method(mrb, integer, "truncate", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.26 */ -#endif mrb_define_method(mrb, integer, "+", int_add, MRB_ARGS_REQ(1)); /* 15.2.8.3.1 */ mrb_define_method(mrb, integer, "-", int_sub, MRB_ARGS_REQ(1)); /* 15.2.8.3.2 */ diff --git a/test/t/integer.rb b/test/t/integer.rb index 2523d2631..d4076f38a 100644 --- a/test/t/integer.rb +++ b/test/t/integer.rb @@ -37,40 +37,42 @@ end assert('Integer#/', '15.2.8.3.4') do a = 2/1 - b = 2/1.0 - assert_equal 2, a + a = 5/2 + assert_equal 2, a + skip unless Object.const_defined?(:Float) + b = 2/1.0 assert_equal 2.0, b end assert('Integer#quo') do a = 6.quo(5) - assert_equal 1.2, a -end +end if Object.const_defined?(:Float) assert('Integer#%', '15.2.8.3.5') do a = 1%1 - b = 1%1.0 - c = 2%4 - d = 2%5 - e = 2%-5 - f = -2%5 - g = -2%-5 - h = 2%-2 - i = -2%2 - j = -2%-2 + b = 2%4 + c = 2%5 + d = 2%-5 + e = -2%5 + f = -2%-5 + g = 2%-2 + h = -2%2 + i = -2%-2 assert_equal 0, a - assert_equal 0.0, b + assert_equal 2, b assert_equal 2, c - assert_equal 2, d - assert_equal(-3, e) - assert_equal 3, f - assert_equal(-2, g) + assert_equal(-3, d) + assert_equal 3, e + assert_equal(-2, f) + assert_equal 0, g assert_equal 0, h assert_equal 0, i - assert_equal 0, j + skip unless Object.const_defined?(:Float) + j = 1%1.0 + assert_equal 0.0, j end assert('Integer#<=>', '15.2.9.3.6') do |
