Search in sources :

Example 1 with ConstantDynamic

use of org.apache.tapestry5.internal.plastic.asm.ConstantDynamic in project tapestry-5 by apache.

the class Remapper method mapValue.

/**
 * Returns the given value, remapped with this remapper. Possible values are {@link Boolean},
 * {@link Byte}, {@link Short}, {@link Character}, {@link Integer}, {@link Long}, {@link Double},
 * {@link Float}, {@link String}, {@link Type}, {@link Handle}, {@link ConstantDynamic} or arrays
 * of primitive types .
 *
 * @param value an object. Only {@link Type}, {@link Handle} and {@link ConstantDynamic} values
 *     are remapped.
 * @return the given value, remapped with this remapper.
 */
public Object mapValue(final Object value) {
    if (value instanceof Type) {
        return mapType((Type) value);
    }
    if (value instanceof Handle) {
        Handle handle = (Handle) value;
        return new Handle(handle.getTag(), mapType(handle.getOwner()), mapMethodName(handle.getOwner(), handle.getName(), handle.getDesc()), handle.getTag() <= Opcodes.H_PUTSTATIC ? mapDesc(handle.getDesc()) : mapMethodDesc(handle.getDesc()), handle.isInterface());
    }
    if (value instanceof ConstantDynamic) {
        ConstantDynamic constantDynamic = (ConstantDynamic) value;
        int bootstrapMethodArgumentCount = constantDynamic.getBootstrapMethodArgumentCount();
        Object[] remappedBootstrapMethodArguments = new Object[bootstrapMethodArgumentCount];
        for (int i = 0; i < bootstrapMethodArgumentCount; ++i) {
            remappedBootstrapMethodArguments[i] = mapValue(constantDynamic.getBootstrapMethodArgument(i));
        }
        String descriptor = constantDynamic.getDescriptor();
        return new ConstantDynamic(mapInvokeDynamicMethodName(constantDynamic.getName(), descriptor), mapDesc(descriptor), (Handle) mapValue(constantDynamic.getBootstrapMethod()), remappedBootstrapMethodArguments);
    }
    return value;
}
Also used : Type(org.apache.tapestry5.internal.plastic.asm.Type) Handle(org.apache.tapestry5.internal.plastic.asm.Handle) ConstantDynamic(org.apache.tapestry5.internal.plastic.asm.ConstantDynamic)

Example 2 with ConstantDynamic

use of org.apache.tapestry5.internal.plastic.asm.ConstantDynamic in project tapestry-5 by apache.

the class CheckMethodAdapter method checkLdcConstant.

/**
 * Checks that the given value is a valid operand for the LDC instruction.
 *
 * @param value the value to be checked.
 */
private void checkLdcConstant(final Object value) {
    if (value instanceof Type) {
        int sort = ((Type) value).getSort();
        if (sort != Type.OBJECT && sort != Type.ARRAY && sort != Type.METHOD) {
            throw new IllegalArgumentException("Illegal LDC constant value");
        }
        if (sort != Type.METHOD && (version & 0xFFFF) < Opcodes.V1_5) {
            throw new IllegalArgumentException("ldc of a constant class requires at least version 1.5");
        }
        if (sort == Type.METHOD && (version & 0xFFFF) < Opcodes.V1_7) {
            throw new IllegalArgumentException("ldc of a method type requires at least version 1.7");
        }
    } else if (value instanceof Handle) {
        if ((version & 0xFFFF) < Opcodes.V1_7) {
            throw new IllegalArgumentException("ldc of a Handle requires at least version 1.7");
        }
        Handle handle = (Handle) value;
        int tag = handle.getTag();
        if (tag < Opcodes.H_GETFIELD || tag > Opcodes.H_INVOKEINTERFACE) {
            throw new IllegalArgumentException("invalid handle tag " + tag);
        }
        checkInternalName(this.version, handle.getOwner(), "handle owner");
        if (tag <= Opcodes.H_PUTSTATIC) {
            checkDescriptor(this.version, handle.getDesc(), false);
        } else {
            checkMethodDescriptor(this.version, handle.getDesc());
        }
        String handleName = handle.getName();
        if (!("<init>".equals(handleName) && tag == Opcodes.H_NEWINVOKESPECIAL)) {
            checkMethodIdentifier(this.version, handleName, "handle name");
        }
    } else if (value instanceof ConstantDynamic) {
        if ((version & 0xFFFF) < Opcodes.V11) {
            throw new IllegalArgumentException("ldc of a ConstantDynamic requires at least version 11");
        }
        ConstantDynamic constantDynamic = (ConstantDynamic) value;
        checkMethodIdentifier(this.version, constantDynamic.getName(), "constant dynamic name");
        checkDescriptor(this.version, constantDynamic.getDescriptor(), false);
        checkLdcConstant(constantDynamic.getBootstrapMethod());
        int bootstrapMethodArgumentCount = constantDynamic.getBootstrapMethodArgumentCount();
        for (int i = 0; i < bootstrapMethodArgumentCount; ++i) {
            checkLdcConstant(constantDynamic.getBootstrapMethodArgument(i));
        }
    } else {
        checkConstant(value);
    }
}
Also used : Type(org.apache.tapestry5.internal.plastic.asm.Type) Handle(org.apache.tapestry5.internal.plastic.asm.Handle) ConstantDynamic(org.apache.tapestry5.internal.plastic.asm.ConstantDynamic)

Example 3 with ConstantDynamic

use of org.apache.tapestry5.internal.plastic.asm.ConstantDynamic in project tapestry-5 by apache.

the class ASMifier method appendConstant.

/**
 * Appends a string representation of the given constant to {@link #stringBuilder}.
 *
 * @param value a {@link String}, {@link Type}, {@link Handle}, {@link Byte}, {@link Short},
 *     {@link Character}, {@link Integer}, {@link Float}, {@link Long} or {@link Double} object,
 *     or an array of primitive values. May be {@literal null}.
 */
