diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index 552299a0..975270a5 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -11,7 +11,15 @@ on: - reopened jobs: + ruby-versions: + uses: ruby/actions/.github/workflows/ruby_versions.yml@master + with: + engine: cruby + min_version: 2.7 + versions: '["debug"]' + host: + needs: ruby-versions name: ${{ matrix.os }} ${{ matrix.ruby }} runs-on: ${{ matrix.os }} strategy: @@ -19,17 +27,13 @@ jobs: matrix: os: - ubuntu-latest - - macos-10.15 + - macos-11 - windows-latest - ruby: - - 3.0 - - 2.7 - - head + ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }} include: - { os: windows-latest , ruby: mingw } - { os: windows-latest , ruby: mswin } exclude: - - { os: windows-latest , ruby: 3.0 } - { os: windows-latest , ruby: debug } steps: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bb0fca1d..4bb8c20a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,29 +11,32 @@ on: - reopened jobs: + ruby-versions: + uses: ruby/actions/.github/workflows/ruby_versions.yml@master + with: + engine: cruby-truffleruby + min_version: 2.5 + versions: '["debug"]' + host: + needs: ruby-versions name: ${{ matrix.os }} ${{ matrix.ruby }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: - - ubuntu-20.04 - - ubuntu-18.04 - - macos-10.15 + - ubuntu-latest + - macos-latest - windows-latest - ruby: - - "3.0" # Quoted to avoid 3.0 becoming "3" as a String. - - 2.7 - - 2.6 - - 2.5 - - debug + ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }} include: - { os: windows-latest , ruby: mingw } - { os: windows-latest , ruby: mswin } exclude: - - { os: windows-latest , ruby: 3.0 } - { os: windows-latest , ruby: debug } + - { os: windows-latest , ruby: truffleruby } + - { os: windows-latest , ruby: truffleruby-head } steps: - uses: actions/checkout@v3 @@ -52,4 +55,4 @@ jobs: - run: rake build - run: gem install pkg/*.gem - if: ${{ ( matrix.ruby != 'debug' && matrix.os == 'linux-latest' ) || ( matrix.ruby != 'debug' && matrix.os == 'macos-latest' ) }} + if: ${{ matrix.ruby != 'debug' && ( matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' ) }} diff --git a/CHANGES.md b/CHANGES.md index f94d6602..3ef0f2c1 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,11 @@ # CHANGES +## 3.1.3 + +* Adjust a local variable type to exponent. [GH-223] +* Remove checks for `struct RRational` and `struct RComplex` . [GH-233] +* Suppress macro redefinition warnings. [GH-239] + ## 3.1.2 * Fix the maximum precision of the quotient. [GH-220] diff --git a/Gemfile b/Gemfile index 06413ee9..288db6ec 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,7 @@ source 'https://rubygems.org' gemspec gem "benchmark_driver" -gem "fiddle" +gem "fiddle", platform: :ruby gem "rake", ">= 12.3.3" gem "rake-compiler", ">= 0.9" gem "minitest", "< 5.0.0" diff --git a/Rakefile b/Rakefile index 8fd7c14b..060fc3f2 100644 --- a/Rakefile +++ b/Rakefile @@ -5,8 +5,12 @@ require "rake" require "rake/extensiontask" require "rake/testtask" -spec = eval(File.read('bigdecimal.gemspec')) -Rake::ExtensionTask.new('bigdecimal', spec) +if RUBY_ENGINE == 'jruby' + # JRuby's extension is included with JRuby currently + task :compile do; end +else + Rake::ExtensionTask.new('bigdecimal', Bundler::GemHelper.gemspec) +end Rake::TestTask.new do |t| t.libs << 'test/lib' diff --git a/bigdecimal.gemspec b/bigdecimal.gemspec index d2157571..f9f3b456 100644 --- a/bigdecimal.gemspec +++ b/bigdecimal.gemspec @@ -1,28 +1,29 @@ # coding: utf-8 +name = File.basename(__FILE__, '.*') +source_version = ["", "ext/#{name}/"].find do |dir| + begin + break File.foreach(File.join(__dir__, "#{dir}#{name}.c")) {|line| + break $1.sub("-", ".") if /^#define\s+#{name.upcase}_VERSION\s+"(.+)"/o =~ line + } + rescue Errno::ENOENT + end +end or raise "can't find #{name.upcase}_VERSION" + Gem::Specification.new do |s| - s.name = "bigdecimal" - s.version = "3.1.3" + s.name = name + s.version = source_version s.authors = ["Kenta Murata", "Zachary Scott", "Shigeo Kobayashi"] s.email = ["mrkn@mrkn.jp"] s.summary = "Arbitrary-precision decimal floating-point number library." s.description = "This library provides arbitrary-precision decimal floating-point number class." s.homepage = "https://github.com/ruby/bigdecimal" - s.licenses = ["Ruby", "bsd-2-clause"] + s.licenses = ["Ruby", "BSD-2-Clause"] s.require_paths = %w[lib] - s.extensions = %w[ext/bigdecimal/extconf.rb] s.files = %w[ bigdecimal.gemspec - ext/bigdecimal/bigdecimal.c - ext/bigdecimal/bigdecimal.h - ext/bigdecimal/bits.h - ext/bigdecimal/feature.h - ext/bigdecimal/missing.c - ext/bigdecimal/missing.h - ext/bigdecimal/missing/dtoa.c - ext/bigdecimal/static_assert.h lib/bigdecimal.rb lib/bigdecimal/jacobian.rb lib/bigdecimal/ludcmp.rb @@ -33,6 +34,21 @@ Gem::Specification.new do |s| sample/nlsolve.rb sample/pi.rb ] + if Gem::Platform === s.platform and s.platform =~ 'java' or RUBY_ENGINE == 'jruby' + s.platform = 'java' + else + s.extensions = %w[ext/bigdecimal/extconf.rb] + s.files += %w[ + ext/bigdecimal/bigdecimal.c + ext/bigdecimal/bigdecimal.h + ext/bigdecimal/bits.h + ext/bigdecimal/feature.h + ext/bigdecimal/missing.c + ext/bigdecimal/missing.h + ext/bigdecimal/missing/dtoa.c + ext/bigdecimal/static_assert.h + ] + end s.required_ruby_version = Gem::Requirement.new(">= 2.5.0") end diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index d6ea35c6..6eb14bcd 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -31,6 +31,8 @@ #include "bits.h" #include "static_assert.h" +#define BIGDECIMAL_VERSION "3.1.4" + /* #define ENABLE_NUMERIC_STRING */ #define SIGNED_VALUE_MAX INTPTR_MAX @@ -313,7 +315,7 @@ static const rb_data_type_t BigDecimal_data_type = { "BigDecimal", { 0, BigDecimal_delete, BigDecimal_memsize, }, #ifdef RUBY_TYPED_FREE_IMMEDIATELY - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE + 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE | RUBY_TYPED_WB_PROTECTED #endif }; @@ -2082,6 +2084,13 @@ BigDecimal_divremain(VALUE self, VALUE r, Real **dv, Real **rv) if (!b) return DoSomeOne(self, r, rb_intern("remainder")); SAVE(b); + if (VpIsPosInf(b) || VpIsNegInf(b)) { + GUARD_OBJ(*dv, NewZeroWrapLimited(1, 1)); + VpSetZero(*dv, 1); + *rv = a; + return Qnil; + } + mx = (a->MaxPrec + b->MaxPrec) *VpBaseFig(); GUARD_OBJ(c, NewZeroWrapLimited(1, mx)); GUARD_OBJ(res, NewZeroWrapNolimit(1, (mx+1) * 2 + (VpBaseFig() + 1))); @@ -4133,11 +4142,11 @@ BigMath_s_log(VALUE klass, VALUE x, VALUE vprec) } x = VpCheckGetValue(vx); - RB_GC_GUARD(one) = VpCheckGetValue(NewOneWrapLimited(1, 1)); - RB_GC_GUARD(two) = VpCheckGetValue(VpCreateRbObject(1, "2", true)); + one = VpCheckGetValue(NewOneWrapLimited(1, 1)); + two = VpCheckGetValue(VpCreateRbObject(1, "2", true)); n = prec + BIGDECIMAL_DOUBLE_FIGURES; - RB_GC_GUARD(vn) = SSIZET2NUM(n); + vn = SSIZET2NUM(n); expo = VpExponent10(vx); if (expo < 0 || expo >= 3) { char buf[DECIMAL_SIZE_OF_BITS(SIZEOF_VALUE * CHAR_BIT) + 4]; @@ -4149,9 +4158,9 @@ BigMath_s_log(VALUE klass, VALUE x, VALUE vprec) } w = BigDecimal_sub(x, one); x = BigDecimal_div2(w, BigDecimal_add(x, one), vn); - RB_GC_GUARD(x2) = BigDecimal_mult2(x, x, vn); - RB_GC_GUARD(y) = x; - RB_GC_GUARD(d) = y; + x2 = BigDecimal_mult2(x, x, vn); + y = x; + d = y; i = 1; while (!VpIsZero((Real*)DATA_PTR(d))) { SIGNED_VALUE const ey = VpExponent10(DATA_PTR(y)); @@ -4179,6 +4188,13 @@ BigMath_s_log(VALUE klass, VALUE x, VALUE vprec) y = BigDecimal_add(y, dy); } + RB_GC_GUARD(one); + RB_GC_GUARD(two); + RB_GC_GUARD(vn); + RB_GC_GUARD(x2); + RB_GC_GUARD(y); + RB_GC_GUARD(d); + return y; } @@ -4395,13 +4411,10 @@ Init_bigdecimal(void) /* Constants definition */ -#ifndef RUBY_BIGDECIMAL_VERSION -# error RUBY_BIGDECIMAL_VERSION is not defined -#endif /* * The version of bigdecimal library */ - rb_define_const(rb_cBigDecimal, "VERSION", rb_str_new2(RUBY_BIGDECIMAL_VERSION)); + rb_define_const(rb_cBigDecimal, "VERSION", rb_str_new2(BIGDECIMAL_VERSION)); /* * Base value used in internal calculations. On a 32 bit system, BASE @@ -6453,7 +6466,7 @@ VPrint(FILE *fp, const char *cntl_chr, Real *a) } } nc += fprintf(fp, "E%"PRIdSIZE, VpExponent10(a)); - nc += fprintf(fp, " (%"PRIdVALUE", %lu, %lu)", a->exponent, a->Prec, a->MaxPrec); + nc += fprintf(fp, " (%"PRIdVALUE", %"PRIuSIZE", %"PRIuSIZE")", a->exponent, a->Prec, a->MaxPrec); } else { nc += fprintf(fp, "0.0"); diff --git a/ext/bigdecimal/depend b/ext/bigdecimal/depend index 943bd6c3..33cf28d1 100644 --- a/ext/bigdecimal/depend +++ b/ext/bigdecimal/depend @@ -1,4 +1,3 @@ -extconf.h: $(srcdir)/$(GEMSPEC) Makefile: $(BIGDECIMAL_RB) # AUTOGENERATED DEPENDENCIES START diff --git a/ext/bigdecimal/extconf.rb b/ext/bigdecimal/extconf.rb index 17e7905d..23904ed6 100644 --- a/ext/bigdecimal/extconf.rb +++ b/ext/bigdecimal/extconf.rb @@ -1,18 +1,6 @@ # frozen_string_literal: false require 'mkmf' -def check_bigdecimal_version(gemspec_path) - message "checking RUBY_BIGDECIMAL_VERSION... " - bigdecimal_version = File.read(gemspec_path).match(/^\s*s\.version\s+=\s+['"]([^'"]+)['"]\s*$/)[1] - - version_components = bigdecimal_version.split('.') - bigdecimal_version = version_components[0, 3].join('.') - bigdecimal_version << "-#{version_components[3]}" if version_components[3] - $defs << %Q[-DRUBY_BIGDECIMAL_VERSION=\\"#{bigdecimal_version}\\"] - - message "#{bigdecimal_version}\n" -end - def have_builtin_func(name, check_expr, opt = "", &b) checking_for checking_message(name.funcall_style, nil, opt) do if try_compile(<