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'
'''
}