Skip to content

Commit

Permalink
Make location final in IRNode (#63078)
Browse files Browse the repository at this point in the history
This change makes Location a final member of IRNode as opposed to possibly changing it. This 
ensures that all ir nodes have a Location for error information upon creation that cannot be updated 
so each node can be tracked as where it came from originally.
  • Loading branch information
jdconrad committed Oct 5, 2020
1 parent cf75abb commit d134b4f
Show file tree
Hide file tree
Showing 81 changed files with 631 additions and 416 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.Location;

import java.util.ArrayList;
import java.util.List;

Expand All @@ -38,4 +40,8 @@ public List<ExpressionNode> getArgumentNodes() {

/* ---- end tree structure ---- */

public ArgumentsNode(Location location) {
super(location);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.ClassWriter;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
import org.elasticsearch.painless.phase.IRTreeVisitor;
import org.elasticsearch.painless.symbol.WriteScope;
Expand All @@ -41,6 +42,10 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop

/* ---- end visitor ---- */

public BinaryImplNode(Location location) {
super(location);
}

@Override
protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteScope writeScope) {
getLeftNode().write(classWriter, methodWriter, writeScope);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.ClassWriter;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
import org.elasticsearch.painless.Operation;
import org.elasticsearch.painless.WriterConstants;
Expand Down Expand Up @@ -95,9 +96,13 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop

/* ---- end visitor ---- */

public BinaryMathNode(Location location) {
super(location);
}

@Override
protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteScope writeScope) {
methodWriter.writeDebugInfo(location);
methodWriter.writeDebugInfo(getLocation());

if (operation == Operation.FIND || operation == Operation.MATCH) {
getRightNode().write(classWriter, methodWriter, writeScope);
Expand All @@ -117,10 +122,10 @@ protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteSc
getRightNode().write(classWriter, methodWriter, writeScope);

if (binaryType == def.class || (shiftType != null && shiftType == def.class)) {
methodWriter.writeDynamicBinaryInstruction(location,
methodWriter.writeDynamicBinaryInstruction(getLocation(),
getExpressionType(), getLeftNode().getExpressionType(), getRightNode().getExpressionType(), operation, flags);
} else {
methodWriter.writeBinaryInstruction(location, getExpressionType(), operation);
methodWriter.writeBinaryInstruction(getLocation(), getExpressionType(), operation);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.Location;

public abstract class BinaryNode extends ExpressionNode {

/* ---- begin tree structure ---- */
Expand All @@ -42,6 +44,10 @@ public ExpressionNode getRightNode() {
return rightNode;
}

/* ---- end tree structure, begin visitor ---- */
/* ---- end tree structure ---- */

public BinaryNode(Location location) {
super(location);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.ClassWriter;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
import org.elasticsearch.painless.phase.IRTreeVisitor;
import org.elasticsearch.painless.symbol.WriteScope;
Expand Down Expand Up @@ -69,6 +70,10 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop

/* ---- end visitor ---- */

public BlockNode(Location location) {
super(location);
}

@Override
protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteScope writeScope) {
for (StatementNode statementNode : statementNodes) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.ClassWriter;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
import org.elasticsearch.painless.Operation;
import org.elasticsearch.painless.phase.IRTreeVisitor;
Expand Down Expand Up @@ -56,9 +57,13 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop

/* ---- end visitor ---- */

public BooleanNode(Location location) {
super(location);
}

@Override
protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteScope writeScope) {
methodWriter.writeDebugInfo(location);
methodWriter.writeDebugInfo(getLocation());

if (operation == Operation.AND) {
Label fals = new Label();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.ClassWriter;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
import org.elasticsearch.painless.phase.IRTreeVisitor;
import org.elasticsearch.painless.symbol.WriteScope;
Expand All @@ -40,6 +41,10 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop

/* ---- end visitor ---- */

public BreakNode(Location location) {
super(location);
}

@Override
protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteScope writeScope) {
methodWriter.goTo(breakLabel);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.ClassWriter;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
import org.elasticsearch.painless.lookup.PainlessCast;
import org.elasticsearch.painless.phase.IRTreeVisitor;
Expand Down Expand Up @@ -53,10 +54,14 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop

/* ---- end visitor ---- */

public CastNode(Location location) {
super(location);
}

@Override
protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteScope writeScope) {
getChildNode().write(classWriter, methodWriter, writeScope);
methodWriter.writeDebugInfo(location);
methodWriter.writeDebugInfo(getLocation());
methodWriter.writeCast(cast);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.ClassWriter;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
import org.elasticsearch.painless.phase.IRTreeVisitor;
import org.elasticsearch.painless.symbol.WriteScope;
Expand Down Expand Up @@ -79,9 +80,13 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop
Label end = null;
Label exception = null;

public CatchNode(Location location) {
super(location);
}

@Override
protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteScope writeScope) {
methodWriter.writeStatementOffset(location);
methodWriter.writeStatementOffset(getLocation());

Variable variable = writeScope.defineVariable(exceptionType, symbol);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,10 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop

/* ---- end visitor ---- */

public ClassNode() {
clinitBlockNode = new BlockNode();
clinitBlockNode.setLocation(new Location("internal$clinit$blocknode", 0));
public ClassNode(Location location) {
super(location);

clinitBlockNode = new BlockNode(new Location("internal$clinit$blocknode", 0));
clinitBlockNode.setAllEscape(true);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

import org.elasticsearch.painless.ClassWriter;
import org.elasticsearch.painless.DefBootstrap;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
import org.elasticsearch.painless.Operation;
import org.elasticsearch.painless.lookup.PainlessLookupUtility;
Expand Down Expand Up @@ -75,9 +76,13 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop

/* ---- end visitor ---- */

public ComparisonNode(Location location) {
super(location);
}

@Override
protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteScope writeScope) {
methodWriter.writeDebugInfo(location);
methodWriter.writeDebugInfo(getLocation());

getLeftNode().write(classWriter, methodWriter, writeScope);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.Location;

public abstract class ConditionNode extends StatementNode {

/* ---- begin tree structure ---- */
Expand All @@ -44,4 +46,8 @@ public BlockNode getBlockNode() {

/* ---- end tree structure ---- */

public ConditionNode(Location location) {
super(location);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.ClassWriter;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
import org.elasticsearch.painless.phase.IRTreeVisitor;
import org.elasticsearch.painless.symbol.WriteScope;
Expand Down Expand Up @@ -56,9 +57,13 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop

/* ---- end visitor ---- */

public ConditionalNode(Location location) {
super(location);
}

@Override
protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteScope writeScope) {
methodWriter.writeDebugInfo(location);
methodWriter.writeDebugInfo(getLocation());

Label fals = new Label();
Label end = new Label();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.ClassWriter;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
import org.elasticsearch.painless.phase.IRTreeVisitor;
import org.elasticsearch.painless.symbol.WriteScope;
Expand Down Expand Up @@ -52,6 +53,10 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop

/* ---- end visitor ---- */

public ConstantNode(Location location) {
super(location);
}

@Override
protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteScope writeScope) {
if (constant instanceof String) methodWriter.push((String)constant);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.ClassWriter;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
import org.elasticsearch.painless.phase.IRTreeVisitor;
import org.elasticsearch.painless.symbol.WriteScope;
Expand All @@ -40,6 +41,10 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop

/* ---- end visitor ---- */

public ContinueNode(Location location) {
super(location);
}

@Override
protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteScope writeScope) {
methodWriter.goTo(continueLabel);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.ClassWriter;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
import org.elasticsearch.painless.phase.IRTreeVisitor;
import org.elasticsearch.painless.symbol.WriteScope;
Expand Down Expand Up @@ -57,6 +58,10 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop

/* ---- end visitor ---- */

public DeclarationBlockNode(Location location) {
super(location);
}

@Override
protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteScope writeScope) {
for (DeclarationNode declarationNode : declarationNodes) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.ClassWriter;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
import org.elasticsearch.painless.lookup.PainlessLookupUtility;
import org.elasticsearch.painless.phase.IRTreeVisitor;
Expand Down Expand Up @@ -82,9 +83,13 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop

/* ---- end visitor ---- */

public DeclarationNode(Location location) {
super(location);
}

@Override
protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteScope writeScope) {
methodWriter.writeStatementOffset(location);
methodWriter.writeStatementOffset(getLocation());

Variable variable = writeScope.defineVariable(declarationType, name);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package org.elasticsearch.painless.ir;

import org.elasticsearch.painless.ClassWriter;
import org.elasticsearch.painless.Location;
import org.elasticsearch.painless.MethodWriter;
import org.elasticsearch.painless.phase.IRTreeVisitor;
import org.elasticsearch.painless.symbol.WriteScope;
Expand Down Expand Up @@ -53,9 +54,13 @@ public <Scope> void visitChildren(IRTreeVisitor<Scope> irTreeVisitor, Scope scop

/* ---- end visitor ---- */

public DefInterfaceReferenceNode(Location location) {
super(location);
}

@Override
protected void write(ClassWriter classWriter, MethodWriter methodWriter, WriteScope writeScope) {
methodWriter.writeDebugInfo(location);
methodWriter.writeDebugInfo(getLocation());

// place holder for functional interface receiver
// which is resolved and replace at runtime
Expand Down

0 comments on commit d134b4f

Please sign in to comment.