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 2020/08/29 22:58:28 UTC

[groovy] branch master updated: reuse CachedField#getProperty

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 57c8a11  reuse CachedField#getProperty
57c8a11 is described below

commit 57c8a116098c750e6e00b727112f66f2b8c10df5
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat Aug 29 17:57:47 2020 -0500

    reuse CachedField#getProperty
---
 .../callsite/GetEffectivePogoFieldSite.java        | 58 ++++++++--------------
 .../callsite/GetEffectivePojoFieldSite.java        | 36 ++++++--------
 2 files changed, 36 insertions(+), 58 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePogoFieldSite.java b/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePogoFieldSite.java
index efa5fb5..b345cbe 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePogoFieldSite.java
+++ b/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePogoFieldSite.java
@@ -19,60 +19,46 @@
 package org.codehaus.groovy.runtime.callsite;
 
 import groovy.lang.GroovyObject;
-import groovy.lang.GroovyRuntimeException;
 import groovy.lang.MetaClass;
 import org.codehaus.groovy.reflection.CachedField;
 import org.codehaus.groovy.runtime.GroovyCategorySupport;
 
-import java.lang.reflect.Field;
-
 public class GetEffectivePogoFieldSite extends AbstractCallSite {
     private final MetaClass metaClass;
-    private final Field effective;
+    private final CachedField effective;
 
-    public GetEffectivePogoFieldSite(CallSite site, MetaClass metaClass, CachedField effective) {
+    public GetEffectivePogoFieldSite(final CallSite site, final MetaClass metaClass, final CachedField effective) {
         super(site);
         this.metaClass = metaClass;
-        this.effective = effective.getCachedField();
+        this.effective = effective;
+    }
+
+    @Override
+    public final CallSite acceptGetProperty(final Object receiver) {
+        return isEffective(receiver) ? this : createGetPropertySite(receiver);
     }
 
-    public final Object callGetProperty (Object receiver) throws Throwable {
-        if (GroovyCategorySupport.hasCategoryInCurrentThread() || !(receiver instanceof GroovyObject) || ((GroovyObject) receiver).getMetaClass() != metaClass) {
-            return createGetPropertySite(receiver).getProperty(receiver);
-        } else {
-            return getProperty(receiver);
-        }
+    @Override
+    public final CallSite acceptGroovyObjectGetProperty(final Object receiver) {
+        return isEffective(receiver) ? this : createGroovyObjectGetPropertySite(receiver);
     }
 
-    public final CallSite acceptGetProperty(Object receiver) {
-        if (GroovyCategorySupport.hasCategoryInCurrentThread() || !(receiver instanceof GroovyObject) || ((GroovyObject)receiver).getMetaClass() != metaClass) {
-            return createGetPropertySite(receiver);
-        } else {
-            return this;
-        }
+    @Override
+    public final Object callGetProperty(final Object receiver) throws Throwable {
+        return isEffective(receiver) ? getProperty(receiver) : createGetPropertySite(receiver).getProperty(receiver);
     }
 
-    public final Object callGroovyObjectGetProperty (Object receiver) throws Throwable {
-        if (GroovyCategorySupport.hasCategoryInCurrentThread() || ((GroovyObject) receiver).getMetaClass() != metaClass) {
-            return createGroovyObjectGetPropertySite(receiver).getProperty(receiver);
-        } else {
-            return getProperty(receiver);
-        }
+    @Override
+    public final Object callGroovyObjectGetProperty (final Object receiver) throws Throwable {
+        return isEffective(receiver) ? getProperty(receiver) : createGroovyObjectGetPropertySite(receiver).getProperty(receiver);
     }
 
-    public final CallSite acceptGroovyObjectGetProperty(Object receiver) {
-        if (GroovyCategorySupport.hasCategoryInCurrentThread() || !(receiver instanceof GroovyObject) || ((GroovyObject)receiver).getMetaClass() != metaClass) {
-            return createGroovyObjectGetPropertySite(receiver);
-        } else {
-            return this;
-        }
+    @Override
+    public final Object getProperty(final Object receiver) {
+        return effective.getProperty(receiver);
     }
 
-    public final Object getProperty(Object receiver) {
-        try {
-            return effective.get(receiver);
-        } catch (IllegalAccessException e) {
-            throw new GroovyRuntimeException("Cannot get the property '" + name + "'.", e);
-        }
+    private boolean isEffective(final Object receiver) {
+        return !GroovyCategorySupport.hasCategoryInCurrentThread() && receiver instanceof GroovyObject && ((GroovyObject) receiver).getMetaClass() == metaClass;
     }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePojoFieldSite.java b/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePojoFieldSite.java
index f1c4d71..2e8a698 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePojoFieldSite.java
+++ b/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePojoFieldSite.java
@@ -18,43 +18,35 @@
  */
 package org.codehaus.groovy.runtime.callsite;
 
-import groovy.lang.GroovyRuntimeException;
 import groovy.lang.MetaClassImpl;
 import org.codehaus.groovy.reflection.CachedField;
 import org.codehaus.groovy.runtime.GroovyCategorySupport;
 
-import java.lang.reflect.Field;
-
 class GetEffectivePojoFieldSite extends AbstractCallSite {
     private final MetaClassImpl metaClass;
-    private final Field effective;
-    private final int version;
+    private final CachedField effective;
+    private final int metaClassVersion;
 
-    public GetEffectivePojoFieldSite(CallSite site, MetaClassImpl metaClass, CachedField effective) {
+    public GetEffectivePojoFieldSite(final CallSite site, final MetaClassImpl metaClass, final CachedField effective) {
         super(site);
         this.metaClass = metaClass;
-        this.effective = effective.getCachedField();
-        version = metaClass.getVersion();
+        this.effective = effective;
+        this.metaClassVersion = metaClass.getVersion();
     }
 
-//    public final Object callGetProperty (Object receiver) throws Throwable {
-//        return acceptGetProperty(receiver).getProperty(receiver);
-//    }
+    @Override
+    public final CallSite acceptGetProperty(final Object receiver) {
+        if (GroovyCategorySupport.hasCategoryInCurrentThread()
+            || metaClass.getTheClass() != receiver.getClass()
+            || metaClass.getVersion() != metaClassVersion) {
 
-    public final CallSite acceptGetProperty(Object receiver) {
-        if (GroovyCategorySupport.hasCategoryInCurrentThread() || receiver.getClass() != metaClass.getTheClass()
-            || version != metaClass.getVersion()) { // metaClass is invalid
             return createGetPropertySite(receiver);
-        } else {
-            return this;
         }
+        return this;
     }
 
-    public final Object getProperty(Object receiver) {
-        try {
-            return effective.get(receiver);
-        } catch (IllegalAccessException e) {
-            throw new GroovyRuntimeException("Cannot get the property '" + name + "'.", e);
-        }
+    @Override
+    public final Object getProperty(final Object receiver) {
+        return effective.getProperty(receiver);
     }
 }