From: Robert Varga Date: Tue, 30 Apr 2019 13:08:30 +0000 (+0200) Subject: Do not use bound MethodHandle in DataObjectCodecContext X-Git-Tag: v4.0.1~20 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=f4008494701891f9231562984554f6ec2358824c;p=mdsal.git Do not use bound MethodHandle in DataObjectCodecContext Binding the MethodHandle means we are actually creating two methodhandles, which is wasteful. Add a dummy CodecDataObject constructor argument, unifying constructor signatures and allowing us to use a single methodhandle, passing 'this' at the single call site. JIRA: MDSAL-444 Change-Id: Idd94638eb42d219b7370463d91dad3d00409bd5e Signed-off-by: Robert Varga --- diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentableCodecDataObject.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentableCodecDataObject.java index 3cf75fbf70..d94c3f7c28 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentableCodecDataObject.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentableCodecDataObject.java @@ -44,7 +44,7 @@ public abstract class AugmentableCodecDataObject context, final NormalizedNodeContainer data) { - super(data); + super(context, data); this.context = requireNonNull(context, "Context must not be null"); } diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObject.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObject.java index cec788f3fd..b48bde535a 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObject.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObject.java @@ -36,7 +36,7 @@ public abstract class CodecDataObject implements DataObjec private volatile Integer cachedHashcode = null; - protected CodecDataObject(final NormalizedNodeContainer data) { + protected CodecDataObject(final DataObjectCodecContext context, final NormalizedNodeContainer data) { this.data = requireNonNull(data, "Data must not be null"); } diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java index 6505b3afdb..92f76510c0 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java @@ -78,12 +78,9 @@ public abstract class DataObjectCodecContext METHOD_BY_ALPHABET = Comparator.comparing(Method::getName); private static final Augmentations EMPTY_AUGMENTATIONS = new Augmentations(ImmutableMap.of(), ImmutableMap.of()); @@ -166,32 +163,25 @@ public abstract class DataObjectCodecContext> generatedClass; - final MethodType ctorType; if (Augmentable.class.isAssignableFrom(bindingClass)) { this.possibleAugmentations = factory().getRuntimeContext().getAvailableAugmentationTypes(getSchema()); generatedClass = CodecDataObjectGenerator.generateAugmentable(prototype.getFactory().getLoader(), bindingClass, propBuilder.build(), keyMethod); - ctorType = AUGMENTABLE_CONSTRUCTOR_TYPE; } else { this.possibleAugmentations = ImmutableMap.of(); generatedClass = CodecDataObjectGenerator.generate(prototype.getFactory().getLoader(), bindingClass, propBuilder.build(), keyMethod); - ctorType = CONSTRUCTOR_TYPE; } reloadAllAugmentations(); final MethodHandle ctor; try { - ctor = MethodHandles.publicLookup().findConstructor(generatedClass, ctorType); + ctor = MethodHandles.publicLookup().findConstructor(generatedClass, CONSTRUCTOR_TYPE); } catch (NoSuchMethodException | IllegalAccessException e) { throw new LinkageError("Failed to find contructor for class " + generatedClass, e); } - if (Augmentable.class.isAssignableFrom(bindingClass)) { - proxyConstructor = ctor.asType(AUGMENTABLE_DATAOBJECT_TYPE).bindTo(this); - } else { - proxyConstructor = ctor.asType(DATAOBJECT_TYPE); - } + proxyConstructor = ctor.asType(DATAOBJECT_TYPE); } // This method could be synchronized, but that would mean that concurrent attempts to load an invalid augmentation @@ -519,7 +509,7 @@ public abstract class DataObjectCodecContext node) { try { - return (D) proxyConstructor.invokeExact(node); + return (D) proxyConstructor.invokeExact(this, node); } catch (final Throwable e) { Throwables.throwIfUnchecked(e); throw new IllegalStateException(e);