Skip to content

Commit c57f6be

Browse files
authored
Remove loop counter from Reserved in Painless AST. (#45298)
This change adds a compiler pass to give each node the chance to store settings necessary for analysis and writing. This removes the need to pass this in a somewhat convoluted way through an additional class called Reserved, and also removes the need to have the Walker set values for settings on reserved. This is next step in decoupling the Painless grammar from the Painless AST.
1 parent 42e8b36 commit c57f6be

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+520
-59
lines changed

modules/lang-painless/src/main/java/org/elasticsearch/painless/Compiler.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,8 @@ private static void addFactoryMethod(Map<String, Class<?>> additionalClasses, Cl
208208
*/
209209
Constructor<?> compile(Loader loader, MainMethodReserved reserved, String name, String source, CompilerSettings settings) {
210210
ScriptClassInfo scriptClassInfo = new ScriptClassInfo(painlessLookup, scriptClass);
211-
SSource root = Walker.buildPainlessTree(scriptClassInfo, reserved, name, source, settings, painlessLookup,
212-
null);
211+
SSource root = Walker.buildPainlessTree(scriptClassInfo, reserved, name, source, settings, painlessLookup, null);
212+
root.storeSettings(settings);
213213
root.analyze(painlessLookup);
214214
Map<String, Object> statics = root.write();
215215

@@ -240,6 +240,7 @@ byte[] compile(String name, String source, CompilerSettings settings, Printer de
240240
ScriptClassInfo scriptClassInfo = new ScriptClassInfo(painlessLookup, scriptClass);
241241
SSource root = Walker.buildPainlessTree(scriptClassInfo, new MainMethodReserved(), name, source, settings, painlessLookup,
242242
debugStream);
243+
root.storeSettings(settings);
243244
root.analyze(painlessLookup);
244245
root.write();
245246

modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/Walker.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ public ANode visitSource(SourceContext ctx) {
253253
statements.add((AStatement)visit(statement));
254254
}
255255

256-
return new SSource(scriptClassInfo, settings, sourceName, sourceText, debugStream,
256+
return new SSource(scriptClassInfo, sourceName, sourceText, debugStream,
257257
(MainMethodReserved)reserved.pop(), location(ctx), functions, statements);
258258
}
259259

@@ -319,8 +319,6 @@ public ANode visitIf(IfContext ctx) {
319319

320320
@Override
321321
public ANode visitWhile(WhileContext ctx) {
322-
reserved.peek().setMaxLoopCounter(settings.getMaxLoopCounter());
323-
324322
AExpression expression = (AExpression)visit(ctx.expression());
325323

326324
if (ctx.trailer() != null) {
@@ -336,8 +334,6 @@ public ANode visitWhile(WhileContext ctx) {
336334

337335
@Override
338336
public ANode visitDo(DoContext ctx) {
339-
reserved.peek().setMaxLoopCounter(settings.getMaxLoopCounter());
340-
341337
AExpression expression = (AExpression)visit(ctx.expression());
342338
SBlock block = (SBlock)visit(ctx.block());
343339

@@ -346,8 +342,6 @@ public ANode visitDo(DoContext ctx) {
346342

347343
@Override
348344
public ANode visitFor(ForContext ctx) {
349-
reserved.peek().setMaxLoopCounter(settings.getMaxLoopCounter());
350-
351345
ANode initializer = ctx.initializer() == null ? null : visit(ctx.initializer());
352346
AExpression expression = ctx.expression() == null ? null : (AExpression)visit(ctx.expression());
353347
AExpression afterthought = ctx.afterthought() == null ? null : (AExpression)visit(ctx.afterthought());
@@ -365,8 +359,6 @@ public ANode visitFor(ForContext ctx) {
365359

366360
@Override
367361
public ANode visitEach(EachContext ctx) {
368-
reserved.peek().setMaxLoopCounter(settings.getMaxLoopCounter());
369-
370362
String type = ctx.decltype().getText();
371363
String name = ctx.ID().getText();
372364
AExpression expression = (AExpression)visit(ctx.expression());
@@ -377,8 +369,6 @@ public ANode visitEach(EachContext ctx) {
377369

378370
@Override
379371
public ANode visitIneach(IneachContext ctx) {
380-
reserved.peek().setMaxLoopCounter(settings.getMaxLoopCounter());
381-
382372
String name = ctx.ID().getText();
383373
AExpression expression = (AExpression)visit(ctx.expression());
384374
SBlock block = (SBlock)visit(ctx.trailer());

modules/lang-painless/src/main/java/org/elasticsearch/painless/node/ANode.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.elasticsearch.painless.node;
2121

22+
import org.elasticsearch.painless.CompilerSettings;
2223
import org.elasticsearch.painless.Globals;
2324
import org.elasticsearch.painless.Locals;
2425
import org.elasticsearch.painless.Location;
@@ -53,6 +54,11 @@ public abstract class ANode {
5354
this.location = Objects.requireNonNull(location);
5455
}
5556

57+
/**
58+
* Store settings required for future compiler passes.
59+
*/
60+
abstract void storeSettings(CompilerSettings settings);
61+
5662
/**
5763
* Adds all variable names referenced to the variable set.
5864
* <p>

modules/lang-painless/src/main/java/org/elasticsearch/painless/node/EAssignment.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222

2323
import org.elasticsearch.painless.AnalyzerCaster;
24+
import org.elasticsearch.painless.CompilerSettings;
2425
import org.elasticsearch.painless.DefBootstrap;
2526
import org.elasticsearch.painless.Globals;
2627
import org.elasticsearch.painless.Locals;
@@ -62,6 +63,15 @@ public EAssignment(Location location, AExpression lhs, AExpression rhs, boolean
6263
this.operation = operation;
6364
}
6465

66+
@Override
67+
void storeSettings(CompilerSettings settings) {
68+
lhs.storeSettings(settings);
69+
70+
if (rhs != null) {
71+
rhs.storeSettings(settings);
72+
}
73+
}
74+
6575
@Override
6676
void extractVariables(Set<String> variables) {
6777
lhs.extractVariables(variables);

modules/lang-painless/src/main/java/org/elasticsearch/painless/node/EBinary.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.painless.node;
2121

2222
import org.elasticsearch.painless.AnalyzerCaster;
23+
import org.elasticsearch.painless.CompilerSettings;
2324
import org.elasticsearch.painless.DefBootstrap;
2425
import org.elasticsearch.painless.Globals;
2526
import org.elasticsearch.painless.Locals;
@@ -57,6 +58,12 @@ public EBinary(Location location, Operation operation, AExpression left, AExpres
5758
this.right = Objects.requireNonNull(right);
5859
}
5960

61+
@Override
62+
void storeSettings(CompilerSettings settings) {
63+
left.storeSettings(settings);
64+
right.storeSettings(settings);
65+
}
66+
6067
@Override
6168
void extractVariables(Set<String> variables) {
6269
left.extractVariables(variables);

modules/lang-painless/src/main/java/org/elasticsearch/painless/node/EBool.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.elasticsearch.painless.node;
2121

22+
import org.elasticsearch.painless.CompilerSettings;
2223
import org.elasticsearch.painless.Globals;
2324
import org.elasticsearch.painless.Locals;
2425
import org.elasticsearch.painless.Location;
@@ -47,6 +48,12 @@ public EBool(Location location, Operation operation, AExpression left, AExpressi
4748
this.right = Objects.requireNonNull(right);
4849
}
4950

51+
@Override
52+
void storeSettings(CompilerSettings settings) {
53+
left.storeSettings(settings);
54+
right.storeSettings(settings);
55+
}
56+
5057
@Override
5158
void extractVariables(Set<String> variables) {
5259
left.extractVariables(variables);

modules/lang-painless/src/main/java/org/elasticsearch/painless/node/EBoolean.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.elasticsearch.painless.node;
2121

22+
import org.elasticsearch.painless.CompilerSettings;
2223
import org.elasticsearch.painless.Globals;
2324
import org.elasticsearch.painless.Locals;
2425
import org.elasticsearch.painless.Location;
@@ -37,6 +38,11 @@ public EBoolean(Location location, boolean constant) {
3738
this.constant = constant;
3839
}
3940

41+
@Override
42+
void storeSettings(CompilerSettings settings) {
43+
// Do nothing.
44+
}
45+
4046
@Override
4147
void extractVariables(Set<String> variables) {
4248
// Do nothing.

modules/lang-painless/src/main/java/org/elasticsearch/painless/node/ECallLocal.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.elasticsearch.painless.node;
2121

22+
import org.elasticsearch.painless.CompilerSettings;
2223
import org.elasticsearch.painless.Globals;
2324
import org.elasticsearch.painless.Locals;
2425
import org.elasticsearch.painless.Locals.LocalMethod;
@@ -59,6 +60,13 @@ public ECallLocal(Location location, String name, List<AExpression> arguments) {
5960
this.arguments = Objects.requireNonNull(arguments);
6061
}
6162

63+
@Override
64+
void storeSettings(CompilerSettings settings) {
65+
for (AExpression argument : arguments) {
66+
argument.storeSettings(settings);
67+
}
68+
}
69+
6270
@Override
6371
void extractVariables(Set<String> variables) {
6472
for (AExpression argument : arguments) {

modules/lang-painless/src/main/java/org/elasticsearch/painless/node/ECapturingFunctionRef.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.elasticsearch.painless.node;
2121

22+
import org.elasticsearch.painless.CompilerSettings;
2223
import org.elasticsearch.painless.DefBootstrap;
2324
import org.elasticsearch.painless.FunctionRef;
2425
import org.elasticsearch.painless.Globals;
@@ -52,6 +53,11 @@ public ECapturingFunctionRef(Location location, String variable, String call) {
5253
this.call = Objects.requireNonNull(call);
5354
}
5455

56+
@Override
57+
void storeSettings(CompilerSettings settings) {
58+
// Do nothing.
59+
}
60+
5561
@Override
5662
void extractVariables(Set<String> variables) {
5763
variables.add(variable);

modules/lang-painless/src/main/java/org/elasticsearch/painless/node/ECast.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.elasticsearch.painless.node;
2121

22+
import org.elasticsearch.painless.CompilerSettings;
2223
import org.elasticsearch.painless.Globals;
2324
import org.elasticsearch.painless.Locals;
2425
import org.elasticsearch.painless.Location;
@@ -44,9 +45,14 @@ final class ECast extends AExpression {
4445
this.cast = Objects.requireNonNull(cast);
4546
}
4647

48+
@Override
49+
void storeSettings(CompilerSettings settings) {
50+
throw createError(new IllegalStateException("illegal tree structure"));
51+
}
52+
4753
@Override
4854
void extractVariables(Set<String> variables) {
49-
throw new IllegalStateException("Illegal tree structure.");
55+
throw createError(new IllegalStateException("Illegal tree structure."));
5056
}
5157

5258
@Override

0 commit comments

Comments
 (0)