Eliminate KeyedListNodeCodecContext.Unordered.getKey() 87/89587/2
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 4 May 2020 12:40:40 +0000 (14:40 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 4 May 2020 13:12:10 +0000 (15:12 +0200)
This method and the methodhandle invoker are completely superfluous,
as we can directly access key() from the created object. While capturing
a MethodHandle lowers what method can be invoked, it does not really
buy us much, as the observed class will we always the same.

That property is visible enough (wired through an invokeExact() on the
constructor), hence JIT should be able to optimize without this help.

Change-Id: Id24eac8e74782f750576c90d60485b2dcbdcff9e
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/KeyedListNodeCodecContext.java

index 5d8445e27935a889c22ff9cf075a0ce6cd5ec683..44151a7b81560239d149cba1806f5122f86a2100 100644 (file)
@@ -12,10 +12,6 @@ import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.IDENTIFI
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMap.Builder;
-import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodHandles;
-import java.lang.invoke.MethodType;
-import java.lang.invoke.WrongMethodTypeException;
 import java.lang.reflect.Method;
 import java.util.List;
 import org.eclipse.jdt.annotation.NonNull;
@@ -39,19 +35,9 @@ abstract class KeyedListNodeCodecContext<D extends DataObject & Identifiable<?>>
     }
 
     private static final class Unordered<D extends DataObject & Identifiable<?>> extends KeyedListNodeCodecContext<D> {
-        private static final MethodType KEY_TYPE = MethodType.methodType(Object.class, DataObject.class);
-
-        private final MethodHandle keyHandle;
-
         Unordered(final DataContainerCodecPrototype<ListSchemaNode> prototype, final Method keyMethod,
                 final IdentifiableItemCodec codec) {
             super(prototype, keyMethod, codec);
-
-            try {
-                this.keyHandle = MethodHandles.publicLookup().unreflect(keyMethod).asType(KEY_TYPE);
-            } catch (IllegalAccessException | WrongMethodTypeException e) {
-                throw new LinkageError("Failed to acquire method " + keyMethod, e);
-            }
         }
 
         @Override
@@ -60,19 +46,10 @@ abstract class KeyedListNodeCodecContext<D extends DataObject & Identifiable<?>>
             final Builder<Object, D> builder = ImmutableMap.builderWithExpectedSize(size);
             for (MapEntryNode node : map.getValue()) {
                 final D entry = fromMapEntry(node);
-                builder.put(getKey(entry), entry);
+                builder.put(entry.key(), entry);
             }
             return builder.build();
         }
-
-        @SuppressWarnings("checkstyle:illegalCatch")
-        private Object getKey(final D entry) {
-            try {
-                return keyHandle.invokeExact(entry);
-            } catch (Throwable e) {
-                throw new LinkageError("Failed to extract key from " + entry, e);
-            }
-        }
     }
 
     private final IdentifiableItemCodec codec;