Search in sources :

Example 76 with Label

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

the class AbstractProxyClassBuilderImpl method logicalSetter.

protected void logicalSetter(MethodVisitor mv, FieldDefinition field, String masterName, ClassDefinition core) {
    String fieldType = field.getTypeName();
    int reg = 1 + BuildUtils.sizeOf(fieldType);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, BuildUtils.getInternalType(masterName), "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, reg);
    mv.visitVarInsn(ALOAD, reg);
    mv.visitLdcInsn(field.resolveAlias());
    if (BuildUtils.isPrimitive(fieldType)) {
        mv.visitVarInsn(BuildUtils.varType(fieldType), 1);
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, BuildUtils.getInternalType(BuildUtils.box(fieldType)), "valueOf", Type.getMethodDescriptor(Type.getType(BuildUtils.getTypeDescriptor(BuildUtils.box(fieldType))), Type.getType(BuildUtils.getTypeDescriptor(fieldType))), false);
    } else {
        mv.visitVarInsn(ALOAD, 1);
    }
    if (BuildUtils.isPrimitive(fieldType)) {
        // mv.visitFieldInsn( GETSTATIC, BuildUtils.getInternalType( BuildUtils.box( fieldType ) ), "TYPE", Type.getDescriptor( Class.class ) );
        mv.visitLdcInsn(Type.getType(BuildUtils.getTypeDescriptor(BuildUtils.box(field.getTypeName()))));
    } else {
        mv.visitLdcInsn(Type.getType(Type.getDescriptor(field.getType())));
    }
    mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(TraitFieldTMS.class), "set", Type.getMethodDescriptor(Type.getType(Object.class), Type.getType(String.class), Type.getType(Object.class), Type.getType(Class.class)), true);
    mv.visitVarInsn(ASTORE, 1);
    mv.visitVarInsn(ALOAD, 1);
    if (BuildUtils.isPrimitive(fieldType)) {
        Label l0 = new Label();
        mv.visitJumpInsn(IFNULL, l0);
        mv.visitVarInsn(ALOAD, 1);
        Label l1 = new Label();
        mv.visitJumpInsn(GOTO, l1);
        mv.visitLabel(l0);
        mv.visitInsn(BuildUtils.zero(fieldType));
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, BuildUtils.getInternalType(BuildUtils.box(fieldType)), "valueOf", Type.getMethodDescriptor(Type.getType(BuildUtils.getTypeDescriptor(BuildUtils.box(fieldType))), Type.getType(BuildUtils.getTypeDescriptor(fieldType))), false);
        mv.visitLabel(l1);
        mv.visitTypeInsn(CHECKCAST, BuildUtils.getInternalType(BuildUtils.box(fieldType)));
        mv.visitMethodInsn(INVOKEVIRTUAL, BuildUtils.getInternalType(BuildUtils.box(fieldType)), BuildUtils.numericMorph(BuildUtils.box(fieldType)), Type.getMethodDescriptor(Type.getType(field.getType())), false);
        mv.visitVarInsn(BuildUtils.storeType(fieldType), 1);
    }
}
Also used : Label(org.mvel2.asm.Label)

Example 77 with Label

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

the class AbstractProxyClassBuilderImpl method helpSet.

