[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).

2016-12-06 Thread ddekany
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: ddekany 
Authored: 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).

2016-12-06 Thread ddekany
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: ddekany 
Authored: 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,
-