Minor refactoring (cherry picked from commit c28b8ca)
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/4fb91285 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/4fb91285 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/4fb91285 Branch: refs/heads/GROOVY_2_5_X Commit: 4fb91285ea6cc3dba19eb93e11779c8bc9c588d4 Parents: 70006c7 Author: sunlan <[email protected]> Authored: Sun Aug 27 17:29:33 2017 +0800 Committer: sunlan <[email protected]> Committed: Sun Aug 27 18:50:44 2017 +0800 ---------------------------------------------------------------------- .../asm/sc/StaticTypesWriterController.java | 23 +++++++++++++++---- .../groovy/control/CompilerConfiguration.java | 14 ++++++++++++ .../transform/stc/MethodCallsSTCTest.groovy | 2 +- .../classgen/asm/BinaryOperationsTest.groovy | 12 +++++----- .../groovy/classgen/asm/HotSwapTest.groovy | 2 +- .../classgen/asm/MethodPatternsTest.groovy | 24 ++++++++++---------- .../CombinedIndyAndStaticCompilationTest.groovy | 2 +- .../asm/sc/StaticCompilationTest.groovy | 4 ++-- .../sc/StaticCompileArrayLengthAndGet.groovy | 4 ++-- ...ticCompileNullCompareOptimizationTest.groovy | 11 +++++---- .../control/CompilerConfigurationTest.java | 1 - 11 files changed, 64 insertions(+), 35 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/4fb91285/src/main/org/codehaus/groovy/classgen/asm/sc/StaticTypesWriterController.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/classgen/asm/sc/StaticTypesWriterController.java b/src/main/org/codehaus/groovy/classgen/asm/sc/StaticTypesWriterController.java index 04c06f2..47ef3d4 100644 --- a/src/main/org/codehaus/groovy/classgen/asm/sc/StaticTypesWriterController.java +++ b/src/main/org/codehaus/groovy/classgen/asm/sc/StaticTypesWriterController.java @@ -18,16 +18,29 @@ */ package org.codehaus.groovy.classgen.asm.sc; -import org.codehaus.groovy.ast.*; +import org.codehaus.groovy.ast.AnnotatedNode; +import org.codehaus.groovy.ast.ClassHelper; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.ConstructorNode; +import org.codehaus.groovy.ast.MethodNode; import org.codehaus.groovy.classgen.AsmClassGenerator; import org.codehaus.groovy.classgen.GeneratorContext; -import org.codehaus.groovy.classgen.asm.*; +import org.codehaus.groovy.classgen.asm.BinaryExpressionHelper; +import org.codehaus.groovy.classgen.asm.BinaryExpressionMultiTypeDispatcher; +import org.codehaus.groovy.classgen.asm.CallSiteWriter; +import org.codehaus.groovy.classgen.asm.ClosureWriter; +import org.codehaus.groovy.classgen.asm.DelegatingController; +import org.codehaus.groovy.classgen.asm.InvocationWriter; +import org.codehaus.groovy.classgen.asm.StatementWriter; +import org.codehaus.groovy.classgen.asm.TypeChooser; +import org.codehaus.groovy.classgen.asm.UnaryExpressionHelper; +import org.codehaus.groovy.classgen.asm.WriterController; import org.codehaus.groovy.classgen.asm.indy.sc.IndyStaticTypesMultiTypeDispatcher; +import org.codehaus.groovy.control.CompilerConfiguration; import org.codehaus.groovy.transform.sc.StaticCompilationMetadataKeys; import org.codehaus.groovy.transform.sc.StaticCompilationVisitor; import org.codehaus.groovy.transform.stc.StaticTypesMarker; import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.Opcodes; /** @@ -62,7 +75,9 @@ public class StaticTypesWriterController extends DelegatingController { this.invocationWriter = new StaticInvocationWriter(this); this.closureWriter = new StaticTypesClosureWriter(this); this.unaryExpressionHelper = new StaticTypesUnaryExpressionHelper(this); - this.binaryExprHelper = (getBytecodeVersion() > Opcodes.V1_6) + + CompilerConfiguration config = cn.getCompileUnit().getConfig(); + this.binaryExprHelper = config.isIndyEnabled() ? new IndyStaticTypesMultiTypeDispatcher(this) : new StaticTypesBinaryExpressionMultiTypeDispatcher(this); } http://git-wip-us.apache.org/repos/asf/groovy/blob/4fb91285/src/main/org/codehaus/groovy/control/CompilerConfiguration.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/control/CompilerConfiguration.java b/src/main/org/codehaus/groovy/control/CompilerConfiguration.java index 38449cc..216d01c 100644 --- a/src/main/org/codehaus/groovy/control/CompilerConfiguration.java +++ b/src/main/org/codehaus/groovy/control/CompilerConfiguration.java @@ -865,4 +865,18 @@ public class CompilerConfiguration { public void setBytecodePostprocessor(final BytecodeProcessor bytecodePostprocessor) { this.bytecodePostprocessor = bytecodePostprocessor; } + + /** + * Check whether invoke dynamic enabled + * @return the result + */ + public boolean isIndyEnabled() { + Boolean indyEnabled = this.getOptimizationOptions().get(INVOKEDYNAMIC); + + if (null == indyEnabled) { + return false; + } + + return indyEnabled; + } } http://git-wip-us.apache.org/repos/asf/groovy/blob/4fb91285/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy ---------------------------------------------------------------------- diff --git a/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy b/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy index d7c6573..ed7f0db 100644 --- a/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy +++ b/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy @@ -803,7 +803,7 @@ class MethodCallsSTCTest extends StaticTypeCheckingTestCase { } void testBoxingShouldCostMore() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assertScript ''' int foo(int x) { 1 } int foo(Integer x) { 2 } http://git-wip-us.apache.org/repos/asf/groovy/blob/4fb91285/src/test/org/codehaus/groovy/classgen/asm/BinaryOperationsTest.groovy ---------------------------------------------------------------------- diff --git a/src/test/org/codehaus/groovy/classgen/asm/BinaryOperationsTest.groovy b/src/test/org/codehaus/groovy/classgen/asm/BinaryOperationsTest.groovy index d152f3b..34cd64a 100644 --- a/src/test/org/codehaus/groovy/classgen/asm/BinaryOperationsTest.groovy +++ b/src/test/org/codehaus/groovy/classgen/asm/BinaryOperationsTest.groovy @@ -26,7 +26,7 @@ import static org.codehaus.groovy.control.CompilerConfiguration.DEFAULT as confi class BinaryOperationsTest extends AbstractBytecodeTestCase { void testIntPlus() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assert compile("""\ int i = 1 int j = 2 @@ -39,7 +39,7 @@ class BinaryOperationsTest extends AbstractBytecodeTestCase { } void testIntCompareLessThan() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assert compile("""\ int i = 0 if (i < 100) println "true" @@ -51,7 +51,7 @@ class BinaryOperationsTest extends AbstractBytecodeTestCase { } void testCompareLessThanInClosure() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; // GROOVY-4741 assert """ int a = 0 @@ -63,7 +63,7 @@ class BinaryOperationsTest extends AbstractBytecodeTestCase { } void testLongLeftShift() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assert compile("""\ long a = 1 long b = a << 32 @@ -74,7 +74,7 @@ class BinaryOperationsTest extends AbstractBytecodeTestCase { } void testIntConstants() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; (0..5).each { assert compile("""\ int a = $it @@ -106,7 +106,7 @@ class BinaryOperationsTest extends AbstractBytecodeTestCase { } void testCharXor() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assert compile(""" int i = ('a' as char) ^ ('b' as char) """).hasStrictSequence ([ http://git-wip-us.apache.org/repos/asf/groovy/blob/4fb91285/src/test/org/codehaus/groovy/classgen/asm/HotSwapTest.groovy ---------------------------------------------------------------------- diff --git a/src/test/org/codehaus/groovy/classgen/asm/HotSwapTest.groovy b/src/test/org/codehaus/groovy/classgen/asm/HotSwapTest.groovy index fef7482..11b570d 100644 --- a/src/test/org/codehaus/groovy/classgen/asm/HotSwapTest.groovy +++ b/src/test/org/codehaus/groovy/classgen/asm/HotSwapTest.groovy @@ -26,7 +26,7 @@ import static org.codehaus.groovy.control.CompilerConfiguration.DEFAULT as confi class HotSwapTest extends AbstractBytecodeTestCase { void testHotSwapMethodExistsAndCallsGetCallSiteArray() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assert compile(method: '__$swapInit', ''' Long d = 123456L ''').hasSequence([ http://git-wip-us.apache.org/repos/asf/groovy/blob/4fb91285/src/test/org/codehaus/groovy/classgen/asm/MethodPatternsTest.groovy ---------------------------------------------------------------------- diff --git a/src/test/org/codehaus/groovy/classgen/asm/MethodPatternsTest.groovy b/src/test/org/codehaus/groovy/classgen/asm/MethodPatternsTest.groovy index ababe1b..bc3e63c 100644 --- a/src/test/org/codehaus/groovy/classgen/asm/MethodPatternsTest.groovy +++ b/src/test/org/codehaus/groovy/classgen/asm/MethodPatternsTest.groovy @@ -25,7 +25,7 @@ import static org.codehaus.groovy.control.CompilerConfiguration.DEFAULT as confi class MethodPatternsTest extends AbstractBytecodeTestCase { void testUnoptimizedIfWithNestedOptimizedLoop(){ - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; // in this example the if block contains statements that will not be optimized // but we still want to optimize the for loops, which can. // The test will check there is a optimized bytecode sequence for the loops. @@ -91,7 +91,7 @@ class MethodPatternsTest extends AbstractBytecodeTestCase { // make a test for native compilation of the ackerman function // and ensure the nested call is optimized void testAckerman() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assert compile(method: 'A', ''' int A(int x, int y) { if (x == 0) return y+1 @@ -141,7 +141,7 @@ class MethodPatternsTest extends AbstractBytecodeTestCase { } void testForLoopSettingArray() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assert compile(''' int n = 10 int[] x = new int[n] @@ -179,7 +179,7 @@ class MethodPatternsTest extends AbstractBytecodeTestCase { } void testArrayIncrement() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assert compile(''' int n = 10 int[] x = new int[n] @@ -229,7 +229,7 @@ class MethodPatternsTest extends AbstractBytecodeTestCase { } void testForLoopSettingArrayWithOperatorUsedInAssignmentAndArrayRHS() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assert compile(''' int n = 10 int[] x = new int[n] @@ -269,7 +269,7 @@ class MethodPatternsTest extends AbstractBytecodeTestCase { } void testRightShiftUnsignedWithLongArgument() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assert compile(method: "hashCode", ''' class X{ long _tagReservationDate @@ -299,7 +299,7 @@ class MethodPatternsTest extends AbstractBytecodeTestCase { } void testObjectArraySet() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assert compile(method: "foo", ''' class X { void foo() { @@ -314,7 +314,7 @@ class MethodPatternsTest extends AbstractBytecodeTestCase { } void testBooleanArraySet() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assert compile(method: "foo", ''' class X{ void foo() { @@ -329,7 +329,7 @@ class MethodPatternsTest extends AbstractBytecodeTestCase { } void testArray() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; def methods = [ "short" : [1, "sArraySet ([SIS)V", "sArrayGet ([SI)S"], "int" : [1, "intArraySet ([III)V", "intArrayGet ([II)I"], @@ -386,7 +386,7 @@ class MethodPatternsTest extends AbstractBytecodeTestCase { } void testFib() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assert compile(method: "fib", """ int fib(int i) { i < 2 ? 1 : fib(i - 2) + fib(i - 1) @@ -426,7 +426,7 @@ class MethodPatternsTest extends AbstractBytecodeTestCase { } void testNoBoxUnbox() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; assert compile(method: "someCode", """ public boolean someCall() { return true; @@ -445,7 +445,7 @@ class MethodPatternsTest extends AbstractBytecodeTestCase { } void testDiv() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; def types = [ "byte", "short", "int", "long", "double", "float"] types.each {type -> http://git-wip-us.apache.org/repos/asf/groovy/blob/4fb91285/src/test/org/codehaus/groovy/classgen/asm/sc/CombinedIndyAndStaticCompilationTest.groovy ---------------------------------------------------------------------- diff --git a/src/test/org/codehaus/groovy/classgen/asm/sc/CombinedIndyAndStaticCompilationTest.groovy b/src/test/org/codehaus/groovy/classgen/asm/sc/CombinedIndyAndStaticCompilationTest.groovy index 8e619d2..14c1b74 100644 --- a/src/test/org/codehaus/groovy/classgen/asm/sc/CombinedIndyAndStaticCompilationTest.groovy +++ b/src/test/org/codehaus/groovy/classgen/asm/sc/CombinedIndyAndStaticCompilationTest.groovy @@ -28,7 +28,7 @@ import static org.codehaus.groovy.control.CompilerConfiguration.DEFAULT as confi */ class CombinedIndyAndStaticCompilationTest extends AbstractBytecodeTestCase { void testArrayAccess() { - if (!config.optimizationOptions.indy) return; + if (!config.indyEnabled) return; ["byte", "short", "int", "long", "float", "double", "boolean", "char"].each { type-> //array get compile (""" http://git-wip-us.apache.org/repos/asf/groovy/blob/4fb91285/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompilationTest.groovy ---------------------------------------------------------------------- diff --git a/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompilationTest.groovy b/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompilationTest.groovy index 7a9be80..b83430a 100644 --- a/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompilationTest.groovy +++ b/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompilationTest.groovy @@ -179,7 +179,7 @@ class StaticCompilationTest extends AbstractBytecodeTestCase { } void testArrayGet() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; // this test is done with indy in another tests case assert compile([method:'m'],''' @groovy.transform.CompileStatic @@ -193,7 +193,7 @@ class StaticCompilationTest extends AbstractBytecodeTestCase { } void testArraySet() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; // this test is done with indy in another tests case assert compile([method:'m'],''' @groovy.transform.CompileStatic http://git-wip-us.apache.org/repos/asf/groovy/blob/4fb91285/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileArrayLengthAndGet.groovy ---------------------------------------------------------------------- diff --git a/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileArrayLengthAndGet.groovy b/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileArrayLengthAndGet.groovy index c538d33..6bcf4bd 100644 --- a/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileArrayLengthAndGet.groovy +++ b/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileArrayLengthAndGet.groovy @@ -38,7 +38,7 @@ class StaticCompileArrayLengthAndGet extends AbstractBytecodeTestCase { } void testArrayGet1() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; // this test is done with indy in another tests case def bytecode = compile([method:'m'],''' @groovy.transform.CompileStatic @@ -55,7 +55,7 @@ class StaticCompileArrayLengthAndGet extends AbstractBytecodeTestCase { } void testArraySet1() { - if (config.optimizationOptions.indy) return; + if (config.indyEnabled) return; // this test is done with indy in another tests case def bytecode = compile([method:'m'],''' @groovy.transform.CompileStatic http://git-wip-us.apache.org/repos/asf/groovy/blob/4fb91285/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileNullCompareOptimizationTest.groovy ---------------------------------------------------------------------- diff --git a/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileNullCompareOptimizationTest.groovy b/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileNullCompareOptimizationTest.groovy index 6d8ef18..06db85b 100644 --- a/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileNullCompareOptimizationTest.groovy +++ b/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileNullCompareOptimizationTest.groovy @@ -123,10 +123,11 @@ class StaticCompileNullCompareOptimizationTest extends AbstractBytecodeTestCase } } ''') - if (Boolean.valueOf(System.getProperty('groovy.target.indy','false'))) { + if (config.indyEnabled) { return } - assert bytecode.hasStrictSequence(['ALOAD 1', 'DUP', 'IFNONNULL', 'POP', 'ICONST_0', 'GOTO', 'L1', 'INVOKEVIRTUAL', 'L2', 'IFEQ']) + assert bytecode.hasStrictSequence(['ALOAD 1', 'DUP', 'IFNONNULL', 'POP', 'ICONST_0', 'GOTO', 'L1', 'INVOKEVIRTUAL', 'L2', 'IFEQ']) || + bytecode.hasStrictSequence(['ALOAD 1', 'DUP', 'IFNONNULL', 'POP', 'ICONST_0', 'GOTO', 'L1', 'FRAME SAME1', 'INVOKEVIRTUAL', 'L2', 'FRAME SAME1', 'IFEQ']) // bytecode with stack map frame } void testOptimizeGroovyTruthWithStringShouldNotBeTriggered() { @@ -138,7 +139,7 @@ class StaticCompileNullCompareOptimizationTest extends AbstractBytecodeTestCase } } ''') - if (config.optimizationOptions.indy) { + if (config.indyEnabled) { assert bytecode.hasStrictSequence([ 'ALOAD 1', 'INVOKEDYNAMIC cast(Ljava/lang/String;)Z', @@ -168,7 +169,7 @@ class StaticCompileNullCompareOptimizationTest extends AbstractBytecodeTestCase } } ''') - if (config.optimizationOptions.indy) { + if (config.indyEnabled) { assert bytecode.hasStrictSequence([ 'ALOAD 1', 'INVOKEDYNAMIC cast(Ljava/lang/Object;)Z', @@ -235,7 +236,7 @@ class StaticCompileNullCompareOptimizationTest extends AbstractBytecodeTestCase } } ''') - if (config.optimizationOptions.indy) { + if (config.indyEnabled) { assert bytecode.hasStrictSequence([ 'ALOAD 1', 'INVOKEDYNAMIC cast(LA$B;)Z', http://git-wip-us.apache.org/repos/asf/groovy/blob/4fb91285/src/test/org/codehaus/groovy/control/CompilerConfigurationTest.java ---------------------------------------------------------------------- diff --git a/src/test/org/codehaus/groovy/control/CompilerConfigurationTest.java b/src/test/org/codehaus/groovy/control/CompilerConfigurationTest.java index 7d67307..ddf0738 100644 --- a/src/test/org/codehaus/groovy/control/CompilerConfigurationTest.java +++ b/src/test/org/codehaus/groovy/control/CompilerConfigurationTest.java @@ -22,7 +22,6 @@ import groovy.util.GroovyTestCase; import org.codehaus.groovy.control.messages.WarningMessage; import java.io.File; -import java.io.PrintWriter; import java.util.HashMap; import java.util.List; import java.util.Map;
