You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2021/06/19 07:00:29 UTC

[groovy] branch danielsun/tweak-build updated: Cache lookup for groovy object

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

sunlan pushed a commit to branch danielsun/tweak-build
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/danielsun/tweak-build by this push:
     new a60d4ea  Cache lookup for groovy object
a60d4ea is described below

commit a60d4ea46a483b38b01bd6667da9ab257e3d9ab7
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sat Jun 19 15:00:15 2021 +0800

    Cache lookup for groovy object
---
 .../org/apache/groovy/lang/GroovyObjectHelper.java   | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/apache/groovy/lang/GroovyObjectHelper.java b/src/main/java/org/apache/groovy/lang/GroovyObjectHelper.java
index 88a4e23..9a60489 100644
--- a/src/main/java/org/apache/groovy/lang/GroovyObjectHelper.java
+++ b/src/main/java/org/apache/groovy/lang/GroovyObjectHelper.java
@@ -25,6 +25,7 @@ import java.lang.invoke.MethodHandles.Lookup;
 import java.lang.invoke.MethodType;
 import java.lang.reflect.Modifier;
 import java.util.Optional;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * Helper for {@link groovy.lang.GroovyObject}
@@ -40,6 +41,17 @@ public class GroovyObjectHelper {
      * @since 4.0.0
      */
     public static Optional<Lookup> lookup(GroovyObject groovyObject) {
+        AtomicReference<Lookup> lookupAtomicRef = LOOKUP_MAP.get(groovyObject.getClass());
+        Lookup lookup = lookupAtomicRef.get();
+        if (null != lookup) return Optional.of(lookup);
+
+        lookup = doLookup(groovyObject);
+        if (null != lookup) lookupAtomicRef.set(lookup);
+
+        return Optional.ofNullable(lookup);
+    }
+
+    private static Lookup doLookup(GroovyObject groovyObject) {
         MethodHandles.Lookup lookup;
         try {
             final Class<? extends GroovyObject> groovyObjectClass = groovyObject.getClass();
@@ -58,9 +70,15 @@ public class GroovyObjectHelper {
             lookup = null;
         }
 
-        return Optional.ofNullable(lookup);
+        return lookup;
     }
 
     private GroovyObjectHelper() {}
+    private static final ClassValue<AtomicReference<Lookup>> LOOKUP_MAP = new ClassValue<AtomicReference<Lookup>>() {
+        @Override
+        protected AtomicReference<Lookup> computeValue(Class<?> type) {
+            return new AtomicReference<>();
+        }
+    };
     private static final Class[] EMPTY_CLASS_ARRAY = new Class[0];
 }