⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asmcontenthandler.java.old

📁 jboss规则引擎
💻 OLD
📖 第 1 页 / 共 3 页
字号:
        
      case IINC_INSN:
        getMethodVisitor().visitIincInsn(Integer.parseInt(attrs.getValue("var")), Integer.parseInt(attrs.getValue("inc")));
        break;

      case TABLESWITCH_INSN:
        vals = new HashMap();
        vals.put("min", attrs.getValue("min"));
        vals.put("max", attrs.getValue("max"));
        vals.put("dflt", attrs.getValue("dflt"));
        vals.put("labels", new ArrayList());
        push(vals);
        break;
        
      case LOOKUPSWITCH_INSN:
        vals = new HashMap();
        vals.put("dflt", attrs.getValue("dflt"));
        vals.put("labels", new ArrayList());
        vals.put("keys", new ArrayList());
        push(vals);
        break;
        
      case MULTIANEWARRAY_INSN:
        getMethodVisitor().visitMultiANewArrayInsn(attrs.getValue("desc"), Integer.parseInt(attrs.getValue("dims")));
        break;
        
    }
  }

  private void end (int element) {
    Map vals;
    int access;
    String name, desc, signature;
    Label dflt;
    Label[] lbls;
    
    switch (element >> 8) {
      case INTERFACES:
        vals = (Map)pop();
        int version = ((Integer)vals.get("version")).intValue();
        access = getAccess((String)vals.get("access"));
        name = (String)vals.get("name");
        signature = (String)vals.get("signature");
        String parent = (String)vals.get("parent");
        String[] interfaces = (String[])((List)vals.get("interfaces")).toArray(new String[0]);
        cw.visit(version, access, name, signature, parent, interfaces);
        push(cw);
        break;
        
      case ANNOTATION:
      case ANNOTATION_DEFAULT:
      case PARAMETER_ANNOTATION:
      case ANNOTATION_VALUE_ANNOTATION:
      case ANNOTATION_VALUE_ARRAY:
        ((AnnotationVisitor)pop()).visitEnd();
        break;

      case FIELD:
        ((FieldVisitor)pop()).visitEnd();
        break;
        
      case METHOD:
        ((MethodVisitor)pop()).visitEnd();
        labels = null;
        break;
        
      case EXCEPTIONS:
        vals = (Map)pop();
        access = getAccess((String)vals.get("access"));
        name = (String)vals.get("name");
        desc = (String)vals.get("desc");
        signature = (String)vals.get("signature");
        String[] exceptions = (String[])((List)vals.get("exceptions")).toArray(new String[0]);
        push(cw.visitMethod(access, name, desc, signature, exceptions));
        break;

      case TABLESWITCH_INSN:
        vals = (Map)pop();
        int min = Integer.parseInt((String)vals.get("min"));
        int max = Integer.parseInt((String)vals.get("max"));
        dflt = getLabel(vals.get("dflt"));
        lbls = (Label[])((List)vals.get("labels")).toArray(new Label[0]);
        getMethodVisitor().visitTableSwitchInsn(min, max, dflt, lbls);
        break;
        
      case LOOKUPSWITCH_INSN:
        vals = (Map)pop();
        dflt = getLabel(vals.get("dflt"));
        List keyList = (List)vals.get("keys");
        lbls = (Label[])((List)vals.get("labels")).toArray(new Label[0]);
        int[] keys = new int[keyList.size()];
        for (int i = 0; i < keys.length; i++) {
          keys[i] = Integer.parseInt((String)keyList.get(i));
        }
        getMethodVisitor().visitLookupSwitchInsn(dflt, keys, lbls);
        break;
    }
  }

  private static int hashcode (final Object o) {
    int h = o.hashCode();
    return Math.abs(h*h) % MAP.length;
  }

  private static int getAccess (final String s) {
    int access = 0;
    if (s.indexOf("public") != -1)
      access |= Opcodes.ACC_PUBLIC;
    if (s.indexOf("private") != -1)
      access |= Opcodes.ACC_PRIVATE;
    if (s.indexOf("protected") != -1)
      access |= Opcodes.ACC_PROTECTED;
    if (s.indexOf("static") != -1)
      access |= Opcodes.ACC_STATIC;
    if (s.indexOf("final") != -1)
      access |= Opcodes.ACC_FINAL;
    if (s.indexOf("super") != -1)
      access |= Opcodes.ACC_SUPER;
    if (s.indexOf("synchronized") != -1)
      access |= Opcodes.ACC_SYNCHRONIZED;
    if (s.indexOf("volatile") != -1)
      access |= Opcodes.ACC_VOLATILE;
    if (s.indexOf("bridge") != -1)
      access |= Opcodes.ACC_BRIDGE;
    if (s.indexOf("varargs") != -1)
      access |= Opcodes.ACC_VARARGS;
    if (s.indexOf("transient") != -1)
      access |= Opcodes.ACC_TRANSIENT;
    if (s.indexOf("native") != -1)
      access |= Opcodes.ACC_NATIVE;
    if (s.indexOf("interface") != -1)
      access |= Opcodes.ACC_INTERFACE;
    if (s.indexOf("abstract") != -1)
      access |= Opcodes.ACC_ABSTRACT;
    if (s.indexOf("strict") != -1)
      access |= Opcodes.ACC_STRICT;
    if (s.indexOf("synthetic") != -1)
      access |= Opcodes.ACC_SYNTHETIC;
    if (s.indexOf("annotation") != -1)
      access |= Opcodes.ACC_ANNOTATION;
    if (s.indexOf("enum") != -1)
      access |= Opcodes.ACC_ENUM;
    if (s.indexOf("deprecated") != -1)
      access |= Opcodes.ACC_DEPRECATED;
    return access;
  }

  private final static String decode (final String val) {
    StringBuffer sb = new StringBuffer(val.length());
    try {
      int n = 0;
      while (n < val.length()) {
        char c = val.charAt(n);
        if (c == '\\') {
          n++;
          c = val.charAt(n);
          if (c == '\\') {
            sb.append('\\');
          } else {
            n++; // skip 'u'
            sb.append((char)Integer.parseInt(val.substring(n, n + 4), 16));
            n += 3;
          }
        } else {
          sb.append(c);
        }
        n++;
      }
    } catch (RuntimeException ex) {
      System.err.println(val + "\n" + ex.toString());
      ex.printStackTrace();
      throw ex;
    }
    return sb.toString();
  }

  private final static Object getValue (String desc, String val) {
    Object value = null;
    if (val != null) {
      if (desc.equals("Ljava/lang/String;")) {
        value = decode(val);
      } else if ("Ljava/lang/Integer;".equals(desc) || "I".equals(desc)
          || "S".equals(desc) || "B".equals(desc) || "C".equals(desc)
          || desc.equals("Z")) {
        value = new Integer(val);
      } else if ("Ljava/lang/Short;".equals(desc)) {
        value = new Short(val);
      } else if ("Ljava/lang/Byte;".equals(desc)) {
        value = new Byte(val);
      } else if ("Ljava/lang/Character;".equals(desc)) {
        value = new Character(decode(val).charAt(0));
      } else if ("Ljava/lang/Boolean;".equals(desc)) {
        value = Boolean.valueOf(val);
        /*
         * } else if( "Ljava/lang/Integer;".equals( desc) || desc.equals( "I")) {
         * value = new Integer( val); } else if( "Ljava/lang/Character;".equals(
         * desc) || desc.equals( "C")) { value = new Character( decode(
         * val).charAt( 0)); } else if( "Ljava/lang/Short;".equals( desc) ||
         * desc.equals( "S")) { value = Short.valueOf( val); } else if(
         * "Ljava/lang/Byte;".equals( desc) || desc.equals( "B")) { value =
         * Byte.valueOf( val);
         */
      } else if ("Ljava/lang/Long;".equals(desc) || desc.equals("J")) {
        value = new Long(val);
      } else if ("Ljava/lang/Float;".equals(desc) || desc.equals("F")) {
        value = new Float(val);
      } else if ("Ljava/lang/Double;".equals(desc) || desc.equals("D")) {
        value = new Double(val);
      } else if (Type.getDescriptor(Type.class).equals(desc)) {
        value = Type.getType(val);
        /*
         * } else if( "[I".equals( desc)) { value = new int[ 0]; // TODO } else
         * if( "[C".equals( desc)) { value = new char[ 0]; // TODO } else if(
         * "[Z".equals( desc)) { value = new boolean[ 0]; // TODO } else if(
         * "[S".equals( desc)) { value = new short[ 0]; // TODO } else if(
         * "[B".equals( desc)) { value = new byte[ 0]; // TODO } else if(
         * "[J".equals( desc)) { value = new long[ 0]; // TODO } else if(
         * "[F".equals( desc)) { value = new float[ 0]; // TODO } else if(
         * "[D".equals( desc)) { value = new double[ 0]; // TODO
         */
      } else {
        throw new RuntimeException("Invalid value:" + val + " desc:" + desc);
      }
    }
    return value;
  }
  
  /**
   * Return the top object on the stack without removing it. If there are no
   * objects on the stack, return <code>null</code>.
   */
  private Object peek () {
    return stack.size() == 0 ? null : stack.get(stack.size() - 1);
  }

  private MethodVisitor getMethodVisitor () {
    return (MethodVisitor)peek();
  }

  /**
   * Pop the top object off of the stack, and return it.  If there are
   * no objects on the stack, return <code>null</code>.
   */
  private Object pop () {
    return stack.size() == 0 ? null : stack.remove(stack.size() - 1);
  }

  /**
   * Push a new object onto the top of the object stack.
   *
   * @param object The new object
   */
  private void push (Object object) {
    stack.add(object);
  }

  private Label getLabel (Object label) {
    Label lbl = (Label)labels.get(label);
    if (lbl == null) {
      lbl = new Label();
      labels.put(label, lbl);
    }
    return lbl;
  }
  
  /**
   * Returns the bytecode of the class that was build with underneath class writer.
   *
   * @return the bytecode of the class that was build with underneath class writer or
   *        null if there are no classwriter created.
   */
  public byte[] toByteArray () {
    return cw == null ? null : cw.toByteArray();
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -