You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2021/12/05 22:17:56 UTC

[groovy] branch master updated: GROOVY-9609: ScriptBytecodeAdapter getPropertyOnSuper/setPropertyOnSuper

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

emilles 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 b90128e  GROOVY-9609: ScriptBytecodeAdapter getPropertyOnSuper/setPropertyOnSuper
b90128e is described below

commit b90128e8de4d728436586393a08c27bf90c44929
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sun Dec 5 16:17:48 2021 -0600

    GROOVY-9609: ScriptBytecodeAdapter getPropertyOnSuper/setPropertyOnSuper
---
 .../groovy/runtime/ScriptBytecodeAdapter.java      | 18 ++++++----
 src/test/groovy/bugs/Groovy9608.groovy             | 30 +++++++++++++++++
 .../bugs/{Groovy9608.groovy => Groovy9609.groovy}  | 38 +++++++---------------
 3 files changed, 52 insertions(+), 34 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java b/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java
index b3dfce5..9204565 100644
--- a/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java
+++ b/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java
@@ -178,7 +178,7 @@ public class ScriptBytecodeAdapter {
     //              normal method invocation
     //  --------------------------------------------------------
     public static Object invokeMethodN(Class senderClass, Object receiver, String messageName, Object[] messageArguments) throws Throwable {
-        try {    
+        try {
             return InvokerHelper.invokeMethod(receiver, messageName, messageArguments);
         } catch (GroovyRuntimeException gre) {
             throw unwrap(gre);
@@ -320,7 +320,7 @@ public class ScriptBytecodeAdapter {
             return InvokerHelper.getAttribute(receiver, messageName);
         } catch (GroovyRuntimeException gre) {
             throw unwrap(gre);
-        }    
+        }
     }
 
     public static Object getFieldSafe(Class senderClass, Object receiver, String messageName) throws Throwable {
@@ -424,7 +424,11 @@ public class ScriptBytecodeAdapter {
     //  --------------------------------------------------------
 
     public static Object getPropertyOnSuper(Class senderClass, GroovyObject receiver, String messageName) throws Throwable {
-        return invokeMethodOnSuperN(senderClass, receiver, "getProperty", new Object[]{messageName});
+        try {
+            return receiver.getMetaClass().getProperty(senderClass, receiver, messageName, true, false);
+        } catch (GroovyRuntimeException gre) {
+            throw unwrap(gre);
+        }
     }
 
     public static Object getPropertyOnSuperSafe(Class senderClass, GroovyObject receiver, String messageName) throws Throwable {
@@ -432,8 +436,8 @@ public class ScriptBytecodeAdapter {
     }
 
     public static Object getPropertyOnSuperSpreadSafe(Class senderClass, GroovyObject receiver, String messageName) throws Throwable {
-        List answer = new ArrayList();
-        for (Iterator it = InvokerHelper.asIterator(receiver); it.hasNext();) {
+        List<Object> answer = new ArrayList<>();
+        for (Iterator<?> it = InvokerHelper.asIterator(receiver); it.hasNext();) {
             answer.add(getPropertySafe(senderClass, it.next(), messageName));
         }
         return answer;
@@ -445,7 +449,7 @@ public class ScriptBytecodeAdapter {
 
     public static void setPropertyOnSuper(Object messageArgument, Class senderClass, GroovyObject receiver, String messageName) throws Throwable {
         try {
-            InvokerHelper.setAttribute(receiver, messageName, messageArgument);
+            receiver.getMetaClass().setProperty(senderClass, receiver, messageName, messageArgument, true, false);
         } catch (GroovyRuntimeException gre) {
             throw unwrap(gre);
         }
@@ -456,7 +460,7 @@ public class ScriptBytecodeAdapter {
     }
 
     public static void setPropertyOnSuperSpreadSafe(Object messageArgument, Class senderClass, GroovyObject receiver, String messageName) throws Throwable {
-        for (Iterator it = InvokerHelper.asIterator(receiver); it.hasNext();) {
+        for (Iterator<?> it = InvokerHelper.asIterator(receiver); it.hasNext();) {
             setPropertySafe(messageArgument, senderClass, it.next(), messageName);
         }
     }
diff --git a/src/test/groovy/bugs/Groovy9608.groovy b/src/test/groovy/bugs/Groovy9608.groovy
index 1e1784e..c0d55ae 100644
--- a/src/test/groovy/bugs/Groovy9608.groovy
+++ b/src/test/groovy/bugs/Groovy9608.groovy
@@ -60,4 +60,34 @@ final class Groovy9608 {
             assert bSuperX == 'A'
         '''
     }
+
+    @Test
+    void testGetPropertyOnSelf() {
+        assertScript '''
+            import groovy.bugs.Groovy9608.*
+
+            def a = new A()
+            def ax = a.metaClass.getProperty(A, a, 'x', false, false)
+            assert ax == 'A'
+
+            def b = new B()
+            def bx = b.metaClass.getProperty(B, b, 'x', false, false)
+            assert bx == 'B'
+        '''
+    }
+
+    @Test // GROOVY-9609
+    void testGetPropertyOnSuper() {
+        assertScript '''
+            import groovy.bugs.Groovy9608.*
+            import org.codehaus.groovy.runtime.ScriptBytecodeAdapter
+
+            def b = new B()
+            def bSuperX = b.metaClass.getProperty(B, b, 'x', true, false)
+            assert bSuperX == 'A'
+
+            bSuperX = ScriptBytecodeAdapter.getPropertyOnSuper(B, b, 'x')
+            assert bSuperX == 'A'
+        '''
+    }
 }
diff --git a/src/test/groovy/bugs/Groovy9608.groovy b/src/test/groovy/bugs/Groovy9609.groovy
similarity index 61%
copy from src/test/groovy/bugs/Groovy9608.groovy
copy to src/test/groovy/bugs/Groovy9609.groovy
index 1e1784e..df1d3b5 100644
--- a/src/test/groovy/bugs/Groovy9608.groovy
+++ b/src/test/groovy/bugs/Groovy9609.groovy
@@ -22,41 +22,25 @@ import org.junit.Test
 
 import static groovy.test.GroovyAssert.assertScript
 
-final class Groovy9608 {
-
-    static class A {
-        public x = 'A'
-    }
-    static class B extends A {
-        public x = 'B'
-    }
-
-    @Test
-    void testGetFieldOnSelf() {
-        assertScript '''
-            import groovy.bugs.Groovy9608.*
-
-            def a = new A()
-            def ax = a.metaClass.getAttribute(A, a, 'x', false)
-            assert ax == 'A'
-
-            def b = new B()
-            def bx = b.metaClass.getAttribute(B, b, 'x', false)
-            assert bx == 'B'
-        '''
-    }
+final class Groovy9609 {
 
     @Test
-    void testGetFieldOnSuper() {
+    void testGetPropertyOnSuper() {
         assertScript '''
-            import groovy.bugs.Groovy9608.*
             import org.codehaus.groovy.runtime.ScriptBytecodeAdapter
 
+            class A {
+                def getX() { 'A' }
+            }
+            class B extends A {
+                def getX() { 'B' }
+            }
+
             def b = new B()
-            def bSuperX = b.metaClass.getAttribute(B, b, 'x', true)
+            def bSuperX = b.metaClass.getProperty(B, b, 'x', true, false)
             assert bSuperX == 'A'
 
-            bSuperX = ScriptBytecodeAdapter.getFieldOnSuper(B, b, 'x')
+            bSuperX = ScriptBytecodeAdapter.getPropertyOnSuper(B, b, 'x')
             assert bSuperX == 'A'
         '''
     }