[jboss-jira] [JBoss JIRA] (DROOLS-3794) Inconsistent null check between JITed and non-JITed "contains"/"memberOf" condition

Max Zerzouri (Jira) issues at jboss.org
Mon Mar 25 20:24:00 EDT 2019


Max Zerzouri created DROOLS-3794:
------------------------------------

             Summary: Inconsistent null check between JITed and non-JITed "contains"/"memberOf" condition
                 Key: DROOLS-3794
                 URL: https://issues.jboss.org/browse/DROOLS-3794
             Project: Drools
          Issue Type: Bug
    Affects Versions: 7.19.0.Final
            Reporter: Max Zerzouri
            Assignee: Mario Fusco
         Attachments: DroolsTest.java, drl.drl

A condition such as {{list contains item}} or {{item memberOf list}} seems to correspond to {{EvaluatorHelper.contains(list, item)}}, but when this has been compiled through {{ASMConditionEvaluatorJitter}}, the condition includes the additional constraint, {{item != null}}. This differs to the non-JITed condition, which does not require {{item}} to be non-null.

Attached an example {{.drl}} file as an example case, and a simple runner. Running {{java DroolsTest 14}} triggers the issue for me (resulting in an infinite loop in this case), but since the recompilation is asynchronous, it might require a larger number.

Decompiled {{ConditionalEvaluator}} for the test case below:
{code:java}
import droolstest.Bar;
import droolstest.Foo;
import java.util.List;
import org.drools.core.common.InternalFactHandle;
import org.drools.core.common.InternalWorkingMemory;
import org.drools.core.rule.Declaration;
import org.drools.core.rule.constraint.ConditionEvaluator;
import org.drools.core.rule.constraint.EvaluatorHelper;
import org.drools.core.spi.Tuple;

public class ConditionEvaluator4471f59df9b54235ba1be708b5c480da
implements ConditionEvaluator {
    private static final String EXPRESSION = "!( foo.barNames contains name )";
    private final Declaration[] declarations;

    public boolean evaluate(InternalFactHandle internalFactHandle, InternalWorkingMemory internalWorkingMemory, Tuple tuple) {
        Tuple tuple2 = tuple;
        Foo foo = (Foo)this.declarations[0].getValue(internalWorkingMemory, tuple2.getFactHandle().getObject());
        List list = foo.getBarNames();
        String string = ((Bar)internalFactHandle.getObject()).getName();
        return !(list == null ? false : (string == null ? false : EvaluatorHelper.contains((Object)list, (Object)string)));
    }

    public ConditionEvaluator4471f59df9b54235ba1be708b5c480da(Declaration[] arrdeclaration) {
        this.declarations = arrdeclaration;
    }
}
{code}



--
This message was sent by Atlassian Jira
(v7.12.1#712002)


More information about the jboss-jira mailing list