minor edits
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 9a39fbc..5284303 100644
--- a/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompilationTest.groovy
+++ b/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompilationTest.groovy
@@ -24,21 +24,19 @@
import static org.codehaus.groovy.control.CompilerConfiguration.DEFAULT as config
class StaticCompilationTest extends AbstractBytecodeTestCase {
+
void testEmptyMethod() {
- def bytecode = compile([method:'m'],'''
+ def bytecode = compile(method: 'm', '''
@groovy.transform.CompileStatic
void m() {}
''')
assert bytecode.hasStrictSequence(
- ['public m()V',
- 'L0',
- 'LINENUMBER 3 L0',
- 'RETURN']
+ ['public m()V', 'L0', 'LINENUMBER 3 L0', 'RETURN']
)
}
void testPrimitiveReturn1() {
- def bytecode = compile([method:'m'],'''
+ def bytecode = compile(method: 'm', '''
@groovy.transform.CompileStatic
int m() { 1 }
''')
@@ -48,7 +46,7 @@
}
void testPrimitiveReturn2() {
- def bytecode = compile([method:'m'],'''
+ def bytecode = compile(method: 'm', '''
@groovy.transform.CompileStatic
long m() { 1L }
''')
@@ -58,7 +56,7 @@
}
void testPrimitiveReturn3() {
- def bytecode = compile([method:'m'],'''
+ def bytecode = compile(method: 'm', '''
@groovy.transform.CompileStatic
short m() { 1 }
''')
@@ -68,7 +66,7 @@
}
void testPrimitiveReturn4() {
- def bytecode = compile([method:'m'],'''
+ def bytecode = compile(method: 'm', '''
@groovy.transform.CompileStatic
byte m() { 1 }
''')
@@ -78,7 +76,7 @@
}
void testIdentityReturns() {
- def bytecode = compile([method:'m'],'''
+ def bytecode = compile(method: 'm', '''
@groovy.transform.CompileStatic
int m(int i) { i }
''')
@@ -86,7 +84,7 @@
['ILOAD', 'IRETURN']
)
- bytecode = compile([method:'m'],'''
+ bytecode = compile(method: 'm', '''
@groovy.transform.CompileStatic
long m(long l) { l }
''')
@@ -94,7 +92,7 @@
['LLOAD', 'LRETURN']
)
- bytecode = compile([method:'m'],'''
+ bytecode = compile(method: 'm', '''
@groovy.transform.CompileStatic
short m(short l) { l }
''')
@@ -102,7 +100,7 @@
['ILOAD', 'IRETURN']
)
- bytecode = compile([method:'m'],'''
+ bytecode = compile(method: 'm', '''
@groovy.transform.CompileStatic
float m(float l) { l }
''')
@@ -110,7 +108,7 @@
['FLOAD', 'FRETURN']
)
- bytecode = compile([method:'m'],'''
+ bytecode = compile(method: 'm', '''
@groovy.transform.CompileStatic
double m(double l) { l }
''')
@@ -118,7 +116,7 @@
['DLOAD', 'DRETURN']
)
- bytecode = compile([method:'m'],'''
+ bytecode = compile(method: 'm', '''
@groovy.transform.CompileStatic
Object m(Object l) { l }
''')
@@ -128,11 +126,12 @@
}
void testSingleAssignment() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- void m() {
- int a = 1
- }''').hasSequence([
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ void m() {
+ int a = 1
+ }
+ ''').hasSequence([
"ICONST_1",
"ISTORE",
"RETURN"
@@ -140,11 +139,12 @@
}
void testReturnSingleAssignment() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- int m() {
- int a = 1
- }''').hasSequence([
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ int m() {
+ int a = 1
+ }
+ ''').hasSequence([
"ICONST_1",
"ISTORE",
"ILOAD",
@@ -153,12 +153,13 @@
}
void testIntLeftShift() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- void m() {
- int a = 1
- int b = a << 32
- }''').hasStrictSequence([
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ void m() {
+ int a = 1
+ int b = a << 32
+ }
+ ''').hasStrictSequence([
"ILOAD",
"BIPUSH 32",
"ISHL"
@@ -166,12 +167,13 @@
}
void testLongLeftShift() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- void m() {
- long a = 1L
- long b = a << 32
- }''').hasStrictSequence([
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ void m() {
+ long a = 1L
+ long b = a << 32
+ }
+ ''').hasStrictSequence([
"LLOAD",
"BIPUSH 32",
"LSHL"
@@ -181,11 +183,12 @@
void testArrayGet() {
if (config.indyEnabled) return;
// this test is done with indy in another tests case
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- void m(int[] arr) {
- arr[0]
- }''').hasStrictSequence([
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ void m(int[] arr) {
+ arr[0]
+ }
+ ''').hasStrictSequence([
"ALOAD 1",
"ICONST_0",
"INVOKESTATIC org/codehaus/groovy/runtime/BytecodeInterface8.intArrayGet ([II)I"
@@ -195,11 +198,12 @@
void testArraySet() {
if (config.indyEnabled) return;
// this test is done with indy in another tests case
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- void m(int[] arr) {
- arr[0] = 0
- }''').hasStrictSequence([
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ void m(int[] arr) {
+ arr[0] = 0
+ }
+ ''').hasStrictSequence([
"ICONST_0",
"ISTORE 2",
"ALOAD 1",
@@ -210,37 +214,38 @@
}
/* void testPlusPlus() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- void m() {
- int i = 0
- i++
- }''').hasStrictSequence([
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ void m() {
+ int i = 0
+ i++
+ }
+ ''').hasStrictSequence([
"IINC",
])
-
}
void testMinusMinus() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- void m() {
- int i = 0
- i--
- }''').hasStrictSequence([
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ void m() {
+ int i = 0
+ i--
+ }
+ ''').hasStrictSequence([
"IINC",
])
-
}
void testPlusEquals() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- int m() {
- int i = 0
- i += 13
- return i
- }''').hasStrictSequence([
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ int m() {
+ int i = 0
+ i += 13
+ return i
+ }
+ ''').hasStrictSequence([
"ILOAD",
"ILOAD",
"IADD",
@@ -249,11 +254,12 @@
}
void testPlusEqualsFromArgs() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- void m(int i, int j) {
- i += j
- }''').hasStrictSequence([
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ void m(int i, int j) {
+ i += j
+ }
+ ''').hasStrictSequence([
"ILOAD",
"ILOAD",
"IADD",
@@ -262,14 +268,14 @@
}*/
void testFlow() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- String m(String str) {
- def obj = 1
- obj = str
- obj.toUpperCase()
- }
- m 'Cedric'
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ String m(String str) {
+ def obj = 1
+ obj = str
+ obj.toUpperCase()
+ }
+ m 'Cedric'
''').hasStrictSequence([
"ICONST",
"INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;",
@@ -296,14 +302,14 @@
}
void testInstanceOf() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- void m(Object str) {
- if (str instanceof String) {
- str.toUpperCase()
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ void m(Object str) {
+ if (str instanceof String) {
+ str.toUpperCase()
+ }
}
- }
- m 'Cedric'
+ m 'Cedric'
''').hasStrictSequence([
"ALOAD",
"CHECKCAST java/lang/String",
@@ -312,15 +318,15 @@
}
void testShouldGenerateDirectConstructorCall() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- class Foo {
- String msg
- Foo(int x, String y) { msg = y*x }
- static Foo foo() {
- Foo result = [2,'Bar']
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ class Foo {
+ String msg
+ Foo(int x, String y) { msg = y*x }
+ static Foo foo() {
+ Foo result = [2,'Bar']
+ }
}
- }
''').hasStrictSequence([
'ICONST_2',
'LDC "Bar"',
@@ -329,11 +335,11 @@
}
void testShouldGenerateDirectArrayConstruct() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- void m() {
- int[] arr = [123,456]
- }
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ void m() {
+ int[] arr = [123,456]
+ }
''').hasStrictSequence([
'ICONST_2',
'NEWARRAY T_INT',
@@ -345,11 +351,11 @@
}
void testShouldGenerateDirectBooleanArrayConstruct() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- void m() {
- boolean[] arr = [123,false]
- }
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ void m() {
+ boolean[] arr = [123,false]
+ }
''').hasStrictSequence([
'ICONST_2',
'NEWARRAY T_BOOLEAN',
@@ -363,38 +369,38 @@
}
void testShouldTriggerDirectCallToOuterClassGetter() {
- assert compile([method: 'fromInner',classNamePattern:'.*Inner.*'], '''
-class Holder {
- String value
-}
+ assert compile(method: 'fromInner', classNamePattern: '.*Inner.*', '''
+ class Holder {
+ String value
+ }
-@groovy.transform.CompileStatic
-class Outer {
- String outerProperty = 'outer'
- private class Inner {
- String fromInner() {
- Holder holder = new Holder()
- holder.value = outerProperty
- holder.value
- }
- }
+ @groovy.transform.CompileStatic
+ class Outer {
+ String outerProperty = 'outer'
+ private class Inner {
+ String fromInner() {
+ Holder holder = new Holder()
+ holder.value = outerProperty
+ holder.value
+ }
+ }
- String blah() {
- new Inner().fromInner()
- }
-}
+ String blah() {
+ new Inner().fromInner()
+ }
+ }
-def o = new Outer()
-assert o.blah() == 'outer'
-''').hasStrictSequence([
- 'GETFIELD Outer$Inner.this$0',
- 'INVOKEVIRTUAL Outer.getOuterProperty',
- 'DUP',
- 'ASTORE',
- 'ALOAD',
- 'ALOAD',
- 'INVOKEVIRTUAL Holder.setValue'
-])
+ def o = new Outer()
+ assert o.blah() == 'outer'
+ ''').hasStrictSequence([
+ 'GETFIELD Outer$Inner.this$0',
+ 'INVOKEVIRTUAL Outer.getOuterProperty',
+ 'DUP',
+ 'ASTORE',
+ 'ALOAD',
+ 'ALOAD',
+ 'INVOKEVIRTUAL Holder.setValue'
+ ])
}
void testShouldOptimizeBytecodeByAvoidingCreationOfMopMethods() {
@@ -448,16 +454,15 @@
// GROOVY-7124
void testUseInvokeVirtualPreferredOverInvokeInterface() {
- assert compile([method: 'foo',classNamePattern:'B'], '''
- interface A { void m() }
- class B implements A {
- void m() {}
- @groovy.transform.CompileStatic
- void foo() {
- m()
+ assert compile(method: 'foo', classNamePattern: 'B', '''
+ interface A { void m() }
+ class B implements A {
+ void m() {}
+ @groovy.transform.CompileStatic
+ void foo() {
+ m()
+ }
}
- }
-
''').hasStrictSequence(['INVOKEVIRTUAL B.m'])
}
@@ -478,11 +483,11 @@
}
void testShouldOptimizeCharInit() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- void m() {
- char c = 'x'
- }
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ void m() {
+ char c = 'x'
+ }
''').hasStrictSequence([
'LINENUMBER 4',
'BIPUSH 120',
@@ -491,13 +496,13 @@
}
void testShouldOptimizeCharComparison() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- void m() {
- char c1 = 'x'
- char c2 = 'x'
- boolean b = c1==c2
- }
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ void m() {
+ char c1 = 'x'
+ char c2 = 'x'
+ boolean b = c1==c2
+ }
''').hasSequence([
'LINENUMBER 4',
'BIPUSH 120',
@@ -541,149 +546,148 @@
// int[]
def intExample = '''
- @groovy.transform.CompileStatic
- void m(int[] arr) {
- for (int i: arr) {
- println(i)
+ @groovy.transform.CompileStatic
+ void m(int[] arr) {
+ for (int i: arr) {
+ println(i)
+ }
}
- }
- m([1,2] as int[])
+ m([1,2] as int[])
'''
- assert compile([method:'m'], intExample).hasSequence([*loop_init,'IALOAD','ISTORE'])
+ assert compile(method:'m', intExample).hasSequence([*loop_init,'IALOAD','ISTORE'])
// short[]
def shortExample = '''
- @groovy.transform.CompileStatic
- void m(short[] arr) {
- for (short i: arr) {
- println(i)
+ @groovy.transform.CompileStatic
+ void m(short[] arr) {
+ for (short i: arr) {
+ println(i)
+ }
}
- }
- m([1,2] as short[])
+ m([1,2] as short[])
'''
- assert compile([method:'m'], shortExample).hasSequence([*loop_init,'SALOAD','ISTORE'])
+ assert compile(method:'m', shortExample).hasSequence([*loop_init,'SALOAD','ISTORE'])
// byte[]
def byteExample = '''
- @groovy.transform.CompileStatic
- void m(byte[] arr) {
- for (byte i: arr) {
- println(i)
+ @groovy.transform.CompileStatic
+ void m(byte[] arr) {
+ for (byte i: arr) {
+ println(i)
+ }
}
- }
- m([1,2] as byte[])
+ m([1,2] as byte[])
'''
- assert compile([method:'m'], byteExample).hasSequence([*loop_init,'BALOAD','ISTORE'])
+ assert compile(method:'m', byteExample).hasSequence([*loop_init,'BALOAD','ISTORE'])
// long[]
def longExample = '''
- @groovy.transform.CompileStatic
- void m(long[] arr) {
- for (long i: arr) {
- println(i)
+ @groovy.transform.CompileStatic
+ void m(long[] arr) {
+ for (long i: arr) {
+ println(i)
+ }
}
- }
- m([1,2] as long[])
+ m([1,2] as long[])
'''
- assert compile([method:'m'], longExample).hasSequence([*loop_init,'LALOAD','LSTORE'])
+ assert compile(method:'m', longExample).hasSequence([*loop_init,'LALOAD','LSTORE'])
- // char[]
+ // char[]
def charExample = '''
- @groovy.transform.CompileStatic
- void m(char[] arr) {
- for (char i: arr) {
- println(i)
+ @groovy.transform.CompileStatic
+ void m(char[] arr) {
+ for (char i: arr) {
+ println(i)
+ }
}
- }
- m('foo'.toCharArray())
+ m('foo'.toCharArray())
'''
- assert compile([method:'m'], charExample).hasSequence([*loop_init,'CALOAD','ISTORE'])
+ assert compile(method:'m', charExample).hasSequence([*loop_init,'CALOAD','ISTORE'])
- // boolean[]
+ // boolean[]
def boolExample = '''
- @groovy.transform.CompileStatic
- void m(boolean[] arr) {
- for (boolean i: arr) {
- println(i)
+ @groovy.transform.CompileStatic
+ void m(boolean[] arr) {
+ for (boolean i: arr) {
+ println(i)
+ }
}
- }
- m([true,false] as boolean[])
+ m([true,false] as boolean[])
'''
- assert compile([method:'m'], boolExample).hasSequence([*loop_init,'BALOAD','ISTORE'])
+ assert compile(method:'m', boolExample).hasSequence([*loop_init,'BALOAD','ISTORE'])
// float[]
def floatExample = '''
- @groovy.transform.CompileStatic
- void m(float[] arr) {
- for (float i: arr) {
- println(i)
+ @groovy.transform.CompileStatic
+ void m(float[] arr) {
+ for (float i: arr) {
+ println(i)
+ }
}
- }
- m([1.5f,2.0f] as float[])
+ m([1.5f,2.0f] as float[])
'''
- assert compile([method:'m'], floatExample).hasSequence([*loop_init,'FALOAD','FSTORE'])
+ assert compile(method:'m', floatExample).hasSequence([*loop_init,'FALOAD','FSTORE'])
// double[]
def doubleExample = '''
- @groovy.transform.CompileStatic
- void m(double[] arr) {
- for (double i: arr) {
- println(i)
+ @groovy.transform.CompileStatic
+ void m(double[] arr) {
+ for (double i: arr) {
+ println(i)
+ }
}
- }
- m([1.1,2.2] as double[])
+ m([1.1,2.2] as double[])
'''
- assert compile([method:'m'], doubleExample).hasSequence([*loop_init,'DALOAD','DSTORE'])
+ assert compile(method:'m', doubleExample).hasSequence([*loop_init,'DALOAD','DSTORE'])
// Any[]
def anyExample = '''
- @groovy.transform.CompileStatic
- void m(String[] arr) {
- for (String i: arr) {
- println(i)
+ @groovy.transform.CompileStatic
+ void m(String[] arr) {
+ for (String i: arr) {
+ println(i)
+ }
}
- }
- m(['a','b'] as String[])
+ m(['a','b'] as String[])
'''
- assert compile([method:'m'], anyExample).hasSequence([*loop_init,'AALOAD','ASTORE'])
+ assert compile(method:'m', anyExample).hasSequence([*loop_init,'AALOAD','ASTORE'])
// now check that everything runs fine
- [byteExample,shortExample, intExample, charExample, boolExample,
- longExample, floatExample, doubleExample, anyExample].each { script ->
+ [byteExample,shortExample, intExample, charExample, boolExample, longExample, floatExample, doubleExample, anyExample].each { script ->
assertScript(script)
}
}
void testCompareWithCharOptimization() {
String code = '''
- @groovy.transform.CompileStatic
- boolean m(char[] arr) {
- char c = arr[0]
- ' '==c
- }
- assert m(' abc '.toCharArray()) == true
+ @groovy.transform.CompileStatic
+ boolean m(char[] arr) {
+ char c = arr[0]
+ ' '==c
+ }
+ assert m(' abc '.toCharArray()) == true
'''
- assert compile([method:'m'],code).hasSequence(['BIPUSH','ILOAD','IF_ICMPNE'])
+ assert compile(method:'m',code).hasSequence(['BIPUSH','ILOAD','IF_ICMPNE'])
assertScript(code)
code = '''
- @groovy.transform.CompileStatic
- boolean m(char[] arr) {
- char c = arr[0]
- c==' '
- }
- assert m(' abc '.toCharArray()) == true
+ @groovy.transform.CompileStatic
+ boolean m(char[] arr) {
+ char c = arr[0]
+ c==' '
+ }
+ assert m(' abc '.toCharArray()) == true
'''
- assert compile([method:'m'],code).hasSequence(['ILOAD','BIPUSH','IF_ICMPNE'])
+ assert compile(method:'m',code).hasSequence(['ILOAD','BIPUSH','IF_ICMPNE'])
assertScript(code)
}
void testShouldRemoveUnnecessaryCast() {
- assert compile([method:'m'],'''
- @groovy.transform.CompileStatic
- void m() {
- char c = (char) 'x'
- }
+ assert compile(method: 'm', '''
+ @groovy.transform.CompileStatic
+ void m() {
+ char c = (char) 'x'
+ }
''').hasStrictSequence([
'LINENUMBER 4',
'BIPUSH 120',
@@ -699,16 +703,16 @@
// static case should be compiled into functional interface
String code = '''
- import groovy.transform.CompileStatic
- import java.util.stream.Collectors
+ import groovy.transform.CompileStatic
+ import java.util.stream.Collectors
- @CompileStatic
- void m() {
- assert ['foo'].stream().map(String::toUpperCase).collect(Collectors.toList()) == ['FOO']
- }
- m()
+ @CompileStatic
+ void m() {
+ assert ['foo'].stream().map(String::toUpperCase).collect(Collectors.toList()) == ['FOO']
+ }
+ m()
'''
- assert compile([method:'m'],code).hasSequence([
+ assert compile(method:'m', code).hasSequence([
'INVOKEDYNAMIC apply()Ljava/util/function/Function;',
/* handle kind 0x6 : INVOKESTATIC */
'java/lang/invoke/LambdaMetafactory.metafactory',