From 26664cfa0f2a5145ae09b94701166efd2f9811d2 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 3 Feb 2021 10:16:53 +0100 Subject: [PATCH] Update byte-buddy integration Update ByteBuddy to 1.10.20. Reuse ElementMatcher for isDefaultConstructor(), lowering the amount of garbage we potentially generate. While we are at it make sure our intra-package use patters are more consistent. Change-Id: I5cc297129c4b04eade4d1a8a9dfb96cd8504554e Signed-off-by: Robert Varga --- binding/mdsal-binding-dom-codec/pom.xml | 2 +- .../dom/codec/impl/ByteBuddyUtils.java | 11 ++++++----- .../codec/impl/CodecDataObjectGenerator.java | 19 ++++++++++--------- .../impl/DataObjectStreamerGenerator.java | 7 ++++++- .../codec/impl/NotificationCodecContext.java | 17 ++++++++++------- 5 files changed, 33 insertions(+), 23 deletions(-) diff --git a/binding/mdsal-binding-dom-codec/pom.xml b/binding/mdsal-binding-dom-codec/pom.xml index 048187b9a2..ae8aef77bf 100644 --- a/binding/mdsal-binding-dom-codec/pom.xml +++ b/binding/mdsal-binding-dom-codec/pom.xml @@ -29,7 +29,7 @@ net.bytebuddy byte-buddy - 1.10.17 + 1.10.20 org.opendaylight.yangtools diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ByteBuddyUtils.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ByteBuddyUtils.java index c5bdc771b5..7ae3ae8854 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ByteBuddyUtils.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ByteBuddyUtils.java @@ -33,12 +33,17 @@ import net.bytebuddy.matcher.ElementMatchers; import net.bytebuddy.pool.TypePool; final class ByteBuddyUtils { - static final StackManipulation THIS = MethodVariableAccess.loadThis(); + private static final StackManipulation LOAD_THIS = MethodVariableAccess.loadThis(); private ByteBuddyUtils() { } + // TODO: eliminate this method once MethodVariableAccess.loadThis() returns a singleton + static StackManipulation loadThis() { + return LOAD_THIS; + } + static StackManipulation invokeMethod(final Method method) { return MethodInvocation.invoke(describe(method)); } @@ -59,10 +64,6 @@ final class ByteBuddyUtils { return new Mark(label); } - static StackManipulation loadThis() { - return THIS; - } - static StackManipulation getField(final Field field) { return FieldAccess.forField(new ForLoadedField(field).asDefined()).read(); } diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObjectGenerator.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObjectGenerator.java index 747af366b4..ef0f8a985f 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObjectGenerator.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObjectGenerator.java @@ -10,9 +10,10 @@ package org.opendaylight.mdsal.binding.dom.codec.impl; import static com.google.common.base.Verify.verify; import static com.google.common.base.Verify.verifyNotNull; import static java.util.Objects.requireNonNull; -import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.THIS; +import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.computeFrames; import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.getField; import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.invokeMethod; +import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.loadThis; import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.putField; import com.google.common.collect.ImmutableMap; @@ -276,7 +277,7 @@ abstract class CodecDataObjectGenerator> implements final Generic bindingDef = TypeDefinition.Sort.describe(bindingInterface); @SuppressWarnings("unchecked") Builder builder = (Builder) BB.subclass(Generic.Builder.parameterizedType(superClass, bindingDef).build()) - .visit(ByteBuddyUtils.computeFrames()).name(fqcn).implement(bindingDef); + .visit(computeFrames()).name(fqcn).implement(bindingDef); builder = generateGetters(builder); @@ -308,7 +309,7 @@ abstract class CodecDataObjectGenerator> implements private static Implementation codecHashCode(final Class bindingInterface) { return new Implementation.Simple( // return Foo.bindingHashCode(this); - THIS, + loadThis(), invokeMethod(bindingInterface, BindingMapping.BINDING_HASHCODE_NAME, bindingInterface), MethodReturn.INTEGER); } @@ -316,7 +317,7 @@ abstract class CodecDataObjectGenerator> implements private static Implementation codecEquals(final Class bindingInterface) { return new Implementation.Simple( // return Foo.bindingEquals(this, obj); - THIS, + loadThis(), FIRST_ARG_REF, invokeMethod(bindingInterface, BindingMapping.BINDING_EQUALS_NAME, bindingInterface, Object.class), MethodReturn.INTEGER); @@ -325,7 +326,7 @@ abstract class CodecDataObjectGenerator> implements private static Implementation toString(final Class bindingInterface) { return new Implementation.Simple( // return Foo.bindingToString(this); - THIS, + loadThis(), invokeMethod(bindingInterface, BindingMapping.BINDING_TO_STRING_NAME, bindingInterface), MethodReturn.REFERENCE); } @@ -386,7 +387,7 @@ abstract class CodecDataObjectGenerator> implements public ByteCodeAppender appender(final Target implementationTarget) { return new ByteCodeAppender.Simple( // return (FooType) codecKey(getFoo$$$V); - THIS, + loadThis(), getField(implementationTarget.getInstrumentedType(), handleName), CODEC_KEY, TypeCasting.to(retType), @@ -434,7 +435,7 @@ abstract class CodecDataObjectGenerator> implements final TypeDescription instrumentedType = implementationTarget.getInstrumentedType(); return new ByteCodeAppender.Simple( // return (FooType) codecMember(getFoo$$$V, getFoo$$$S); - THIS, + loadThis(), getField(instrumentedType, handleName), getField(instrumentedType, stringName), CODEC_MEMBER, @@ -459,7 +460,7 @@ abstract class CodecDataObjectGenerator> implements public ByteCodeAppender appender(final Target implementationTarget) { return new ByteCodeAppender.Simple( // return (FooType) codecMember(getFoo$$$V, FooType.class); - THIS, + loadThis(), getField(implementationTarget.getInstrumentedType(), handleName), ClassConstant.of(TypeDefinition.Sort.describe(bindingClass).asErasure()), CODEC_MEMBER, @@ -501,7 +502,7 @@ abstract class CodecDataObjectGenerator> implements final TypeDescription instrumentedType = implementationTarget.getInstrumentedType(); return new ByteCodeAppender.Simple( // return (FooType) codecMember(getFoo$$$V, getFoo$$$C); - THIS, + loadThis(), getField(instrumentedType, handleName), getField(instrumentedType, contextName), CODEC_MEMBER, diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectStreamerGenerator.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectStreamerGenerator.java index c51374a4a2..111b8254f7 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectStreamerGenerator.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectStreamerGenerator.java @@ -45,6 +45,7 @@ import net.bytebuddy.implementation.bytecode.member.MethodReturn; import net.bytebuddy.implementation.bytecode.member.MethodVariableAccess; import net.bytebuddy.jar.asm.MethodVisitor; import net.bytebuddy.jar.asm.Opcodes; +import net.bytebuddy.matcher.ElementMatcher; import net.bytebuddy.matcher.ElementMatchers; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.mdsal.binding.dom.codec.api.BindingStreamEventWriter; @@ -453,6 +454,10 @@ final class DataObjectStreamerGenerator> impleme private enum InitializeInstanceField implements ByteCodeAppender { INSTANCE; + // TODO: eliminate this constant when ElementMatchers.isDefaultConstructor() returns a singleton + private static final ElementMatcher IS_DEFAULT_CONSTRUCTOR = + ElementMatchers.isDefaultConstructor(); + @Override public Size apply(final MethodVisitor methodVisitor, final Context implementationContext, final MethodDescription instrumentedMethod) { @@ -461,7 +466,7 @@ final class DataObjectStreamerGenerator> impleme TypeCreation.of(instrumentedType), Duplication.SINGLE, MethodInvocation.invoke(instrumentedType.getDeclaredMethods() - .filter(ElementMatchers.isDefaultConstructor()).getOnly().asDefined()), + .filter(IS_DEFAULT_CONSTRUCTOR).getOnly().asDefined()), putField(instrumentedType, INSTANCE_FIELD)) .apply(methodVisitor, implementationContext); return new Size(operandStackSize.getMaximalSize(), instrumentedMethod.getStackSize()); diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NotificationCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NotificationCodecContext.java index 3388a9a2f0..a6fe0b5887 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NotificationCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NotificationCodecContext.java @@ -8,6 +8,9 @@ package org.opendaylight.mdsal.binding.dom.codec.impl; import static com.google.common.base.Preconditions.checkState; +import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.getField; +import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.loadThis; +import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.putField; import com.google.common.base.Throwables; import java.lang.invoke.MethodHandle; @@ -120,7 +123,7 @@ final class NotificationCodecContext private enum ConstructorImplementation implements Implementation { INSTANCE; - private static final StackManipulation INSTANT_ARG = MethodVariableAccess.REFERENCE.loadFrom(3); + private static final StackManipulation LOAD_INSTANT_ARG = MethodVariableAccess.REFERENCE.loadFrom(3); private static final StackManipulation LOAD_CTOR_ARGS; static { @@ -145,12 +148,12 @@ final class NotificationCodecContext .filter(ElementMatchers.isConstructor()).getOnly(); return new ByteCodeAppender.Simple( - ByteBuddyUtils.THIS, + loadThis(), LOAD_CTOR_ARGS, MethodInvocation.invoke(superCtor), - ByteBuddyUtils.THIS, - INSTANT_ARG, - ByteBuddyUtils.putField(instrumentedType, INSTANT_FIELD), + loadThis(), + LOAD_INSTANT_ARG, + putField(instrumentedType, INSTANT_FIELD), MethodReturn.VOID); } } @@ -166,8 +169,8 @@ final class NotificationCodecContext @Override public ByteCodeAppender appender(final Target implementationTarget) { return new ByteCodeAppender.Simple( - ByteBuddyUtils.THIS, - ByteBuddyUtils.getField(implementationTarget.getInstrumentedType(), INSTANT_FIELD), + loadThis(), + getField(implementationTarget.getInstrumentedType(), INSTANT_FIELD), MethodReturn.REFERENCE); } } -- 2.36.6