You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2020/01/24 12:03:00 UTC

[groovy] 02/08: minor edits

This is an automated email from the ASF dual-hosted git repository.

sunlan pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 672521dc6917388b82b5fa442649c78c5ac351fa
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed Jan 22 16:37:21 2020 -0600

    minor edits
    
    (cherry picked from commit b521a35285c1e8a317ab18fbb55552894f907695)
---
 .../classgen/asm/OptimizingStatementWriter.java    |   2 -
 .../groovy/classgen/asm/StatementWriter.java       | 232 ++++++++++-----------
 .../asm/sc/StaticTypesStatementWriter.java         |   7 +-
 3 files changed, 108 insertions(+), 133 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 f394ebb..f6d3d95 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java
@@ -102,12 +102,10 @@ public class OptimizingStatementWriter extends StatementWriter {
     };
 
     private static final MethodCaller disabledStandardMetaClass = MethodCaller.newStatic(BytecodeInterface8.class, "disabledStandardMetaClass");
-    private final WriterController controller;
     private boolean fastPathBlocked;
 
     public OptimizingStatementWriter(final WriterController controller) {
         super(controller);
-        this.controller = controller;
     }
 
     private FastPathData writeGuards(final StatementMeta meta, final Statement statement) {
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java
index ebe0428..c40fdf8 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java
@@ -53,6 +53,7 @@ import org.objectweb.asm.MethodVisitor;
 
 import java.util.Iterator;
 import java.util.List;
+import java.util.function.Consumer;
 
 import static org.objectweb.asm.Opcodes.ALOAD;
 import static org.objectweb.asm.Opcodes.ATHROW;
@@ -65,17 +66,17 @@ import static org.objectweb.asm.Opcodes.NOP;
 import static org.objectweb.asm.Opcodes.RETURN;
 
 public class StatementWriter {
-    // iterator
-    private static final MethodCaller iteratorNextMethod = MethodCaller.newInterface(Iterator.class, "next");
+
     private static final MethodCaller iteratorHasNextMethod = MethodCaller.newInterface(Iterator.class, "hasNext");
+    private static final MethodCaller iteratorNextMethod = MethodCaller.newInterface(Iterator.class, "next");
 
-    private final WriterController controller;
+    protected final WriterController controller;
 
-    public StatementWriter(WriterController controller) {
+    public StatementWriter(final WriterController controller) {
         this.controller = controller;
     }
 
-    protected void writeStatementLabel(Statement statement) {
+    protected void writeStatementLabel(final Statement statement) {
         String name = statement.getStatementLabel();
         if (name != null) {
             Label label = controller.getCompileStack().createLocalLabel(name);
@@ -83,22 +84,19 @@ public class StatementWriter {
         }
     }
 
-    public void writeBlockStatement(BlockStatement block) {
+    public void writeBlockStatement(final BlockStatement block) {
         writeStatementLabel(block);
 
         int mark = controller.getOperandStack().getStackLength();
         CompileStack compileStack = controller.getCompileStack();
         compileStack.pushVariableScope(block.getVariableScope());
-        List<Statement> statementList = block.getStatements();
-        for (Statement statement : statementList) {
+        for (Statement statement : block.getStatements()) {
             statement.visit(controller.getAcg());
         }
         compileStack.pop();
 
-        // GROOVY-7647
-        if (block.getLastLineNumber() > 0
-                && !isMethodOrConstructorNonEmptyBlock(block) // GROOVY-9126
-        ) {
+        // GROOVY-7647, GROOVY-9126
+        if (block.getLastLineNumber() > 0 && !isMethodOrConstructorNonEmptyBlock(block)) {
             MethodVisitor mv = controller.getMethodVisitor();
             Label blockEnd = new Label();
             mv.visitLabel(blockEnd);
@@ -108,96 +106,81 @@ public class StatementWriter {
         controller.getOperandStack().popDownTo(mark);
     }
 
-    private boolean isMethodOrConstructorNonEmptyBlock(BlockStatement block) {
+    private boolean isMethodOrConstructorNonEmptyBlock(final BlockStatement block) {
         MethodNode methodNode = controller.getMethodNode();
-        if (null == methodNode) {
+        if (methodNode == null) {
             methodNode = controller.getConstructorNode();
         }
-
-        if (null == methodNode || block != methodNode.getCode()) { // check if the block is method/constructor's code
-            return false;
-        }
-
-        return !block.getStatements().isEmpty();
+        return (methodNode != null && methodNode.getCode() == block && !block.isEmpty());
     }
 
-    public void writeForStatement(ForStatement loop) {
-        Parameter loopVar = loop.getVariable();
-        if (loopVar == ForStatement.FOR_LOOP_DUMMY) {
-            writeForLoopWithClosureList(loop);
+    public void writeForStatement(final ForStatement statement) {
+        if (statement.getVariable() == ForStatement.FOR_LOOP_DUMMY) {
+            writeForLoopWithClosureList(statement);
         } else {
-            writeForInLoop(loop);
+            writeForInLoop(statement);
         }
     }
 
-    protected void writeIteratorHasNext(MethodVisitor mv) {
-        iteratorHasNextMethod.call(mv);
-    }
-
-    protected void writeIteratorNext(MethodVisitor mv) {
-        iteratorNextMethod.call(mv);
-    }
-
-    protected void writeForInLoop(ForStatement loop) {
-        controller.getAcg().onLineNumber(loop, "visitForLoop");
-        writeStatementLabel(loop);
+    protected void writeForInLoop(final ForStatement statement) {
+        controller.getAcg().onLineNumber(statement, "visitForLoop");
+        writeStatementLabel(statement);
 
         CompileStack compileStack = controller.getCompileStack();
         MethodVisitor mv = controller.getMethodVisitor();
         OperandStack operandStack = controller.getOperandStack();
 
-        compileStack.pushLoop(loop.getVariableScope(), loop.getStatementLabels());
+        compileStack.pushLoop(statement.getVariableScope(), statement.getStatementLabels());
 
-        // Declare the loop counter.
-        BytecodeVariable variable = compileStack.defineVariable(loop.getVariable(), false);
+        // declare the loop counter
+        BytecodeVariable variable = compileStack.defineVariable(statement.getVariable(), false);
 
-        // Then get the iterator and generate the loop control
-        MethodCallExpression iterator = new MethodCallExpression(loop.getCollectionExpression(), "iterator", new ArgumentListExpression());
+        // then get the iterator and generate the loop control
+        MethodCallExpression iterator = new MethodCallExpression(statement.getCollectionExpression(), "iterator", new ArgumentListExpression());
         iterator.visit(controller.getAcg());
         operandStack.doGroovyCast(ClassHelper.Iterator_TYPE);
 
-        final int iteratorIdx = compileStack.defineTemporaryVariable("iterator", ClassHelper.Iterator_TYPE, true);
-
+        int iteratorIndex = compileStack.defineTemporaryVariable("iterator", ClassHelper.Iterator_TYPE, true);
         Label continueLabel = compileStack.getContinueLabel();
         Label breakLabel = compileStack.getBreakLabel();
 
         mv.visitLabel(continueLabel);
-        mv.visitVarInsn(ALOAD, iteratorIdx);
+        mv.visitVarInsn(ALOAD, iteratorIndex);
         writeIteratorHasNext(mv);
         // note: ifeq tests for ==0, a boolean is 0 if it is false
         mv.visitJumpInsn(IFEQ, breakLabel);
 
-        mv.visitVarInsn(ALOAD, iteratorIdx);
+        mv.visitVarInsn(ALOAD, iteratorIndex);
         writeIteratorNext(mv);
         operandStack.push(ClassHelper.OBJECT_TYPE);
         operandStack.storeVar(variable);
 
-        // Generate the loop body
-        loop.getLoopBlock().visit(controller.getAcg());
+        // generate the loop body
+        statement.getLoopBlock().visit(controller.getAcg());
 
         mv.visitJumpInsn(GOTO, continueLabel);
         mv.visitLabel(breakLabel);
 
-        compileStack.removeVar(iteratorIdx);
+        compileStack.removeVar(iteratorIndex);
         compileStack.pop();
     }
 
-    private void visitExpressionOfLoopStatement(Expression expression) {
-        if (expression instanceof ClosureListExpression) {
-            ((ClosureListExpression) expression).getExpressions().forEach(this::visitExpressionOrStatement);
-        } else {
-            visitExpressionOrStatement(expression);
-        }
+    protected void writeIteratorHasNext(final MethodVisitor mv) {
+        iteratorHasNextMethod.call(mv);
     }
 
-    protected void writeForLoopWithClosureList(ForStatement loop) {
-        controller.getAcg().onLineNumber(loop, "visitForLoop");
-        writeStatementLabel(loop);
+    protected void writeIteratorNext(final MethodVisitor mv) {
+        iteratorNextMethod.call(mv);
+    }
+
+    protected void writeForLoopWithClosureList(final ForStatement statement) {
+        controller.getAcg().onLineNumber(statement, "visitForLoop");
+        writeStatementLabel(statement);
 
         MethodVisitor mv = controller.getMethodVisitor();
-        controller.getCompileStack().pushLoop(loop.getVariableScope(), loop.getStatementLabels());
+        controller.getCompileStack().pushLoop(statement.getVariableScope(), statement.getStatementLabels());
 
-        ClosureListExpression clExpr = (ClosureListExpression) loop.getCollectionExpression();
+        ClosureListExpression clExpr = (ClosureListExpression) statement.getCollectionExpression();
         controller.getCompileStack().pushVariableScope(clExpr.getVariableScope());
 
         List<Expression> expressions = clExpr.getExpressions();
@@ -207,7 +190,7 @@ public class StatementWriter {
         int condIndex = (size - 1) / 2;
 
         // visit init
-        for (int i = 0; i < condIndex; i++) {
+        for (int i = 0; i < condIndex; i += 1) {
             visitExpressionOfLoopStatement(expressions.get(i));
         }
 
@@ -218,8 +201,8 @@ public class StatementWriter {
         mv.visitLabel(cond);
         // visit condition leave boolean on stack
         {
-            Expression condExpr = expressions.get(condIndex);
             int mark = controller.getOperandStack().getStackLength();
+            Expression condExpr = expressions.get(condIndex);
             condExpr.visit(controller.getAcg());
             controller.getOperandStack().castToBool(mark, true);
         }
@@ -228,12 +211,12 @@ public class StatementWriter {
         controller.getOperandStack().jump(IFEQ, breakLabel);
 
         // Generate the loop body
-        loop.getLoopBlock().visit(controller.getAcg());
+        statement.getLoopBlock().visit(controller.getAcg());
 
         // visit increment
         mv.visitLabel(continueLabel);
         // fix for being on the wrong line when debugging for loop
-        controller.getAcg().onLineNumber(loop, "increment condition");
+        controller.getAcg().onLineNumber(statement, "increment condition");
         for (int i = condIndex + 1; i < size; i += 1) {
             visitExpressionOfLoopStatement(expressions.get(i));
         }
@@ -248,22 +231,25 @@ public class StatementWriter {
         controller.getCompileStack().pop();
     }
 
-    private void visitExpressionOrStatement(Object o) {
-        if (o instanceof EmptyExpression) return;
-        if (o instanceof Expression) {
-            Expression expr = (Expression) o;
+    private void visitExpressionOfLoopStatement(final Expression expression) {
+        Consumer<Expression> visit = expr -> {
+            if (expr instanceof EmptyExpression) return;
             int mark = controller.getOperandStack().getStackLength();
             expr.visit(controller.getAcg());
             controller.getOperandStack().popDownTo(mark);
+        };
+
+        if (expression instanceof ClosureListExpression) {
+            ((ClosureListExpression) expression).getExpressions().forEach(visit);
         } else {
-            ((Statement) o).visit(controller.getAcg());
+            visit.accept(expression);
         }
     }
 
-    private void visitConditionOfLoopingStatement(BooleanExpression bool, Label breakLabel, MethodVisitor mv) {
+    private void visitConditionOfLoopingStatement(final BooleanExpression expression, final Label breakLabel, final MethodVisitor mv) {
         boolean boolHandled = false;
-        if (bool.getExpression() instanceof ConstantExpression) {
-            ConstantExpression constant = (ConstantExpression) bool.getExpression();
+        if (expression.getExpression() instanceof ConstantExpression) {
+            ConstantExpression constant = (ConstantExpression) expression.getExpression();
             if (constant.getValue() == Boolean.TRUE) {
                 boolHandled = true;
                 // do nothing
@@ -272,27 +258,26 @@ public class StatementWriter {
                 mv.visitJumpInsn(GOTO, breakLabel);
             }
         }
-
         if (!boolHandled) {
-            bool.visit(controller.getAcg());
+            expression.visit(controller.getAcg());
             controller.getOperandStack().jump(IFEQ, breakLabel);
         }
     }
 
-    public void writeWhileLoop(WhileStatement loop) {
-        controller.getAcg().onLineNumber(loop, "visitWhileLoop");
-        writeStatementLabel(loop);
+    public void writeWhileLoop(final WhileStatement statement) {
+        controller.getAcg().onLineNumber(statement, "visitWhileLoop");
+        writeStatementLabel(statement);
 
         MethodVisitor mv = controller.getMethodVisitor();
 
-        controller.getCompileStack().pushLoop(loop.getStatementLabels());
+        controller.getCompileStack().pushLoop(statement.getStatementLabels());
         Label continueLabel = controller.getCompileStack().getContinueLabel();
         Label breakLabel = controller.getCompileStack().getBreakLabel();
 
         mv.visitLabel(continueLabel);
 
-        this.visitConditionOfLoopingStatement(loop.getBooleanExpression(), breakLabel, mv);
-        loop.getLoopBlock().visit(controller.getAcg());
+        visitConditionOfLoopingStatement(statement.getBooleanExpression(), breakLabel, mv);
+        statement.getLoopBlock().visit(controller.getAcg());
 
         mv.visitJumpInsn(GOTO, continueLabel);
         mv.visitLabel(breakLabel);
@@ -300,20 +285,20 @@ public class StatementWriter {
         controller.getCompileStack().pop();
     }
 
-    public void writeDoWhileLoop(DoWhileStatement loop) {
-        controller.getAcg().onLineNumber(loop, "visitDoWhileLoop");
-        writeStatementLabel(loop);
+    public void writeDoWhileLoop(final DoWhileStatement statement) {
+        controller.getAcg().onLineNumber(statement, "visitDoWhileLoop");
+        writeStatementLabel(statement);
 
         MethodVisitor mv = controller.getMethodVisitor();
 
-        controller.getCompileStack().pushLoop(loop.getStatementLabels());
+        controller.getCompileStack().pushLoop(statement.getStatementLabels());
         Label continueLabel = controller.getCompileStack().getContinueLabel();
         Label breakLabel = controller.getCompileStack().getBreakLabel();
 
         mv.visitLabel(continueLabel);
 
-        loop.getLoopBlock().visit(controller.getAcg());
-        this.visitConditionOfLoopingStatement(loop.getBooleanExpression(), breakLabel, mv);
+        statement.getLoopBlock().visit(controller.getAcg());
+        visitConditionOfLoopingStatement(statement.getBooleanExpression(), breakLabel, mv);
 
         mv.visitJumpInsn(GOTO, continueLabel);
         mv.visitLabel(breakLabel);
@@ -321,22 +306,22 @@ public class StatementWriter {
         controller.getCompileStack().pop();
     }
 
-    public void writeIfElse(IfStatement ifElse) {
-        controller.getAcg().onLineNumber(ifElse, "visitIfElse");
-        writeStatementLabel(ifElse);
+    public void writeIfElse(final IfStatement statement) {
+        controller.getAcg().onLineNumber(statement, "visitIfElse");
+        writeStatementLabel(statement);
 
         MethodVisitor mv = controller.getMethodVisitor();
 
-        ifElse.getBooleanExpression().visit(controller.getAcg());
+        statement.getBooleanExpression().visit(controller.getAcg());
         Label l0 = controller.getOperandStack().jump(IFEQ);
 
         // if-else is here handled as a special version
         // of a boolean expression
         controller.getCompileStack().pushBooleanExpression();
-        ifElse.getIfBlock().visit(controller.getAcg());
+        statement.getIfBlock().visit(controller.getAcg());
         controller.getCompileStack().pop();
 
-        if (ifElse.getElseBlock() instanceof EmptyStatement) {
+        if (statement.getElseBlock() instanceof EmptyStatement) {
             mv.visitLabel(l0);
         } else {
             Label l1 = new Label();
@@ -344,14 +329,14 @@ public class StatementWriter {
             mv.visitLabel(l0);
 
             controller.getCompileStack().pushBooleanExpression();
-            ifElse.getElseBlock().visit(controller.getAcg());
+            statement.getElseBlock().visit(controller.getAcg());
             controller.getCompileStack().pop();
 
             mv.visitLabel(l1);
         }
     }
 
-    public void writeTryCatchFinally(TryCatchStatement statement) {
+    public void writeTryCatchFinally(final TryCatchStatement statement) {
         controller.getAcg().onLineNumber(statement, "visitTryCatchFinally");
         writeStatementLabel(statement);
 
@@ -454,18 +439,18 @@ public class StatementWriter {
         compileStack.removeVar(anyExceptionIndex);
     }
 
-    private BlockRecorder makeBlockRecorder(Statement finallyStatement) {
-        final BlockRecorder block = new BlockRecorder();
-        block.excludedStatement = () -> {
-            controller.getCompileStack().pushBlockRecorderVisit(block);
+    private BlockRecorder makeBlockRecorder(final Statement finallyStatement) {
+        BlockRecorder recorder = new BlockRecorder();
+        recorder.excludedStatement = () -> {
+            controller.getCompileStack().pushBlockRecorderVisit(recorder);
             finallyStatement.visit(controller.getAcg());
-            controller.getCompileStack().popBlockRecorderVisit(block);
+            controller.getCompileStack().popBlockRecorderVisit(recorder);
         };
-        controller.getCompileStack().pushBlockRecorder(block);
-        return block;
+        controller.getCompileStack().pushBlockRecorder(recorder);
+        return recorder;
     }
 
-    public void writeSwitch(SwitchStatement statement) {
+    public void writeSwitch(final SwitchStatement statement) {
         controller.getAcg().onLineNumber(statement, "visitSwitch");
         writeStatementLabel(statement);
 
@@ -474,19 +459,18 @@ public class StatementWriter {
         // switch does not have a continue label. use its parent's for continue
         Label breakLabel = controller.getCompileStack().pushSwitch();
 
-        final int switchVariableIndex = controller.getCompileStack().defineTemporaryVariable("switch", true);
+        int switchVariableIndex = controller.getCompileStack().defineTemporaryVariable("switch", true);
 
-        List caseStatements = statement.getCaseStatements();
+        List<CaseStatement> caseStatements = statement.getCaseStatements();
         int caseCount = caseStatements.size();
         Label[] labels = new Label[caseCount + 1];
-        for (int i = 0; i < caseCount; i++) {
+        for (int i = 0; i < caseCount; i += 1) {
             labels[i] = new Label();
         }
 
         int i = 0;
-        for (Iterator iter = caseStatements.iterator(); iter.hasNext(); i++) {
-            CaseStatement caseStatement = (CaseStatement) iter.next();
-            writeCaseStatement(caseStatement, switchVariableIndex, labels[i], labels[i + 1]);
+        for (Iterator<CaseStatement> iter = caseStatements.iterator(); iter.hasNext(); i += 1) {
+            writeCaseStatement(iter.next(), switchVariableIndex, labels[i], labels[i + 1]);
         }
 
         statement.getDefaultStatement().visit(controller.getAcg());
@@ -497,9 +481,7 @@ public class StatementWriter {
         controller.getCompileStack().pop();
     }
 
-    protected void writeCaseStatement(
-            CaseStatement statement, int switchVariableIndex,
-            Label thisLabel, Label nextLabel) {
+    private void writeCaseStatement(final CaseStatement statement, final int switchVariableIndex, final Label thisLabel, final Label nextLabel) {
         controller.getAcg().onLineNumber(statement, "visitCaseStatement");
         MethodVisitor mv = controller.getMethodVisitor();
         OperandStack operandStack = controller.getOperandStack();
@@ -517,8 +499,7 @@ public class StatementWriter {
 
         statement.getCode().visit(controller.getAcg());
 
-        // now if we don't finish with a break we need to jump past
-        // the next comparison
+        // now if we don't finish with a break we need to jump past the next comparison
         if (nextLabel != null) {
             mv.visitJumpInsn(GOTO, nextLabel);
         }
@@ -526,7 +507,7 @@ public class StatementWriter {
         mv.visitLabel(l0);
     }
 
-    public void writeBreak(BreakStatement statement) {
+    public void writeBreak(final BreakStatement statement) {
         controller.getAcg().onLineNumber(statement, "visitBreakStatement");
         writeStatementLabel(statement);
 
@@ -537,7 +518,7 @@ public class StatementWriter {
         controller.getMethodVisitor().visitJumpInsn(GOTO, breakLabel);
     }
 
-    public void writeContinue(ContinueStatement statement) {
+    public void writeContinue(final ContinueStatement statement) {
         controller.getAcg().onLineNumber(statement, "visitContinueStatement");
         writeStatementLabel(statement);
 
@@ -548,19 +529,19 @@ public class StatementWriter {
         controller.getMethodVisitor().visitJumpInsn(GOTO, continueLabel);
     }
 
-    public void writeSynchronized(SynchronizedStatement statement) {
+    public void writeSynchronized(final SynchronizedStatement statement) {
         controller.getAcg().onLineNumber(statement, "visitSynchronizedStatement");
         writeStatementLabel(statement);
-        final MethodVisitor mv = controller.getMethodVisitor();
+        MethodVisitor mv = controller.getMethodVisitor();
         CompileStack compileStack = controller.getCompileStack();
 
         statement.getExpression().visit(controller.getAcg());
         controller.getOperandStack().box();
-        final int index = compileStack.defineTemporaryVariable("synchronized", ClassHelper.OBJECT_TYPE, true);
+        int index = compileStack.defineTemporaryVariable("synchronized", ClassHelper.OBJECT_TYPE, true);
 
-        final Label synchronizedStart = new Label();
-        final Label synchronizedEnd = new Label();
-        final Label catchAll = new Label();
+        Label synchronizedStart = new Label();
+        Label synchronizedEnd = new Label();
+        Label catchAll = new Label();
 
         mv.visitVarInsn(ALOAD, index);
         mv.visitInsn(MONITORENTER);
@@ -592,13 +573,13 @@ public class StatementWriter {
         compileStack.removeVar(index);
     }
 
-    public void writeAssert(AssertStatement statement) {
+    public void writeAssert(final AssertStatement statement) {
         controller.getAcg().onLineNumber(statement, "visitAssertStatement");
         writeStatementLabel(statement);
         controller.getAssertionWriter().writeAssertStatement(statement);
     }
 
-    public void writeThrow(ThrowStatement statement) {
+    public void writeThrow(final ThrowStatement statement) {
         controller.getAcg().onLineNumber(statement, "visitThrowStatement");
         writeStatementLabel(statement);
         MethodVisitor mv = controller.getMethodVisitor();
@@ -612,7 +593,7 @@ public class StatementWriter {
         controller.getOperandStack().remove(1);
     }
 
-    public void writeReturn(ReturnStatement statement) {
+    public void writeReturn(final ReturnStatement statement) {
         controller.getAcg().onLineNumber(statement, "visitReturnStatement");
         writeStatementLabel(statement);
         MethodVisitor mv = controller.getMethodVisitor();
@@ -646,13 +627,12 @@ public class StatementWriter {
         operandStack.remove(1);
     }
 
-    public void writeExpressionStatement(ExpressionStatement statement) {
+    public void writeExpressionStatement(final ExpressionStatement statement) {
         controller.getAcg().onLineNumber(statement, "visitExpressionStatement: " + statement.getExpression().getClass().getName());
         writeStatementLabel(statement);
 
-        Expression expression = statement.getExpression();
-
         int mark = controller.getOperandStack().getStackLength();
+        Expression expression = statement.getExpression();
         expression.visit(controller.getAcg());
         controller.getOperandStack().popDownTo(mark);
     }
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesStatementWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesStatementWriter.java
index f049eb8..8165224 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesStatementWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesStatementWriter.java
@@ -59,7 +59,7 @@ import static org.objectweb.asm.Opcodes.LALOAD;
 import static org.objectweb.asm.Opcodes.SALOAD;
 
 /**
- * A class to write out the optimized statements
+ * A class to write out the optimized statements.
  */
 public class StaticTypesStatementWriter extends StatementWriter {
 
@@ -68,13 +68,10 @@ public class StaticTypesStatementWriter extends StatementWriter {
     private static final MethodCaller ENUMERATION_NEXT_METHOD = MethodCaller.newInterface(Enumeration.class, "nextElement");
     private static final MethodCaller ENUMERATION_HASMORE_METHOD = MethodCaller.newInterface(Enumeration.class, "hasMoreElements");
 
-    private final StaticTypesWriterController controller;
-
     public StaticTypesStatementWriter(StaticTypesWriterController controller) {
         super(controller);
-        this.controller = controller;
     }
-    
+
     @Override
     public void writeBlockStatement(BlockStatement statement) {
         controller.switchToFastPath();