Java Code Examples for org.objectweb.asm.Opcodes#V1_5

The following examples show how to use org.objectweb.asm.Opcodes#V1_5 . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: CheckMethodAdapter.java    From Concurnas with MIT License 6 votes vote down vote up
/**
 * Checks that the given string is a valid Java identifier.
 *
 * @param version the class version.
 * @param name the string to be checked.
 * @param message the message to use in case of error.
 */
static void checkMethodIdentifier(final int version, final String name, final String message) {
  if (name == null || name.length() == 0) {
    throw new IllegalArgumentException(INVALID + message + MUST_NOT_BE_NULL_OR_EMPTY);
  }
  if ((version & 0xFFFF) >= Opcodes.V1_5) {
    for (int i = 0; i < name.length(); i = name.offsetByCodePoints(i, 1)) {
      if (".;[/<>".indexOf(name.codePointAt(i)) != -1) {
        throw new IllegalArgumentException(
            INVALID + message + " (must be a valid unqualified name): " + name);
      }
    }
    return;
  }
  for (int i = 0; i < name.length(); i = name.offsetByCodePoints(i, 1)) {
    if (i == 0
        ? !Character.isJavaIdentifierStart(name.codePointAt(i))
        : !Character.isJavaIdentifierPart(name.codePointAt(i))) {
      throw new IllegalArgumentException(
          INVALID
              + message
              + " (must be a '<init>', '<clinit>' or a valid Java identifier): "
              + name);
    }
  }
}
 
Example 2
Source File: SourceVersionUtils.java    From buck with Apache License 2.0 6 votes vote down vote up
/** Gets the class file version corresponding to the given source version constant. */
public static int sourceVersionToClassFileVersion(SourceVersion version) {
  switch (version) {
    case RELEASE_0:
      return Opcodes.V1_1; // JVMS8 4.1: 1.0 and 1.1 both support version 45.3 (Opcodes.V1_1)
    case RELEASE_1:
      return Opcodes.V1_1;
    case RELEASE_2:
      return Opcodes.V1_2;
    case RELEASE_3:
      return Opcodes.V1_3;
    case RELEASE_4:
      return Opcodes.V1_4;
    case RELEASE_5:
      return Opcodes.V1_5;
    case RELEASE_6:
      return Opcodes.V1_6;
    case RELEASE_7:
      return Opcodes.V1_7;
    case RELEASE_8:
      return Opcodes.V1_8;
    default:
      throw new IllegalArgumentException(String.format("Unexpected source version: %s", version));
  }
}
 
Example 3
Source File: CheckMethodAdapter.java    From JByteMod-Beta with GNU General Public License v2.0 6 votes vote down vote up
void checkLDCConstant(final Object cst) {
  if (cst instanceof Type) {
    int s = ((Type) cst).getSort();
    if (s != Type.OBJECT && s != Type.ARRAY && s != Type.METHOD) {
      throw new IllegalArgumentException("Illegal LDC constant value");
    }
    if (s != Type.METHOD && (version & 0xFFFF) < Opcodes.V1_5) {
      throw new IllegalArgumentException("ldc of a constant class requires at least version 1.5");
    }
    if (s == Type.METHOD && (version & 0xFFFF) < Opcodes.V1_7) {
      throw new IllegalArgumentException("ldc of a method type requires at least version 1.7");
    }
  } else if (cst instanceof Handle) {
    if ((version & 0xFFFF) < Opcodes.V1_7) {
      throw new IllegalArgumentException("ldc of a handle requires at least version 1.7");
    }
    int tag = ((Handle) cst).getTag();
    if (tag < Opcodes.H_GETFIELD || tag > Opcodes.H_INVOKEINTERFACE) {
      throw new IllegalArgumentException("invalid handle tag " + tag);
    }
  } else {
    checkConstant(cst);
  }
}
 
Example 4
Source File: CheckMethodAdapter.java    From JReFrameworker with MIT License 6 votes vote down vote up
/**
 * Checks that the given string is a valid Java identifier.
 *
 * @param version the class version.
 * @param name the string to be checked.
 * @param message the message to use in case of error.
 */
