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/04/19 08:22:48 UTC
[groovy] 01/02: Revert "Remove indy flags thoroughly"
This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch GROOVY-9513
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit b8757a0f8c45b88f7d53da7b69c2bcf734a9c932
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sun Apr 19 16:20:11 2020 +0800
Revert "Remove indy flags thoroughly"
This reverts commit b0e4095a
---
README.adoc | 12 ++++++++++++
.../org/codehaus/groovy/classgen/asm/WriterController.java | 3 ++-
.../org/codehaus/groovy/control/CompilerConfiguration.java | 8 +++++++-
src/spec/doc/tools-groovy.adoc | 1 +
src/spec/doc/tools-groovyc.adoc | 1 +
src/test/groovy/bugs/Groovy9271.groovy | 4 +++-
subprojects/groovy-ant/src/spec/doc/groovy-ant-task.adoc | 1 +
.../groovy/groovy/console/SwingBuilderConsoleTest.groovy | 3 +++
8 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/README.adoc b/README.adoc
index 13d6690..293932c 100644
--- a/README.adoc
+++ b/README.adoc
@@ -174,6 +174,18 @@ All code samples of the documentation guide are pulled from actual test cases. T
(Note the omission of package name: class is `semantics.PowerAssertTest` but only `PowerAssertTest` is added to `testSingle`.)
+== InvokeDynamic support
+
+The Groovy build supports the JVM instruction `invokedynamic`. If you want to build Groovy with invokedynamic, you can use the project property `indy`:
+
+ gradlew -Pindy=true clean test
+
+Please note that the following Gradle tasks generate both indy and non indy variants of the jars, so you don't need to use the system property:
+
+* dist
+* install
+* uploadArchives
+
== Continuous Integration Server
The official CI server runs {groovy-ci}[here] and is sponsored by http://www.jetbrains.com[JetBrains].
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
index 38fc9ba..fe8dc41 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
@@ -80,13 +80,14 @@ public class WriterController {
public void init(final AsmClassGenerator asmClassGenerator, final GeneratorContext gcon, final ClassVisitor cv, final ClassNode cn) {
CompilerConfiguration config = cn.getCompileUnit().getConfig();
Map<String,Boolean> optOptions = config.getOptimizationOptions();
- final boolean invokedynamic = true;
+ boolean invokedynamic = false;
if (optOptions.isEmpty()) {
// IGNORE
} else if (Boolean.FALSE.equals(optOptions.get("all"))) {
this.optimizeForInt = false;
// set other optimizations options to false here
} else {
+ if (Boolean.TRUE.equals(optOptions.get(CompilerConfiguration.INVOKEDYNAMIC))) invokedynamic = true;
if (Boolean.FALSE.equals(optOptions.get("int"))) this.optimizeForInt = false;
if (invokedynamic) this.optimizeForInt = false;
// set other optimizations options to false here
diff --git a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
index 9fc0cc3..6422184 100644
--- a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
+++ b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
@@ -48,6 +48,9 @@ import static org.codehaus.groovy.runtime.StringGroovyMethods.isAtLeast;
*/
public class CompilerConfiguration {
+ /** Optimization Option for enabling <code>invokedynamic</code> compilation. */
+ public static final String INVOKEDYNAMIC = "indy";
+
/** Optimization Option for enabling attaching groovydoc as AST node metadata. */
public static final String GROOVYDOC = "groovydoc";
@@ -412,6 +415,7 @@ public class CompilerConfiguration {
* <blockquote>
* <table summary="Groovy Compiler Optimization Options Configuration Properties">
* <tr><th>Property Key</th><th>Related Property Getter</th></tr>
+ * <tr><td><code>groovy.target.indy</code></td><td>{@link #getOptimizationOptions}</td></tr>
* <tr><td><code>groovy.attach.groovydoc</code></td><td>{@link #getOptimizationOptions}</td></tr>
* <tr><td><code>groovy.attach.runtime.groovydoc</code></td><td>{@link #getOptimizationOptions}</td></tr>
* </table>
@@ -432,6 +436,7 @@ public class CompilerConfiguration {
defaultScriptExtension = getSystemPropertySafe("groovy.default.scriptExtension", ".groovy");
optimizationOptions = new HashMap<>(4);
+ handleOptimizationOption(optimizationOptions, INVOKEDYNAMIC, "groovy.target.indy", "true");
handleOptimizationOption(optimizationOptions, GROOVYDOC, "groovy.attach.groovydoc");
handleOptimizationOption(optimizationOptions, RUNTIME_GROOVYDOC, "groovy.attach.runtime.groovydoc");
}
@@ -1060,7 +1065,8 @@ public class CompilerConfiguration {
* Checks if invoke dynamic is enabled.
*/
public boolean isIndyEnabled() {
- return true;
+ Boolean indyEnabled = getOptimizationOptions().get(INVOKEDYNAMIC);
+ return Optional.ofNullable(indyEnabled).orElse(Boolean.FALSE);
}
/**
diff --git a/src/spec/doc/tools-groovy.adoc b/src/spec/doc/tools-groovy.adoc
index 2e865cc..caf202c 100644
--- a/src/spec/doc/tools-groovy.adoc
+++ b/src/spec/doc/tools-groovy.adoc
@@ -54,6 +54,7 @@ int (disable any int based optimizations) |
| -e <script> | | specify an inline command line script | groovy -e "println new Date()"
| -h | --help | Displays usage information for the command line groovy command | groovy --help
| -i <extension> | | modify files in place; create backup if extension is given (e.g. '.bak') |
+| | --indy | Enables invokedynamic support. Requires Java 7+ | groovy --indy Person.groovy
| -l <port> | | listen on a port and process inbound lines (default: 1960) |
| -n | | process files line by line using implicit 'line' variable |
| -p | | process files line by line and print result (see also -n) |
diff --git a/src/spec/doc/tools-groovyc.adoc b/src/spec/doc/tools-groovyc.adoc
index 3d48d1d..6193db6 100644
--- a/src/spec/doc/tools-groovyc.adoc
+++ b/src/spec/doc/tools-groovyc.adoc
@@ -47,6 +47,7 @@ a number of command line switches:
| -e | --exception | Displays the stack trace in case of compilation error | groovyc -e script.groovy
| -j | --jointCompilation* | Enables joint compilation | groovyc -j A.groovy B.java
| -b | --basescript | Base class name for scripts (must derive from Script)|
+| -indy | --indy | Enables invokedynamic support. Requires Java 7+ | groovyc --indy Person.groovy
| | --configscript | Advanced compiler configuration script | groovyc --configscript config/config.groovy src/Person.groovy
| -Jproperty=value | | Properties to be passed to `javac` if joint compilation is enabled | groovyc -j -Jtarget=1.6 -Jsource=1.6 A.groovy B.java
| -Fflag | | Flags to be passed to `javac` if joint compilation is enabled | groovyc -j -Fnowarn A.groovy B.java
diff --git a/src/test/groovy/bugs/Groovy9271.groovy b/src/test/groovy/bugs/Groovy9271.groovy
index f9b8298..9ab9124 100644
--- a/src/test/groovy/bugs/Groovy9271.groovy
+++ b/src/test/groovy/bugs/Groovy9271.groovy
@@ -19,6 +19,7 @@
package groovy.bugs
import groovy.transform.CompileStatic
+import org.codehaus.groovy.control.CompilerConfiguration
import org.junit.Test
@CompileStatic
@@ -26,7 +27,8 @@ final class Groovy9271 {
@Test
void testBracketsInMethodNameWithIndy() {
- new GroovyShell().evaluate '''
+ def config = new CompilerConfiguration(optimizationOptions: [indy: true])
+ new GroovyShell(config).evaluate '''
class Bar {
private char letter = 'o'
int 'foo$()bar'() {
diff --git a/subprojects/groovy-ant/src/spec/doc/groovy-ant-task.adoc b/subprojects/groovy-ant/src/spec/doc/groovy-ant-task.adoc
index 6057f70..cea3333 100644
--- a/subprojects/groovy-ant/src/spec/doc/groovy-ant-task.adoc
+++ b/subprojects/groovy-ant/src/spec/doc/groovy-ant-task.adoc
@@ -118,6 +118,7 @@ You might need to use the _contextClassLoader_ attribute (see below) if any of y
|append|If enabled and output is to a file, append to existing file rather than overwrite. Defaults to false.|No
|fork|If enabled the script will be executed in a forked JVM process (disabled by default).|No
|scriptBaseClass|The name of the base class for scripts.|No
+|indy|If enabled the script will be executed with `invokedynamic` (disabled by default).|No
|parameters|Generates metadata for reflection on method parameter names on JDK 8 and above. Defaults to false. |No
|useGroovyShell|If enabled a new GroovyShell is used to run the script. Special variables won't be available but you don't need Ant in the classpath. Defaults to false. |No
|includeAntRuntime|If enabled the system classpath will be included on the classpath when forking. Defaults to true. |No
diff --git a/subprojects/groovy-console/src/test/groovy/groovy/console/SwingBuilderConsoleTest.groovy b/subprojects/groovy-console/src/test/groovy/groovy/console/SwingBuilderConsoleTest.groovy
index 30ae0da..6d57206 100644
--- a/subprojects/groovy-console/src/test/groovy/groovy/console/SwingBuilderConsoleTest.groovy
+++ b/subprojects/groovy-console/src/test/groovy/groovy/console/SwingBuilderConsoleTest.groovy
@@ -24,6 +24,7 @@ import groovy.console.ui.view.BasicMenuBar
import groovy.console.ui.view.MacOSXMenuBar
import groovy.swing.GroovySwingTestCase
import groovy.swing.SwingBuilder
+import org.codehaus.groovy.control.CompilerConfiguration
import org.junit.rules.TemporaryFolder
import javax.swing.JTextPane
@@ -590,10 +591,12 @@ class SwingBuilderConsoleTest extends GroovySwingTestCase {
console.inputEditor.textEditor.text = scriptSource
console.runScript(new EventObject([:]))
+ assert console.config.getOptimizationOptions().get(CompilerConfiguration.INVOKEDYNAMIC)
assert outputDocument.getText(0, outputDocument.length) == 'Result: foobar'
console.outputArea.text = ''
console.runScript(new EventObject([:]))
+ assert console.config.getOptimizationOptions().get(CompilerConfiguration.INVOKEDYNAMIC)
assert outputDocument.getText(0, outputDocument.length) == 'Result: foobar'
} finally {
GroovySystem.metaClassRegistry.removeMetaClass(Thread)