[23/24] incubator-freemarker git commit: Made `+` operator when adding two hashes significantly faster (be removing the overhead caused be throwing and then catching an exception).
Made `+` operator when adding two hashes significantly faster (be removing the overhead caused be throwing and then catching an exception). Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/4b989f89 Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/4b989f89 Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/4b989f89 Branch: refs/heads/2.3 Commit: 4b989f89ba54b0ba309b7385e56e2ecf2466ffef Parents: 496ddfb Author: ddekanyAuthored: Tue Dec 6 23:25:42 2016 +0100 Committer: ddekany Committed: Tue Dec 6 23:25:55 2016 +0100 -- .../freemarker/core/AddConcatExpression.java| 58 ++-- src/main/java/freemarker/core/EvalUtil.java | 26 +++-- src/manual/en_US/book.xml | 4 +- 3 files changed, 65 insertions(+), 23 deletions(-) -- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/4b989f89/src/main/java/freemarker/core/AddConcatExpression.java -- diff --git a/src/main/java/freemarker/core/AddConcatExpression.java b/src/main/java/freemarker/core/AddConcatExpression.java index 4dbfd78..5523118 100644 --- a/src/main/java/freemarker/core/AddConcatExpression.java +++ b/src/main/java/freemarker/core/AddConcatExpression.java @@ -74,11 +74,26 @@ final class AddConcatExpression extends Expression { } else if (leftModel instanceof TemplateSequenceModel && rightModel instanceof TemplateSequenceModel) { return new ConcatenatedSequence((TemplateSequenceModel) leftModel, (TemplateSequenceModel) rightModel); } else { +boolean hashConcatPossible += leftModel instanceof TemplateHashModel && rightModel instanceof TemplateHashModel; try { +// We try string addition first. If hash addition is possible, then instead of throwing exception +// we return null and do hash addition instead. (We can't simply give hash addition a priority, like +// with sequence addition above, as FTL strings are often also FTL hashes.) Object leftOMOrStr = EvalUtil.coerceModelToStringOrMarkup( -leftModel, leftExp, (String) null, env); +leftModel, leftExp, /* returnNullOnNonCoercableType = */ hashConcatPossible, (String) null, +env); +if (leftOMOrStr == null) { +return _eval_concatenateHashes(leftModel, rightModel); +} + +// Same trick with null return as above. Object rightOMOrStr = EvalUtil.coerceModelToStringOrMarkup( -rightModel, rightExp, (String) null, env); +rightModel, rightExp, /* returnNullOnNonCoercableType = */ hashConcatPossible, (String) null, +env); +if (rightOMOrStr == null) { +return _eval_concatenateHashes(leftModel, rightModel); +} if (leftOMOrStr instanceof String) { if (rightOMOrStr instanceof String) { @@ -98,25 +113,14 @@ final class AddConcatExpression extends Expression { } else { // rightOMOrStr instanceof TemplateMarkupOutputModel return EvalUtil.concatMarkupOutputs(parent, leftMO, -(TemplateMarkupOutputModel) rightOMOrStr); +(TemplateMarkupOutputModel) rightOMOrStr); } } } catch (NonStringOrTemplateOutputException e) { -if (leftModel instanceof TemplateHashModel && rightModel instanceof TemplateHashModel) { -if (leftModel instanceof TemplateHashModelEx && rightModel instanceof TemplateHashModelEx) { -TemplateHashModelEx leftModelEx = (TemplateHashModelEx) leftModel; -TemplateHashModelEx rightModelEx = (TemplateHashModelEx) rightModel; -if (leftModelEx.size() == 0) { -return rightModelEx; -} else if (rightModelEx.size() == 0) { -return leftModelEx; -} else { -return new ConcatenatedHashEx(leftModelEx, rightModelEx); -} -} else { -return new ConcatenatedHash((TemplateHashModel) leftModel, -(TemplateHashModel) rightModel); -} +// 2.4: Remove
incubator-freemarker git commit: Made `+` operator when adding two hashes significantly faster (be removing the overhead caused be throwing and then catching an exception).
Repository: incubator-freemarker Updated Branches: refs/heads/2.3-gae 496ddfbc0 -> 4b989f89b Made `+` operator when adding two hashes significantly faster (be removing the overhead caused be throwing and then catching an exception). Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/4b989f89 Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/4b989f89 Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/4b989f89 Branch: refs/heads/2.3-gae Commit: 4b989f89ba54b0ba309b7385e56e2ecf2466ffef Parents: 496ddfb Author: ddekanyAuthored: Tue Dec 6 23:25:42 2016 +0100 Committer: ddekany Committed: Tue Dec 6 23:25:55 2016 +0100 -- .../freemarker/core/AddConcatExpression.java| 58 ++-- src/main/java/freemarker/core/EvalUtil.java | 26 +++-- src/manual/en_US/book.xml | 4 +- 3 files changed, 65 insertions(+), 23 deletions(-) -- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/4b989f89/src/main/java/freemarker/core/AddConcatExpression.java -- diff --git a/src/main/java/freemarker/core/AddConcatExpression.java b/src/main/java/freemarker/core/AddConcatExpression.java index 4dbfd78..5523118 100644 --- a/src/main/java/freemarker/core/AddConcatExpression.java +++ b/src/main/java/freemarker/core/AddConcatExpression.java @@ -74,11 +74,26 @@ final class AddConcatExpression extends Expression { } else if (leftModel instanceof TemplateSequenceModel && rightModel instanceof TemplateSequenceModel) { return new ConcatenatedSequence((TemplateSequenceModel) leftModel, (TemplateSequenceModel) rightModel); } else { +boolean hashConcatPossible += leftModel instanceof TemplateHashModel && rightModel instanceof TemplateHashModel; try { +// We try string addition first. If hash addition is possible, then instead of throwing exception +// we return null and do hash addition instead. (We can't simply give hash addition a priority, like +// with sequence addition above, as FTL strings are often also FTL hashes.) Object leftOMOrStr = EvalUtil.coerceModelToStringOrMarkup( -leftModel, leftExp, (String) null, env); +leftModel, leftExp, /* returnNullOnNonCoercableType = */ hashConcatPossible, (String) null, +env); +if (leftOMOrStr == null) { +return _eval_concatenateHashes(leftModel, rightModel); +} + +// Same trick with null return as above. Object rightOMOrStr = EvalUtil.coerceModelToStringOrMarkup( -rightModel, rightExp, (String) null, env); +rightModel, rightExp, /* returnNullOnNonCoercableType = */ hashConcatPossible, (String) null, +env); +if (rightOMOrStr == null) { +return _eval_concatenateHashes(leftModel, rightModel); +} if (leftOMOrStr instanceof String) { if (rightOMOrStr instanceof String) { @@ -98,25 +113,14 @@ final class AddConcatExpression extends Expression { } else { // rightOMOrStr instanceof TemplateMarkupOutputModel return EvalUtil.concatMarkupOutputs(parent, leftMO, -(TemplateMarkupOutputModel) rightOMOrStr); +(TemplateMarkupOutputModel) rightOMOrStr); } } } catch (NonStringOrTemplateOutputException e) { -if (leftModel instanceof TemplateHashModel && rightModel instanceof TemplateHashModel) { -if (leftModel instanceof TemplateHashModelEx && rightModel instanceof TemplateHashModelEx) { -TemplateHashModelEx leftModelEx = (TemplateHashModelEx) leftModel; -TemplateHashModelEx rightModelEx = (TemplateHashModelEx) rightModel; -if (leftModelEx.size() == 0) { -return rightModelEx; -} else if (rightModelEx.size() == 0) { -return leftModelEx; -} else { -return new ConcatenatedHashEx(leftModelEx, rightModelEx); -} -} else { -return new ConcatenatedHash((TemplateHashModel) leftModel, -