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

emilles pushed a commit to branch GROOVY-8283
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit b4325e4ac47de0bd4f344a45adb3826205192730
Author: Eric Milles <eric.mil...@thomsonreuters.com>
AuthorDate: Mon Dec 9 12:31:11 2024 -0600

    GROOVY-8283: propagate sender class for `getProperty` and `setProperty`
---
 .../java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java     | 5 +++--
 src/test/groovy/bugs/Groovy8283.groovy                              | 6 ++++++
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java 
b/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java
index e73dd853cc..5860340946 100644
--- a/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java
+++ b/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java
@@ -468,7 +468,8 @@ public class ScriptBytecodeAdapter {
 
     public static Object getProperty(Class senderClass, Object receiver, 
String messageName) throws Throwable {
         try {
-            if (receiver instanceof GroovyObject) {
+            if (receiver instanceof GroovyObject && 
!receiver.getClass().getMethod("getProperty", String.class).isDefault()) {
+                // TODO: instead of checking for no getProperty 
specialization, pass senderClass in ThreadLocal or something
                 var groovyObject = (GroovyObject) receiver;
                 return groovyObject.getProperty(messageName);
             } else {
@@ -500,7 +501,7 @@ public class ScriptBytecodeAdapter {
 
     public static void setProperty(Object messageArgument, Class senderClass, 
Object receiver, String messageName) throws Throwable {
         try {
-            if (receiver instanceof GroovyObject) {
+            if (receiver instanceof GroovyObject && 
!receiver.getClass().getMethod("setProperty", String.class, 
Object.class).isDefault()) {
                 var groovyObject = (GroovyObject) receiver;
                 groovyObject.setProperty(messageName, messageArgument);
             } else {
diff --git a/src/test/groovy/bugs/Groovy8283.groovy 
b/src/test/groovy/bugs/Groovy8283.groovy
index fc34722f4a..2d7f8b3dbb 100644
--- a/src/test/groovy/bugs/Groovy8283.groovy
+++ b/src/test/groovy/bugs/Groovy8283.groovy
@@ -223,6 +223,12 @@ final class Groovy8283 {
             new E().test3()
             new E().test4()
             new E().test5()
+
+            def e = new E()
+            e.foo = null // not the field from this perspective
+            assert e.setter
+            assert e.fooA == null
+            assert e.fooB != null
         '''
     }
 }

Reply via email to