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 2020/03/28 12:07:00 UTC

[groovy] 01/01: GROOVY-9487: Update and check if initialized via same field of metaclass

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

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

commit 1665bb5763658c08c288779794ae905e102f966c
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sat Mar 28 20:06:21 2020 +0800

    GROOVY-9487: Update and check if initialized via same field of metaclass
---
 src/main/java/groovy/lang/ExpandoMetaClass.java                |  4 +++-
 src/main/java/groovy/lang/MetaClassImpl.java                   |  6 +++++-
 .../codehaus/groovy/runtime/metaclass/ClosureMetaClass.java    | 10 ++++++++--
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/main/java/groovy/lang/ExpandoMetaClass.java b/src/main/java/groovy/lang/ExpandoMetaClass.java
index 3ecf073..73a2ad4 100644
--- a/src/main/java/groovy/lang/ExpandoMetaClass.java
+++ b/src/main/java/groovy/lang/ExpandoMetaClass.java
@@ -272,7 +272,7 @@ public class ExpandoMetaClass extends MetaClassImpl implements GroovyObject {
     // These two properties are used when no ExpandoMetaClassCreationHandle is present
 
     private MetaClass myMetaClass;
-    private boolean initialized;
+    private volatile boolean initialized;
     private volatile boolean modified;
 
     private boolean initCalled;
@@ -502,6 +502,7 @@ public class ExpandoMetaClass extends MetaClassImpl implements GroovyObject {
      * Checks if the meta class is initialized.
      * @see groovy.lang.MetaClassImpl#isInitialized()
      */
+    @Override
     protected boolean isInitialized() {
         try {
             readLock.lock();
@@ -511,6 +512,7 @@ public class ExpandoMetaClass extends MetaClassImpl implements GroovyObject {
         }
     }
 
+    @Override
     protected void setInitialized(boolean b) {
         this.initialized = b;
     }
diff --git a/src/main/java/groovy/lang/MetaClassImpl.java b/src/main/java/groovy/lang/MetaClassImpl.java
index 141deab..f3a149a 100644
--- a/src/main/java/groovy/lang/MetaClassImpl.java
+++ b/src/main/java/groovy/lang/MetaClassImpl.java
@@ -3135,6 +3135,10 @@ public class MetaClassImpl implements MetaClass, MutableMetaClass {
         return initialized;
     }
 
+    protected void setInitialized(boolean initialized) {
+        this.initialized = initialized;
+    }
+
     /**
      * @return {@code false}: add method
      *         {@code null} : ignore method
@@ -3391,7 +3395,7 @@ public class MetaClassImpl implements MetaClass, MutableMetaClass {
                 // Introspection failure...
                 // May happen in Android
             }
-            initialized = true;
+            setInitialized(true);
         }
     }
 
diff --git a/src/main/java/org/codehaus/groovy/runtime/metaclass/ClosureMetaClass.java b/src/main/java/org/codehaus/groovy/runtime/metaclass/ClosureMetaClass.java
index 786a0ba..af0bf2b 100644
--- a/src/main/java/org/codehaus/groovy/runtime/metaclass/ClosureMetaClass.java
+++ b/src/main/java/org/codehaus/groovy/runtime/metaclass/ClosureMetaClass.java
@@ -436,6 +436,7 @@ public final class ClosureMetaClass extends MetaClassImpl {
         attributeInitDone = !attributes.isEmpty();
     }
 
+    @Override
     public synchronized void initialize() {
         if (!isInitialized()) {
             CachedMethod[] methodArray = theCachedClass.getMethods();
@@ -446,8 +447,7 @@ public final class ClosureMetaClass extends MetaClassImpl {
                 }
             }
             assignMethodChooser();
-
-            initialized = true;
+            setInitialized(true);
         }
     }
 
@@ -575,10 +575,16 @@ public final class ClosureMetaClass extends MetaClassImpl {
         return null;
     }
 
+    @Override
     protected boolean isInitialized() {
         return initialized;
     }
 
+    @Override
+    protected void setInitialized(boolean initialized) {
+        this.initialized = initialized;
+    }
+
     public MetaMethod getStaticMetaMethod(String name, Object[] args) {
         return CLOSURE_METACLASS.getStaticMetaMethod(name, args);
     }