protected void appendConstant(final Object value) {
    if (value == null) {
        stringBuilder.append("null");
    } else if (value instanceof String) {
        appendString(stringBuilder, (String) value);
    } else if (value instanceof Type) {
        stringBuilder.append("Type.getType(\"");
        stringBuilder.append(((Type) value).getDescriptor());
        stringBuilder.append("\")");
    } else if (value instanceof Handle) {
        stringBuilder.append("new Handle(");
        Handle handle = (Handle) value;
        stringBuilder.append("Opcodes.").append(HANDLE_TAG[handle.getTag()]).append(", \"");
        stringBuilder.append(handle.getOwner()).append(COMMA);
        stringBuilder.append(handle.getName()).append(COMMA);
        stringBuilder.append(handle.getDesc()).append("\", ");
        stringBuilder.append(handle.isInterface()).append(")");
    } else if (value instanceof ConstantDynamic) {
        stringBuilder.append("new ConstantDynamic(\"");
        ConstantDynamic constantDynamic = (ConstantDynamic) value;
        stringBuilder.append(constantDynamic.getName()).append(COMMA);
        stringBuilder.append(constantDynamic.getDescriptor()).append("\", ");
        appendConstant(constantDynamic.getBootstrapMethod());
        stringBuilder.append(NEW_OBJECT_ARRAY);
        int bootstrapMethodArgumentCount = constantDynamic.getBootstrapMethodArgumentCount();
        for (int i = 0; i < bootstrapMethodArgumentCount; ++i) {
            appendConstant(constantDynamic.getBootstrapMethodArgument(i));
            if (i != bootstrapMethodArgumentCount - 1) {
                stringBuilder.append(", ");
            }
        }
        stringBuilder.append("})");
    } else if (value instanceof Byte) {
        stringBuilder.append("new Byte((byte)").append(value).append(')');
    } else if (value instanceof Boolean) {
        stringBuilder.append(((Boolean) value).booleanValue() ? "Boolean.TRUE" : "Boolean.FALSE");
    } else if (value instanceof Short) {
        stringBuilder.append("new Short((short)").append(value).append(')');
    } else if (value instanceof Character) {
        stringBuilder.append("new Character((char)").append((int) ((Character) value).charValue()).append(')');
    } else if (value instanceof Integer) {
        stringBuilder.append("new Integer(").append(value).append(')');
    } else if (value instanceof Float) {
        stringBuilder.append("new Float(\"").append(value).append("\")");
    } else if (value instanceof Long) {
        stringBuilder.append("new Long(").append(value).append("L)");
    } else if (value instanceof Double) {
        stringBuilder.append("new Double(\"").append(value).append("\")");
    } else if (value instanceof byte[]) {
        byte[] byteArray = (byte[]) value;
        stringBuilder.append("new byte[] {");
        for (int i = 0; i < byteArray.length; i++) {
            stringBuilder.append(i == 0 ? "" : ",").append(byteArray[i]);
        }
        stringBuilder.append('}');
    } else if (value instanceof boolean[]) {
        boolean[] booleanArray = (boolean[]) value;
        stringBuilder.append("new boolean[] {");
        for (int i = 0; i < booleanArray.length; i++) {
            stringBuilder.append(i == 0 ? "" : ",").append(booleanArray[i]);
        }
        stringBuilder.append('}');
    } else if (value instanceof short[]) {
        short[] shortArray = (short[]) value;
        stringBuilder.append("new short[] {");
        for (int i = 0; i < shortArray.length; i++) {
            stringBuilder.append(i == 0 ? "" : ",").append("(short)").append(shortArray[i]);
        }
        stringBuilder.append('}');
    } else if (value instanceof char[]) {
        char[] charArray = (char[]) value;
        stringBuilder.append("new char[] {");
        for (int i = 0; i < charArray.length; i++) {
            stringBuilder.append(i == 0 ? "" : ",").append("(char)").append((int) charArray[i]);
        }
        stringBuilder.append('}');
    } else if (value instanceof int[]) {
        int[] intArray = (int[]) value;
        stringBuilder.append("new int[] {");
        for (int i = 0; i < intArray.length; i++) {
            stringBuilder.append(i == 0 ? "" : ",").append(intArray[i]);
        }
        stringBuilder.append('}');
    } else if (value instanceof long[]) {
        long[] longArray = (long[]) value;
        stringBuilder.append("new long[] {");
        for (int i = 0; i < longArray.length; i++) {
            stringBuilder.append(i == 0 ? "" : ",").append(longArray[i]).append('L');
        }
        stringBuilder.append('}');
    } else if (value instanceof float[]) {
        float[] floatArray = (float[]) value;
        stringBuilder.append("new float[] {");
        for (int i = 0; i < floatArray.length; i++) {
            stringBuilder.append(i == 0 ? "" : ",").append(floatArray[i]).append('f');
        }
        stringBuilder.append('}');
    } else if (value instanceof double[]) {
        double[] doubleArray = (double[]) value;
        stringBuilder.append("new double[] {");
        for (int i = 0; i < doubleArray.length; i++) {
            stringBuilder.append(i == 0 ? "" : ",").append(doubleArray[i]).append('d');
        }
        stringBuilder.append('}');
    }
}
Also used : Handle(org.apache.tapestry5.internal.plastic.asm.Handle) ConstantDynamic(org.apache.tapestry5.internal.plastic.asm.ConstantDynamic) Type(org.apache.tapestry5.internal.plastic.asm.Type)

Aggregations

ConstantDynamic (org.apache.tapestry5.internal.plastic.asm.ConstantDynamic)3 Handle (org.apache.tapestry5.internal.plastic.asm.Handle)3 Type (org.apache.tapestry5.internal.plastic.asm.Type)3