groovy
  1. groovy
  2. GROOVY-5272

Intermittant/random incorrect resolution of sub-interface constant values

    Details

    • Type: Bug Bug
    • Status: Closed Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.8.5
    • Fix Version/s: 1.8.6, 2.0-beta-3
    • Component/s: groovy-jdk
    • Labels:
      None
    • Environment:
      Windows XP and LINUX
    • Testcase included:
      yes
    • Number of attachments :
      0

      Description

      If a constant in a sub-interface replaces/shadows a constant in a super interface (both Java), when trying to access the sub-interface's constant value from Groovy, the behaviour is intermittantly incorrect - sometimes the sub-interface's value is returned (correct) and sometimes the super interface's value is returned (incorrect).
      In Java the sub-interface's value is always returned, as expected.

      See source code below that demonstrates this: InterfaceA.java, InterfaceB.java, ShowBugGroovy.groovy, ShowBugJava.java
      If ShowBugGroovy is repeatedly run, sometimes the assertion fails, sometimes it passes (randomly?). I believe the behaviour is the same for concrete implementations of the sub-interface.

      package groovybug;
      
      public interface InterfaceA {
          String FOO="Foo A";
      }
      
      package groovybug;
      
      public interface InterfaceB extends InterfaceA {
          String FOO="Foo B";
      }
      
      package groovybug
      
      class ShowBugGroovy {
          static main(args) {
              println("Interface A: " + InterfaceA.FOO);
              println("Interface B: " + InterfaceB.FOO);
      
              // Fails randomly
              assert(InterfaceA.FOO!=InterfaceB.FOO)
          }
      }
      
      package groovybug;
      
      public class ShowBugJava {
          public static void main(String[] args) {
              System.out.println("Interface A: " + InterfaceA.FOO);
              System.out.println("Interface B: " + InterfaceB.FOO);
      
              // Always passes
              assert(!InterfaceA.FOO.equals(InterfaceB.FOO));
          }
      }
      

        Issue Links

          Activity

          Hide
          blackdrag blackdrag added a comment -

          that should be a sorting issue somewhere, where we depend on the VM sorting, which is not guaranteed.

          Show
          blackdrag blackdrag added a comment - that should be a sorting issue somewhere, where we depend on the VM sorting, which is not guaranteed.
          Hide
          CÚdric Champeau added a comment -

          Thanks for reporting this. It's also interesting to notice that Groovy will now enforce deterministic behaviour to return the same value in case of ambiguous static field, like in the example below:

          public interface InterfaceA {
              String FOO="Foo A";
          }
          public interface InterfaceB extends InterfaceA {
              String FOO="Foo B";
          }
          public interface InterfaceC extends InterfaceA {
              String FOO="Foo C";
          }
          
          class A implements InterfaceB, InterfaceC {
          }
          
          assert A.FOO == 'Foo C'
          

          https://github.com/groovy/groovy-core/commit/7928038221f88b12db6d23f2d12a53e78a3cd52d

          Show
          CÚdric Champeau added a comment - Thanks for reporting this. It's also interesting to notice that Groovy will now enforce deterministic behaviour to return the same value in case of ambiguous static field, like in the example below: public interface InterfaceA { String FOO= "Foo A" ; } public interface InterfaceB extends InterfaceA { String FOO= "Foo B" ; } public interface InterfaceC extends InterfaceA { String FOO= "Foo C" ; } class A implements InterfaceB, InterfaceC { } assert A.FOO == 'Foo C' https://github.com/groovy/groovy-core/commit/7928038221f88b12db6d23f2d12a53e78a3cd52d
          Hide
          CÚdric Champeau added a comment -

          Reopening because the fix introduces a regression in Grails.

          Show
          CÚdric Champeau added a comment - Reopening because the fix introduces a regression in Grails.

            People

            • Assignee:
              CÚdric Champeau
              Reporter:
              Stephen Summerfield
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: