Search in sources :

Example 91 with Label

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

the class AbstractPropertyWrapperClassBuilderImpl method invokePut.

protected void invokePut(MethodVisitor mv, String wrapperName, ClassDefinition core, String fieldName, FieldDefinition field) {
    mv.visitLdcInsn(fieldName);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(String.class), "equals", "(" + Type.getDescriptor(Object.class) + ")Z", false);
    Label l1 = new Label();
    mv.visitJumpInsn(IFEQ, l1);
    mv.visitVarInsn(ALOAD, 2);
    if (BuildUtils.isPrimitive(field.getTypeName())) {
        TraitFactoryImpl.primitiveValue(mv, field.getTypeName());
        mv.visitVarInsn(AsmUtil.storeType(field.getTypeName()), 3);
        TraitFactoryImpl.invokeInjector(mv, wrapperName, core, field, false, 3);
    } else {
        TraitFactoryImpl.invokeInjector(mv, wrapperName, core, field, false, 2);
    }
    mv.visitVarInsn(ALOAD, 2);
    mv.visitInsn(ARETURN);
    mv.visitLabel(l1);
}
Also used : Label(org.mvel2.asm.Label)

Example 92 with Label

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

the class TraitMapPropertyWrapperClassBuilderImpl 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, Type.getInternalName(String.class), "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 93 with Label

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

the class TraitMapPropertyWrapperClassBuilderImpl method initSoftFields.

protected void initSoftFields(MethodVisitor mv, ClassDefinition trait, ClassDefinition core, String internalWrapper, BitSet mask, int varNum) {
    int j = 0;
    for (FieldDefinition field : trait.getFieldsDefinitions()) {
        boolean isSoftField = TraitRegistryImpl.isSoftField(field, j++, mask);
        if (isSoftField) {
            mv.visitVarInsn(ALOAD, varNum);
            mv.visitLdcInsn(field.resolveAlias());
            mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(Map.class), "containsKey", Type.getMethodDescriptor(Type.getType(boolean.class), Type.getType(Object.class)), true);
            Label l0 = new Label();
            mv.visitJumpInsn(IFNE, l0);
            mv.visitVarInsn(ALOAD, varNum);
            mv.visitLdcInsn(field.resolveAlias());
            mv.visitInsn(AsmUtil.zero(field.getTypeName()));
            if (BuildUtils.isPrimitive(field.getTypeName())) {
                TraitFactoryImpl.valueOf(mv, field.getTypeName());
            }
            mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(Map.class), "put", Type.getMethodDescriptor(Type.getType(Object.class), Type.getType(Object.class), Type.getType(Object.class)), true);
            mv.visitInsn(POP);
            if (core.isFullTraiting()) {
                registerLogicalField(mv, internalWrapper, field, core);
            }
            mv.visitLabel(l0);
        }
    }
}
Also used : FieldDefinition(org.drools.core.factmodel.FieldDefinition) Label(org.mvel2.asm.Label) Map(java.util.Map)

Example 94 with Label

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

the class TraitMapProxyClassBuilderImpl 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()), "()" + Type.getDescriptor(field.getType()), false);
                    Label l8 = new Label();
                    mv.visitJumpInsn(IFNULL, l8);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitMethodInsn(INVOKEVIRTUAL, proxyType, BuildUtils.getterName(field.getName(), field.getTypeName()), "()" + Type.getDescriptor(field.getType()), 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()), "()" + Type.getDescriptor(field.getType()), 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()), "()" + Type.getDescriptor(field.getType()), 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()), "()" + Type.getDescriptor(field.getType()), 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()), "()" + Type.getDescriptor(field.getType()), 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()), "()" + Type.getDescriptor(field.getType()), 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()), "()" + Type.getDescriptor(field.getType()), false);
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitMethodInsn(INVOKEVIRTUAL, proxyType, BuildUtils.getterName(field.getName(), field.getTypeName()), "()" + Type.getDescriptor(field.getType()), 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()), "()" + Type.getDescriptor(field.getType()), 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 95 with Label

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

the class TraitTripleProxyClassBuilderImpl method buildSoftGetter.

protected void buildSoftGetter(ClassVisitor cw, FieldDefinition field, String proxy, String getterName, int accessMode) {
    String type = field.getTypeName();
    MethodVisitor mv = cw.visitMethod(accessMode, getterName, "()" + Type.getDescriptor(field.getType()), null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, BuildUtils.getInternalType(proxy), "store", Type.getDescriptor(TripleStore.class));
    mv.visitVarInsn(ALOAD, 0);
    mv.visitLdcInsn(field.resolveAlias());
    mv.visitMethodInsn(INVOKEVIRTUAL, BuildUtils.getInternalType(proxy), "propertyKey", "(" + Type.getDescriptor(String.class) + ")" + Type.getDescriptor(Triple.class), false);
    mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(TripleStore.class), "get", "(" + Type.getDescriptor(Triple.class) + ")" + Type.getDescriptor(Triple.class), false);
    String actualType = BuildUtils.isPrimitive(type) ? BuildUtils.box(type) : type;
    mv.visitVarInsn(ASTORE, 1);
    mv.visitVarInsn(ALOAD, 1);
    Label l0 = new Label();
    mv.visitJumpInsn(IFNULL, l0);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(Triple.class), "getValue", "()" + Type.getDescriptor(Object.class), true);
    mv.visitVarInsn(ASTORE, 2);
    mv.visitVarInsn(ALOAD, 2);
    mv.visitTypeInsn(INSTANCEOF, BuildUtils.getInternalType(actualType));
    Label l1 = new Label();
    mv.visitJumpInsn(IFEQ, l1);
    mv.visitVarInsn(ALOAD, 2);
    mv.visitTypeInsn(CHECKCAST, BuildUtils.getInternalType(actualType));
    if (BuildUtils.isPrimitive(type)) {
        TraitFactoryImpl.primitiveValue(mv, type);
        mv.visitInsn(AsmUtil.returnType(type));
        mv.visitLabel(l1);
        mv.visitInsn(AsmUtil.zero(type));
        mv.visitInsn(AsmUtil.returnType(type));
        mv.visitLabel(l0);
        mv.visitInsn(AsmUtil.zero(type));
        mv.visitInsn(AsmUtil.returnType(type));
    } else {
        mv.visitInsn(ARETURN);
        mv.visitLabel(l1);
        mv.visitInsn(ACONST_NULL);
        mv.visitInsn(ARETURN);
        mv.visitLabel(l0);
        mv.visitInsn(ACONST_NULL);
        mv.visitInsn(ARETURN);
    }
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : Label(org.mvel2.asm.Label) MethodVisitor(org.mvel2.asm.MethodVisitor)

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