You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "death lord (JIRA)" <ji...@apache.org> on 2018/07/14 03:39:00 UTC
[jira] [Created] (GROOVY-8699) Somehow reduce or optimize o.g.c.r
calls in CompileStatic
death lord created GROOVY-8699:
----------------------------------
Summary: Somehow reduce or optimize o.g.c.r calls in CompileStatic
Key: GROOVY-8699
URL: https://issues.apache.org/jira/browse/GROOVY-8699
Project: Groovy
Issue Type: Wish
Reporter: death lord
Given the following simple snippet:
{code:java}
import groovy.transform.*
@CompileStatic
class IteratorTest {
static void main(args) {
final coords = [new Coord(1, 2), new Coord(0, 3), new Coord(1, 3), new Coord(0, 2)]
int i = 0
for (coord in coords) {
if (i in coord.x..coord.y) println "coord $i is between coord $coord.x and $coord.y"
++i
}
}
@TupleConstructor
static class Coord {
int x, y
}
}{code}
The bytecode output for the main method is polluted with needed class constants (in 2.4.12)
{code:java}
public static void main(String... args) {
List coords = ScriptBytecodeAdapter.createList(new Object[]{new IteratorTest.Coord(1, 2), new IteratorTest.Coord(0, 3), new IteratorTest.Coord(1, 3), new IteratorTest.Coord(0, 2)});
// ScriptBytecodeAdapter.createList calls InvokerHelper.createList which calls addAll on a ArrayList, meanwhile Arrays.asList (around since java 2) would directly call an efficient private ArrayList constructor
int i = 0;
IteratorTest.Coord coord = null;
for(Iterator var4 = coords.iterator(); var4.hasNext(); ++i) {
coord = (IteratorTest.Coord)ScriptBytecodeAdapter.castToType(var4.next(), IteratorTest.Coord.class);
// this castToType call is fine with a normal cast
if (DefaultTypeTransformation.booleanUnbox(new IntRange(true, coord.getX(), coord.getY()) == null ? false : DefaultGroovyMethods.isCase(new IntRange(true, coord.getX(), coord.getY()), i))) {
// isCase returns a primitive boolean so no need for unbox
// if certain expressions like a range expression can prove to not be null, then the == null check for for-in statements can be optimized out
// maybe an annotation to transform aliased method calls could make this compile to (coord.x..coord.y).contains(i), or even better: (i >= coord.x && i <= coord.y)
DefaultGroovyMethods.println(IteratorTest.class, new GStringImpl(new Object[]{i, coord.getX(), coord.getY()}, new String[]{"coord ", " is between coord ", " and ", ""}));
// GStrings could be optimized to StringBuilder if there's no closure expressions
// or, this could alias transform into System.out.println, and since it calls .toString on the GString all direct (GString literal).toString() calls can be optimized to StringBuilder
Object var10000 = null;
// random aconst_null
}
}
}
{code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)