Re: static vs. default interface methods and inheritance VM/javac issues

2013-09-15 Thread Alan Bateman

On 13/09/2013 10:37, Peter Levart wrote:



Karen, I filed a bug, but don't have the bug ID yet. Will let you know 
when I get it.

I found it, and moved it into the JDK project as:
  8024836: static vs. default interface methods and inheritance - VM crash

-Alan.


Re: static vs. default interface methods and inheritance VM/javac issues

2013-09-13 Thread Joel Borggrén-Franck
Hi,

Thanks Karen and Peter.

FWIW my interpretation is that javac is doing the right thing. The bytecode 
generated is an invokeinterface DefaultStaticMethodTest$C.m(). This looks 
consistent with the other bytecodes generated for calls to methods of anonymous 
classes implementing an interface. There should be no ambiguity in the program 
since static interface methods are not inherited, so javac is right in 
accepting it.

cheers
/Joel

On Sep 12, 2013, at 8:23 PM, Karen Kinnear karen.kinn...@oracle.com wrote:

 Thank you, we really appreciate all testing.
 
 I have a fix in a prototype in the vm for this. Let me know if you want an 
 early patch. 
 Or you can just file a bug and that way you'll know when the fix is 
 officially in the tree.
 
 thanks,
 Karen
 
 On Sep 12, 2013, at 10:59 AM, Peter Levart wrote:
 
 Hi,
 
 While testing behavior of reflection on default and static interface 
 methods, using self-built JDK from latest tip of jdk8/tl, I found:
 
 The following program:
 
 public class DefaultVsStaticInterfaceMethodTest {
 public interface A {
 default void m() {
 System.out.println(A.m() called);
 }
 }
 
 public interface B {
 static void m() {
 System.out.println(B.m() called);
 }
 }
 
 public interface C extends A, B {
 }
 
 public static void main(String[] args) throws Exception {
 C c = new C() {};
 c.m();
 }
 }
 
 
 ...compiles, but gives a runtime error:
 
 Exception in thread main java.lang.AbstractMethodError: Conflicting 
 default methods: DefaultVsStaticInterfaceMethodTest$A.m 
 DefaultVsStaticInterfaceMethodTest$B.m
 at 
 DefaultVsStaticInterfaceMethodTest$1.m(DefaultVsStaticInterfaceMethodTest.java)
 at 
 DefaultVsStaticInterfaceMethodTest.main(DefaultVsStaticInterfaceMethodTest.java:28)
 
 
 A slightly modified program: C extends A, B replaced with C extends B, A:
 
 http://cr.openjdk.java.net/~plevart/jdk8-tl/StaticVsDefaultInterfaceMethods/DefaultVsStaticInterfaceMethodTest.java
 
 ...also compiles, but crashes the VM when run:
 
 #
 # A fatal error has been detected by the Java Runtime Environment:
 #
 #  SIGSEGV (0xb) at pc=0x7fd4d5020bf9, pid=9964, tid=140552419804928
 #
 # JRE version: OpenJDK Runtime Environment (8.0) (build 
 1.8.0-internal-peter_2013_09_12_16_29-b00)
 # Java VM: OpenJDK 64-Bit Server VM (25.0-b48 mixed mode linux-amd64 
 compressed oops)
 # Problematic frame:
 # j  DefaultVsStaticInterfaceMethodTest.main([Ljava/lang/String;)V+9
 #
 # Failed to write core dump. Core dumps have been disabled. To enable core 
 dumping, try ulimit -c unlimited before starting Java again
 #
 # An error report file with more information is saved as:
 # /home/peter/work/git/jdk8-tl/out/production/test/hs_err_pid9964.log
 #
 # If you would like to submit a bug report, please visit:
 #   http://bugreport.sun.com/bugreport/crash.jsp
 #
 Aborted (core dumped)
 
 
 Here's the hs_err_pid file:
 
 http://cr.openjdk.java.net/~plevart/jdk8-tl/StaticVsDefaultInterfaceMethods/hs_err_pid9964.log
  
 
 
 Regards, Peter
 
 



Re: static vs. default interface methods and inheritance VM/javac issues

2013-09-13 Thread Peter Levart

On 09/13/2013 11:05 AM, Joel Borggrén-Franck wrote:

Hi,

Thanks Karen and Peter.

