diff --git a/jdk/src/share/classes/java/math/BigDecimal.java b/jdk/src/share/classes/java/math/BigDecimal.java index 369d9dfa96b..d95b1cb27b3 100644 --- a/jdk/src/share/classes/java/math/BigDecimal.java +++ b/jdk/src/share/classes/java/math/BigDecimal.java @@ -3715,26 +3715,28 @@ public class BigDecimal extends Number implements Comparable { } } - private static final sun.misc.Unsafe unsafe = sun.misc.Unsafe.getUnsafe(); - private static final long intCompactOffset; - private static final long intValOffset; - static { - try { - intCompactOffset = unsafe.objectFieldOffset - (BigDecimal.class.getDeclaredField("intCompact")); - intValOffset = unsafe.objectFieldOffset - (BigDecimal.class.getDeclaredField("intVal")); - } catch (Exception ex) { - throw new Error(ex); + private static class UnsafeHolder { + private static final sun.misc.Unsafe unsafe; + private static final long intCompactOffset; + private static final long intValOffset; + static { + try { + unsafe = sun.misc.Unsafe.getUnsafe(); + intCompactOffset = unsafe.objectFieldOffset + (BigDecimal.class.getDeclaredField("intCompact")); + intValOffset = unsafe.objectFieldOffset + (BigDecimal.class.getDeclaredField("intVal")); + } catch (Exception ex) { + throw new ExceptionInInitializerError(ex); + } + } + static void setIntCompactVolatile(BigDecimal bd, long val) { + unsafe.putLongVolatile(bd, intCompactOffset, val); } - } - private void setIntCompactVolatile(long val) { - unsafe.putLongVolatile(this, intCompactOffset, val); - } - - private void setIntValVolatile(BigInteger val) { - unsafe.putObjectVolatile(this, intValOffset, val); + static void setIntValVolatile(BigDecimal bd, BigInteger val) { + unsafe.putObjectVolatile(bd, intValOffset, val); + } } /** @@ -3753,7 +3755,7 @@ public class BigDecimal extends Number implements Comparable { throw new java.io.StreamCorruptedException(message); // [all values of scale are now allowed] } - setIntCompactVolatile(compactValFor(intVal)); + UnsafeHolder.setIntCompactVolatile(this, compactValFor(intVal)); } /** @@ -3765,7 +3767,7 @@ public class BigDecimal extends Number implements Comparable { throws java.io.IOException { // Must inflate to maintain compatible serial form. if (this.intVal == null) - this.setIntValVolatile(BigInteger.valueOf(this.intCompact)); + UnsafeHolder.setIntValVolatile(this, BigInteger.valueOf(this.intCompact)); // Could reset intVal back to null if it has to be set. s.defaultWriteObject(); } diff --git a/jdk/src/share/classes/java/math/BigInteger.java b/jdk/src/share/classes/java/math/BigInteger.java index d783c2b8d36..748a6c2f2b0 100644 --- a/jdk/src/share/classes/java/math/BigInteger.java +++ b/jdk/src/share/classes/java/math/BigInteger.java @@ -3303,25 +3303,35 @@ public class BigInteger extends Number implements Comparable { } // Commit final fields via Unsafe - unsafe.putIntVolatile(this, signumOffset, sign); + UnsafeHolder.putSign(this, sign); // Calculate mag field from magnitude and discard magnitude - unsafe.putObjectVolatile(this, magOffset, - stripLeadingZeroBytes(magnitude)); + UnsafeHolder.putMag(this, stripLeadingZeroBytes(magnitude)); } // Support for resetting final fields while deserializing - private static final sun.misc.Unsafe unsafe = sun.misc.Unsafe.getUnsafe(); - private static final long signumOffset; - private static final long magOffset; - static { - try { - signumOffset = unsafe.objectFieldOffset - (BigInteger.class.getDeclaredField("signum")); - magOffset = unsafe.objectFieldOffset - (BigInteger.class.getDeclaredField("mag")); - } catch (Exception ex) { - throw new Error(ex); + private static class UnsafeHolder { + private static final sun.misc.Unsafe unsafe; + private static final long signumOffset; + private static final long magOffset; + static { + try { + unsafe = sun.misc.Unsafe.getUnsafe(); + signumOffset = unsafe.objectFieldOffset + (BigInteger.class.getDeclaredField("signum")); + magOffset = unsafe.objectFieldOffset + (BigInteger.class.getDeclaredField("mag")); + } catch (Exception ex) { + throw new ExceptionInInitializerError(ex); + } + } + + static void putSign(BigInteger bi, int sign) { + unsafe.putIntVolatile(bi, signumOffset, sign); + } + + static void putMag(BigInteger bi, int[] magnitude) { + unsafe.putObjectVolatile(bi, magOffset, magnitude); } }