From 301e43c4bf300b011b8b0e3800335879c6603a39 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 28 Jan 2020 19:27:17 +0100 Subject: [PATCH] Move declaredInstance out of StatementContextBase This caching field is useful, except it is clear that only the original instance really needs it, as InferredStatementContext will just walk through prototype to acquire it from there. Move the field into AbstractResumedStatement, i.e. originally-declared statements, taking buildDeclared() method implementation there. This reduces the size of StatementContextBase by one reference field, which helps InferredStatementContext, as it can now hold pointer to the original context without increasing object size. Having the original context allows us to more efficiently shortcut to the original definition -- which is useful for other methods as well. JIRA: YANGTOOLS-784 Change-Id: Ib8767a892b8c8aaa0e3f7da10ac794167269fff6 Signed-off-by: Robert Varga (cherry picked from commit 4159f31b29b342181a5e19b3732b36954592a8a8) (cherry picked from commit 309569041fb3a539ea7683729e357197956f0d8a) --- .../reactor/AbstractResumedStatement.java | 15 +++++++++++++++ .../reactor/InferredStatementContext.java | 19 +++++++++++++------ .../stmt/reactor/StatementContextBase.java | 17 ----------------- .../yang/parser/spi/meta/StmtContext.java | 2 ++ 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/AbstractResumedStatement.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/AbstractResumedStatement.java index 7c7f0db7b6..db3202a522 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/AbstractResumedStatement.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/AbstractResumedStatement.java @@ -13,6 +13,7 @@ import static java.util.Objects.requireNonNull; import java.util.Collection; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @@ -39,6 +40,7 @@ abstract class AbstractResumedStatement, E ext private final String rawArgument; private StatementMap substatements = StatementMap.empty(); + private @Nullable D declaredInstance; // Copy constructor AbstractResumedStatement(final AbstractResumedStatement original) { @@ -46,6 +48,7 @@ abstract class AbstractResumedStatement, E ext this.statementDeclSource = original.statementDeclSource; this.rawArgument = original.rawArgument; this.substatements = original.substatements; + this.declaredInstance = original.declaredInstance; } AbstractResumedStatement(final StatementDefinitionContext def, final StatementSourceReference ref, @@ -87,6 +90,18 @@ abstract class AbstractResumedStatement, E ext return substatements.values(); } + @Override + public final D buildDeclared() { + final D existing = declaredInstance; + if (existing != null) { + return existing; + } + final ModelProcessingPhase phase = getCompletedPhase(); + checkState(phase == ModelProcessingPhase.FULL_DECLARATION || phase == ModelProcessingPhase.EFFECTIVE_MODEL, + "Cannot build declared instance after phase %s", phase); + return declaredInstance = definition().getFactory().createDeclared(this); + } + @Override public @NonNull StatementDefinition getDefinition() { return getPublicDefinition(); diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java index 3378efde40..1d7a057805 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java @@ -43,6 +43,7 @@ final class InferredStatementContext, E extend private final @NonNull StatementContextBase prototype; private final @NonNull StatementContextBase parent; + private final @NonNull StmtContext originalCtx; private final @NonNull CopyType childCopyType; private final QNameModule targetModule; private final A argument; @@ -54,6 +55,7 @@ final class InferredStatementContext, E extend this.childCopyType = original.childCopyType; this.targetModule = original.targetModule; this.prototype = original.prototype; + this.originalCtx = original.originalCtx; this.argument = original.argument; } @@ -66,6 +68,8 @@ final class InferredStatementContext, E extend : prototype.definition().adaptArgumentValue(prototype, targetModule); this.childCopyType = requireNonNull(childCopyType); this.targetModule = targetModule; + // FIXME: 5.0.0: ugly cast due getOriginalCtx() return type :( + this.originalCtx = (StmtContext) prototype.getOriginalCtx().orElse(prototype); // FIXME: YANGTOOLS-784: instantiate these lazily addEffectiveSubstatements(createEffective()); @@ -90,18 +94,17 @@ final class InferredStatementContext, E extend @Override public StatementSourceReference getStatementSourceReference() { - return prototype.getStatementSourceReference(); + return originalCtx.getStatementSourceReference(); } @Override public String rawStatementArgument() { - return prototype.rawStatementArgument(); + return originalCtx.rawStatementArgument(); } @Override public Optional> getOriginalCtx() { - final Optional> orig = prototype.getOriginalCtx(); - return orig.isPresent() ? orig : Optional.of(prototype); + return Optional.of(originalCtx); } @Override @@ -110,8 +113,12 @@ final class InferredStatementContext, E extend } @Override - D createDeclared() { - return prototype.buildDeclared(); + public D buildDeclared() { + /* + * Share original instance of declared statement between all effective statements which have been copied or + * derived from this original declared statement. + */ + return originalCtx.buildDeclared(); } @Override diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java index c5e676aa4a..0ee59976f4 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java @@ -144,7 +144,6 @@ public abstract class StatementContextBase, E private List> effectOfStatement = ImmutableList.of(); private @Nullable ModelProcessingPhase completedPhase; - private @Nullable D declaredInstance; private @Nullable E effectiveInstance; // Master flag controlling whether this context can yield an effective statement @@ -171,7 +170,6 @@ public abstract class StatementContextBase, E this.isSupportedToBuildEffective = original.isSupportedToBuildEffective; this.fullyDefined = original.fullyDefined; this.completedPhase = original.completedPhase; - this.declaredInstance = original.declaredInstance; this.flags = original.flags; } @@ -516,21 +514,6 @@ public abstract class StatementContextBase, E fullyDefined = true; } - @Override - public D buildDeclared() { - final D existing = declaredInstance; - if (existing != null) { - return existing; - } - checkArgument(completedPhase == ModelProcessingPhase.FULL_DECLARATION - || completedPhase == ModelProcessingPhase.EFFECTIVE_MODEL); - return declaredInstance = createDeclared(); - } - - @NonNull D createDeclared() { - return definition.getFactory().createDeclared(this); - } - @Override public E buildEffective() { final E existing = effectiveInstance; diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java index 6ce51ab3a2..b3d1a69876 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java @@ -190,6 +190,7 @@ public interface StmtContext, E extends Effect * * @return Original definition, if this statement was copied. */ + // FIXME: 5.0.0: this should return Optional>, is that feasible? Optional> getOriginalCtx(); /** @@ -198,6 +199,7 @@ public interface StmtContext, E extends Effect * * @return Context of the previous copy of this statement, if this statement has been copied. */ + // FIXME: 5.0.0: this should return Optional> Optional> getPreviousCopyCtx(); ModelProcessingPhase getCompletedPhase(); -- 2.36.6