static void checkMethodIdentifier(final int version, final String name, final String message) {
  if (name == null || name.length() == 0) {
    throw new IllegalArgumentException(INVALID + message + MUST_NOT_BE_NULL_OR_EMPTY);
  }
  if ((version & 0xFFFF) >= Opcodes.V1_5) {
    for (int i = 0; i < name.length(); i = name.offsetByCodePoints(i, 1)) {
      if (".;[/<>".indexOf(name.codePointAt(i)) != -1) {
        throw new IllegalArgumentException(
            INVALID + message + " (must be a valid unqualified name): " + name);
      }
    }
    return;
  }
  for (int i = 0; i < name.length(); i = name.offsetByCodePoints(i, 1)) {
    if (i == 0
        ? !Character.isJavaIdentifierStart(name.codePointAt(i))
        : !Character.isJavaIdentifierPart(name.codePointAt(i))) {
      throw new IllegalArgumentException(
          INVALID
              + message
              + " (must be a '<init>', '<clinit>' or a valid Java identifier): "
              + name);
    }
  }
}
 
Example 5
Source File: CheckMethodAdapter.java    From JByteMod-Beta with GNU General Public License v2.0 6 votes vote down vote up
/**
 * Checks that the given string is a valid Java identifier.
 * 
 * @param version
 *          the class version.
 * @param name
 *          the string to be checked.
 * @param msg
 *          a message to be used in case of error.
 */
static void checkMethodIdentifier(int version, final String name, final String msg) {
  if (name == null || name.length() == 0) {
    throw new IllegalArgumentException("Invalid " + msg + " (must not be null or empty)");
  }
  if ((version & 0xFFFF) >= Opcodes.V1_5) {
    for (int i = 0; i < name.length(); ++i) {
      if (".;[/<>".indexOf(name.charAt(i)) != -1) {
        throw new IllegalArgumentException("Invalid " + msg + " (must be a valid unqualified name): " + name);
      }
    }
    return;
  }
  if (!Character.isJavaIdentifierStart(name.charAt(0))) {
    throw new IllegalArgumentException("Invalid " + msg + " (must be a '<init>', '<clinit>' or a valid Java identifier): " + name);
  }
  for (int i = 1; i < name.length(); ++i) {
    if (!Character.isJavaIdentifierPart(name.charAt(i))) {
      throw new IllegalArgumentException("Invalid " + msg + " (must be '<init>' or '<clinit>' or a valid Java identifier): " + name);
    }
  }
}
 
Example 6
Source File: CheckMethodAdapter.java    From JReFrameworker with MIT License 6 votes vote down vote up
/**
 * Checks that the given string is a valid Java identifier.
 *
 * @param version the class version.
 * @param name the string to be checked.
 * @param message the message to use in case of error.
 */
static void checkMethodIdentifier(final int version, final String name, final String message) {
  if (name == null || name.length() == 0) {
    throw new IllegalArgumentException(INVALID + message + MUST_NOT_BE_NULL_OR_EMPTY);
  }
  if ((version & 0xFFFF) >= Opcodes.V1_5) {
    for (int i = 0; i < name.length(); i = name.offsetByCodePoints(i, 1)) {
      if (".;[/<>".indexOf(name.codePointAt(i)) != -1) {
        throw new IllegalArgumentException(
            INVALID + message + " (must be a valid unqualified name): " + name);
      }
    }
    return;
  }
  for (int i = 0; i < name.length(); i = name.offsetByCodePoints(i, 1)) {
    if (i == 0
        ? !Character.isJavaIdentifierStart(name.codePointAt(i))
        : !Character.isJavaIdentifierPart(name.codePointAt(i))) {
      throw new IllegalArgumentException(
          INVALID
              + message
              + " (must be a '<init>', '<clinit>' or a valid Java identifier): "
              + name);
    }
  }
}
 
Example 7
Source File: CheckMethodAdapter.java    From Concurnas with MIT License 5 votes vote down vote up
/**
 * Checks that the given substring is a valid Java identifier.
 *
 * @param version the class version.
 * @param name the string to be checked.
 * @param startPos the index of the first character of the identifier (inclusive).
 * @param endPos the index of the last character of the identifier (exclusive). -1 is equivalent
 *     to {@code name.length()} if name is not {@literal null}.
 * @param message the message to use in case of error.
 */
static void checkIdentifier(
    final int version,
    final String name,
    final int startPos,
    final int endPos,
    final String message) {
  if (name == null || (endPos == -1 ? name.length() <= startPos : endPos <= startPos)) {
    throw new IllegalArgumentException(INVALID + message + MUST_NOT_BE_NULL_OR_EMPTY);
  }
  int max = endPos == -1 ? name.length() : endPos;
  if ((version & 0xFFFF) >= Opcodes.V1_5) {
    for (int i = startPos; i < max; i = name.offsetByCodePoints(i, 1)) {
      if (".;[/".indexOf(name.codePointAt(i)) != -1) {
        throw new IllegalArgumentException(
            INVALID + message + " (must not contain . ; [ or /): " + name);
      }
    }
    return;
  }
  for (int i = startPos; i < max; i = name.offsetByCodePoints(i, 1)) {
    if (i == startPos
        ? !Character.isJavaIdentifierStart(name.codePointAt(i))
        : !Character.isJavaIdentifierPart(name.codePointAt(i))) {
      throw new IllegalArgumentException(
          INVALID + message + " (must be a valid Java identifier): " + name);
    }
  }
}
 
Example 8
Source File: SourceVersionUtils.java    From buck with Apache License 2.0 5 votes vote down vote up
/** Gets the class file version corresponding to the given source version constant. */
public static int sourceVersionToClassFileVersion(SourceVersion version) {
  switch (version) {
    case RELEASE_0:
      return Opcodes.V1_1; // JVMS8 4.1: 1.0 and 1.1 both support version 45.3 (Opcodes.V1_1)
    case RELEASE_1:
      return Opcodes.V1_1;
    case RELEASE_2:
      return Opcodes.V1_2;
    case RELEASE_3:
      return Opcodes.V1_3;
    case RELEASE_4:
      return Opcodes.V1_4;
    case RELEASE_5:
      return Opcodes.V1_5;
    case RELEASE_6:
      return Opcodes.V1_6;
    case RELEASE_7:
      return Opcodes.V1_7;
    case RELEASE_8:
      return Opcodes.V1_8;
    case RELEASE_9:
      return Opcodes.V9;
    case RELEASE_10:
      return Opcodes.V10;
    case RELEASE_11:
      return Opcodes.V11;
    default:
      throw new IllegalArgumentException(String.format("Unexpected source version: %s", version));
  }
}
 
Example 9
Source File: TreeInstructions.java    From instrumentation with Apache License 2.0 5 votes vote down vote up
public static InsnList getClassConstantReference(Type type, int majorVersion) {
    InsnList il = new InsnList();

    if (majorVersion >= Opcodes.V1_5) {
        il.add(new LdcInsnNode(type));

    } else {
        String fullyQualifiedName = type.getInternalName().replaceAll("/", ".");
        il.add(new LdcInsnNode(fullyQualifiedName));
        il.add(new MethodInsnNode(Opcodes.INVOKESTATIC,
                "java/lang/Class", "forName",
                "(Ljava/lang/String;)Ljava/lang/Class;", false));
    }
    return il;
}
 
Example 10
Source File: CheckMethodAdapter.java    From JReFrameworker with MIT License 5 votes vote down vote up
/**
 * Checks that the given substring is a valid Java identifier.
 *
 * @param version the class version.
 * @param name the string to be checked.
 * @param startPos the index of the first character of the identifier (inclusive).
 * @param endPos the index of the last character of the identifier (exclusive). -1 is equivalent
 *     to {@code name.length()} if name is not {@literal null}.
 * @param message the message to use in case of error.
 */
