[jboss-jira] [JBoss JIRA] (DROOLS-8) Traits: java.lang.VerifyError when you don a trait on a JavaBean with primitive field type

Peter Hilton (JIRA) jira-events at lists.jboss.org
Thu Jan 3 11:34:08 EST 2013


     [ https://issues.jboss.org/browse/DROOLS-8?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Peter Hilton updated DROOLS-8:
------------------------------

    Description: 
I get a {{java.lang.VerifyError}} when I use {{don}} to add a trait to an instance of a fact type declared in Java with a field whose type is {{long}}:

{code}
java.lang.VerifyError: (class: org/drools/factmodel/traits/ExamMarkWrapper, method: getValue signature: ()J) Stack size too large
	at java.lang.Class.getDeclaredMethods0(Native Method)
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
	at java.lang.Class.privateGetPublicMethods(Class.java:2547)
	at java.lang.Class.getMethods(Class.java:1410)
	at org.drools.core.util.asm.ClassFieldInspector.processClassWithoutByteCode(ClassFieldInspector.java:140)
	at org.drools.core.util.asm.ClassFieldInspector.<init>(ClassFieldInspector.java:85)
	at org.drools.core.util.asm.ClassFieldInspector.<init>(ClassFieldInspector.java:66)
	at org.drools.base.ClassFieldAccessorFactory.getClassFieldReader(ClassFieldAccessorFactory.java:109)
	at org.drools.base.ClassFieldAccessorCache$CacheEntry.getReadAccessor(ClassFieldAccessorCache.java:169)
	at org.drools.base.ClassFieldAccessorCache.getReadAcessor(ClassFieldAccessorCache.java:102)
	at org.drools.base.ClassFieldAccessorStore.wire(ClassFieldAccessorStore.java:434)
	at org.drools.base.ClassFieldAccessorStore.getAccessor(ClassFieldAccessorStore.java:218)
	at org.drools.factmodel.traits.TraitFactory.buildWrapperClassDefinition(TraitFactory.java:405)
	at org.drools.factmodel.traits.TraitFactory.getCoreWrapper(TraitFactory.java:367)
	at org.drools.base.DefaultKnowledgeHelper.asTraitable(DefaultKnowledgeHelper.java:560)
	at org.drools.base.DefaultKnowledgeHelper.applyTrait(DefaultKnowledgeHelper.java:542)
	at org.drools.base.DefaultKnowledgeHelper.don(DefaultKnowledgeHelper.java:521)
	at org.drools.base.DefaultKnowledgeHelper.don(DefaultKnowledgeHelper.java:594)
	at org.drools.factmodel.traits.Rule_testTraitFieldTypePrimitive_1a1b19e093984aefbb595c793975b053.defaultConsequence(Rule_testTraitFieldTypePrimitive_1a1b19e093984aefbb595c793975b053.java:7)
	at org.drools.factmodel.traits.Rule_testTraitFieldTypePrimitive_1a1b19e093984aefbb595c793975b053DefaultConsequenceInvokerGenerated.evaluate(Unknown Source)
	at org.drools.factmodel.traits.Rule_testTraitFieldTypePrimitive_1a1b19e093984aefbb595c793975b053DefaultConsequenceInvoker.evaluate(Unknown Source)
	at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1287)
	at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1221)
	at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1456)
	at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710)
	at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674)
	at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230)
	at org.drools.factmodel.traits.TraitTest.testTraitFieldTypePrimitive(TraitTest.java:37)
{code}

This is using the following DRL and model:

{code}
package org.drools.factmodel.traits;

declare trait PassMark
end

rule "testTraitFieldTypePrimitive"
when
    $mark : ExamMark()
then
    don($mark, PassMark.class);
end
{code}

{code:java}
package org.drools.factmodel.traits;

/**
 * A student examination grade - marks out of ten, used as an example of a fact type whose field has a primitive type.
 */
public class ExamMark {

    private long value;

    public long getValue() {
        return value;
    }

    public void setValue(long value) {
        if (value < 0 || value > 10) {
            throw new IllegalArgumentException("Not a valid grade: " + value);
        }
        this.value = value;
    }
}
{code}

The test is based on {{org.drools.factmodel.traits.TraitTest}}:

{code:java}
@Test
public void testTraitFieldTypePrimitive() {
    String source = "org/drools/factmodel/traits/testTraitFieldTypePrimitive.drl";
    StatefulKnowledgeSession session = getSession( source );
    session.insert(new ExamMark());
    session.fireAllRules();
}
{code}

