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 2017/04/22 01:19:15 UTC
[08/40] groovy git commit: GROOVY-8144: Invoking a public method
declared in a non-public class result in a IllegalAccessError (closes #522)
GROOVY-8144: Invoking a public method declared in a non-public class result in a IllegalAccessError (closes #522)
Commit 1a4c9918a4f12e64 introduced the DecompiledClassNode as part of
enabling the ASM class resolver.
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/a1fac74b
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/a1fac74b
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/a1fac74b
Branch: refs/heads/parrot
Commit: a1fac74b1d6b6d419fb97566b5da7829636099ee
Parents: e06a1ea
Author: John Wagenleitner <jw...@apache.org>
Authored: Sat Apr 15 07:59:29 2017 -0700
Committer: John Wagenleitner <jw...@apache.org>
Committed: Sat Apr 15 08:05:00 2017 -0700
----------------------------------------------------------------------
.../classgen/asm/sc/StaticInvocationWriter.java | 5 +-
src/test/groovy/bugs/Groovy8144Bug.groovy | 85 ++++++++++++++++++++
.../org/codehaus/groovy/dummy/Groovy8144A.java | 26 ++++++
.../codehaus/groovy/dummy/Groovy8144ABase.java | 25 ++++++
.../org/codehaus/groovy/dummy/Groovy8144B.java | 26 ++++++
.../codehaus/groovy/dummy/Groovy8144BBase.java | 23 ++++++
.../org/codehaus/groovy/dummy/Groovy8144C.java | 26 ++++++
.../codehaus/groovy/dummy/Groovy8144CBase.java | 23 ++++++
8 files changed, 238 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/a1fac74b/src/main/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java b/src/main/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
index 09ca8ae..778d740 100644
--- a/src/main/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
+++ b/src/main/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
@@ -27,6 +27,7 @@ import org.codehaus.groovy.ast.GroovyCodeVisitor;
import org.codehaus.groovy.ast.InnerClassNode;
import org.codehaus.groovy.ast.MethodNode;
import org.codehaus.groovy.ast.Parameter;
+import org.codehaus.groovy.ast.decompiled.DecompiledClassNode;
import org.codehaus.groovy.ast.expr.*;
import org.codehaus.groovy.ast.stmt.ExpressionStatement;
import org.codehaus.groovy.ast.stmt.ForStatement;
@@ -706,7 +707,9 @@ public class StaticInvocationWriter extends InvocationWriter {
} else {
type = getWrapper(controller.getTypeChooser().resolveType(receiver, controller.getClassNode()));
ClassNode declaringClass = target.getDeclaringClass();
- if (type.getClass() != ClassNode.class && type.getClass() !=InnerClassNode.class) {
+ if (type.getClass() != ClassNode.class
+ && type.getClass() != InnerClassNode.class
+ && type.getClass() != DecompiledClassNode.class) {
type = declaringClass; // ex: LUB type
}
if (OBJECT_TYPE.equals(type) && !OBJECT_TYPE.equals(declaringClass)) {
http://git-wip-us.apache.org/repos/asf/groovy/blob/a1fac74b/src/test/groovy/bugs/Groovy8144Bug.groovy
----------------------------------------------------------------------
diff --git a/src/test/groovy/bugs/Groovy8144Bug.groovy b/src/test/groovy/bugs/Groovy8144Bug.groovy
new file mode 100644
index 0000000..da7172c
--- /dev/null
+++ b/src/test/groovy/bugs/Groovy8144Bug.groovy
@@ -0,0 +1,85 @@
+/*
+ * 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
+
+import org.codehaus.groovy.classgen.asm.AbstractBytecodeTestCase
+import org.codehaus.groovy.control.CompilerConfiguration
+import org.codehaus.groovy.control.SourceUnit
+
+/**
+ * This test requires the test classes executed are compiled and on the
+ * classpath and not in the same compilation unit.
+ */
+class Groovy8144Bug extends AbstractBytecodeTestCase {
+
+ GroovyShell shell
+
+ protected Map<String, Boolean> getOptions() {
+ ['asmResolving': Boolean.TRUE]
+ }
+
+ @Override
+ void setUp() {
+ CompilerConfiguration config = new CompilerConfiguration(CompilerConfiguration.DEFAULT)
+ config.optimizationOptions.putAll(getOptions())
+ shell = new GroovyShell(config)
+ }
+
+ void testMethodInheritedFromNonPublicAbstractBaseClass() {
+ checkAnswer('Groovy8144A')
+ }
+
+ void testMethodInheritedFromPublicAbstractBaseClass() {
+ checkAnswer('Groovy8144B')
+ }
+
+ void testMethodInheritedFromPublicBaseClass() {
+ checkAnswer('Groovy8144C')
+ }
+
+ void checkAnswer(String testClassName) {
+ String code = """
+ import org.codehaus.groovy.dummy.${testClassName}
+
+ @groovy.transform.CompileStatic
+ def m() {
+ new ${testClassName}().answer()
+ }
+
+ assert m() == 42
+ """
+
+ def action = { SourceUnit unit ->
+ unit.getConfiguration().optimizationOptions.putAll(getOptions())
+ }
+
+ assert compile([conversionAction:action, method:'m'], code).hasSequence([
+ "INVOKEVIRTUAL org/codehaus/groovy/dummy/${testClassName}.answer ()I"
+ ])
+
+ shell.evaluate(code)
+ }
+}
+
+class Groovy8144BugAsmResolveOff extends Groovy8144Bug {
+ @Override
+ protected Map<String, Boolean> getOptions() {
+ ['asmResolving': Boolean.FALSE]
+ }
+}
http://git-wip-us.apache.org/repos/asf/groovy/blob/a1fac74b/src/test/org/codehaus/groovy/dummy/Groovy8144A.java
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/dummy/Groovy8144A.java b/src/test/org/codehaus/groovy/dummy/Groovy8144A.java
new file mode 100644
index 0000000..cd6becb
--- /dev/null
+++ b/src/test/org/codehaus/groovy/dummy/Groovy8144A.java
@@ -0,0 +1,26 @@
+/*
+ * 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 org.codehaus.groovy.dummy;
+
+/**
+ * Inherits a public method from a package-private base class and is used to verify
+ * the generated INVOKEVIRTUAL call is on this and not super.
+ */
+public class Groovy8144A extends Groovy8144ABase {
+}
http://git-wip-us.apache.org/repos/asf/groovy/blob/a1fac74b/src/test/org/codehaus/groovy/dummy/Groovy8144ABase.java
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/dummy/Groovy8144ABase.java b/src/test/org/codehaus/groovy/dummy/Groovy8144ABase.java
new file mode 100644
index 0000000..f174c6d
--- /dev/null
+++ b/src/test/org/codehaus/groovy/dummy/Groovy8144ABase.java
@@ -0,0 +1,25 @@
+/*
+ * 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 org.codehaus.groovy.dummy;
+
+abstract class Groovy8144ABase {
+ public int answer() {
+ return 42;
+ }
+}
http://git-wip-us.apache.org/repos/asf/groovy/blob/a1fac74b/src/test/org/codehaus/groovy/dummy/Groovy8144B.java
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/dummy/Groovy8144B.java b/src/test/org/codehaus/groovy/dummy/Groovy8144B.java
new file mode 100644
index 0000000..338cef6
--- /dev/null
+++ b/src/test/org/codehaus/groovy/dummy/Groovy8144B.java
@@ -0,0 +1,26 @@
+/*
+ * 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 org.codehaus.groovy.dummy;
+
+/**
+ * Inherits a public method from a public abstract base class and is used to verify
+ * the generated INVOKEVIRTUAL call is on this and not super.
+ */
+public class Groovy8144B extends Groovy8144BBase {
+}
http://git-wip-us.apache.org/repos/asf/groovy/blob/a1fac74b/src/test/org/codehaus/groovy/dummy/Groovy8144BBase.java
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/dummy/Groovy8144BBase.java b/src/test/org/codehaus/groovy/dummy/Groovy8144BBase.java
new file mode 100644
index 0000000..d885049
--- /dev/null
+++ b/src/test/org/codehaus/groovy/dummy/Groovy8144BBase.java
@@ -0,0 +1,23 @@
+/*
+ * 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 org.codehaus.groovy.dummy;
+
+public abstract class Groovy8144BBase {
+ public int answer() { return 42; }
+}
http://git-wip-us.apache.org/repos/asf/groovy/blob/a1fac74b/src/test/org/codehaus/groovy/dummy/Groovy8144C.java
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/dummy/Groovy8144C.java b/src/test/org/codehaus/groovy/dummy/Groovy8144C.java
new file mode 100644
index 0000000..bf2f748
--- /dev/null
+++ b/src/test/org/codehaus/groovy/dummy/Groovy8144C.java
@@ -0,0 +1,26 @@
+/*
+ * 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 org.codehaus.groovy.dummy;
+
+/**
+ * Inherits a public method from a public base class and is used to verify
+ * the generated INVOKEVIRTUAL call is on this and not super.
+ */
+public class Groovy8144C extends Groovy8144CBase {
+}
http://git-wip-us.apache.org/repos/asf/groovy/blob/a1fac74b/src/test/org/codehaus/groovy/dummy/Groovy8144CBase.java
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/dummy/Groovy8144CBase.java b/src/test/org/codehaus/groovy/dummy/Groovy8144CBase.java
new file mode 100644
index 0000000..dcc0171
--- /dev/null
+++ b/src/test/org/codehaus/groovy/dummy/Groovy8144CBase.java
@@ -0,0 +1,23 @@
+/*
+ * 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 org.codehaus.groovy.dummy;
+
+public class Groovy8144CBase {
+ public int answer() { return 42; }
+}