FWIW my interpretation is that javac is doing the right thing. The bytecode generated is 
an invokeinterface DefaultStaticMethodTest$C.m(). This looks consistent with 
the other bytecodes generated for calls to methods of anonymous classes implementing an 
interface. There should be no ambiguity in the program since static interface methods are 
not inherited, so javac is right in accepting it.


I think that too. In that case even the AbstractMethodError is incorrect 
VM behaviour. And the order of C extends B, A vs. C extends A, B 
should not effect the behaviour.


Karen, I filed a bug, but don't have the bug ID yet. Will let you know 
when I get it.


Regards, Peter

cheers /Joel
On Sep 12, 2013, at 8:23 PM, Karen Kinnear karen.kinn...@oracle.com 
wrote:

Thank you, we really appreciate all testing.

I have a fix in a prototype in the vm for this. Let me know if you want an 
early patch.
Or you can just file a bug and that way you'll know when the fix is officially 
in the tree.

thanks,
Karen

On Sep 12, 2013, at 10:59 AM, Peter Levart wrote:


Hi,

While testing behavior of reflection on default and static interface methods, 
using self-built JDK from latest tip of jdk8/tl, I found:

The following program:

public class DefaultVsStaticInterfaceMethodTest {
 public interface A {
 default void m() {
 System.out.println(A.m() called);
 }
 }

 public interface B {
 static void m() {
 System.out.println(B.m() called);
 }
 }

 public interface C extends A, B {
 }

 public static void main(String[] args) throws Exception {
 C c = new C() {};
 c.m();
 }
}


...compiles, but gives a runtime error:

Exception in thread main java.lang.AbstractMethodError: Conflicting default 
methods: DefaultVsStaticInterfaceMethodTest$A.m DefaultVsStaticInterfaceMethodTest$B.m
 at 
DefaultVsStaticInterfaceMethodTest$1.m(DefaultVsStaticInterfaceMethodTest.java)
 at 
DefaultVsStaticInterfaceMethodTest.main(DefaultVsStaticInterfaceMethodTest.java:28)


A slightly modified program: C extends A, B replaced with C extends B, A:

http://cr.openjdk.java.net/~plevart/jdk8-tl/StaticVsDefaultInterfaceMethods/DefaultVsStaticInterfaceMethodTest.java

...also compiles, but crashes the VM when run:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x7fd4d5020bf9, pid=9964, tid=140552419804928
#
# JRE version: OpenJDK Runtime Environment (8.0) (build 
1.8.0-internal-peter_2013_09_12_16_29-b00)
# Java VM: OpenJDK 64-Bit Server VM (25.0-b48 mixed mode linux-amd64 compressed 
oops)
# Problematic frame:
# j  DefaultVsStaticInterfaceMethodTest.main([Ljava/lang/String;)V+9
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try 
ulimit -c unlimited before starting Java again
#
# An error report file with more information is saved as:
# /home/peter/work/git/jdk8-tl/out/production/test/hs_err_pid9964.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
#
Aborted (core dumped)


Here's the hs_err_pid file:

http://cr.openjdk.java.net/~plevart/jdk8-tl/StaticVsDefaultInterfaceMethods/hs_err_pid9964.log
  



Regards, Peter





static vs. default interface methods and inheritance VM/javac issues

2013-09-12 Thread Peter Levart

Hi,

While testing behavior of reflection on default and static interface 
methods, using self-built JDK from latest tip of jdk8/tl, I found:


The following program:

public class DefaultVsStaticInterfaceMethodTest {
public interface A {
default void m() {
System.out.println(A.m() called);
}
}

public interface B {
static void m() {
System.out.println(B.m() called);
}
}

public interface C extends A, B {
}

public static void main(String[] args) throws Exception {
C c = new C() {};
c.m();
}
}


...compiles, but gives a runtime error:

Exception in thread main java.lang.AbstractMethodError: Conflicting 
default methods: DefaultVsStaticInterfaceMethodTest$A.m 
DefaultVsStaticInterfaceMethodTest$B.m
at 
DefaultVsStaticInterfaceMethodTest$1.m(DefaultVsStaticInterfaceMethodTest.java)
at 
DefaultVsStaticInterfaceMethodTest.main(DefaultVsStaticInterfaceMethodTest.java:28)



