// verify pattern and add compiled pattern to static cache
  private void initPatterns(MethodVisitor mv) {
    mv.visitIntInsn(BIPUSH, myPatterns.size());
    mv.visitTypeInsn(ANEWARRAY, "java/util/regex/Pattern");
    mv.visitFieldInsn(PUTSTATIC, myClassName, PATTERN_CACHE_NAME, JAVA_UTIL_REGEX_PATTERN);

    int i = 0;
    for (String pattern : myPatterns) {
      // check the pattern so we can rely on the pattern being valid at runtime
      try {
        Pattern.compile(pattern);
      } catch (Exception e) {
        throw new InstrumentationException("Illegal Pattern: " + pattern, e);
      }

      mv.visitFieldInsn(GETSTATIC, myClassName, PATTERN_CACHE_NAME, JAVA_UTIL_REGEX_PATTERN);
      mv.visitIntInsn(BIPUSH, i++);
      mv.visitLdcInsn(pattern);
      mv.visitMethodInsn(
          INVOKESTATIC,
          "java/util/regex/Pattern",
          "compile",
          "(Ljava/lang/String;)Ljava/util/regex/Pattern;",
          false);
      mv.visitInsn(AASTORE);
    }
  }
Example #2
0
 /**
  * Visits an instruction with a single int operand.
  *
  * @param opcode the opcode of the instruction to be visited. This opcode is either BIPUSH, SIPUSH
  *     or NEWARRAY.
  * @param operand the operand of the instruction to be visited.<br>
  *     When opcode is BIPUSH, operand value should be between Byte.MIN_VALUE and Byte.MAX_VALUE.
  *     <br>
  *     When opcode is SIPUSH, operand value should be between Short.MIN_VALUE and Short.MAX_VALUE.
  *     <br>
  *     When opcode is NEWARRAY, operand value should be one of {@link Opcodes#T_BOOLEAN}, {@link
  *     Opcodes#T_CHAR}, {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE}, {@link Opcodes#T_BYTE},
  *     {@link Opcodes#T_SHORT}, {@link Opcodes#T_INT} or {@link Opcodes#T_LONG}.
  */
 public void visitIntInsn(int opcode, int operand) {
   if (mv != null) {
     mv.visitIntInsn(opcode, operand);
   }
 }