The workaround is to change the type of {{ExamMark.value}} from {{long}} to {{Long}}.

  was:
I get a {{java.lang.VerifyError}} when I use {{don}} to add a trait to an instance of a fact type declared in Java with a field whose type is {{long}}:

{code}
java.lang.VerifyError: (class: org/drools/factmodel/traits/ExamMarkWrapper, method: getValue signature: ()J) Stack size too large
	at java.lang.Class.getDeclaredMethods0(Native Method)
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
	at java.lang.Class.privateGetPublicMethods(Class.java:2547)
	at java.lang.Class.getMethods(Class.java:1410)
	at org.drools.core.util.asm.ClassFieldInspector.processClassWithoutByteCode(ClassFieldInspector.java:140)
	at org.drools.core.util.asm.ClassFieldInspector.<init>(ClassFieldInspector.java:85)
	at org.drools.core.util.asm.ClassFieldInspector.<init>(ClassFieldInspector.java:66)
	at org.drools.base.ClassFieldAccessorFactory.getClassFieldReader(ClassFieldAccessorFactory.java:109)
	at org.drools.base.ClassFieldAccessorCache$CacheEntry.getReadAccessor(ClassFieldAccessorCache.java:169)
	at org.drools.base.ClassFieldAccessorCache.getReadAcessor(ClassFieldAccessorCache.java:102)
	at org.drools.base.ClassFieldAccessorStore.wire(ClassFieldAccessorStore.java:434)
	at org.drools.base.ClassFieldAccessorStore.getAccessor(ClassFieldAccessorStore.java:218)
	at org.drools.factmodel.traits.TraitFactory.buildWrapperClassDefinition(TraitFactory.java:405)
	at org.drools.factmodel.traits.TraitFactory.getCoreWrapper(TraitFactory.java:367)
	at org.drools.base.DefaultKnowledgeHelper.asTraitable(DefaultKnowledgeHelper.java:560)
	at org.drools.base.DefaultKnowledgeHelper.applyTrait(DefaultKnowledgeHelper.java:542)
	at org.drools.base.DefaultKnowledgeHelper.don(DefaultKnowledgeHelper.java:521)
	at org.drools.base.DefaultKnowledgeHelper.don(DefaultKnowledgeHelper.java:594)
	at org.drools.factmodel.traits.Rule_testTraitFieldTypePrimitive_1a1b19e093984aefbb595c793975b053.defaultConsequence(Rule_testTraitFieldTypePrimitive_1a1b19e093984aefbb595c793975b053.java:7)
	at org.drools.factmodel.traits.Rule_testTraitFieldTypePrimitive_1a1b19e093984aefbb595c793975b053DefaultConsequenceInvokerGenerated.evaluate(Unknown Source)
	at org.drools.factmodel.traits.Rule_testTraitFieldTypePrimitive_1a1b19e093984aefbb595c793975b053DefaultConsequenceInvoker.evaluate(Unknown Source)
	at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1287)
	at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1221)
	at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1456)
	at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710)
	at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674)
	at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230)
	at org.drools.factmodel.traits.TraitTest.testTraitFieldTypePrimitive(TraitTest.java:37)
{code}

This is using the following DRL and model:

{code}
package org.drools.factmodel.traits;

declare trait PassMark
end

rule "testTraitFieldTypePrimitive"
when
    $mark : ExamMark()
then
    don($mark, PassMark.class);
end
{code}

{code:java}
package org.drools.factmodel.traits;

/**
 * A student examination grade - marks out of ten, used as an example of a fact type whose field has a primitive type.
 */
public class ExamMark {

    private long value;

    public long getValue() {
        return value;
    }

    public void setValue(long value) {
        if (value < 0 || value > 10) {
            throw new IllegalArgumentException("Not a valid grade: " + value);
        }
        this.value = value;
    }
}
{code}

The test is based on {{org.drools.factmodel.traits.TraitTest}}:

{code:java}
@Test
public void testTraitFieldTypePrimitive() {
    String source = "org/drools/factmodel/traits/testTraitFieldTypePrimitive.drl";
    StatefulKnowledgeSession session = getSession( source );
    session.insert(new ExamMark());
    session.fireAllRules();
}
{code}



    
> Traits: java.lang.VerifyError when you don a trait on a JavaBean with primitive field type
> ------------------------------------------------------------------------------------------
>
>                 Key: DROOLS-8
>                 URL: https://issues.jboss.org/browse/DROOLS-8
>             Project: Drools
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>         Environment: Drools 5.5.0.Final
>            Reporter: Peter Hilton
>            Assignee: Mark Proctor
>              Labels: traits
>
> I get a {{java.lang.VerifyError}} when I use {{don}} to add a trait to an instance of a fact type declared in Java with a field whose type is {{long}}:
> {code}
> java.lang.VerifyError: (class: org/drools/factmodel/traits/ExamMarkWrapper, method: getValue signature: ()J) Stack size too large
> 	at java.lang.Class.getDeclaredMethods0(Native Method)
> 	at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
> 	at java.lang.Class.privateGetPublicMethods(Class.java:2547)
> 	at java.lang.Class.getMethods(Class.java:1410)
> 	at org.drools.core.util.asm.ClassFieldInspector.processClassWithoutByteCode(ClassFieldInspector.java:140)
> 	at org.drools.core.util.asm.ClassFieldInspector.<init>(ClassFieldInspector.java:85)
> 	at org.drools.core.util.asm.ClassFieldInspector.<init>(ClassFieldInspector.java:66)
> 	at org.drools.base.ClassFieldAccessorFactory.getClassFieldReader(ClassFieldAccessorFactory.java:109)
> 	at org.drools.base.ClassFieldAccessorCache$CacheEntry.getReadAccessor(ClassFieldAccessorCache.java:169)
> 	at org.drools.base.ClassFieldAccessorCache.getReadAcessor(ClassFieldAccessorCache.java:102)
> 	at org.drools.base.ClassFieldAccessorStore.wire(ClassFieldAccessorStore.java:434)
> 	at org.drools.base.ClassFieldAccessorStore.getAccessor(ClassFieldAccessorStore.java:218)
> 	at org.drools.factmodel.traits.TraitFactory.buildWrapperClassDefinition(TraitFactory.java:405)
> 	at org.drools.factmodel.traits.TraitFactory.getCoreWrapper(TraitFactory.java:367)
> 	at org.drools.base.DefaultKnowledgeHelper.asTraitable(DefaultKnowledgeHelper.java:560)
> 	at org.drools.base.DefaultKnowledgeHelper.applyTrait(DefaultKnowledgeHelper.java:542)
> 	at org.drools.base.DefaultKnowledgeHelper.don(DefaultKnowledgeHelper.java:521)
> 	at org.drools.base.DefaultKnowledgeHelper.don(DefaultKnowledgeHelper.java:594)
> 	at org.drools.factmodel.traits.Rule_testTraitFieldTypePrimitive_1a1b19e093984aefbb595c793975b053.defaultConsequence(Rule_testTraitFieldTypePrimitive_1a1b19e093984aefbb595c793975b053.java:7)
> 	at org.drools.factmodel.traits.Rule_testTraitFieldTypePrimitive_1a1b19e093984aefbb595c793975b053DefaultConsequenceInvokerGenerated.evaluate(Unknown Source)
> 	at org.drools.factmodel.traits.Rule_testTraitFieldTypePrimitive_1a1b19e093984aefbb595c793975b053DefaultConsequenceInvoker.evaluate(Unknown Source)
> 	at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1287)
> 	at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1221)
> 	at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1456)
> 	at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710)
> 	at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674)
> 	at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230)
> 	at org.drools.factmodel.traits.TraitTest.testTraitFieldTypePrimitive(TraitTest.java:37)
> {code}
> This is using the following DRL and model:
> {code}
> package org.drools.factmodel.traits;
> declare trait PassMark
> end
> rule "testTraitFieldTypePrimitive"
> when
>     $mark : ExamMark()
> then
>     don($mark, PassMark.class);
> end
> {code}
> {code:java}
> package org.drools.factmodel.traits;
> /**
>  * A student examination grade - marks out of ten, used as an example of a fact type whose field has a primitive type.
>  */
> public class ExamMark {
>     private long value;
>     public long getValue() {
>         return value;
>     }
>     public void setValue(long value) {
>         if (value < 0 || value > 10) {
>             throw new IllegalArgumentException("Not a valid grade: " + value);
>         }
>         this.value = value;
>     }
> }
> {code}
> The test is based on {{org.drools.factmodel.traits.TraitTest}}:
> {code:java}
> @Test
> public void testTraitFieldTypePrimitive() {
>     String source = "org/drools/factmodel/traits/testTraitFieldTypePrimitive.drl";
>     StatefulKnowledgeSession session = getSession( source );
>     session.insert(new ExamMark());
>     session.fireAllRules();
> }
> {code}
> The workaround is to change the type of {{ExamMark.value}} from {{long}} to {{Long}}.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira


More information about the jboss-jira mailing list