A slightly modified program: C extends A, B replaced with C extends 
B, A:


http://cr.openjdk.java.net/~plevart/jdk8-tl/StaticVsDefaultInterfaceMethods/DefaultVsStaticInterfaceMethodTest.java

...also compiles, but crashes the VM when run:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x7fd4d5020bf9, pid=9964, tid=140552419804928
#
# JRE version: OpenJDK Runtime Environment (8.0) (build 
1.8.0-internal-peter_2013_09_12_16_29-b00)
# Java VM: OpenJDK 64-Bit Server VM (25.0-b48 mixed mode linux-amd64 
compressed oops)

# Problematic frame:
# j  DefaultVsStaticInterfaceMethodTest.main([Ljava/lang/String;)V+9
#
# Failed to write core dump. Core dumps have been disabled. To enable 
core dumping, try ulimit -c unlimited before starting Java again

#
# An error report file with more information is saved as:
# /home/peter/work/git/jdk8-tl/out/production/test/hs_err_pid9964.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
#
Aborted (core dumped)


Here's the hs_err_pid file:

http://cr.openjdk.java.net/~plevart/jdk8-tl/StaticVsDefaultInterfaceMethods/hs_err_pid9964.log



Regards, Peter



Re: static vs. default interface methods and inheritance VM/javac issues

2013-09-12 Thread Karen Kinnear
Thank you, we really appreciate all testing.

I have a fix in a prototype in the vm for this. Let me know if you want an 
early patch. 
Or you can just file a bug and that way you'll know when the fix is officially 
in the tree.

thanks,
Karen

On Sep 12, 2013, at 10:59 AM, Peter Levart wrote:

 Hi,
 
 While testing behavior of reflection on default and static interface methods, 
 using self-built JDK from latest tip of jdk8/tl, I found:
 
 The following program:
 
 public class DefaultVsStaticInterfaceMethodTest {
 public interface A {
 default void m() {
 System.out.println(A.m() called);
 }
 }
 
 public interface B {
 static void m() {
 System.out.println(B.m() called);
 }
 }
 
 public interface C extends A, B {
 }
 
 public static void main(String[] args) throws Exception {
 C c = new C() {};
 c.m();
 }
 }
 
 
 ...compiles, but gives a runtime error:
 
 Exception in thread main java.lang.AbstractMethodError: Conflicting default 
 methods: DefaultVsStaticInterfaceMethodTest$A.m 
 DefaultVsStaticInterfaceMethodTest$B.m
 at 
 DefaultVsStaticInterfaceMethodTest$1.m(DefaultVsStaticInterfaceMethodTest.java)
 at 
 DefaultVsStaticInterfaceMethodTest.main(DefaultVsStaticInterfaceMethodTest.java:28)
 
 
 A slightly modified program: C extends A, B replaced with C extends B, A:
 
 http://cr.openjdk.java.net/~plevart/jdk8-tl/StaticVsDefaultInterfaceMethods/DefaultVsStaticInterfaceMethodTest.java
 
 ...also compiles, but crashes the VM when run:
 
 #
 # A fatal error has been detected by the Java Runtime Environment:
 #
 #  SIGSEGV (0xb) at pc=0x7fd4d5020bf9, pid=9964, tid=140552419804928
 #
 # JRE version: OpenJDK Runtime Environment (8.0) (build 
 1.8.0-internal-peter_2013_09_12_16_29-b00)
 # Java VM: OpenJDK 64-Bit Server VM (25.0-b48 mixed mode linux-amd64 
 compressed oops)
 # Problematic frame:
 # j  DefaultVsStaticInterfaceMethodTest.main([Ljava/lang/String;)V+9
 #
 # Failed to write core dump. Core dumps have been disabled. To enable core 
 dumping, try ulimit -c unlimited before starting Java again
 #
 # An error report file with more information is saved as:
 # /home/peter/work/git/jdk8-tl/out/production/test/hs_err_pid9964.log
 #
 # If you would like to submit a bug report, please visit:
 #   http://bugreport.sun.com/bugreport/crash.jsp
 #
 Aborted (core dumped)
 
 
 Here's the hs_err_pid file:
 
 http://cr.openjdk.java.net/~plevart/jdk8-tl/StaticVsDefaultInterfaceMethods/hs_err_pid9964.log
  
 
 
 Regards, Peter