public void helpSet(ClassDefinition core, FieldDefinition field, MethodVisitor mv, String masterName) {
    // The trait field update will be done by the core setter. However, types may mismatch here
    FieldDefinition hardField = core.getFieldByAlias(field.resolveAlias());
    boolean isHardField = field.getTypeName().equals(hardField.getTypeName());
    if (!field.getType().isPrimitive() && !isHardField) {
        boolean isCoreTrait = hardField.getType().getAnnotation(Trait.class) != null;
        boolean isTraitTrait = field.getType().getAnnotation(Trait.class) != null;
        Label l0 = new Label();
        mv.visitVarInsn(ALOAD, 1);
        mv.visitJumpInsn(IFNULL, l0);
        if (isCoreTrait && !isTraitTrait) {
            mv.visitVarInsn(ALOAD, 1);
            mv.visitTypeInsn(CHECKCAST, Type.getInternalName(TraitableBean.class));
            mv.visitLdcInsn(hardField.getTypeName());
            mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(TraitableBean.class), "getTrait", Type.getMethodDescriptor(Type.getType(Thing.class), Type.getType(String.class)), true);
            mv.visitVarInsn(ASTORE, 1);
        } else if (!isCoreTrait && isTraitTrait) {
            mv.visitVarInsn(ALOAD, 1);
            mv.visitTypeInsn(CHECKCAST, Type.getInternalName(TraitProxy.class));
            mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(TraitProxy.class), "getObject", Type.getMethodDescriptor(Type.getType(TraitableBean.class)), false);
            mv.visitVarInsn(ASTORE, 1);
        } else if (isCoreTrait) {
            mv.visitVarInsn(ALOAD, 1);
            mv.visitTypeInsn(CHECKCAST, Type.getInternalName(TraitProxy.class));
            mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(TraitProxy.class), "getObject", Type.getMethodDescriptor(Type.getType(TraitableBean.class)), false);
            mv.visitTypeInsn(CHECKCAST, Type.getInternalName(TraitableBean.class));
            mv.visitLdcInsn(hardField.getTypeName());
            mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(TraitableBean.class), "getTrait", Type.getMethodDescriptor(Type.getType(Thing.class), Type.getType(String.class)), true);
            mv.visitVarInsn(ASTORE, 1);
        } else {
            // handled by normal inheritance, exceptions should have been thrown
            if (!hardField.getType().isAssignableFrom(field.getType())) {
                mv.visitInsn(RETURN);
            }
        }
        Label l1 = new Label();
        mv.visitJumpInsn(GOTO, l1);
        mv.visitLabel(l0);
        mv.visitInsn(ACONST_NULL);
        mv.visitVarInsn(ASTORE, 1);
        mv.visitLabel(l1);
    } else if (field.getType().isPrimitive()) {
        if (!hardField.getType().equals(field.getType())) {
            mv.visitInsn(RETURN);
        }
    }
    if (isHardField && CoreWrapper.class.isAssignableFrom(core.getDefinedClass())) {
        logicalSetter(mv, field, masterName, core);
    }
}
Also used : FieldDefinition(org.drools.core.factmodel.FieldDefinition) Label(org.mvel2.asm.Label)

Example 78 with Label

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

the class AbstractProxyClassBuilderImpl method buildLogicalGetter.

