code: private static String getTypeDescription(ClassNode c, boolean end) {
          StringBuilder buf = new StringBuilder();
          ClassNode d = c;
          while (true) {
              if (ClassHelper.isPrimitiveType(d.redirect())) {
                  d = d.redirect();
                  char car;
                  if (d == ClassHelper.int_TYPE) {
                      car = 'I';
                  } else if (d == ClassHelper.VOID_TYPE) {
                      car = 'V';
                  } else if (d == ClassHelper.boolean_TYPE) {
                      car = 'Z';
                  } else if (d == ClassHelper.byte_TYPE) {
                      car = 'B';
                  } else if (d == ClassHelper.char_TYPE) {
                      car = 'C';
                  } else if (d == ClassHelper.short_TYPE) {
                      car = 'S';
                  } else if (d == ClassHelper.double_TYPE) {
                      car = 'D';
                  } else if (d == ClassHelper.float_TYPE) {
                      car = 'F';
                  } else /* long */ {
                      car = 'J';
                  }
                  buf.append(car);
                  return buf.toString();
              } else if (d.isArray()) {
                  buf.append('[');
                  d = d.getComponentType();
              } else {
                  buf.append('L');
                  String name = d.getName();
                  int len = name.length();
                  for (int i = 0; i < len; ++i) {
                      char car = name.charAt(i);
                      buf.append(car == '.' ? '/' : car);
                  }
                  if (end) buf.append(';');
                  return buf.toString();
              }
          }
      }
docs: array types are special:
  eg.: String[]: classname: [Ljava/lang/String;
  int[]: [I
  
  @return the ASM type description