Search in sources :

Example 36 with Label

use of org.mvel2.asm.Label in project drools by kiegroup.

the class TraitTriplePropertyWrapperClassBuilderImpl method invokeGet.

protected void invokeGet(MethodVisitor mv, String wrapperName, ClassDefinition core, String fieldName, FieldDefinition field) {
    mv.visitLdcInsn(fieldName);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(" + Type.getDescriptor(Object.class) + ")Z", false);
    Label l0 = new Label();
    mv.visitJumpInsn(IFEQ, l0);
    TraitFactoryImpl.invokeExtractor(mv, wrapperName, core, field);
    if (BuildUtils.isPrimitive(field.getTypeName())) {
        TraitFactoryImpl.valueOf(mv, field.getTypeName());
    }
    mv.visitInsn(ARETURN);
    mv.visitLabel(l0);
}
Also used : Label(org.mvel2.asm.Label)

Example 37 with Label

use of org.mvel2.asm.Label in project drools by kiegroup.

the class TraitTripleProxyClassBuilderImpl method buildKeyedHashCode.

protected void buildKeyedHashCode(ClassVisitor cw, ClassDefinition classDef, String proxyType) {
    MethodVisitor mv;
    {
        mv = cw.visitMethod(ACC_PUBLIC, "hashCode", "()I", null, null);
        mv.visitCode();
        mv.visitIntInsn(BIPUSH, 31);
        mv.visitVarInsn(ISTORE, 1);
        int x = 2;
        int y = 2;
        for (FieldDefinition field : classDef.getFieldsDefinitions()) {
            if (field.isKey()) {
                if (!BuildUtils.isPrimitive(field.getTypeName())) {
                    mv.visitIntInsn(BIPUSH, 31);
                    mv.visitVarInsn(ILOAD, 1);
                    mv.visitInsn(IMUL);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitMethodInsn(INVOKEVIRTUAL, proxyType, BuildUtils.getterName(field.getName(), field.getTypeName()), "()" + BuildUtils.getTypeDescriptor(field.getTypeName()), false);
                    Label l8 = new Label();
                    mv.visitJumpInsn(IFNULL, l8);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitMethodInsn(INVOKEVIRTUAL, proxyType, BuildUtils.getterName(field.getName(), field.getTypeName()), "()" + BuildUtils.getTypeDescriptor(field.getTypeName()), false);
                    mv.visitMethodInsn(INVOKEVIRTUAL, BuildUtils.getInternalType(field.getTypeName()), "hashCode", "()I", false);
                    Label l9 = new Label();
                    mv.visitJumpInsn(GOTO, l9);
                    mv.visitLabel(l8);
                    mv.visitInsn(ICONST_0);
                    mv.visitLabel(l9);
                    mv.visitInsn(IADD);
                    mv.visitVarInsn(ISTORE, 1);
                } else if ("double".equals(field.getTypeName())) {
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitMethodInsn(INVOKEVIRTUAL, proxyType, BuildUtils.getterName(field.getName(), field.getTypeName()), "()" + BuildUtils.getTypeDescriptor(field.getTypeName()), false);
                    mv.visitInsn(DCONST_0);
                    mv.visitInsn(DCMPL);
                    Label l2 = new Label();
                    mv.visitJumpInsn(IFEQ, l2);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitMethodInsn(INVOKEVIRTUAL, proxyType, BuildUtils.getterName(field.getName(), field.getTypeName()), "()" + BuildUtils.getTypeDescriptor(field.getTypeName()), false);
                    mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(Double.class), "doubleToLongBits", "(D)J", false);
                    Label l3 = new Label();
                    mv.visitJumpInsn(GOTO, l3);
                    mv.visitLabel(l2);
                    mv.visitInsn(LCONST_0);
                    mv.visitLabel(l3);
                    mv.visitVarInsn(LSTORE, 2);
                    mv.visitIntInsn(BIPUSH, 31);
                    mv.visitVarInsn(ILOAD, 1);
                    mv.visitInsn(IMUL);
                    mv.visitVarInsn(LLOAD, 2);
                    mv.visitVarInsn(LLOAD, 2);
                    mv.visitIntInsn(BIPUSH, 32);
                    mv.visitInsn(LUSHR);
                    mv.visitInsn(LXOR);
                    mv.visitInsn(L2I);
                    mv.visitInsn(IADD);
                    mv.visitVarInsn(ISTORE, 1);
                    x = Math.max(6, x);
                    y = Math.max(4, y);
                } else if ("boolean".equals(field.getTypeName())) {
                    mv.visitIntInsn(BIPUSH, 31);
                    mv.visitVarInsn(ILOAD, 1);
                    mv.visitInsn(IMUL);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitMethodInsn(INVOKEVIRTUAL, proxyType, BuildUtils.getterName(field.getName(), field.getTypeName()), "()" + BuildUtils.getTypeDescriptor(field.getTypeName()), false);
                    Label l4 = new Label();
                    mv.visitJumpInsn(IFEQ, l4);
                    mv.visitInsn(ICONST_1);
                    Label l5 = new Label();
                    mv.visitJumpInsn(GOTO, l5);
                    mv.visitLabel(l4);
                    mv.visitInsn(ICONST_0);
                    mv.visitLabel(l5);
                    mv.visitInsn(IADD);
                    mv.visitVarInsn(ISTORE, 1);
                } else if ("float".equals(field.getTypeName())) {
                    mv.visitIntInsn(BIPUSH, 31);
                    mv.visitVarInsn(ILOAD, 1);
                    mv.visitInsn(IMUL);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitMethodInsn(INVOKEVIRTUAL, proxyType, BuildUtils.getterName(field.getName(), field.getTypeName()), "()" + BuildUtils.getTypeDescriptor(field.getTypeName()), false);
                    mv.visitInsn(FCONST_0);
                    mv.visitInsn(FCMPL);
                    Label l6 = new Label();
                    mv.visitJumpInsn(IFEQ, l6);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitMethodInsn(INVOKEVIRTUAL, proxyType, BuildUtils.getterName(field.getName(), field.getTypeName()), "()" + BuildUtils.getTypeDescriptor(field.getTypeName()), false);
                    mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(Float.class), "floatToIntBits", "(F)I", false);
                    Label l7 = new Label();
                    mv.visitJumpInsn(GOTO, l7);
                    mv.visitLabel(l6);
                    mv.visitInsn(ICONST_0);
                    mv.visitLabel(l7);
                    mv.visitInsn(IADD);
                    mv.visitVarInsn(ISTORE, 1);
                    x = Math.max(3, x);
                } else if ("long".equals(field.getTypeName())) {
                    mv.visitIntInsn(BIPUSH, 31);
                    mv.visitVarInsn(ILOAD, 1);
                    mv.visitInsn(IMUL);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitMethodInsn(INVOKEVIRTUAL, proxyType, BuildUtils.getterName(field.getName(), field.getTypeName()), "()" + BuildUtils.getTypeDescriptor(field.getTypeName()), false);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitMethodInsn(INVOKEVIRTUAL, proxyType, BuildUtils.getterName(field.getName(), field.getTypeName()), "()" + BuildUtils.getTypeDescriptor(field.getTypeName()), false);
                    mv.visitIntInsn(BIPUSH, 32);
                    mv.visitInsn(LUSHR);
                    mv.visitInsn(LXOR);
                    mv.visitInsn(L2I);
                    mv.visitInsn(IADD);
                    mv.visitVarInsn(ISTORE, 1);
                    x = Math.max(6, x);
                } else {
                    mv.visitIntInsn(BIPUSH, 31);
                    mv.visitVarInsn(ILOAD, 1);
                    mv.visitInsn(IMUL);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitMethodInsn(INVOKEVIRTUAL, proxyType, BuildUtils.getterName(field.getName(), field.getTypeName()), "()" + BuildUtils.getTypeDescriptor(field.getTypeName()), false);
                    mv.visitInsn(IADD);
                    mv.visitVarInsn(ISTORE, 1);
                }
            }
        }
        mv.visitVarInsn(ILOAD, 1);
        mv.visitInsn(IRETURN);
        mv.visitMaxs(0, 0);
        mv.visitEnd();
    }
}
Also used : FieldDefinition(org.drools.core.factmodel.FieldDefinition) Label(org.mvel2.asm.Label) MethodVisitor(org.mvel2.asm.MethodVisitor)

