From 05e8afd0ef6e7fe1f2c66a7b6c8a3317d51081d2 Mon Sep 17 00:00:00 2001 From: Claes Redestad Date: Thu, 5 Nov 2015 16:36:55 +0100 Subject: [PATCH] 8141536: MethodType field offset calculation could be lazy Reviewed-by: vlivanov --- .../classes/java/lang/invoke/MethodType.java | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodType.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodType.java index 1a986a4bf64..7f77c5e84ad 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodType.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodType.java @@ -1187,20 +1187,23 @@ s.writeObject(this.parameterArray()); // store them into the implementation-specific final fields. checkRtype(rtype); checkPtypes(ptypes); - UNSAFE.putObject(this, rtypeOffset, rtype); - UNSAFE.putObject(this, ptypesOffset, ptypes); + UNSAFE.putObject(this, OffsetHolder.rtypeOffset, rtype); + UNSAFE.putObject(this, OffsetHolder.ptypesOffset, ptypes); } - // Support for resetting final fields while deserializing - private static final long rtypeOffset, ptypesOffset; - static { - try { - rtypeOffset = UNSAFE.objectFieldOffset - (MethodType.class.getDeclaredField("rtype")); - ptypesOffset = UNSAFE.objectFieldOffset - (MethodType.class.getDeclaredField("ptypes")); - } catch (Exception ex) { - throw new Error(ex); + // Support for resetting final fields while deserializing. Implement Holder + // pattern to make the rarely needed offset calculation lazy. + private static class OffsetHolder { + private static final long rtypeOffset, ptypesOffset; + static { + try { + rtypeOffset = UNSAFE.objectFieldOffset + (MethodType.class.getDeclaredField("rtype")); + ptypesOffset = UNSAFE.objectFieldOffset + (MethodType.class.getDeclaredField("ptypes")); + } catch (Exception ex) { + throw new Error(ex); + } } }