static void checkIdentifier(
    final int version,
    final String name,
    final int startPos,
    final int endPos,
    final String message) {
  if (name == null || (endPos == -1 ? name.length() <= startPos : endPos <= startPos)) {
    throw new IllegalArgumentException(INVALID + message + MUST_NOT_BE_NULL_OR_EMPTY);
  }
  int max = endPos == -1 ? name.length() : endPos;
  if ((version & 0xFFFF) >= Opcodes.V1_5) {
    for (int i = startPos; i < max; i = name.offsetByCodePoints(i, 1)) {
      if (".;[/".indexOf(name.codePointAt(i)) != -1) {
        throw new IllegalArgumentException(
            INVALID + message + " (must not contain . ; [ or /): " + name);
      }
    }
    return;
  }
  for (int i = startPos; i < max; i = name.offsetByCodePoints(i, 1)) {
    if (i == startPos
        ? !Character.isJavaIdentifierStart(name.codePointAt(i))
        : !Character.isJavaIdentifierPart(name.codePointAt(i))) {
      throw new IllegalArgumentException(
          INVALID + message + " (must be a valid Java identifier): " + name);
    }
  }
}
 
Example 11
Source File: CheckMethodAdapter.java    From JReFrameworker with MIT License 5 votes vote down vote up
/**
 * Checks that the given substring is a valid Java identifier.
 *
 * @param version the class version.
 * @param name the string to be checked.
 * @param startPos the index of the first character of the identifier (inclusive).
 * @param endPos the index of the last character of the identifier (exclusive). -1 is equivalent
 *     to {@code name.length()} if name is not {@literal null}.
 * @param message the message to use in case of error.
 */
static void checkIdentifier(
    final int version,
    final String name,
    final int startPos,
    final int endPos,
    final String message) {
  if (name == null || (endPos == -1 ? name.length() <= startPos : endPos <= startPos)) {
    throw new IllegalArgumentException(INVALID + message + MUST_NOT_BE_NULL_OR_EMPTY);
  }
  int max = endPos == -1 ? name.length() : endPos;
  if ((version & 0xFFFF) >= Opcodes.V1_5) {
    for (int i = startPos; i < max; i = name.offsetByCodePoints(i, 1)) {
      if (".;[/".indexOf(name.codePointAt(i)) != -1) {
        throw new IllegalArgumentException(
            INVALID + message + " (must not contain . ; [ or /): " + name);
      }
    }
    return;
  }
  for (int i = startPos; i < max; i = name.offsetByCodePoints(i, 1)) {
    if (i == startPos
        ? !Character.isJavaIdentifierStart(name.codePointAt(i))
        : !Character.isJavaIdentifierPart(name.codePointAt(i))) {
      throw new IllegalArgumentException(
          INVALID + message + " (must be a valid Java identifier): " + name);
    }
  }
}
 
Example 12
Source File: CheckMethodAdapter.java    From JByteMod-Beta with GNU General Public License v2.0 5 votes vote down vote up
/**
 * Checks that the given string is a valid unqualified name.
 * 
 * @param version
 *          the class version.
 * @param name
 *          the string to be checked.
 * @param msg
 *          a message to be used in case of error.
 */
static void checkUnqualifiedName(int version, final String name, final String msg) {
  if ((version & 0xFFFF) < Opcodes.V1_5) {
    checkIdentifier(name, msg);
  } else {
    for (int i = 0; i < name.length(); ++i) {
      if (".;[/".indexOf(name.charAt(i)) != -1) {
        throw new IllegalArgumentException("Invalid " + msg + " (must be a valid unqualified name): " + name);
      }
    }
  }
}
 
Example 13
Source File: CheckMethodAdapter.java    From JReFrameworker with MIT License 4 votes vote down vote up
/**
 * 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);
  }
}
 
Example 14
Source File: CheckMethodAdapter.java    From JReFrameworker with MIT License 4 votes vote down vote up
/**
 * 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);
  }
}
 
Example 15
Source File: AbstractASMBackend.java    From JAADAS with GNU General Public License v3.0 4 votes vote down vote up
/**
 * Creates a new ASM backend
 * @param sc The SootClass that is to be converted into bytecode
 * @param javaVersion A particular Java version enforced by the user, may be 0 for automatic detection, must not be lower than necessary for all features used
 */