Example 38 with Label

use of org.mvel2.asm.Label in project drools by kiegroup.

the class AbstractPropertyWrapperClassBuilderImpl method invokeContainsKey.

protected void invokeContainsKey(MethodVisitor mv, String fieldName) {
    mv.visitLdcInsn(fieldName);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(String.class), "equals", "(" + Type.getDescriptor(Object.class) + ")Z", false);
    Label l0 = new Label();
    mv.visitJumpInsn(IFEQ, l0);
    mv.visitInsn(ICONST_1);
    mv.visitInsn(IRETURN);
    mv.visitLabel(l0);
}
Also used : Label(org.mvel2.asm.Label)

Example 39 with Label

use of org.mvel2.asm.Label in project drools by kiegroup.

the class AbstractPropertyWrapperClassBuilderImpl method registerLogicalField.

protected void registerLogicalField(MethodVisitor mv, String internalWrapper, FieldDefinition field, ClassDefinition core) {
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, internalWrapper, "object", Type.getDescriptor(core.getDefinedClass()));
    mv.visitTypeInsn(CHECKCAST, Type.getInternalName(TraitableBean.class));
    mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(TraitableBean.class), "_getFieldTMS", Type.getMethodDescriptor(Type.getType(TraitFieldTMS.class)), true);
    mv.visitVarInsn(ASTORE, 1);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitLdcInsn(field.resolveAlias());
    mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(TraitFieldTMS.class), "isManagingField", Type.getMethodDescriptor(Type.BOOLEAN_TYPE, Type.getType(String.class)), true);
    Label l1 = new Label();
    mv.visitJumpInsn(IFNE, l1);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitLdcInsn(Type.getType(BuildUtils.getTypeDescriptor(core.getClassName())));
    mv.visitLdcInsn(field.resolveAlias());
    mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(TraitFieldTMS.class), "registerField", Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(Class.class), Type.getType(String.class)), true);
    mv.visitLabel(l1);
}
Also used : TraitFieldTMS(org.drools.core.factmodel.traits.TraitFieldTMS) Label(org.mvel2.asm.Label) TraitableBean(org.drools.core.factmodel.traits.TraitableBean)