protected void buildLogicalGetter(ClassVisitor cw, FieldDefinition field, String proxy, ClassDefinition core) {
    String fieldName = field.getName();
    String fieldType = field.getTypeName();
    String getter = BuildUtils.getterName(fieldName, fieldType);
    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, getter, "()" + BuildUtils.getTypeDescriptor(fieldType), null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, BuildUtils.getInternalType(proxy), "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.visitLdcInsn(field.resolveAlias());
    if (BuildUtils.isPrimitive(fieldType)) {
        // mv.visitFieldInsn( GETSTATIC, BuildUtils.getInternalType( BuildUtils.box( fieldType ) ), "TYPE", Type.getDescriptor( Class.class ) );
        mv.visitLdcInsn(Type.getType(BuildUtils.getTypeDescriptor(BuildUtils.box(field.getTypeName()))));
    } else {
        mv.visitLdcInsn(Type.getType(Type.getDescriptor(field.getType())));
    }
    mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(TraitFieldTMS.class), "get", Type.getMethodDescriptor(Type.getType(Object.class), Type.getType(String.class), Type.getType(Class.class)), true);
    mv.visitVarInsn(ASTORE, 1);
    mv.visitVarInsn(ALOAD, 1);
    if (BuildUtils.isPrimitive(fieldType)) {
        Label l0 = new Label();
        mv.visitJumpInsn(IFNULL, l0);
        mv.visitVarInsn(ALOAD, 1);
        Label l1 = new Label();
        mv.visitJumpInsn(GOTO, l1);
        mv.visitLabel(l0);
        mv.visitInsn(BuildUtils.zero(fieldType));
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, BuildUtils.getInternalType(BuildUtils.box(fieldType)), "valueOf", Type.getMethodDescriptor(Type.getType(BuildUtils.getTypeDescriptor(BuildUtils.box(fieldType))), Type.getType(BuildUtils.getTypeDescriptor(fieldType))), false);
        mv.visitLabel(l1);
        mv.visitTypeInsn(CHECKCAST, BuildUtils.getInternalType(BuildUtils.box(fieldType)));
        mv.visitMethodInsn(INVOKEVIRTUAL, BuildUtils.getInternalType(BuildUtils.box(fieldType)), BuildUtils.numericMorph(BuildUtils.box(fieldType)), Type.getMethodDescriptor(Type.getType(field.getType())), false);
        mv.visitInsn(BuildUtils.returnType(fieldType));
    } else {
        mv.visitTypeInsn(CHECKCAST, BuildUtils.getInternalType(fieldType));
        mv.visitInsn(ARETURN);
    }
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : Label(org.mvel2.asm.Label) MethodVisitor(org.mvel2.asm.MethodVisitor)

Example 79 with Label

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

the class ASMEvalStubBuilder method createStubEval.

private void createStubEval(final ClassGenerator generator, final InvokerDataProvider data, final Map vars) {
    generator.setInterfaces(EvalStub.class, CompiledInvoker.class).addField(ACC_PRIVATE + ACC_VOLATILE, "eval", EvalExpression.class);
    generator.addMethod(ACC_PUBLIC, "createContext", generator.methodDescr(Object.class), new ClassGenerator.MethodBody() {

        public void body(MethodVisitor mv) {
            mv.visitInsn(ACONST_NULL);
            mv.visitInsn(ARETURN);
        }
    }).addMethod(ACC_PUBLIC, "clone", generator.methodDescr(EvalExpression.class), new ClassGenerator.MethodBody() {

        public void body(MethodVisitor mv) {
            String internalClassName = generator.getClassName().replace('.', '/');
            mv.visitTypeInsn(NEW, internalClassName);
            mv.visitInsn(DUP);
            mv.visitMethodInsn(INVOKESPECIAL, internalClassName, "<init>", "()V", false);
            mv.visitInsn(ARETURN);
        }
    }).addMethod(ACC_PUBLIC, "replaceDeclaration", generator.methodDescr(null, Declaration.class, Declaration.class)).addMethod(ACC_PUBLIC, "evaluate", generator.methodDescr(Boolean.TYPE, Tuple.class, Declaration[].class, WorkingMemory.class, Object.class), new String[] { "java/lang/Exception" }, new ClassGenerator.MethodBody() {

        public void body(MethodVisitor mv) {
            Label syncStart = new Label();
            Label syncEnd = new Label();
            Label l1 = new Label();
            Label l2 = new Label();
            mv.visitTryCatchBlock(syncStart, l1, l2, null);
            Label l3 = new Label();
            mv.visitTryCatchBlock(l2, l3, l2, null);
            getFieldFromThis("eval", EvalExpression.class);
            mv.visitJumpInsn(IFNONNULL, syncEnd);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitInsn(DUP);
            mv.visitVarInsn(ASTORE, 5);
            // synchronized(this) {
            mv.visitInsn(MONITORENTER);
            mv.visitLabel(syncStart);
            getFieldFromThis("eval", EvalExpression.class);
            // if (eval == null) ...
            Label ifNotInitialized = new Label();
            mv.visitJumpInsn(IFNONNULL, ifNotInitialized);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitVarInsn(ALOAD, 3);
            // ... EvalGenerator.generate(this, tuple, declarations, workingMemory)
            invokeStatic(EvalGenerator.class, "generate", null, EvalStub.class, Tuple.class, Declaration[].class, WorkingMemory.class);
            mv.visitLabel(ifNotInitialized);
            mv.visitVarInsn(ALOAD, 5);
            mv.visitInsn(MONITOREXIT);
            mv.visitLabel(l1);
            mv.visitJumpInsn(GOTO, syncEnd);
            mv.visitLabel(l2);
            mv.visitVarInsn(ASTORE, 6);
            mv.visitVarInsn(ALOAD, 5);
            mv.visitInsn(MONITOREXIT);
            mv.visitLabel(l3);
            mv.visitVarInsn(ALOAD, 6);
            mv.visitInsn(ATHROW);
            mv.visitLabel(syncEnd);
            // } end of synchronized
            getFieldFromThis("eval", EvalExpression.class);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitVarInsn(ALOAD, 3);
            mv.visitVarInsn(ALOAD, 4);
            invokeInterface(EvalExpression.class, "evaluate", Boolean.TYPE, Tuple.class, Declaration[].class, WorkingMemory.class, Object.class);
            mv.visitInsn(IRETURN);
        }
    }).addMethod(ACC_PUBLIC, "setEval", generator.methodDescr(null, EvalExpression.class), new ClassGenerator.MethodBody() {

        public void body(MethodVisitor mv) {
            putFieldInThisFromRegistry("eval", EvalExpression.class, 1);
            mv.visitInsn(RETURN);
        }
    });
}
Also used : EvalExpression(org.drools.core.spi.EvalExpression) ClassGenerator(org.drools.core.rule.builder.dialect.asm.ClassGenerator) EvalStub(org.drools.core.rule.builder.dialect.asm.EvalStub) Label(org.mvel2.asm.Label) Declaration(org.drools.core.rule.Declaration) CompiledInvoker(org.drools.core.spi.CompiledInvoker) MethodVisitor(org.mvel2.asm.MethodVisitor)

