Example usage for org.objectweb.asm.commons GeneratorAdapter pop2

List of usage examples for org.objectweb.asm.commons GeneratorAdapter pop2

Introduction

In this page you can find the example usage for org.objectweb.asm.commons GeneratorAdapter pop2.

Prototype

public void pop2() 

Source Link

Document

Generates a POP2 instruction.

Usage

From source file:io.datakernel.codegen.ExpressionSequence.java

License:Apache License

@Override
public Type load(Context ctx) {
    GeneratorAdapter g = ctx.getGeneratorAdapter();

    Type type = VOID_TYPE;/*from   w  w w.  j  av a 2s  .  c om*/
    for (int i = 0; i < expressions.size(); i++) {
        Expression expression = expressions.get(i);
        type = expression.load(ctx);
        if (i != expressions.size() - 1) {
            if (type.getSize() == 1)
                g.pop();
            if (type.getSize() == 2)
                g.pop2();
        }
    }

    return type;
}

From source file:io.datakernel.codegen.Utils.java

License:Apache License

public static void cast(Context ctx, Type type, Type targetType) {
    GeneratorAdapter g = ctx.getGeneratorAdapter();

    if (type.equals(targetType)) {
        return;//from  w  w  w .j a  v  a 2  s . c om
    }

    if (targetType == Type.VOID_TYPE) {
        if (type.getSize() == 1)
            g.pop();
        if (type.getSize() == 2)
            g.pop2();
        return;
    }

    if (type == Type.VOID_TYPE) {
        throw new RuntimeException(format("Can't cast VOID_TYPE to %s. %s", targetType.getClassName(),
                exceptionInGeneratedClass(ctx)));
    }

    if (type.equals(ctx.getThisType())) {
        final Class<?> javaType = getJavaType(ctx.getClassLoader(), targetType);
        for (Class<?> aClass : ctx.getOtherClasses()) {
            if (javaType.isAssignableFrom(aClass)) {
                return;
            }
        }
        throw new RuntimeException(format("Can't cast self %s to %s, %s", type.getClassName(),
                targetType.getClassName(), exceptionInGeneratedClass(ctx)));
    }

    if (!type.equals(ctx.getThisType()) && !targetType.equals(ctx.getThisType())
            && getJavaType(ctx.getClassLoader(), targetType)
                    .isAssignableFrom(getJavaType(ctx.getClassLoader(), type))) {
        return;
    }

    if (targetType.equals(getType(Object.class)) && isPrimitiveType(type)) {
        g.box(type);
        g.cast(wrap(type), getType(Object.class));
        return;
    }

    if ((isPrimitiveType(type) || isWrapperType(type))
            && (isPrimitiveType(targetType) || isWrapperType(targetType))) {

        Type targetTypePrimitive = isPrimitiveType(targetType) ? targetType : unwrap(targetType);

        if (isWrapperType(type)) {
            g.invokeVirtual(type, primitiveValueMethod(targetType));
            return;
        }

        assert isPrimitiveType(type);

        if (type != targetTypePrimitive) {
            g.cast(type, targetTypePrimitive);
        }

        if (isWrapperType(targetType)) {
            g.valueOf(targetTypePrimitive);
        }

        return;
    }

    g.checkCast(targetType);
}

From source file:io.datakernel.codegen.VarField.java

License:Apache License

public static void setField(Context ctx, Type ownerType, String field, Type valueType, boolean isStatic) {
    GeneratorAdapter g = ctx.getGeneratorAdapter();

    Class<?> valueClass = getJavaType(ctx.getClassLoader(), valueType);

    if (ctx.getThisType().equals(ownerType)) {
        Map<String, Class<?>> fieldNameToClass = (isStatic) ? ctx.getStaticFields() : ctx.getThisFields();
        Class<?> fieldClass = fieldNameToClass.get(field);
        if (fieldClass == null) {
            throw new RuntimeException(format("No field \"%s\" in generated class %s. %s", field,
                    ctx.getThisType().getClassName(), exceptionInGeneratedClass(ctx)));
        }//from w  w w  .j  a va 2s .com

        Type fieldType = getType(fieldClass);
        cast(ctx, valueType, fieldType);
        if (isStatic)
            g.putStatic(ownerType, field, fieldType);
        else
            g.putField(ownerType, field, fieldType);

        return;
    }

    Class<?> argumentClass = getJavaType(ctx.getClassLoader(), ownerType);

    try {
        java.lang.reflect.Field javaField = argumentClass.getField(field);
        if (Modifier.isPublic(javaField.getModifiers())
                && Modifier.isStatic(javaField.getModifiers()) == isStatic) {
            Type fieldType = getType(javaField.getType());
            cast(ctx, valueType, fieldType);
            if (Modifier.isStatic(javaField.getModifiers()))
                g.putStatic(ownerType, field, fieldType);
            else
                g.putField(ownerType, field, fieldType);
            return;
        }
    } catch (NoSuchFieldException ignored) {
    }

    java.lang.reflect.Method javaSetter = tryFindSetter(argumentClass, field, valueClass);

    if (javaSetter == null && Primitives.isWrapperType(valueClass)) {
        javaSetter = tryFindSetter(argumentClass, field, Primitives.unwrap(valueClass));
    }

    if (javaSetter == null && valueClass.isPrimitive()) {
        javaSetter = tryFindSetter(argumentClass, field, Primitives.wrap(valueClass));
    }

    if (javaSetter == null) {
        javaSetter = tryFindSetter(argumentClass, field);
    }

    if (javaSetter != null) {
        Type fieldType = getType(javaSetter.getParameterTypes()[0]);
        cast(ctx, valueType, fieldType);
        invokeVirtualOrInterface(g, argumentClass, getMethod(javaSetter));
        Type returnType = getType(javaSetter.getReturnType());
        if (returnType.getSize() == 1) {
            g.pop();
        } else if (returnType.getSize() == 2) {
            g.pop2();
        }
        return;
    }

    throw new RuntimeException(format("No public field or setter for class %s for field \"%s\". %s ",
            ownerType.getClassName(), field, exceptionInGeneratedClass(ctx)));
}

From source file:lucee.transformer.bytecode.util.ASMUtil.java

License:Open Source License

/**
 * @param adapter/*from ww w.  ja v a2  s .co  m*/
 * @param expr
 * @param mode
 */
public static void pop(GeneratorAdapter adapter, Expression expr, int mode) {
    if (mode == Expression.MODE_VALUE && (expr instanceof ExprDouble))
        adapter.pop2();
    else
        adapter.pop();
}

From source file:lucee.transformer.bytecode.util.ASMUtil.java

License:Open Source License

public static void pop(GeneratorAdapter adapter, Type type) {
    if (type.equals(Types.DOUBLE_VALUE))
        adapter.pop2();
    else if (type.equals(Types.VOID))
        ;//from   w w  w . j  a v a 2 s .co  m
    else
        adapter.pop();
}