You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Rodolfo Yanke (Jira)" <ji...@apache.org> on 2022/03/20 00:13:00 UTC

[jira] [Created] (GROOVY-10535) IF condition on empty Collection has different behavior than null Collection

Rodolfo Yanke created GROOVY-10535:
--------------------------------------

             Summary: IF condition on empty Collection has different behavior than null Collection
                 Key: GROOVY-10535
                 URL: https://issues.apache.org/jira/browse/GROOVY-10535
             Project: Groovy
          Issue Type: Bug
    Affects Versions: 3.0.10
         Environment: Groovy 3.0.10/OpenJDK 17.0.2 - Ubuntu 21.10
            Reporter: Rodolfo Yanke


I believe this code should print "something" but doesn't work:
{code:java}
@CompileStatic
class NotWorkingExample {
  static void main(String[] args) {
    Collection<String> values = null
    for (i in 0..<200_000) {
      printSomethingIfNotEmpty(values)
    }

    //never printed but it should
    values = ['A']
    printSomethingIfNotEmpty(values)
  }

  static printSomethingIfNotEmpty(Collection<String> values) {
    if(values) {
      println 'something'
    }
  }
}

{code}

This one does print "something" because we pass an empty collection [] instead of null:
{code:java}
@CompileStatic
class ItWorks {
  static void main(String[] args) {
      Collection<String> values = []
      for (i in 0..<200_000) {
        printSomethingIfNotEmpty(values)
      }

    //it works because [] was passed in the previous 200k calls
    values = ['A']
    printSomethingIfNotEmpty(values)
  }

  static printSomethingIfNotEmpty(Collection<String> values) {
    if(values) {
      println 'something'
    }
  }
}{code}

Some optimization is done differently when the condition is skipped too many times. Both classes should output "something" on the last method call.


Thank you for the support.



--
This message was sent by Atlassian Jira
(v8.20.1#820001)