You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by bl...@apache.org on 2017/12/23 22:25:43 UTC

groovy git commit: GROOVY-8338: JDK9 requires at least JDK8 bytecode to invokestatic a static interface method

Repository: groovy
Updated Branches:
  refs/heads/master 58bd8a0dd -> 1972c21cb


GROOVY-8338: JDK9 requires at least JDK8 bytecode to invokestatic a static interface method


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

Branch: refs/heads/master
Commit: 1972c21cb2ccade3109cf9befdbbc3ff9c7dad68
Parents: 58bd8a0
Author: Jochen Theodorou <bl...@gmx.org>
Authored: Sat Dec 23 23:24:03 2017 +0100
Committer: Jochen Theodorou <bl...@gmx.org>
Committed: Sat Dec 23 23:25:07 2017 +0100

----------------------------------------------------------------------
 .../runtime/callsite/CallSiteGenerator.java     | 33 +++++++++++++++-----
 .../v8/InterfaceStaticMethodCallTest.groovy     | 30 ++++++++++++++++++
 2 files changed, 55 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/1972c21c/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java b/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
index 7b616c9..8931d19 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
+++ b/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
@@ -25,6 +25,7 @@ import org.codehaus.groovy.classgen.asm.BytecodeHelper;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.CachedMethod;
 import org.codehaus.groovy.reflection.android.AndroidSupport;
+import org.codehaus.groovy.vmplugin.VMPluginFactory;
 import org.objectweb.asm.ClassWriter;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
@@ -90,7 +91,7 @@ public class CallSiteGenerator {
         }        
         
         // make call
-        mv.visitMethodInsn(invokeMethodCode, type, cachedMethod.getName(), descriptor, invokeMethodCode == Opcodes.INVOKEINTERFACE);
+        mv.visitMethodInsn(invokeMethodCode, type, cachedMethod.getName(), descriptor, useInterface);
 
         // produce result
         BytecodeHelper.box(mv, cachedMethod.getReturnType());
@@ -158,11 +159,19 @@ public class CallSiteGenerator {
         mv.visitEnd();
     }
 
+    private static void classHeader(ClassWriter cw, String internalName, String superName) {
+        if (VMPluginFactory.getPlugin().getVersion()>=8) {
+            cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, internalName, null, superName, null);
+        } else {
+            cw.visit(Opcodes.V1_4, Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, internalName, null, superName, null);
+        }
+    }
+
     public static byte[] genPogoMetaMethodSite(CachedMethod cachedMethod, ClassWriter cw, String name) {
         String internalName = name.replace('.', '/');
-        cw.visit(Opcodes.V1_4, Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, internalName, null, "org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite", null);
+        classHeader(cw, internalName, "org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite");
         cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "__constructor__", "Ljava/lang/reflect/Constructor;", null, null);
- 
+
         genConstructor(cw, "org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite", internalName);
 
         genCallXxxWithArray(cw, "Current", "org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite", cachedMethod, "groovy/lang/GroovyObject");
@@ -179,7 +188,7 @@ public class CallSiteGenerator {
 
     public static byte[] genPojoMetaMethodSite(CachedMethod cachedMethod, ClassWriter cw, String name) {
         String internalName = name.replace('.', '/');
-        cw.visit(Opcodes.V1_4, Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, internalName, null, "org/codehaus/groovy/runtime/callsite/PojoMetaMethodSite", null);
+        classHeader(cw, internalName, "org/codehaus/groovy/runtime/callsite/PojoMetaMethodSite");
         cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "__constructor__", "Ljava/lang/reflect/Constructor;", null, null);
 
         genConstructor(cw, "org/codehaus/groovy/runtime/callsite/PojoMetaMethodSite", internalName);
@@ -194,7 +203,7 @@ public class CallSiteGenerator {
 
     public static byte[] genStaticMetaMethodSite(CachedMethod cachedMethod, ClassWriter cw, String name) {
         String internalName = name.replace('.', '/');
-        cw.visit(Opcodes.V1_4, Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, internalName, null, "org/codehaus/groovy/runtime/callsite/StaticMetaMethodSite", null);
+        classHeader(cw, internalName, "org/codehaus/groovy/runtime/callsite/StaticMetaMethodSite");
         cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "__constructor__", "Ljava/lang/reflect/Constructor;", null, null);
  
         genConstructor(cw, "org/codehaus/groovy/runtime/callsite/StaticMetaMethodSite", internalName);
@@ -209,8 +218,16 @@ public class CallSiteGenerator {
         return cw.toByteArray();
     }
 
+    private static ClassWriter makeClassWriter() {
+        if (VMPluginFactory.getPlugin().getVersion()>=8) {
+            return new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+        } else {
+            return new ClassWriter(ClassWriter.COMPUTE_MAXS);
+        }
+    }
+
     public static Constructor compilePogoMethod(CachedMethod cachedMethod) {
-        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+        ClassWriter cw = makeClassWriter();
 
         final CachedClass declClass = cachedMethod.getDeclaringClass();
         final CallSiteClassLoader callSiteLoader = declClass.getCallSiteLoader();
@@ -222,7 +239,7 @@ public class CallSiteGenerator {
     }
 
     public static Constructor compilePojoMethod(CachedMethod cachedMethod) {
-        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+        ClassWriter cw = makeClassWriter();
 
         final CachedClass declClass = cachedMethod.getDeclaringClass();
         final CallSiteClassLoader callSiteLoader = declClass.getCallSiteLoader();
@@ -234,7 +251,7 @@ public class CallSiteGenerator {
     }
 
     public static Constructor compileStaticMethod(CachedMethod cachedMethod) {
-        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+        ClassWriter cw = makeClassWriter();
 
         final CachedClass declClass = cachedMethod.getDeclaringClass();
         final CallSiteClassLoader callSiteLoader = declClass.getCallSiteLoader();

http://git-wip-us.apache.org/repos/asf/groovy/blob/1972c21c/src/test/org/codehaus/groovy/vmplugin/v8/InterfaceStaticMethodCallTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/vmplugin/v8/InterfaceStaticMethodCallTest.groovy b/src/test/org/codehaus/groovy/vmplugin/v8/InterfaceStaticMethodCallTest.groovy
new file mode 100644
index 0000000..80ad66a
--- /dev/null
+++ b/src/test/org/codehaus/groovy/vmplugin/v8/InterfaceStaticMethodCallTest.groovy
@@ -0,0 +1,30 @@
+/*
+ *  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.vmplugin.v8
+
+class InterfaceStaticMethodCallTest extends GroovyTestCase {
+    void testStreamOf() {
+        // "of" is a static method declared on the interface, we only want to be sure we can call the method
+        assertScript '''
+            import java.util.stream.Stream
+
+            assert Stream.of("1") instanceof Stream
+        '''
+    }
+}