public AbstractASMBackend(SootClass sc, int javaVersion) {
	this.sc = sc;
	
	int minVersion = getMinJavaVersion(sc);		

	if (javaVersion == 0)
		javaVersion = Options.java_version_default;
	
	if(javaVersion != Options.java_version_default && javaVersion < minVersion){
		throw new IllegalArgumentException("Enforced Java version " + translateJavaVersion(javaVersion) + " too low to support required features (" + translateJavaVersion(minVersion) + " required)");
	}
	
	javaVersion = Math.max(javaVersion, minVersion);

	switch (javaVersion) {
	case Options.java_version_1_1:
		this.javaVersion = Opcodes.V1_1;
		break;
	case Options.java_version_1_2:
		this.javaVersion = Opcodes.V1_2;
		break;
	case Options.java_version_1_3:
		this.javaVersion = Opcodes.V1_3;
		break;
	case Options.java_version_1_4:
		this.javaVersion = Opcodes.V1_4;
		break;
	case Options.java_version_1_5:
		this.javaVersion = Opcodes.V1_5;
		break;
	case Options.java_version_1_6:
		this.javaVersion = Opcodes.V1_6;
		break;
	case Options.java_version_1_7:
		this.javaVersion = Opcodes.V1_7;
		break;
	case Options.java_version_1_8:
		this.javaVersion = Opcodes.V1_8;
		break;
	}
}
 
Example 16
Source File: ASMifier.java    From JByteMod-Beta with GNU General Public License v2.0 4 votes vote down vote up
@Override
public void visit(final int version, final int access, final String name, final String signature, final String superName,
    final String[] interfaces) {
  String simpleName;
  if (name == null) {
    simpleName = "module-info";
  } else {
    int n = name.lastIndexOf('/');
    if (n == -1) {
      simpleName = name;
    } else {
      text.add("package asm." + name.substring(0, n).replace('/', '.') + ";\n");
      simpleName = name.substring(n + 1).replace('-', '_');
    }
  }
  text.add("import java.util.*;\n");
  text.add("import org.objectweb.asm.*;\n");
  text.add("public class " + simpleName + "Dump implements Opcodes {\n\n");
  text.add("public static byte[] dump () throws Exception {\n\n");
  text.add("ClassWriter cw = new ClassWriter(0);\n");
  text.add("FieldVisitor fv;\n");
  text.add("MethodVisitor mv;\n");
  text.add("AnnotationVisitor av0;\n\n");

  buf.setLength(0);
  buf.append("cw.visit(");
  switch (version) {
  case Opcodes.V1_1:
    buf.append("V1_1");
    break;
  case Opcodes.V1_2:
    buf.append("V1_2");
    break;
  case Opcodes.V1_3:
    buf.append("V1_3");
    break;
  case Opcodes.V1_4:
    buf.append("V1_4");
    break;
  case Opcodes.V1_5:
    buf.append("V1_5");
    break;
  case Opcodes.V1_6:
    buf.append("V1_6");
    break;
  case Opcodes.V1_7:
    buf.append("V1_7");
    break;
  case Opcodes.V1_8:
    buf.append("V1_8");
    break;
  case Opcodes.V9:
    buf.append("V9");
    break;
  default:
    buf.append(version);
    break;
  }
  buf.append(", ");
  appendAccess(access | ACCESS_CLASS);
  buf.append(", ");
  appendConstant(name);
  buf.append(", ");
  appendConstant(signature);
  buf.append(", ");
  appendConstant(superName);
  buf.append(", ");
  if (interfaces != null && interfaces.length > 0) {
    buf.append("new String[] {");
    for (int i = 0; i < interfaces.length; ++i) {
      buf.append(i == 0 ? " " : ", ");
      appendConstant(interfaces[i]);
    }
    buf.append(" }");
  } else {
    buf.append("null");
  }
  buf.append(");\n\n");
  text.add(buf.toString());
}
 
Example 17
Source File: CheckMethodAdapter.java    From Concurnas with MIT License 4 votes vote down vote up
/**
 * 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);
  }
}
 
Example 18
Source File: ClassWrapper.java    From radon with GNU General Public License v3.0 2 votes vote down vote up
/**
 * See https://docs.oracle.com/javase/specs/jvms/se12/html/jvms-4.html#jvms-4.9.1
 *
 * @return true if the wrapped {@link ClassNode} supports JSR instructions.
 */
public boolean allowsJSR() {
    return classNode.version <= Opcodes.V1_5 || classNode.version == Opcodes.V1_1;
}