Optimize source generation 47/81647/5
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 14 Apr 2019 14:22:50 +0000 (16:22 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 17 Apr 2019 08:24:42 +0000 (10:24 +0200)
Since StringBuilder is fluent, we can optimize some of the source
generation utilities to have less bytecode. Also mark FIXMEs for
future improvement, as these would allow better devirtualization.

Furthermore we expose Class-based cast/assign operations, which
trim down code duplication a tiny bit.

Change-Id: I32d9d9321992effe0bec1423990208a92c1f780b
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/DataNodeContainerSerializerSource.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/DataObjectSerializerSource.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/spi/AbstractSource.java

index deb82f611716f9e3352d796241a6d37c6e58e4b9..004cbadc3e0ebd39ddd2a19c890b2b1a1adccd1f 100644 (file)
@@ -60,29 +60,28 @@ abstract class DataNodeContainerSerializerSource extends DataObjectSerializerSou
 
     @Override
     protected CharSequence getSerializerBody() {
-        final StringBuilder sb = new StringBuilder();
-        sb.append("{\n");
-        sb.append(statement(assign(DataObjectSerializerRegistry.class.getName(), REGISTRY, "$1")));
-        sb.append(statement(assign(dtoType.getFullyQualifiedName(), INPUT,
-                cast(dtoType.getFullyQualifiedName(), "$2"))));
-        sb.append(statement(assign(BindingStreamEventWriter.class.getName(), STREAM,
-            cast(BindingStreamEventWriter.class.getName(), "$3"))));
-        sb.append(statement(assign(BindingSerializer.class.getName(), SERIALIZER, null)));
-        sb.append("if (");
-        sb.append(STREAM);
-        sb.append(" instanceof ");
-        sb.append(BindingSerializer.class.getName());
-        sb.append(") {");
-        sb.append(statement(assign(SERIALIZER, cast(BindingSerializer.class.getName(), STREAM))));
-        sb.append('}');
-        sb.append(statement(emitStartEvent()));
+        final StringBuilder sb = new StringBuilder()
+                .append("{\n")
+                .append(statement(assign(DataObjectSerializerRegistry.class, REGISTRY, "$1")))
+                .append(statement(assign(dtoType, INPUT, cast(dtoType, "$2"))))
+                .append(statement(assign(BindingStreamEventWriter.class, STREAM,
+                    cast(BindingStreamEventWriter.class, "$3"))))
+                .append(statement(assign(BindingSerializer.class, SERIALIZER, null)))
+                .append("if (")
+                .append(STREAM)
+                .append(" instanceof ")
+                .append(BindingSerializer.class.getName())
+                .append(") {")
+                .append(statement(assign(SERIALIZER, cast(BindingSerializer.class, STREAM))))
+                .append('}')
+                .append(statement(emitStartEvent()));
 
         emitBody(sb);
         emitAfterBody(sb);
-        sb.append(statement(endNode()));
-        sb.append(statement("return null"));
-        sb.append('}');
-        return sb;
+
+        return sb.append(statement(endNode()))
+                .append(statement("return null"))
+                .append('}');
     }
 
     /**
@@ -167,8 +166,7 @@ abstract class DataNodeContainerSerializerSource extends DataObjectSerializerSou
             staticConstant(propertyName, DataObjectSerializerImplementation.class,
                 ChoiceDispatchSerializer.from(loadClass(childType)));
             sb.append(tryToUseCacheElse(getterName, statement(invoke(propertyName,
-                StreamWriterGenerator.SERIALIZE_METHOD_NAME, REGISTRY, cast(DataObject.class.getName(), getterName),
-                STREAM))));
+                StreamWriterGenerator.SERIALIZE_METHOD_NAME, REGISTRY, cast(DataObject.class, getterName), STREAM))));
         }
     }
 
index 8ec0a4d6312113c7b1c36dba6629ae9726e13c41..79d47c42eb2de5171af75ee6b41c6bf54d8e5601 100644 (file)
@@ -61,6 +61,7 @@ abstract class DataObjectSerializerSource extends AbstractSource {
      */
     protected abstract CharSequence getSerializerBody();
 
+    // FIXME: 5.0.0: consider optimizing streaming use through returning StringBuilder from common methods
     protected static final CharSequence leafNode(final String localName, final CharSequence value) {
         return invoke(STREAM, "leafNode", escape(localName), value);
     }
index 45b17722391e43ccd9757b44d753fe44e142a865..64c6c500a401cb8c913ffb06ff632cf6fce5569b 100644 (file)
@@ -11,9 +11,11 @@ import com.google.common.collect.Iterators;
 import com.google.common.collect.UnmodifiableIterator;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Set;
 import org.opendaylight.mdsal.binding.model.api.Type;
 
+// FIXME: 5.0.0: consider optimizing streaming use through returning StringBuilder from common methods
 public abstract class AbstractSource {
     private final Set<StaticConstantDefinition> staticConstants = new HashSet<>();
 
@@ -28,8 +30,7 @@ public abstract class AbstractSource {
     private static StringBuilder commonInvoke(final CharSequence object, final String methodName) {
         final StringBuilder sb = new StringBuilder();
         if (object != null) {
-            sb.append(object);
-            sb.append('.');
+            sb.append(object).append('.');
         }
         return sb.append(methodName).append('(');
     }
@@ -59,16 +60,23 @@ public abstract class AbstractSource {
     protected static final CharSequence assign(final String type, final String var, final CharSequence value) {
         final StringBuilder sb = new StringBuilder();
         if (type != null) {
-            sb.append(type);
-            sb.append(' ');
+            sb.append(type).append(' ');
         }
         return sb.append(var).append(" = ").append(value);
     }
 
+    protected static final CharSequence assign(final Class<?> type, final String var, final CharSequence value) {
+        return assign(type.getName(), var, value);
+    }
+
     protected static final CharSequence assign(final Type type, final String var, final CharSequence value) {
         return assign(type.getFullyQualifiedName(), var, value);
     }
 
+    protected static final CharSequence cast(final Class<?> type, final CharSequence value) {
+        return cast(type.getName(), value);
+    }
+
     protected static final CharSequence cast(final Type type, final CharSequence value) {
         return cast(type.getFullyQualifiedName(), value);
     }
@@ -79,12 +87,12 @@ public abstract class AbstractSource {
 
     protected static final CharSequence forEach(final String iterable, final String iteratorName,
             final String valueType, final String valueName, final CharSequence body) {
-        final StringBuilder sb = new StringBuilder();
-        sb.append(statement(assign(java.util.Iterator.class.getName(), iteratorName, invoke(iterable, "iterator"))));
-        sb.append("while (").append(invoke(iteratorName, "hasNext")).append(") {\n");
-        sb.append(statement(assign(valueType, valueName,cast(valueType, invoke(iteratorName, "next")))));
-        sb.append(body);
-        return sb.append("\n}\n");
+        return new StringBuilder()
+                .append(statement(assign(Iterator.class, iteratorName, invoke(iterable, "iterator"))))
+                .append("while (").append(invoke(iteratorName, "hasNext")).append(") {\n")
+                .append(statement(assign(valueType, valueName, cast(valueType, invoke(iteratorName, "next")))))
+                .append(body)
+                .append("\n}\n");
     }
 
     protected static final CharSequence statement(final CharSequence statement) {