[groovy] branch master updated: GROOVY-7494: ArrayStoreException assigning GStringImpl to String[] when using Indy

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[groovy] branch master updated: GROOVY-7494: ArrayStoreException assigning GStringImpl to String[] when using Indy

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

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


The following commit(s) were added to refs/heads/master by this push:
     new bad02b2  GROOVY-7494: ArrayStoreException assigning GStringImpl to String[] when using Indy
bad02b2 is described below

commit bad02b2f8d9ba3906321af2cf2ffd8abbb51a954
Author: Paul King <[hidden email]>
AuthorDate: Wed Oct 14 20:15:07 2020 +1000

    GROOVY-7494: ArrayStoreException assigning GStringImpl to String[] when using Indy
---
 .../groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java  | 2 ++
 src/test/groovy/GStringTest.groovy                                 | 7 +++++++
 2 files changed, 9 insertions(+)

diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java
index 556d584..9cb7c74 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java
@@ -58,6 +58,8 @@ public class ObjectArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
             }
         } else if (Character.class.isAssignableFrom(arrayComponentClass)) {
             adjustedNewVal = DefaultTypeTransformation.getCharFromSizeOneString(newValue);
+        } else if (String.class.equals(arrayComponentClass) && newValue instanceof GString) {
+            adjustedNewVal = DefaultTypeTransformation.castToType(newValue, arrayComponentClass);
         } else if (Number.class.isAssignableFrom(arrayComponentClass)) {
             if (newValue instanceof Character || newValue instanceof String || newValue instanceof GString) {
                 Character ch = DefaultTypeTransformation.getCharFromSizeOneString(newValue);
diff --git a/src/test/groovy/GStringTest.groovy b/src/test/groovy/GStringTest.groovy
index ec1c714..f19c0d4 100644
--- a/src/test/groovy/GStringTest.groovy
+++ b/src/test/groovy/GStringTest.groovy
@@ -594,6 +594,13 @@ class GStringTest extends GroovyTestCase {
         assert gstring.toString() == 'Green eggs and ham'
     }
 
+    // GROOVY-7494
+    void testGStringCoercionForArrayPutAt() {
+        String[] fubar = new String[1]
+        fubar[0] = "x${'y'}"
+        assert fubar.toString() == '[xy]'
+    }
+
     void testGStringLiteral() {
         def gstr = "a${'1'}"
         assert gstr.toString() === gstr.toString()

Apache Groovy committer & PMC member

Blog: http://blog.sunlan.me
Twitter: @daniel_sun