bigdecimal 4.1.0 → 4.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -168,6 +168,11 @@ typedef struct {
168
168
  Real *real;
169
169
  } BDVALUE;
170
170
 
171
+ typedef struct {
172
+ VALUE bigdecimal_or_nil;
173
+ Real *real_or_null;
174
+ } NULLABLE_BDVALUE;
175
+
171
176
  /*
172
177
  * ------------------
173
178
  * EXPORTables.
@@ -194,7 +199,7 @@ VP_EXPORT unsigned short VpSetRoundMode(unsigned short n);
194
199
  VP_EXPORT int VpException(unsigned short f,const char *str,int always);
195
200
  VP_EXPORT size_t VpNumOfChars(Real *vp,const char *pszFmt);
196
201
  VP_EXPORT size_t VpInit(DECDIG BaseVal);
197
- VP_EXPORT Real *VpAlloc(const char *szVal, int strict_p, int exc);
202
+ VP_EXPORT NULLABLE_BDVALUE VpAlloc(const char *szVal, int strict_p, int exc);
198
203
  VP_EXPORT size_t VpAsgn(Real *c, Real *a, int isw);
199
204
  VP_EXPORT size_t VpAddSub(Real *c,Real *a,Real *b,int operation);
200
205
  VP_EXPORT size_t VpMult(Real *c,Real *a,Real *b);
data/ext/bigdecimal/div.h CHANGED
@@ -59,14 +59,14 @@ divmod_by_inv_mul(VALUE x, VALUE y, VALUE inv, VALUE *res_div, VALUE *res_mod) {
59
59
 
60
60
  static void
61
61
  slice_copy(DECDIG *dest, Real *src, size_t rshift, size_t length) {
62
- ssize_t start = src->exponent - rshift - length;
62
+ ssize_t start = src->exponent - (ssize_t)rshift - (ssize_t)length;
63
63
  if (start >= (ssize_t)src->Prec) return;
64
64
  if (start < 0) {
65
65
  dest -= start;
66
- length += start;
66
+ length -= (size_t)(-start);
67
67
  start = 0;
68
68
  }
69
- size_t max_length = src->Prec - start;
69
+ size_t max_length = (size_t)((ssize_t)src->Prec - start);
70
70
  memcpy(dest, src->frac + start, Min(length, max_length) * sizeof(DECDIG));
71
71
  }
72
72
 
@@ -101,28 +101,28 @@ divmod_newton(VALUE x, VALUE y, VALUE *div_out, VALUE *mod_out) {
101
101
  BDVALUE div_result = NewZeroWrap(1, BIGDECIMAL_COMPONENT_FIGURES * (num_blocks * block_figs + 1));
102
102
  BDVALUE bdx = GetBDValueMust(x);
103
103
 
104
- VALUE mod = BigDecimal_fix(BigDecimal_decimal_shift(x, SSIZET2NUM(-num_blocks * block_digits)));
105
- for (ssize_t i = num_blocks - 1; i >= 0; i--) {
104
+ VALUE mod = BigDecimal_fix(BigDecimal_decimal_shift(x, SSIZET2NUM(-(ssize_t)(num_blocks * block_digits))));
105
+ for (ssize_t i = (ssize_t)(num_blocks - 1); i >= 0; i--) {
106
106
  memset(divident.real->frac, 0, (y_figs + block_figs) * sizeof(DECDIG));
107
107
 
108
108
  BDVALUE bdmod = GetBDValueMust(mod);
109
109
  slice_copy(divident.real->frac, bdmod.real, 0, y_figs);
110
- slice_copy(divident.real->frac + y_figs, bdx.real, i * block_figs, block_figs);
110
+ slice_copy(divident.real->frac + y_figs, bdx.real, (size_t)i * block_figs, block_figs);
111
111
  RB_GC_GUARD(bdmod.bigdecimal);
112
112
 
113
113
  VpSetSign(divident.real, 1);
114
- divident.real->exponent = y_figs + block_figs;
114
+ divident.real->exponent = (ssize_t)(y_figs + block_figs);
115
115
  divident.real->Prec = y_figs + block_figs;
116
116
  VpNmlz(divident.real);
117
117
 
118
118
  VALUE div;
119
119
  divmod_by_inv_mul(divident.bigdecimal, y, yinv, &div, &mod);
120
120
  BDVALUE bddiv = GetBDValueMust(div);
121
- slice_copy(div_result.real->frac + (num_blocks - i - 1) * block_figs, bddiv.real, 0, block_figs + 1);
121
+ slice_copy(div_result.real->frac + (num_blocks - (size_t)i - 1) * block_figs, bddiv.real, 0, block_figs + 1);
122
122
  RB_GC_GUARD(bddiv.bigdecimal);
123
123
  }
124
124
  VpSetSign(div_result.real, 1);
125
- div_result.real->exponent = num_blocks * block_figs + 1;
125
+ div_result.real->exponent = (ssize_t)(num_blocks * block_figs + 1);
126
126
  div_result.real->Prec = num_blocks * block_figs + 1;
127
127
  VpNmlz(div_result.real);
128
128
  RB_GC_GUARD(bdx.bigdecimal);
@@ -148,8 +148,8 @@ VpDivdNewtonInner(VALUE args_ptr)
148
148
  VpAsgn(b2.real, b, 1);
149
149
  VpSetSign(a2.real, 1);
150
150
  VpSetSign(b2.real, 1);
151
- a2.real->exponent = base_prec + div_prec;
152
- b2.real->exponent = base_prec;
151
+ a2.real->exponent = (ssize_t)(base_prec + div_prec);
152
+ b2.real->exponent = (ssize_t)base_prec;
153
153
 
154
154
  if ((ssize_t)a2.real->Prec > a2.real->exponent) {
155
155
  a2_frac = BigDecimal_frac(a2.bigdecimal);
@@ -164,9 +164,9 @@ VpDivdNewtonInner(VALUE args_ptr)
164
164
  VpAsgn(r, r2.real, VpGetSign(a));
165
165
  AddExponent(c, a->exponent);
166
166
  AddExponent(c, -b->exponent);
167
- AddExponent(c, -div_prec);
167
+ AddExponent(c, -(ssize_t)div_prec);
168
168
  AddExponent(r, a->exponent);
169
- AddExponent(r, -base_prec - div_prec);
169
+ AddExponent(r, -(ssize_t)(base_prec + div_prec));
170
170
  RB_GC_GUARD(a2.bigdecimal);
171
171
  RB_GC_GUARD(a2.bigdecimal);
172
172
  RB_GC_GUARD(c2.bigdecimal);
@@ -46,6 +46,10 @@ have_func("rb_opts_exception_p", "ruby.h")
46
46
  have_func("rb_category_warn", "ruby.h")
47
47
  have_const("RB_WARN_CATEGORY_DEPRECATED", "ruby.h")
48
48
 
49
+ if RUBY_ENGINE == "ruby"
50
+ have_const("RUBY_TYPED_EMBEDDABLE", "ruby.h") # RUBY_VERSION >= 3.3
51
+ end
52
+
49
53
  if File.file?(File.expand_path('../lib/bigdecimal.rb', __FILE__))
50
54
  bigdecimal_rb = "$(srcdir)/lib/bigdecimal.rb"
51
55
  else