You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by jw...@apache.org on 2016/01/01 00:27:22 UTC

groovy git commit: GROOVY-7709 - ConvertedClosure/ConvertedMap do not work with interface extending GroovyObject (closes #226)

Repository: groovy
Updated Branches:
  refs/heads/master a843a40ed -> 0a75ecd61


GROOVY-7709 - ConvertedClosure/ConvertedMap do not work with interface extending GroovyObject (closes #226)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/0a75ecd6
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/0a75ecd6
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/0a75ecd6

Branch: refs/heads/master
Commit: 0a75ecd613d9873095302fdb911b592a1e995f99
Parents: a843a40
Author: John Wagenleitner <jw...@apache.org>
Authored: Sat Dec 26 19:17:07 2015 -0800
Committer: John Wagenleitner <jw...@apache.org>
Committed: Thu Dec 31 15:19:26 2015 -0800

----------------------------------------------------------------------
 .../groovy/runtime/ConversionHandler.java       | 26 +++++++++++++
 src/test/groovy/bugs/Groovy7709Bug.groovy       | 41 ++++++++++++++++++++
 2 files changed, 67 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/0a75ecd6/src/main/org/codehaus/groovy/runtime/ConversionHandler.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/runtime/ConversionHandler.java b/src/main/org/codehaus/groovy/runtime/ConversionHandler.java
index d628ea1..929642d 100644
--- a/src/main/org/codehaus/groovy/runtime/ConversionHandler.java
+++ b/src/main/org/codehaus/groovy/runtime/ConversionHandler.java
@@ -18,7 +18,11 @@
  */
 package org.codehaus.groovy.runtime;
 
+import groovy.lang.GroovyObject;
 import groovy.lang.GroovyRuntimeException;
+import groovy.lang.GroovySystem;
+import groovy.lang.MetaClass;
+import org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl;
 import org.codehaus.groovy.vmplugin.VMPlugin;
 import org.codehaus.groovy.vmplugin.VMPluginFactory;
 
@@ -45,6 +49,8 @@ public abstract class ConversionHandler implements InvocationHandler, Serializab
         if (VMPluginFactory.getPlugin().getVersion()>=7) handleCache = new ConcurrentHashMap();
     }
 
+    private MetaClass metaClass;
+
     /**
      * Creates a ConversionHandler with an delegate.
      *
@@ -102,6 +108,13 @@ public abstract class ConversionHandler implements InvocationHandler, Serializab
 
         if (!checkMethod(method)) {
             try {
+                if (method.getDeclaringClass() == GroovyObject.class) {
+                    if ("getMetaClass".equals(method.getName())) {
+                        return getMetaClass(proxy);
+                    } else if ("setMetaClass".equals(method.getName())) {
+                        return setMetaClass((MetaClass) args[0]);
+                    }
+                }
                 return invokeCustom(proxy, method, args);
             } catch (GroovyRuntimeException gre) {
                 throw ScriptBytecodeAdapter.unwrap(gre);
@@ -189,4 +202,17 @@ public abstract class ConversionHandler implements InvocationHandler, Serializab
         return Object.class.equals(method.getDeclaringClass());
     }
 
+    private MetaClass setMetaClass(MetaClass mc) {
+        metaClass = mc;
+        return mc;
+    }
+
+    private MetaClass getMetaClass(Object proxy) {
+        MetaClass mc = metaClass;
+        if (mc == null) {
+            mc = ((MetaClassRegistryImpl) GroovySystem.getMetaClassRegistry()).getMetaClass(proxy);
+            metaClass = mc;
+        }
+        return mc;
+    }
 }

http://git-wip-us.apache.org/repos/asf/groovy/blob/0a75ecd6/src/test/groovy/bugs/Groovy7709Bug.groovy
----------------------------------------------------------------------
diff --git a/src/test/groovy/bugs/Groovy7709Bug.groovy b/src/test/groovy/bugs/Groovy7709Bug.groovy
new file mode 100644
index 0000000..be5e789
--- /dev/null
+++ b/src/test/groovy/bugs/Groovy7709Bug.groovy
@@ -0,0 +1,41 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package groovy.bugs
+
+class Groovy7709Bug extends GroovyTestCase {
+
+    void testConvertedClosureAsGroovyObject() {
+        def closure = { 43 }
+        def proxy = closure as Groovy7709BugY
+        assert proxy instanceof GroovyObject
+        assert proxy.foo() == 43
+    }
+
+    void testConvertedMapAsGroovyObject() {
+        def map = [foo: { 43 }]
+        def proxy = map as Groovy7709BugY
+        assert proxy instanceof GroovyObject
+        assert proxy.foo() == 43
+    }
+
+}
+
+interface Groovy7709BugY extends GroovyObject {
+    int foo()
+}