This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch 11.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/11.0.x by this push:
new eeda77235e Partial fix for BZ 69338. Better performance for >2 operand
And/Or
eeda77235e is described below
commit eeda77235e3e5b6d0ab0af4839a223bc48f2bccc
Author: Mark Thomas <[email protected]>
AuthorDate: Wed Sep 25 19:55:09 2024 +0100
Partial fix for BZ 69338. Better performance for >2 operand And/Or
https://bz.apache.org/bugzilla/show_bug.cgi?id=69338
---
java/org/apache/el/parser/AstAnd.java | 17 +-
java/org/apache/el/parser/AstOr.java | 17 +-
java/org/apache/el/parser/ELParser.java | 720 +++++++++++----------
java/org/apache/el/parser/ELParser.jjt | 4 +-
.../apache/el/parser/TestELParserPerformance.java | 51 ++
webapps/docs/changelog.xml | 4 +
6 files changed, 458 insertions(+), 355 deletions(-)
diff --git a/java/org/apache/el/parser/AstAnd.java
b/java/org/apache/el/parser/AstAnd.java
index 8a87feaaaa..a55ca4cfc5 100644
--- a/java/org/apache/el/parser/AstAnd.java
+++ b/java/org/apache/el/parser/AstAnd.java
@@ -33,13 +33,16 @@ public final class AstAnd extends BooleanNode {
@Override
public Object getValue(EvaluationContext ctx) throws ELException {
- Object obj = children[0].getValue(ctx);
- Boolean b = ELSupport.coerceToBoolean(ctx, obj, true);
- if (!b.booleanValue()) {
- return b;
+ int i = 0;
+ while (i < children.length - 1) {
+ Object obj = children[i].getValue(ctx);
+ Boolean b = ELSupport.coerceToBoolean(ctx, obj, true);
+ if (!b.booleanValue()) {
+ return b;
+ }
+ i++;
}
- obj = children[1].getValue(ctx);
- b = ELSupport.coerceToBoolean(ctx, obj, true);
- return b;
+ Object obj = children[i].getValue(ctx);
+ return ELSupport.coerceToBoolean(ctx, obj, true);
}
}
diff --git a/java/org/apache/el/parser/AstOr.java
b/java/org/apache/el/parser/AstOr.java
index d5e7d40120..eeecf8dd38 100644
--- a/java/org/apache/el/parser/AstOr.java
+++ b/java/org/apache/el/parser/AstOr.java
@@ -33,13 +33,16 @@ public final class AstOr extends BooleanNode {
@Override
public Object getValue(EvaluationContext ctx) throws ELException {
- Object obj = this.children[0].getValue(ctx);
- Boolean b = ELSupport.coerceToBoolean(ctx, obj, true);
- if (b.booleanValue()) {
- return b;
+ int i = 0;
+ while (i < children.length - 1) {
+ Object obj = children[i].getValue(ctx);
+ Boolean b = ELSupport.coerceToBoolean(ctx, obj, true);
+ if (b.booleanValue()) {
+ return b;
+ }
+ i++;
}
- obj = this.children[1].getValue(ctx);
- b = ELSupport.coerceToBoolean(ctx, obj, true);
- return b;
+ Object obj = children[i].getValue(ctx);
+ return ELSupport.coerceToBoolean(ctx, obj, true);
}
}
diff --git a/java/org/apache/el/parser/ELParser.java
b/java/org/apache/el/parser/ELParser.java
index b80fd01b6c..06c07abe13 100644
--- a/java/org/apache/el/parser/ELParser.java
+++ b/java/org/apache/el/parser/ELParser.java
@@ -637,67 +637,76 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
*/
final public void Or() throws ParseException {
And();
- label_7: while (true) {
- switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
- case OR0:
- case OR1: {
- ;
- break;
- }
- default:
- jj_la1[10] = jj_gen;
- break label_7;
- }
- switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
- case OR0: {
- jj_consume_token(OR0);
- break;
- }
- case OR1: {
- jj_consume_token(OR1);
- break;
- }
- default:
- jj_la1[11] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- AstOr jjtn001 = new AstOr(JJTOR);
- boolean jjtc001 = true;
- jjtree.openNodeScope(jjtn001);
- try {
- And();
- } catch (Throwable jjte001) {
- if (jjtc001) {
- jjtree.clearNodeScope(jjtn001);
- jjtc001 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte001 instanceof RuntimeException) {
- {
- if (true) {
- throw (RuntimeException) jjte001;
+ switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
+ case OR0:
+ case OR1: {
+ AstOr jjtn001 = new AstOr(JJTOR);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ label_7: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
+ case OR0: {
+ jj_consume_token(OR0);
+ break;
+ }
+ case OR1: {
+ jj_consume_token(OR1);
+ break;
+ }
+ default:
+ jj_la1[10] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ And();
+ switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
+ case OR0:
+ case OR1: {
+ ;
+ break;
+ }
+ default:
+ jj_la1[11] = jj_gen;
+ break label_7;
+ }
+ }
+ } catch (Throwable jjte001) {
+ if (jjtc001) {
+ jjtree.clearNodeScope(jjtn001);
+ jjtc001 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte001 instanceof RuntimeException) {
+ {
+ if (true) {
+ throw (RuntimeException) jjte001;
+ }
+ }
+ }
+ if (jjte001 instanceof ParseException) {
+ {
+ if (true) {
+ throw (ParseException) jjte001;
+ }
}
}
- }
- if (jjte001 instanceof ParseException) {
{
if (true) {
- throw (ParseException) jjte001;
+ throw (Error) jjte001;
}
}
- }
- {
- if (true) {
- throw (Error) jjte001;
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, jjtree.nodeArity() + 1);
}
}
- } finally {
- if (jjtc001) {
- jjtree.closeNodeScope(jjtn001, 2);
- }
+ break;
}
+ default:
+ jj_la1[12] = jj_gen;
+ ;
}
}
@@ -706,67 +715,76 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
*/
final public void And() throws ParseException {
Equality();
- label_8: while (true) {
- switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
- case AND0:
- case AND1: {
- ;
- break;
- }
- default:
- jj_la1[12] = jj_gen;
- break label_8;
- }
- switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
- case AND0: {
- jj_consume_token(AND0);
- break;
- }
- case AND1: {
- jj_consume_token(AND1);
- break;
- }
- default:
- jj_la1[13] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- AstAnd jjtn001 = new AstAnd(JJTAND);
- boolean jjtc001 = true;
- jjtree.openNodeScope(jjtn001);
- try {
- Equality();
- } catch (Throwable jjte001) {
- if (jjtc001) {
- jjtree.clearNodeScope(jjtn001);
- jjtc001 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte001 instanceof RuntimeException) {
- {
- if (true) {
- throw (RuntimeException) jjte001;
+ switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
+ case AND0:
+ case AND1: {
+ AstAnd jjtn001 = new AstAnd(JJTAND);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ label_8: while (true) {
+ switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
+ case AND0: {
+ jj_consume_token(AND0);
+ break;
+ }
+ case AND1: {
+ jj_consume_token(AND1);
+ break;
+ }
+ default:
+ jj_la1[13] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ Equality();
+ switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
+ case AND0:
+ case AND1: {
+ ;
+ break;
+ }
+ default:
+ jj_la1[14] = jj_gen;
+ break label_8;
+ }
+ }
+ } catch (Throwable jjte001) {
+ if (jjtc001) {
+ jjtree.clearNodeScope(jjtn001);
+ jjtc001 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte001 instanceof RuntimeException) {
+ {
+ if (true) {
+ throw (RuntimeException) jjte001;
+ }
+ }
+ }
+ if (jjte001 instanceof ParseException) {
+ {
+ if (true) {
+ throw (ParseException) jjte001;
+ }
}
}
- }
- if (jjte001 instanceof ParseException) {
{
if (true) {
- throw (ParseException) jjte001;
+ throw (Error) jjte001;
}
}
- }
- {
- if (true) {
- throw (Error) jjte001;
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, jjtree.nodeArity() + 1);
}
}
- } finally {
- if (jjtc001) {
- jjtree.closeNodeScope(jjtn001, 2);
- }
+ break;
}
+ default:
+ jj_la1[15] = jj_gen;
+ ;
}
}
@@ -785,7 +803,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[14] = jj_gen;
+ jj_la1[16] = jj_gen;
break label_9;
}
switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -801,7 +819,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[15] = jj_gen;
+ jj_la1[17] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -855,7 +873,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[16] = jj_gen;
+ jj_la1[18] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -898,7 +916,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[17] = jj_gen;
+ jj_la1[19] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -924,7 +942,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[18] = jj_gen;
+ jj_la1[20] = jj_gen;
break label_10;
}
switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -940,7 +958,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[19] = jj_gen;
+ jj_la1[21] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -994,7 +1012,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[20] = jj_gen;
+ jj_la1[22] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1048,7 +1066,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[21] = jj_gen;
+ jj_la1[23] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1102,7 +1120,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[22] = jj_gen;
+ jj_la1[24] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1145,7 +1163,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[23] = jj_gen;
+ jj_la1[25] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1165,7 +1183,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[24] = jj_gen;
+ jj_la1[26] = jj_gen;
break label_11;
}
jj_consume_token(CONCAT);
@@ -1221,7 +1239,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[25] = jj_gen;
+ jj_la1[27] = jj_gen;
break label_12;
}
switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -1306,7 +1324,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[26] = jj_gen;
+ jj_la1[28] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1329,7 +1347,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[27] = jj_gen;
+ jj_la1[29] = jj_gen;
break label_13;
}
switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -1385,7 +1403,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[28] = jj_gen;
+ jj_la1[30] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1439,7 +1457,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[29] = jj_gen;
+ jj_la1[31] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1482,7 +1500,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[30] = jj_gen;
+ jj_la1[32] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1546,7 +1564,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[31] = jj_gen;
+ jj_la1[33] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1642,7 +1660,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[32] = jj_gen;
+ jj_la1[34] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1665,7 +1683,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[33] = jj_gen;
+ jj_la1[35] = jj_gen;
break label_14;
}
ValueSuffix();
@@ -1725,7 +1743,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[34] = jj_gen;
+ jj_la1[36] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1745,7 +1763,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[35] = jj_gen;
+ jj_la1[37] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1755,7 +1773,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[36] = jj_gen;
+ jj_la1[38] = jj_gen;
;
}
}
@@ -1857,7 +1875,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[37] = jj_gen;
+ jj_la1[39] = jj_gen;
break label_15;
}
jj_consume_token(COMMA);
@@ -1866,7 +1884,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[38] = jj_gen;
+ jj_la1[40] = jj_gen;
;
}
jj_consume_token(RPAREN);
@@ -1918,7 +1936,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[39] = jj_gen;
+ jj_la1[41] = jj_gen;
if (jj_2_7(2147483647)) {
Function();
} else {
@@ -1928,7 +1946,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[40] = jj_gen;
+ jj_la1[42] = jj_gen;
if (jj_2_8(5)) {
SetData();
} else {
@@ -1942,7 +1960,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[41] = jj_gen;
+ jj_la1[43] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1986,7 +2004,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[42] = jj_gen;
+ jj_la1[44] = jj_gen;
break label_16;
}
jj_consume_token(COMMA);
@@ -1995,7 +2013,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[43] = jj_gen;
+ jj_la1[45] = jj_gen;
;
}
jj_consume_token(RBRACE);
@@ -2061,7 +2079,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[44] = jj_gen;
+ jj_la1[46] = jj_gen;
break label_17;
}
jj_consume_token(COMMA);
@@ -2070,7 +2088,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[45] = jj_gen;
+ jj_la1[47] = jj_gen;
;
}
jj_consume_token(RBRACK);
@@ -2140,7 +2158,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[46] = jj_gen;
+ jj_la1[48] = jj_gen;
break label_18;
}
jj_consume_token(COMMA);
@@ -2149,7 +2167,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[47] = jj_gen;
+ jj_la1[49] = jj_gen;
;
}
jj_consume_token(RBRACE);
@@ -2265,7 +2283,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[48] = jj_gen;
+ jj_la1[50] = jj_gen;
;
}
if (t1 != null) {
@@ -2282,7 +2300,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[49] = jj_gen;
+ jj_la1[51] = jj_gen;
break label_19;
}
}
@@ -2346,7 +2364,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[50] = jj_gen;
+ jj_la1[52] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -2384,7 +2402,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
break;
}
default:
- jj_la1[51] = jj_gen;
+ jj_la1[53] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -2562,21 +2580,6 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
}
}
- private boolean jj_3R_And_173_17_41() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(39)) {
- jj_scanpos = xsp;
- if (jj_scan_token(40)) {
- return true;
- }
- }
- if (jj_3R_Equality_182_5_40()) {
- return true;
- }
- return false;
- }
-
private boolean jj_3R_LambdaExpressionOrInvocation_144_45_30() {
if (jj_3R_Choice_155_5_22()) {
return true;
@@ -2585,13 +2588,13 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
}
private boolean jj_3R_Equality_182_5_40() {
- if (jj_3R_Compare_196_5_44()) {
+ if (jj_3R_Compare_196_5_45()) {
return true;
}
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_Equality_184_9_45()) {
+ if (jj_3R_Equality_184_9_46()) {
jj_scanpos = xsp;
break;
}
@@ -2599,7 +2602,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_ListData_350_26_109() {
+ private boolean jj_3R_ListData_350_26_111() {
if (jj_scan_token(COMMA)) {
return true;
}
@@ -2609,7 +2612,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_MapEntry_368_5_107() {
+ private boolean jj_3R_MapEntry_368_5_109() {
if (jj_3R_Expression_99_5_36()) {
return true;
}
@@ -2622,14 +2625,14 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_MapData_362_11_105() {
- if (jj_3R_MapEntry_368_5_107()) {
+ private boolean jj_3R_MapData_362_11_107() {
+ if (jj_3R_MapEntry_368_5_109()) {
return true;
}
return false;
}
- private boolean jj_3R_LambdaParameters_132_46_43() {
+ private boolean jj_3R_LambdaParameters_132_46_44() {
if (jj_scan_token(COMMA)) {
return true;
}
@@ -2644,12 +2647,9 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return true;
}
Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_And_173_17_41()) {
- jj_scanpos = xsp;
- break;
- }
+ xsp = jj_scanpos;
+ if (jj_3R_And_174_17_41()) {
+ jj_scanpos = xsp;
}
return false;
}
@@ -2664,7 +2664,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_Or_164_12_35() {
+ private boolean jj_3R_Or_164_13_42() {
Token xsp;
xsp = jj_scanpos;
if (jj_scan_token(41)) {
@@ -2679,13 +2679,28 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_MapData_361_5_99() {
+ private boolean jj_3R_Or_165_12_35() {
+ Token xsp;
+ if (jj_3R_Or_164_13_42()) {
+ return true;
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_Or_164_13_42()) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_MapData_361_5_101() {
if (jj_scan_token(START_SET_OR_MAP)) {
return true;
}
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_MapData_362_11_105()) {
+ if (jj_3R_MapData_362_11_107()) {
jj_scanpos = xsp;
}
if (jj_scan_token(RBRACE)) {
@@ -2694,14 +2709,14 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_ListData_350_11_104() {
+ private boolean jj_3R_ListData_350_11_106() {
if (jj_3R_Expression_99_5_36()) {
return true;
}
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_ListData_350_26_109()) {
+ if (jj_3R_ListData_350_26_111()) {
jj_scanpos = xsp;
break;
}
@@ -2714,12 +2729,9 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return true;
}
Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_Or_164_12_35()) {
- jj_scanpos = xsp;
- break;
- }
+ xsp = jj_scanpos;
+ if (jj_3R_Or_165_12_35()) {
+ jj_scanpos = xsp;
}
return false;
}
@@ -2737,13 +2749,13 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_ListData_349_5_98() {
+ private boolean jj_3R_ListData_349_5_100() {
if (jj_scan_token(LBRACK)) {
return true;
}
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_ListData_350_11_104()) {
+ if (jj_3R_ListData_350_11_106()) {
jj_scanpos = xsp;
}
if (jj_scan_token(RBRACK)) {
@@ -2759,7 +2771,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_LambdaParameters_132_46_43()) {
+ if (jj_3R_LambdaParameters_132_46_44()) {
jj_scanpos = xsp;
break;
}
@@ -2804,7 +2816,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_MethodParameters_317_31_111() {
+ private boolean jj_3R_MethodParameters_317_31_113() {
if (jj_scan_token(COMMA)) {
return true;
}
@@ -2873,15 +2885,15 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_NonLiteral_332_7_89() {
- if (jj_3R_MapData_361_5_99()) {
+ private boolean jj_3R_NonLiteral_332_7_91() {
+ if (jj_3R_MapData_361_5_101()) {
return true;
}
return false;
}
- private boolean jj_3R_NonLiteral_331_7_88() {
- if (jj_3R_ListData_349_5_98()) {
+ private boolean jj_3R_NonLiteral_331_7_90() {
+ if (jj_3R_ListData_349_5_100()) {
return true;
}
return false;
@@ -2918,21 +2930,21 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_NonLiteral_329_7_87() {
+ private boolean jj_3R_NonLiteral_329_7_89() {
if (jj_3R_Identifier_377_5_38()) {
return true;
}
return false;
}
- private boolean jj_3R_NonLiteral_328_7_86() {
- if (jj_3R_Function_390_5_97()) {
+ private boolean jj_3R_NonLiteral_328_7_88() {
+ if (jj_3R_Function_390_5_99()) {
return true;
}
return false;
}
- private boolean jj_3R_NonLiteral_327_7_85() {
+ private boolean jj_3R_NonLiteral_327_7_87() {
if (jj_scan_token(LPAREN)) {
return true;
}
@@ -2945,14 +2957,14 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_MethodParameters_317_16_110() {
+ private boolean jj_3R_MethodParameters_317_16_112() {
if (jj_3R_Expression_99_5_36()) {
return true;
}
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_MethodParameters_317_31_111()) {
+ if (jj_3R_MethodParameters_317_31_113()) {
jj_scanpos = xsp;
break;
}
@@ -2960,29 +2972,29 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_ValueSuffix_291_41_108() {
- if (jj_3R_MethodParameters_317_5_106()) {
+ private boolean jj_3R_ValueSuffix_291_41_110() {
+ if (jj_3R_MethodParameters_317_5_108()) {
return true;
}
return false;
}
- private boolean jj_3R_NonLiteral_326_5_77() {
+ private boolean jj_3R_NonLiteral_326_5_79() {
Token xsp;
xsp = jj_scanpos;
if (jj_3_6()) {
jj_scanpos = xsp;
- if (jj_3R_NonLiteral_327_7_85()) {
+ if (jj_3R_NonLiteral_327_7_87()) {
jj_scanpos = xsp;
- if (jj_3R_NonLiteral_328_7_86()) {
+ if (jj_3R_NonLiteral_328_7_88()) {
jj_scanpos = xsp;
- if (jj_3R_NonLiteral_329_7_87()) {
+ if (jj_3R_NonLiteral_329_7_89()) {
jj_scanpos = xsp;
if (jj_3_8()) {
jj_scanpos = xsp;
- if (jj_3R_NonLiteral_331_7_88()) {
+ if (jj_3R_NonLiteral_331_7_90()) {
jj_scanpos = xsp;
- if (jj_3R_NonLiteral_332_7_89()) {
+ if (jj_3R_NonLiteral_332_7_91()) {
return true;
}
}
@@ -3030,13 +3042,13 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_MethodParameters_317_5_106() {
+ private boolean jj_3R_MethodParameters_317_5_108() {
if (jj_scan_token(LPAREN)) {
return true;
}
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_MethodParameters_317_16_110()) {
+ if (jj_3R_MethodParameters_317_16_112()) {
jj_scanpos = xsp;
}
if (jj_scan_token(RPAREN)) {
@@ -3063,7 +3075,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_Semicolon_107_20_46() {
+ private boolean jj_3R_Semicolon_107_20_48() {
if (jj_scan_token(SEMICOLON)) {
return true;
}
@@ -3073,7 +3085,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_BracketSuffix_309_5_91() {
+ private boolean jj_3R_BracketSuffix_309_5_93() {
if (jj_scan_token(LBRACK)) {
return true;
}
@@ -3086,8 +3098,8 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_ValueSuffix_291_21_79() {
- if (jj_3R_BracketSuffix_309_5_91()) {
+ private boolean jj_3R_ValueSuffix_291_21_81() {
+ if (jj_3R_BracketSuffix_309_5_93()) {
return true;
}
return false;
@@ -3127,7 +3139,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_DotSuffix_300_5_90() {
+ private boolean jj_3R_DotSuffix_300_5_92() {
if (jj_scan_token(DOT)) {
return true;
}
@@ -3137,14 +3149,14 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_Semicolon_107_5_42() {
+ private boolean jj_3R_Semicolon_107_5_43() {
if (jj_3R_Assignment_115_5_20()) {
return true;
}
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_Semicolon_107_20_46()) {
+ if (jj_3R_Semicolon_107_20_48()) {
jj_scanpos = xsp;
break;
}
@@ -3152,77 +3164,77 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_ValueSuffix_291_7_78() {
- if (jj_3R_DotSuffix_300_5_90()) {
+ private boolean jj_3R_ValueSuffix_291_7_80() {
+ if (jj_3R_DotSuffix_300_5_92()) {
return true;
}
return false;
}
- private boolean jj_3R_ValueSuffix_291_5_75() {
+ private boolean jj_3R_ValueSuffix_291_5_77() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_ValueSuffix_291_7_78()) {
+ if (jj_3R_ValueSuffix_291_7_80()) {
jj_scanpos = xsp;
- if (jj_3R_ValueSuffix_291_21_79()) {
+ if (jj_3R_ValueSuffix_291_21_81()) {
return true;
}
}
xsp = jj_scanpos;
- if (jj_3R_ValueSuffix_291_41_108()) {
+ if (jj_3R_ValueSuffix_291_41_110()) {
jj_scanpos = xsp;
}
return false;
}
private boolean jj_3R_Expression_99_5_36() {
- if (jj_3R_Semicolon_107_5_42()) {
+ if (jj_3R_Semicolon_107_5_43()) {
return true;
}
return false;
}
- private boolean jj_3R_Value_272_21_72() {
- if (jj_3R_ValueSuffix_291_5_75()) {
+ private boolean jj_3R_Value_272_21_74() {
+ if (jj_3R_ValueSuffix_291_5_77()) {
return true;
}
return false;
}
- private boolean jj_3R_ValuePrefix_282_7_74() {
- if (jj_3R_NonLiteral_326_5_77()) {
+ private boolean jj_3R_ValuePrefix_282_7_76() {
+ if (jj_3R_NonLiteral_326_5_79()) {
return true;
}
return false;
}
- private boolean jj_3R_ValuePrefix_281_5_71() {
+ private boolean jj_3R_ValuePrefix_281_5_73() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_ValuePrefix_281_5_73()) {
+ if (jj_3R_ValuePrefix_281_5_75()) {
jj_scanpos = xsp;
- if (jj_3R_ValuePrefix_282_7_74()) {
+ if (jj_3R_ValuePrefix_282_7_76()) {
return true;
}
}
return false;
}
- private boolean jj_3R_ValuePrefix_281_5_73() {
- if (jj_3R_Literal_408_5_76()) {
+ private boolean jj_3R_ValuePrefix_281_5_75() {
+ if (jj_3R_Literal_408_5_78()) {
return true;
}
return false;
}
- private boolean jj_3R_Value_272_5_70() {
- if (jj_3R_ValuePrefix_281_5_71()) {
+ private boolean jj_3R_Value_272_5_72() {
+ if (jj_3R_ValuePrefix_281_5_73()) {
return true;
}
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_Value_272_21_72()) {
+ if (jj_3R_Value_272_21_74()) {
jj_scanpos = xsp;
break;
}
@@ -3230,31 +3242,31 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_Null_458_5_96() {
+ private boolean jj_3R_Null_458_5_98() {
if (jj_scan_token(NULL)) {
return true;
}
return false;
}
- private boolean jj_3R_Unary_263_9_66() {
- if (jj_3R_Value_272_5_70()) {
+ private boolean jj_3R_Unary_263_9_68() {
+ if (jj_3R_Value_272_5_72()) {
return true;
}
return false;
}
- private boolean jj_3R_Unary_261_9_65() {
+ private boolean jj_3R_Unary_261_9_67() {
if (jj_scan_token(EMPTY)) {
return true;
}
- if (jj_3R_Unary_257_9_59()) {
+ if (jj_3R_Unary_257_9_61()) {
return true;
}
return false;
}
- private boolean jj_3R_Unary_259_9_64() {
+ private boolean jj_3R_Unary_259_9_66() {
Token xsp;
xsp = jj_scanpos;
if (jj_scan_token(37)) {
@@ -3263,22 +3275,22 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return true;
}
}
- if (jj_3R_Unary_257_9_59()) {
+ if (jj_3R_Unary_257_9_61()) {
return true;
}
return false;
}
- private boolean jj_3R_Unary_257_9_59() {
+ private boolean jj_3R_Unary_257_9_61() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_Unary_257_9_63()) {
+ if (jj_3R_Unary_257_9_65()) {
jj_scanpos = xsp;
- if (jj_3R_Unary_259_9_64()) {
+ if (jj_3R_Unary_259_9_66()) {
jj_scanpos = xsp;
- if (jj_3R_Unary_261_9_65()) {
+ if (jj_3R_Unary_261_9_67()) {
jj_scanpos = xsp;
- if (jj_3R_Unary_263_9_66()) {
+ if (jj_3R_Unary_263_9_68()) {
return true;
}
}
@@ -3287,24 +3299,24 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_Unary_257_9_63() {
+ private boolean jj_3R_Unary_257_9_65() {
if (jj_scan_token(MINUS)) {
return true;
}
- if (jj_3R_Unary_257_9_59()) {
+ if (jj_3R_Unary_257_9_61()) {
return true;
}
return false;
}
- private boolean jj_3R_String_449_5_95() {
+ private boolean jj_3R_String_449_5_97() {
if (jj_scan_token(STRING_LITERAL)) {
return true;
}
return false;
}
- private boolean jj_3R_Multiplication_247_9_69() {
+ private boolean jj_3R_Multiplication_247_9_71() {
Token xsp;
xsp = jj_scanpos;
if (jj_scan_token(51)) {
@@ -3313,20 +3325,20 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return true;
}
}
- if (jj_3R_Unary_257_9_59()) {
+ if (jj_3R_Unary_257_9_61()) {
return true;
}
return false;
}
- private boolean jj_3R_Integer_440_5_94() {
+ private boolean jj_3R_Integer_440_5_96() {
if (jj_scan_token(INTEGER_LITERAL)) {
return true;
}
return false;
}
- private boolean jj_3R_Multiplication_245_9_68() {
+ private boolean jj_3R_Multiplication_245_9_70() {
Token xsp;
xsp = jj_scanpos;
if (jj_scan_token(49)) {
@@ -3335,20 +3347,20 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return true;
}
}
- if (jj_3R_Unary_257_9_59()) {
+ if (jj_3R_Unary_257_9_61()) {
return true;
}
return false;
}
- private boolean jj_3R_Multiplication_243_9_60() {
+ private boolean jj_3R_Multiplication_243_9_62() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_Multiplication_243_9_67()) {
+ if (jj_3R_Multiplication_243_9_69()) {
jj_scanpos = xsp;
- if (jj_3R_Multiplication_245_9_68()) {
+ if (jj_3R_Multiplication_245_9_70()) {
jj_scanpos = xsp;
- if (jj_3R_Multiplication_247_9_69()) {
+ if (jj_3R_Multiplication_247_9_71()) {
return true;
}
}
@@ -3356,24 +3368,24 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_Multiplication_243_9_67() {
+ private boolean jj_3R_Multiplication_243_9_69() {
if (jj_scan_token(MULT)) {
return true;
}
- if (jj_3R_Unary_257_9_59()) {
+ if (jj_3R_Unary_257_9_61()) {
return true;
}
return false;
}
- private boolean jj_3R_Multiplication_241_5_57() {
- if (jj_3R_Unary_257_9_59()) {
+ private boolean jj_3R_Multiplication_241_5_59() {
+ if (jj_3R_Unary_257_9_61()) {
return true;
}
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_Multiplication_243_9_60()) {
+ if (jj_3R_Multiplication_243_9_62()) {
jj_scanpos = xsp;
break;
}
@@ -3381,79 +3393,79 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_FloatingPoint_431_5_93() {
+ private boolean jj_3R_FloatingPoint_431_5_95() {
if (jj_scan_token(FLOATING_POINT_LITERAL)) {
return true;
}
return false;
}
- private boolean jj_3R_Math_231_9_62() {
+ private boolean jj_3R_Math_231_9_64() {
if (jj_scan_token(MINUS)) {
return true;
}
- if (jj_3R_Multiplication_241_5_57()) {
+ if (jj_3R_Multiplication_241_5_59()) {
return true;
}
return false;
}
- private boolean jj_3R_Boolean_423_7_101() {
+ private boolean jj_3R_Boolean_423_7_103() {
if (jj_scan_token(FALSE)) {
return true;
}
return false;
}
- private boolean jj_3R_Math_229_9_58() {
+ private boolean jj_3R_Math_229_9_60() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_Math_229_9_61()) {
+ if (jj_3R_Math_229_9_63()) {
jj_scanpos = xsp;
- if (jj_3R_Math_231_9_62()) {
+ if (jj_3R_Math_231_9_64()) {
return true;
}
}
return false;
}
- private boolean jj_3R_Math_229_9_61() {
+ private boolean jj_3R_Math_229_9_63() {
if (jj_scan_token(PLUS)) {
return true;
}
- if (jj_3R_Multiplication_241_5_57()) {
+ if (jj_3R_Multiplication_241_5_59()) {
return true;
}
return false;
}
- private boolean jj_3R_Boolean_421_5_100() {
+ private boolean jj_3R_Boolean_421_5_102() {
if (jj_scan_token(TRUE)) {
return true;
}
return false;
}
- private boolean jj_3R_Boolean_421_5_92() {
+ private boolean jj_3R_Boolean_421_5_94() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_Boolean_421_5_100()) {
+ if (jj_3R_Boolean_421_5_102()) {
jj_scanpos = xsp;
- if (jj_3R_Boolean_423_7_101()) {
+ if (jj_3R_Boolean_423_7_103()) {
return true;
}
}
return false;
}
- private boolean jj_3R_Math_227_5_51() {
- if (jj_3R_Multiplication_241_5_57()) {
+ private boolean jj_3R_Math_227_5_53() {
+ if (jj_3R_Multiplication_241_5_59()) {
return true;
}
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_Math_229_9_58()) {
+ if (jj_3R_Math_229_9_60()) {
jj_scanpos = xsp;
break;
}
@@ -3461,45 +3473,45 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_Literal_412_7_84() {
- if (jj_3R_Null_458_5_96()) {
+ private boolean jj_3R_Literal_412_7_86() {
+ if (jj_3R_Null_458_5_98()) {
return true;
}
return false;
}
- private boolean jj_3R_Literal_411_7_83() {
- if (jj_3R_String_449_5_95()) {
+ private boolean jj_3R_Literal_411_7_85() {
+ if (jj_3R_String_449_5_97()) {
return true;
}
return false;
}
- private boolean jj_3R_Concatenation_217_10_52() {
+ private boolean jj_3R_Concatenation_217_10_54() {
if (jj_scan_token(CONCAT)) {
return true;
}
- if (jj_3R_Math_227_5_51()) {
+ if (jj_3R_Math_227_5_53()) {
return true;
}
return false;
}
- private boolean jj_3R_Literal_410_7_82() {
- if (jj_3R_Integer_440_5_94()) {
+ private boolean jj_3R_Literal_410_7_84() {
+ if (jj_3R_Integer_440_5_96()) {
return true;
}
return false;
}
- private boolean jj_3R_Literal_409_7_81() {
- if (jj_3R_FloatingPoint_431_5_93()) {
+ private boolean jj_3R_Literal_409_7_83() {
+ if (jj_3R_FloatingPoint_431_5_95()) {
return true;
}
return false;
}
- private boolean jj_3R_Function_390_24_102() {
+ private boolean jj_3R_Function_390_24_104() {
if (jj_scan_token(COLON)) {
return true;
}
@@ -3509,25 +3521,25 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_Literal_408_5_80() {
- if (jj_3R_Boolean_421_5_92()) {
+ private boolean jj_3R_Literal_408_5_82() {
+ if (jj_3R_Boolean_421_5_94()) {
return true;
}
return false;
}
- private boolean jj_3R_Literal_408_5_76() {
+ private boolean jj_3R_Literal_408_5_78() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_Literal_408_5_80()) {
+ if (jj_3R_Literal_408_5_82()) {
jj_scanpos = xsp;
- if (jj_3R_Literal_409_7_81()) {
+ if (jj_3R_Literal_409_7_83()) {
jj_scanpos = xsp;
- if (jj_3R_Literal_410_7_82()) {
+ if (jj_3R_Literal_410_7_84()) {
jj_scanpos = xsp;
- if (jj_3R_Literal_411_7_83()) {
+ if (jj_3R_Literal_411_7_85()) {
jj_scanpos = xsp;
- if (jj_3R_Literal_412_7_84()) {
+ if (jj_3R_Literal_412_7_86()) {
return true;
}
}
@@ -3537,14 +3549,14 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_Concatenation_215_6_47() {
- if (jj_3R_Math_227_5_51()) {
+ private boolean jj_3R_Concatenation_215_6_49() {
+ if (jj_3R_Math_227_5_53()) {
return true;
}
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_Concatenation_217_10_52()) {
+ if (jj_3R_Concatenation_217_10_54()) {
jj_scanpos = xsp;
break;
}
@@ -3552,14 +3564,14 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_Function_399_7_103() {
- if (jj_3R_MethodParameters_317_5_106()) {
+ private boolean jj_3R_Function_399_7_105() {
+ if (jj_3R_MethodParameters_317_5_108()) {
return true;
}
return false;
}
- private boolean jj_3R_Compare_204_9_56() {
+ private boolean jj_3R_Compare_204_9_58() {
Token xsp;
xsp = jj_scanpos;
if (jj_scan_token(29)) {
@@ -3568,13 +3580,13 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return true;
}
}
- if (jj_3R_Concatenation_215_6_47()) {
+ if (jj_3R_Concatenation_215_6_49()) {
return true;
}
return false;
}
- private boolean jj_3R_Compare_202_9_55() {
+ private boolean jj_3R_Compare_202_9_57() {
Token xsp;
xsp = jj_scanpos;
if (jj_scan_token(31)) {
@@ -3583,13 +3595,13 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return true;
}
}
- if (jj_3R_Concatenation_215_6_47()) {
+ if (jj_3R_Concatenation_215_6_49()) {
return true;
}
return false;
}
- private boolean jj_3R_Compare_200_9_54() {
+ private boolean jj_3R_Compare_200_9_56() {
Token xsp;
xsp = jj_scanpos;
if (jj_scan_token(25)) {
@@ -3598,22 +3610,22 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return true;
}
}
- if (jj_3R_Concatenation_215_6_47()) {
+ if (jj_3R_Concatenation_215_6_49()) {
return true;
}
return false;
}
- private boolean jj_3R_Compare_198_9_48() {
+ private boolean jj_3R_Compare_198_9_50() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_Compare_198_9_53()) {
+ if (jj_3R_Compare_198_9_55()) {
jj_scanpos = xsp;
- if (jj_3R_Compare_200_9_54()) {
+ if (jj_3R_Compare_200_9_56()) {
jj_scanpos = xsp;
- if (jj_3R_Compare_202_9_55()) {
+ if (jj_3R_Compare_202_9_57()) {
jj_scanpos = xsp;
- if (jj_3R_Compare_204_9_56()) {
+ if (jj_3R_Compare_204_9_58()) {
return true;
}
}
@@ -3622,7 +3634,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_Compare_198_9_53() {
+ private boolean jj_3R_Compare_198_9_55() {
Token xsp;
xsp = jj_scanpos;
if (jj_scan_token(27)) {
@@ -3631,27 +3643,27 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return true;
}
}
- if (jj_3R_Concatenation_215_6_47()) {
+ if (jj_3R_Concatenation_215_6_49()) {
return true;
}
return false;
}
- private boolean jj_3R_Function_390_5_97() {
+ private boolean jj_3R_Function_390_5_99() {
if (jj_scan_token(IDENTIFIER)) {
return true;
}
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_Function_390_24_102()) {
+ if (jj_3R_Function_390_24_104()) {
jj_scanpos = xsp;
}
- if (jj_3R_Function_399_7_103()) {
+ if (jj_3R_Function_399_7_105()) {
return true;
}
while (true) {
xsp = jj_scanpos;
- if (jj_3R_Function_399_7_103()) {
+ if (jj_3R_Function_399_7_105()) {
jj_scanpos = xsp;
break;
}
@@ -3659,14 +3671,14 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_Compare_196_5_44() {
- if (jj_3R_Concatenation_215_6_47()) {
+ private boolean jj_3R_Compare_196_5_45() {
+ if (jj_3R_Concatenation_215_6_49()) {
return true;
}
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_Compare_198_9_48()) {
+ if (jj_3R_Compare_198_9_50()) {
jj_scanpos = xsp;
break;
}
@@ -3674,7 +3686,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
- private boolean jj_3R_Equality_186_9_50() {
+ private boolean jj_3R_Equality_186_9_52() {
Token xsp;
xsp = jj_scanpos;
if (jj_scan_token(35)) {
@@ -3683,25 +3695,25 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return true;
}
}
- if (jj_3R_Compare_196_5_44()) {
+ if (jj_3R_Compare_196_5_45()) {
return true;
}
return false;
}
- private boolean jj_3R_Equality_184_9_45() {
+ private boolean jj_3R_Equality_184_9_46() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_Equality_184_9_49()) {
+ if (jj_3R_Equality_184_9_51()) {
jj_scanpos = xsp;
- if (jj_3R_Equality_186_9_50()) {
+ if (jj_3R_Equality_186_9_52()) {
return true;
}
}
return false;
}
- private boolean jj_3R_Equality_184_9_49() {
+ private boolean jj_3R_Equality_184_9_51() {
Token xsp;
xsp = jj_scanpos;
if (jj_scan_token(33)) {
@@ -3710,7 +3722,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return true;
}
}
- if (jj_3R_Compare_196_5_44()) {
+ if (jj_3R_Compare_196_5_45()) {
return true;
}
return false;
@@ -3723,6 +3735,36 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
return false;
}
+ private boolean jj_3R_And_174_17_41() {
+ Token xsp;
+ if (jj_3R_And_173_18_47()) {
+ return true;
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_And_173_18_47()) {
+ jj_scanpos = xsp;
+ break;
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_And_173_18_47() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(39)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(40)) {
+ return true;
+ }
+ }
+ if (jj_3R_Equality_182_5_40()) {
+ return true;
+ }
+ return false;
+ }
+
private boolean jj_3R_Identifier_377_5_38() {
if (jj_scan_token(IDENTIFIER)) {
return true;
@@ -3741,7 +3783,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
private Token jj_scanpos, jj_lastpos;
private int jj_la;
private int jj_gen;
- final private int[] jj_la1 = new int[52];
+ final private int[] jj_la1 = new int[54];
static private int[] jj_la1_0;
static private int[] jj_la1_1;
static {
@@ -3751,7 +3793,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
private static void jj_la1_init_0() {
jj_la1_0 = new int[] { 0xe, 0xe, 0x800000, 0x15ed00, 0x15ed00,
0x1000000, 0x0, 0x40000, 0x15ed00, 0x40000, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe000000, 0x18000000,
0x6000000, 0x80000000, 0x60000000,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe000000,
0x18000000, 0x6000000, 0x80000000, 0x60000000,
0xfe000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15ed00,
0x120000, 0x15ed00, 0x120000, 0x40000,
0x1000000, 0x15ed00, 0x40000, 0x0, 0x100100, 0x1000000,
0x15ed00, 0x1000000, 0x15ed00, 0x1000000,
0x15ed00, 0x400000, 0x40000, 0x1ec00, 0xc000, };
@@ -3759,9 +3801,9 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
private static void jj_la1_init_1() {
jj_la1_1 = new int[] { 0x0, 0x0, 0x0, 0x1008860, 0x1008860, 0x0,
0x1000000, 0x1000000, 0x1008860, 0x0, 0x600,
- 0x600, 0x180, 0x180, 0x1e, 0x6, 0x18, 0x1e, 0x1, 0x0, 0x0,
0x1, 0x0, 0x1, 0x200000, 0xc000, 0xc000,
- 0x1e2000, 0x60000, 0x180000, 0x1e2000, 0x60, 0x1008860, 0x0,
0x1000000, 0x0, 0x0, 0x0, 0x1008860, 0x0,
- 0x1000000, 0x0, 0x0, 0x1008860, 0x0, 0x1008860, 0x0,
0x1008860, 0x0, 0x0, 0x0, 0x0, };
+ 0x600, 0x600, 0x180, 0x180, 0x180, 0x1e, 0x6, 0x18, 0x1e, 0x1,
0x0, 0x0, 0x1, 0x0, 0x1, 0x200000,
+ 0xc000, 0xc000, 0x1e2000, 0x60000, 0x180000, 0x1e2000, 0x60,
0x1008860, 0x0, 0x1000000, 0x0, 0x0, 0x0,
+ 0x1008860, 0x0, 0x1000000, 0x0, 0x0, 0x1008860, 0x0,
0x1008860, 0x0, 0x1008860, 0x0, 0x0, 0x0, 0x0, };
}
final private JJCalls[] jj_2_rtns = new JJCalls[8];
@@ -3784,7 +3826,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 52; i++) {
+ for (int i = 0; i < 54; i++) {
jj_la1[i] = -1;
}
for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3809,7 +3851,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
jj_ntk = -1;
jjtree.reset();
jj_gen = 0;
- for (int i = 0; i < 52; i++) {
+ for (int i = 0; i < 54; i++) {
jj_la1[i] = -1;
}
for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3824,7 +3866,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 52; i++) {
+ for (int i = 0; i < 54; i++) {
jj_la1[i] = -1;
}
for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3848,7 +3890,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
jj_ntk = -1;
jjtree.reset();
jj_gen = 0;
- for (int i = 0; i < 52; i++) {
+ for (int i = 0; i < 54; i++) {
jj_la1[i] = -1;
}
for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3862,7 +3904,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 52; i++) {
+ for (int i = 0; i < 54; i++) {
jj_la1[i] = -1;
}
for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3877,7 +3919,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
jj_ntk = -1;
jjtree.reset();
jj_gen = 0;
- for (int i = 0; i < 52; i++) {
+ for (int i = 0; i < 54; i++) {
jj_la1[i] = -1;
}
for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -4041,7 +4083,7 @@ public class ELParser/* @bgen(jjtree) */ implements
ELParserTreeConstants, ELPar
la1tokens[jj_kind] = true;
jj_kind = -1;
}
- for (int i = 0; i < 52; i++) {
+ for (int i = 0; i < 54; i++) {
if (jj_la1[i] == jj_gen) {
for (int j = 0; j < 32; j++) {
if ((jj_la1_0[i] & (1 << j)) != 0) {
diff --git a/java/org/apache/el/parser/ELParser.jjt
b/java/org/apache/el/parser/ELParser.jjt
index ce9c7fe431..8739d038cc 100644
--- a/java/org/apache/el/parser/ELParser.jjt
+++ b/java/org/apache/el/parser/ELParser.jjt
@@ -161,7 +161,7 @@ void Choice() : {}
*/
void Or() : {}
{
- And() ((<OR0>|<OR1>) And() #Or(2))*
+ And() [((<OR0>|<OR1>) And())+ #Or(jjtree.nodeArity() + 1)]
}
/*
@@ -170,7 +170,7 @@ void Or() : {}
*/
void And() : {}
{
- Equality() ((<AND0>|<AND1>) Equality() #And(2))*
+ Equality() [((<AND0>|<AND1>) Equality())+ #And(jjtree.nodeArity() + 1)]
}
/*
diff --git a/test/org/apache/el/parser/TestELParserPerformance.java
b/test/org/apache/el/parser/TestELParserPerformance.java
index eb860f4be9..424a6fe27f 100644
--- a/test/org/apache/el/parser/TestELParserPerformance.java
+++ b/test/org/apache/el/parser/TestELParserPerformance.java
@@ -19,8 +19,13 @@ package org.apache.el.parser;
import java.io.StringReader;
import jakarta.el.ELBaseTest;
+import jakarta.el.ELContext;
+import jakarta.el.ELManager;
+import jakarta.el.ExpressionFactory;
+import jakarta.el.ValueExpression;
import org.junit.Assert;
+import org.junit.Ignore;
import org.junit.Test;
import org.apache.tomcat.util.collections.SynchronizedStack;
@@ -91,4 +96,50 @@ public class TestELParserPerformance extends ELBaseTest {
Assert.assertTrue("Using new ElParser() was faster then using
ELParser.ReInit", reinitTotalTime < newTotalTime);
}
+
+
+ /*
+ * Ignored by default since this is an absolute test primarily for
+ * https://bz.apache.org/bugzilla/show_bug.cgi?id=69338
+ */
+ @Ignore
+ @Test
+ public void testAstAnd() {
+
+ ELManager manager = new ELManager();
+ ELContext context = manager.getELContext();
+ ExpressionFactory factory = ELManager.getExpressionFactory();
+
+ long durations[] = new long[9];
+ for (int j = 0; j < 5; j++) {
+ for (int operandCount = 2; operandCount < 11; operandCount ++) {
+
+ StringBuilder sb = new StringBuilder("${true");
+ for (int i = 2; i <= operandCount; i++) {
+ sb.append(" && true");
+ }
+ sb.append("}");
+
+ String expression = sb.toString();
+
+ long start = System.nanoTime();
+
+ for (int i = 0; i < 2000000; i++) {
+ ValueExpression ve =
factory.createValueExpression(context, expression, Boolean.class);
+ Boolean result = ve.getValue(context);
+ Assert.assertEquals(Boolean.TRUE, result);
+ }
+
+ long duration = System.nanoTime() - start;
+
+ if (j > 0) {
+ durations[operandCount - 2] += duration;
+ }
+ }
+ }
+ for (int operandCount = 2; operandCount < 11; operandCount ++) {
+ System.out.println("Operand count [" + operandCount + "], duration
[" + durations[operandCount -2] + "]");
+ }
+ System.out.println("");
+ }
}
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index aa367c6257..1130159b5c 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -164,6 +164,10 @@
<fix>
<bug>69333</bug>: Remove unnecessary code from generated JSPs. (markt)
</fix>
+ <fix>
+ <bug>69338</bug>: Improve the performance of processing expressions
that
+ include AND or OR operations with more than two operands. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Web applications">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]