You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2019/11/23 22:56:33 UTC
[groovy] branch master updated: reset flags after constructor (like
after method) and other minor edits
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new e03c5a6 reset flags after constructor (like after method) and other minor edits
e03c5a6 is described below
commit e03c5a6362de3d4239eedfeb0b5ef96c9c8aa597
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat Nov 23 16:44:25 2019 -0600
reset flags after constructor (like after method) and other minor edits
---
.../classgen/asm/OptimizingStatementWriter.java | 129 ++++++++++-----------
1 file changed, 64 insertions(+), 65 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java
index 94ae2ef..75fbf73 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java
@@ -50,7 +50,6 @@ import org.codehaus.groovy.ast.stmt.IfStatement;
import org.codehaus.groovy.ast.stmt.ReturnStatement;
import org.codehaus.groovy.ast.stmt.Statement;
import org.codehaus.groovy.ast.stmt.WhileStatement;
-import org.codehaus.groovy.ast.tools.ParameterUtils;
import org.codehaus.groovy.classgen.AsmClassGenerator;
import org.codehaus.groovy.classgen.Verifier;
import org.codehaus.groovy.control.SourceUnit;
@@ -72,6 +71,7 @@ import static org.codehaus.groovy.ast.ClassHelper.double_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.int_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveType;
import static org.codehaus.groovy.ast.ClassHelper.long_TYPE;
+import static org.codehaus.groovy.ast.tools.ParameterUtils.parametersEqual;
import static org.codehaus.groovy.ast.tools.WideningCategories.isBigDecCategory;
import static org.codehaus.groovy.ast.tools.WideningCategories.isDoubleCategory;
import static org.codehaus.groovy.ast.tools.WideningCategories.isFloatingCategory;
@@ -88,6 +88,7 @@ import static org.objectweb.asm.Opcodes.INVOKEINTERFACE;
public class OptimizingStatementWriter extends StatementWriter {
+ // values correspond to BinaryExpressionMultiTypeDispatcher.typeMapKeyNames
private static final MethodCaller[] guards = {
null,
MethodCaller.newStatic(BytecodeInterface8.class, "isOrigInt"),
@@ -104,24 +105,20 @@ public class OptimizingStatementWriter extends StatementWriter {
private final WriterController controller;
private boolean fastPathBlocked;
- public OptimizingStatementWriter(WriterController controller) {
+ public OptimizingStatementWriter(final WriterController controller) {
super(controller);
this.controller = controller;
}
- private boolean notEnableFastPath(StatementMeta meta) {
- // return false if cannot do fast path and if are already on the path
- return fastPathBlocked || meta==null || !meta.optimize || controller.isFastPath();
- }
+ private FastPathData writeGuards(final StatementMeta meta, final Statement statement) {
+ if (fastPathBlocked || controller.isFastPath() || meta == null || !meta.optimize) return null;
- private FastPathData writeGuards(StatementMeta meta, Statement statement) {
- if (notEnableFastPath(meta)) return null;
controller.getAcg().onLineNumber(statement, null);
MethodVisitor mv = controller.getMethodVisitor();
FastPathData fastPathData = new FastPathData();
Label slowPath = new Label();
- for (int i=0; i<guards.length; i++) {
+ for (int i = 0, n = guards.length; i < n; i += 1) {
if (meta.involvedTypes[i]) {
guards[i].call(mv);
mv.visitJumpInsn(IFEQ, slowPath);
@@ -131,42 +128,40 @@ public class OptimizingStatementWriter extends StatementWriter {
// meta class check with boolean holder
String owner = BytecodeHelper.getClassInternalName(controller.getClassNode());
MethodNode mn = controller.getMethodNode();
- if (mn!=null) {
+ if (mn != null) {
mv.visitFieldInsn(GETSTATIC, owner, Verifier.STATIC_METACLASS_BOOL, "Z");
mv.visitJumpInsn(IFNE, slowPath);
}
- //standard metaclass check
+ // standard metaclass check
disabledStandardMetaClass.call(mv);
mv.visitJumpInsn(IFNE, slowPath);
// other guards here
-
mv.visitJumpInsn(GOTO, fastPathData.pathStart);
mv.visitLabel(slowPath);
return fastPathData;
}
- private void writeFastPathPrelude(FastPathData meta) {
+ private void writeFastPathPrelude(final FastPathData meta) {
MethodVisitor mv = controller.getMethodVisitor();
mv.visitJumpInsn(GOTO, meta.afterPath);
mv.visitLabel(meta.pathStart);
controller.switchToFastPath();
}
- private void writeFastPathEpilogue(FastPathData meta) {
+ private void writeFastPathEpilogue(final FastPathData meta) {
MethodVisitor mv = controller.getMethodVisitor();
mv.visitLabel(meta.afterPath);
controller.switchToSlowPath();
}
@Override
- public void writeBlockStatement(BlockStatement statement) {
+ public void writeBlockStatement(final BlockStatement statement) {
StatementMeta meta = statement.getNodeMetaData(StatementMeta.class);
FastPathData fastPathData = writeGuards(meta, statement);
-
- if (fastPathData==null) {
+ if (fastPathData == null) {
// normal mode with different paths
// important is to not to have a fastpathblock here,
// otherwise the per expression statement improvement
@@ -186,7 +181,7 @@ public class OptimizingStatementWriter extends StatementWriter {
}
@Override
- public void writeDoWhileLoop(DoWhileStatement statement) {
+ public void writeDoWhileLoop(final DoWhileStatement statement) {
if (controller.isFastPath()) {
super.writeDoWhileLoop(statement);
} else {
@@ -198,7 +193,7 @@ public class OptimizingStatementWriter extends StatementWriter {
super.writeDoWhileLoop(statement);
fastPathBlocked = oldFastPathBlock;
- if (fastPathData==null) return;
+ if (fastPathData == null) return;
writeFastPathPrelude(fastPathData);
super.writeDoWhileLoop(statement);
writeFastPathEpilogue(fastPathData);
@@ -206,7 +201,7 @@ public class OptimizingStatementWriter extends StatementWriter {
}
@Override
- protected void writeIteratorHasNext(MethodVisitor mv) {
+ protected void writeIteratorHasNext(final MethodVisitor mv) {
if (controller.isFastPath()) {
mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z", true);
} else {
@@ -215,7 +210,7 @@ public class OptimizingStatementWriter extends StatementWriter {
}
@Override
- protected void writeIteratorNext(MethodVisitor mv) {
+ protected void writeIteratorNext(final MethodVisitor mv) {
if (controller.isFastPath()) {
mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;", true);
} else {
@@ -224,7 +219,7 @@ public class OptimizingStatementWriter extends StatementWriter {
}
@Override
- protected void writeForInLoop(ForStatement statement) {
+ protected void writeForInLoop(final ForStatement statement) {
if (controller.isFastPath()) {
super.writeForInLoop(statement);
} else {
@@ -236,7 +231,7 @@ public class OptimizingStatementWriter extends StatementWriter {
super.writeForInLoop(statement);
fastPathBlocked = oldFastPathBlock;
- if (fastPathData==null) return;
+ if (fastPathData == null) return;
writeFastPathPrelude(fastPathData);
super.writeForInLoop(statement);
writeFastPathEpilogue(fastPathData);
@@ -244,7 +239,7 @@ public class OptimizingStatementWriter extends StatementWriter {
}
@Override
- protected void writeForLoopWithClosureList(ForStatement statement) {
+ protected void writeForLoopWithClosureList(final ForStatement statement) {
if (controller.isFastPath()) {
super.writeForLoopWithClosureList(statement);
} else {
@@ -256,7 +251,7 @@ public class OptimizingStatementWriter extends StatementWriter {
super.writeForLoopWithClosureList(statement);
fastPathBlocked = oldFastPathBlock;
- if (fastPathData==null) return;
+ if (fastPathData == null) return;
writeFastPathPrelude(fastPathData);
super.writeForLoopWithClosureList(statement);
writeFastPathEpilogue(fastPathData);
@@ -264,7 +259,7 @@ public class OptimizingStatementWriter extends StatementWriter {
}
@Override
- public void writeWhileLoop(WhileStatement statement) {
+ public void writeWhileLoop(final WhileStatement statement) {
if (controller.isFastPath()) {
super.writeWhileLoop(statement);
} else {
@@ -276,7 +271,7 @@ public class OptimizingStatementWriter extends StatementWriter {
super.writeWhileLoop(statement);
fastPathBlocked = oldFastPathBlock;
- if (fastPathData==null) return;
+ if (fastPathData == null) return;
writeFastPathPrelude(fastPathData);
super.writeWhileLoop(statement);
writeFastPathEpilogue(fastPathData);
@@ -284,11 +279,10 @@ public class OptimizingStatementWriter extends StatementWriter {
}
@Override
- public void writeIfElse(IfStatement statement) {
+ public void writeIfElse(final IfStatement statement) {
StatementMeta meta = statement.getNodeMetaData(StatementMeta.class);
FastPathData fastPathData = writeGuards(meta, statement);
-
- if (fastPathData==null) {
+ if (fastPathData == null) {
super.writeIfElse(statement);
} else {
boolean oldFastPathBlock = fastPathBlocked;
@@ -302,17 +296,8 @@ public class OptimizingStatementWriter extends StatementWriter {
}
}
- private boolean isNewPathFork(StatementMeta meta) {
- // meta.optimize -> can do fast path
- if (meta==null || !meta.optimize) return false;
- // fastPathBlocked -> slow path
- if (fastPathBlocked) return false;
- // controller.isFastPath() -> fastPath
- return !controller.isFastPath();
- }
-
@Override
- public void writeReturn(ReturnStatement statement) {
+ public void writeReturn(final ReturnStatement statement) {
if (controller.isFastPath()) {
super.writeReturn(statement);
} else {
@@ -329,7 +314,7 @@ public class OptimizingStatementWriter extends StatementWriter {
super.writeReturn(statement);
fastPathBlocked = oldFastPathBlock;
- if (fastPathData==null) return;
+ if (fastPathData == null) return;
writeFastPathPrelude(fastPathData);
super.writeReturn(statement);
writeFastPathEpilogue(fastPathData);
@@ -340,7 +325,7 @@ public class OptimizingStatementWriter extends StatementWriter {
}
@Override
- public void writeExpressionStatement(ExpressionStatement statement) {
+ public void writeExpressionStatement(final ExpressionStatement statement) {
if (controller.isFastPath()) {
super.writeExpressionStatement(statement);
} else {
@@ -358,7 +343,6 @@ public class OptimizingStatementWriter extends StatementWriter {
// (3) fast path possible and in slow or fastPath. Nothing to do here.
//
// the only case we need to handle is then (2).
-
if (isNewPathFork(meta) && writeDeclarationExtraction(statement)) {
if (meta.declaredVariableExpression != null) {
// declaration was replaced by assignment so we need to define the variable
@@ -371,7 +355,7 @@ public class OptimizingStatementWriter extends StatementWriter {
super.writeExpressionStatement(statement);
fastPathBlocked = oldFastPathBlock;
- if (fastPathData==null) return;
+ if (fastPathData == null) return;
writeFastPathPrelude(fastPathData);
super.writeExpressionStatement(statement);
writeFastPathEpilogue(fastPathData);
@@ -381,7 +365,7 @@ public class OptimizingStatementWriter extends StatementWriter {
}
}
- private boolean writeDeclarationExtraction(Statement statement) {
+ private boolean writeDeclarationExtraction(final Statement statement) {
Expression ex = null;
if (statement instanceof ReturnStatement) {
ReturnStatement rs = (ReturnStatement) statement;
@@ -390,7 +374,7 @@ public class OptimizingStatementWriter extends StatementWriter {
ExpressionStatement es = (ExpressionStatement) statement;
ex = es.getExpression();
} else {
- throw new GroovyBugError("unknown statement type :"+statement.getClass());
+ throw new GroovyBugError("unknown statement type :" + statement.getClass());
}
if (!(ex instanceof DeclarationExpression)) return true;
DeclarationExpression declaration = (DeclarationExpression) ex;
@@ -419,26 +403,32 @@ public class OptimizingStatementWriter extends StatementWriter {
ExpressionStatement es = (ExpressionStatement) statement;
es.setExpression(assignment);
} else {
- throw new GroovyBugError("unknown statement type :"+statement.getClass());
+ throw new GroovyBugError("unknown statement type :" + statement.getClass());
}
return true;
}
- public static void setNodeMeta(TypeChooser chooser, ClassNode classNode) {
- if (classNode.getNodeMetaData(ClassNodeSkip.class)!=null) return;
+ private boolean isNewPathFork(final StatementMeta meta) {
+ // meta.optimize -> can do fast path
+ if (meta == null || !meta.optimize) return false;
+ // fastPathBlocked -> slow path
+ if (fastPathBlocked) return false;
+ // controller.isFastPath() -> fastPath
+ return !controller.isFastPath();
+ }
+
+ public static void setNodeMeta(final TypeChooser chooser, final ClassNode classNode) {
+ if (classNode.getNodeMetaData(ClassNodeSkip.class) != null) return;
new OptVisitor(chooser).visitClass(classNode);
}
- private static StatementMeta addMeta(ASTNode node) {
- StatementMeta metaOld = node.getNodeMetaData(StatementMeta.class);
- StatementMeta meta = metaOld;
- if (meta==null) meta = new StatementMeta();
+ private static StatementMeta addMeta(final ASTNode node) {
+ StatementMeta meta = node.getNodeMetaData(StatementMeta.class, x -> new StatementMeta());
meta.optimize = true;
- if (metaOld==null) node.setNodeMetaData(StatementMeta.class, meta);
return meta;
}
- private static StatementMeta addMeta(ASTNode node, OptimizeFlagsCollector opt) {
+ private static StatementMeta addMeta(final ASTNode node, final OptimizeFlagsCollector opt) {
StatementMeta meta = addMeta(node);
meta.chainInvolvedTypes(opt);
return meta;
@@ -471,9 +461,15 @@ public class OptimizingStatementWriter extends StatementWriter {
@Override
public String toString() {
- StringBuilder ret = new StringBuilder("optimize=" + optimize + " target=" + target + " type=" + type + " involvedTypes=");
+ StringBuilder ret = new StringBuilder();
+ ret.append("optimize=").append(optimize);
+ ret.append(" target=").append(target);
+ ret.append(" type=").append(type);
+ ret.append(" involvedTypes=");
for (int i = 0, n = typeMapKeyNames.length; i < n; i += 1) {
- if (involvedTypes[i]) ret.append(" ").append(typeMapKeyNames[i]);
+ if (involvedTypes[i]) {
+ ret.append(' ').append(typeMapKeyNames[i]);
+ }
}
return ret.toString();
}
@@ -490,13 +486,13 @@ public class OptimizingStatementWriter extends StatementWriter {
private final Deque<OptimizeFlagsEntry> previous = new LinkedList<>();
public void push() {
- previous.addLast(current);
+ previous.push(current);
current = new OptimizeFlagsEntry();
}
public void pop(final boolean propagateFlags) {
OptimizeFlagsEntry old = current;
- current = previous.removeLast();
+ current = previous.pop();
if (propagateFlags) {
chainCanOptimize(old.canOptimize);
chainShouldOptimize(old.shouldOptimize);
@@ -508,17 +504,19 @@ public class OptimizingStatementWriter extends StatementWriter {
@Override
public String toString() {
- StringBuilder ret;
+ StringBuilder ret = new StringBuilder();
if (current.shouldOptimize) {
- ret = new StringBuilder("should optimize, can = " + current.canOptimize);
+ ret.append("should optimize, can = " + current.canOptimize);
} else if (current.canOptimize) {
- ret = new StringBuilder("can optimize");
+ ret.append("can optimize");
} else {
- ret = new StringBuilder("don't optimize");
+ ret.append("don't optimize");
}
ret.append(" involvedTypes =");
for (int i = 0, n = typeMapKeyNames.length; i < n; i += 1) {
- if (current.involvedTypes[i]) ret.append(" ").append(typeMapKeyNames[i]);
+ if (current.involvedTypes[i]) {
+ ret.append(' ').append(typeMapKeyNames[i]);
+ }
}
return ret.toString();
}
@@ -595,6 +593,7 @@ public class OptimizingStatementWriter extends StatementWriter {
public void visitConstructor(final ConstructorNode node) {
scope = node.getVariableScope();
super.visitConstructor(node);
+ opt.reset();
}
@Override
@@ -942,7 +941,7 @@ public class OptimizingStatementWriter extends StatementWriter {
List<ConstructorNode> ctors = node.getDeclaredConstructors();
MethodNode result = null;
for (ConstructorNode ctor : ctors) {
- if (ParameterUtils.parametersEqual(ctor.getParameters(), parameters)) {
+ if (parametersEqual(ctor.getParameters(), parameters)) {
result = ctor;
break;
}