Skip to content

Commit

Permalink
[refactor] cache normalized (strip-ed) BigDecimal value - for re-use
Browse files Browse the repository at this point in the history
  • Loading branch information
kares committed Apr 15, 2018
1 parent 4b004f1 commit 5560cd1
Showing 1 changed file with 16 additions and 7 deletions.
23 changes: 16 additions & 7 deletions core/src/main/java/org/jruby/ext/bigdecimal/RubyBigDecimal.java
Expand Up @@ -798,14 +798,25 @@ private RubyBigDecimal setResult(final int scale) {
int exponent;
if (prec > 0 && this.value.scale() > (prec - (exponent = getExponent()))) {
this.value = this.value.setScale(prec - exponent, BigDecimal.ROUND_HALF_UP);
this.absStripTrailingZeros = null;
}
return this;
}

private transient BigDecimal absStripTrailingZeros; // cached re-used 'normalized' value

private BigDecimal absStripTrailingZeros() {
BigDecimal absStripTrailingZeros = this.absStripTrailingZeros;
if (absStripTrailingZeros == null) {
return this.absStripTrailingZeros = value.abs().stripTrailingZeros();
}
return absStripTrailingZeros;
}

@Override
@JRubyMethod
public RubyFixnum hash() {
return getRuntime().newFixnum(value.stripTrailingZeros().hashCode());
return getRuntime().newFixnum(absStripTrailingZeros().hashCode() * value.signum());
}

@Override
Expand Down Expand Up @@ -1716,19 +1727,17 @@ private String splitDigits() {

// it doesn't handle special cases
private String getSignificantDigits() {
// TODO: no need to calculate every time.
return value.abs().stripTrailingZeros().unscaledValue().toString();
return absStripTrailingZeros().unscaledValue().toString();
}

private String getAllDigits() {
// TODO: no need to calculate every time.
return value.abs().unscaledValue().toString();
return value.unscaledValue().abs().toString();
}

private int getExponent() {
if (isZero() || isNaN() || isInfinity()) return 0;

BigDecimal val = value.abs().stripTrailingZeros();
BigDecimal val = absStripTrailingZeros();
return val.precision() - val.scale();
}

Expand Down Expand Up @@ -1919,7 +1928,7 @@ private CharSequence engineeringValue(final String arg) {
}

private CharSequence floatingPointValue(final String arg) {
List<String> values = StringSupport.split(value.abs().stripTrailingZeros().toPlainString(), '.');
List<String> values = StringSupport.split(absStripTrailingZeros().toPlainString(), '.');
final String whole = values.size() > 0 ? values.get(0) : "0";
final String after = values.size() > 1 ? values.get(1) : "0";

Expand Down

0 comments on commit 5560cd1

Please sign in to comment.