Example 80 with Label

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

the class ClassFieldAccessorFactory method buildGetMethod.

/**
 * Creates the proxy reader method for the given method
 */
protected static void buildGetMethod(final Class<?> originalClass, final String className, final Class<?> superClass, final Method getterMethod, final ClassWriter cw) {
    final Class<?> fieldType = getterMethod.getReturnType();
    Method overridingMethod;
    try {
        overridingMethod = superClass.getMethod(getOverridingGetMethodName(fieldType), InternalWorkingMemory.class, Object.class);
    } catch (final Exception e) {
        throw new RuntimeException("This is a bug. Please report back to JBoss Rules team.", e);
    }
    final MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, overridingMethod.getName(), Type.getMethodDescriptor(overridingMethod), null, null);
    mv.visitCode();
    final Label l0 = new Label();
    mv.visitLabel(l0);
    mv.visitVarInsn(Opcodes.ALOAD, 2);
    mv.visitTypeInsn(Opcodes.CHECKCAST, Type.getInternalName(originalClass));
    if (originalClass.isInterface()) {
        mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, Type.getInternalName(originalClass), getterMethod.getName(), Type.getMethodDescriptor(getterMethod));
    } else {
        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type.getInternalName(originalClass), getterMethod.getName(), Type.getMethodDescriptor(getterMethod));
    }
    mv.visitInsn(Type.getType(fieldType).getOpcode(Opcodes.IRETURN));
    final Label l1 = new Label();
    mv.visitLabel(l1);
    mv.visitLocalVariable("this", "L" + className + ";", null, l0, l1, 0);
    mv.visitLocalVariable("workingMemory", Type.getDescriptor(InternalWorkingMemory.class), null, l0, l1, 1);
    mv.visitLocalVariable("object", Type.getDescriptor(Object.class), null, l0, l1, 2);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) Label(org.mvel2.asm.Label) Method(java.lang.reflect.Method) IOException(java.io.IOException) 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