Example 40 with Label

use of org.mvel2.asm.Label in project drools by kiegroup.

the class AbstractPropertyWrapperClassBuilderImpl method extractAndTestNotNull.

protected void extractAndTestNotNull(MethodVisitor mv, String wrapperName, ClassDefinition core, FieldDefinition field) {
    TraitFactoryImpl.invokeExtractor(mv, wrapperName, core, field);
    Label l1 = new Label();
    mv.visitJumpInsn(IFNONNULL, l1);
    mv.visitInsn(ICONST_1);
    mv.visitInsn(IRETURN);
    mv.visitLabel(l1);
}
Also used : Label(org.mvel2.asm.Label)

Aggregations

Label (org.mvel2.asm.Label)97 MethodVisitor (org.mvel2.asm.MethodVisitor)49 FieldDefinition (org.drools.core.factmodel.FieldDefinition)24 Map (java.util.Map)18 Type (org.mvel2.asm.Type)12 IOException (java.io.IOException)10 BitSet (java.util.BitSet)8 FieldVisitor (org.mvel2.asm.FieldVisitor)8 Method (java.lang.reflect.Method)7 CompiledInvoker (org.drools.core.spi.CompiledInvoker)7 TraitableBean (org.drools.core.factmodel.traits.TraitableBean)5 ObjectInput (java.io.ObjectInput)4 ObjectOutput (java.io.ObjectOutput)4 Collection (java.util.Collection)4 Thing (org.drools.core.factmodel.traits.Thing)4 Declaration (org.drools.core.rule.Declaration)4 ClassGenerator (org.drools.core.rule.builder.dialect.asm.ClassGenerator)4 ClassWriter (org.mvel2.asm.ClassWriter)4 ArrayList (java.util.ArrayList)3 HashMap (java.util.HashMap)3