[jboss-jira] [JBoss JIRA] (DROOLS-858) NoSuchMethodError on JIT Compilation of non-primitive comparison

Sascha Dirbach (JIRA) issues at jboss.org
Fri Jul 24 05:41:03 EDT 2015


Sascha Dirbach created DROOLS-858:
-------------------------------------

             Summary: NoSuchMethodError on JIT Compilation of non-primitive comparison
                 Key: DROOLS-858
                 URL: https://issues.jboss.org/browse/DROOLS-858
             Project: Drools
          Issue Type: Feature Request
          Components: core engine
    Affects Versions: 6.3.0.Beta2
            Reporter: Sascha Dirbach
            Assignee: Mario Fusco


A LHS like this:

{code}
$map : Map()
$simpleTestObject : NonStringConstructorClass (something=="simpleTestObject")
Entry (
  getKey() == $simpleTestObject
) from $map.entrySet()
{code}

fails at runtime with a NoSuchMethodError, when incompatible objects are compared (Map with object vs. custom Object) and the execution is jitted.

The generated evaluation method looks like this:
{code}
  public boolean evaluate(InternalFactHandle paramInternalFactHandle, InternalWorkingMemory paramInternalWorkingMemory, LeftTuple paramLeftTuple)
  {
    LeftTuple localLeftTuple = paramLeftTuple;
    NonStringConstructorClass localNonStringConstructorClass2 = (NonStringConstructorClass)this.declarations[0].getValue(paramInternalWorkingMemory, localLeftTuple.getHandle().getObject());
    Object localObject = ((Map.Entry)paramInternalFactHandle.getObject()).getKey();
    NonStringConstructorClass localNonStringConstructorClass1 = localNonStringConstructorClass2;
    if (localObject != null)
    {
      if ((localObject instanceof NonStringConstructorClass)) {
        localObject = (NonStringConstructorClass)localObject;
      } else {
        localObject = new NonStringConstructorClass(localObject.toString());
      }
    }
    else
    {
      tmpTernaryOp = (localNonStringConstructorClass1 != null ? 0 : true;
      break label123;
    }
    label123:
    return localNonStringConstructorClass1 == null ? false : ((NonStringConstructorClass)localObject).equals(localNonStringConstructorClass1);
  }
}
{code}

It seem that, a fallback for primitive types was included, by calling the constructor of an object with the object's toString() output:
{code}
localObject = new NonStringConstructorClass(localObject.toString());
{code}

At runtime this fails, if no such constructor exists.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)


More information about the jboss-jira mailing list