@Override
 public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Label[] labels) {
   checkEndCode();
   checkStartCode();
   checkLabel(dflt, false, "default label");
   checkNonDebugLabel(dflt);
   if (keys == null || labels == null || keys.length != labels.length) {
     throw new IllegalArgumentException("There must be the same number of keys and labels");
   }
   for (int i = 0; i < labels.length; ++i) {
     checkLabel(labels[i], false, "label at index " + i);
     checkNonDebugLabel(labels[i]);
   }
   super.visitLookupSwitchInsn(dflt, keys, labels);
   usedLabels.add(dflt);
   for (int i = 0; i < labels.length; ++i) {
     usedLabels.add(labels[i]);
   }
   ++insnCount;
 }
 public void visitLookupSwitchInsn(Label label, int[] ints, Label[] labels) {
   System.out.println("visitLookupSwitchInsn(" + label + ", " + ints + ", " + labels + ")");
   methodVisitor.visitLookupSwitchInsn(label, ints, labels);
 }
Example #3
0
 public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
   visitor.visitLookupSwitchInsn(dflt, keys, labels);
 }
Example #4
0
 @Override
 public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
   mtd.addSwitch(dflt, keys, labels);
   super.visitLookupSwitchInsn(dflt, keys, labels);
 }
  private void buildObjectDispatchMethods(ClassWriter cw) {
    String classname = "SVDBPersistenceDelegate";
    String full_classname = transform_cls(fTargetPkg) + "/" + classname;
    int idx;

    Label labels[] = new Label[fClassList.size()];
    int indexes[] = new int[fClassList.size()];
    Label dflt, endcase;

    for (int i = 0; i < fClassList.size(); i++) {
      indexes[i] = i;
    }

    // writeItem Dispatch method
    MethodVisitor mv =
        cw.visitMethod(
            ACC_PUBLIC,
            "writeObject",
            "(L" + getClassName(Class.class) + ";" + "L" + getClassName(Object.class) + ";)V",
            null,
            new String[] {fDBWriteException});
    for (int i = 0; i < fClassList.size(); i++) {
      labels[i] = new Label();
    }
    dflt = new Label();
    endcase = new Label();

    // Find the object index
    mv.visitVarInsn(ALOAD, THIS_VAR);
    mv.visitFieldInsn(
        GETFIELD, fBaseClass, "fObjectTypeList", "L" + getClassName(List.class) + ";");

    // Class parameter
    // fObjectList field
    mv.visitVarInsn(ALOAD, 1); // cls parameter
    mv.visitMethodInsn(
        INVOKEINTERFACE,
        getClassName(List.class),
        "indexOf",
        "(L" + getClassName(Object.class) + ";)I");
    // Index now on the stack
    mv.visitLookupSwitchInsn(dflt, indexes, labels);
    idx = 0;
    for (Class c : fClassList) {
      mv.visitLabel(labels[idx]);

      mv.visitVarInsn(ALOAD, THIS_VAR);
      mv.visitVarInsn(ALOAD, 2); // object
      mv.visitTypeInsn(CHECKCAST, getClassName(c));
      mv.visitMethodInsn(
          INVOKESPECIAL,
          full_classname,
          "write" + getClassLeafName(c),
          "(L" + getClassName(c) + ";)V");
      mv.visitJumpInsn(GOTO, endcase);
      idx++;
    }
    mv.visitLabel(dflt);
    mv.visitVarInsn(ALOAD, THIS_VAR);
    mv.visitVarInsn(ALOAD, 2); // object
    mv.visitMethodInsn(
        INVOKESPECIAL, full_classname, "writeObjectErr", "(L" + getClassName(Object.class) + ";)V");

    mv.visitLabel(endcase);
    mv.visitInsn(RETURN);
    mv.visitMaxs(16, 16);
    mv.visitEnd();

    // readItem dispatch method
    mv =
        cw.visitMethod(
            ACC_PUBLIC,
            "readObject",
            "(L"
                + getClassName(ISVDBChildItem.class)
                + ";"
                + "L"
                + getClassName(Class.class)
                + ";"
                + "L"
                + getClassName(Object.class)
                + ";)V",
            null,
            new String[] {fDBWriteException});
    for (int i = 0; i < fClassList.size(); i++) {
      labels[i] = new Label();
    }
    dflt = new Label();
    endcase = new Label();

    // Find the object index
    mv.visitVarInsn(ALOAD, THIS_VAR);
    mv.visitFieldInsn(
        GETFIELD, fBaseClass, "fObjectTypeList", "L" + getClassName(List.class) + ";");

    // Class parameter
    // fObjectList field
    mv.visitVarInsn(ALOAD, 2); // cls parameter
    mv.visitMethodInsn(
        INVOKEINTERFACE,
        getClassName(List.class),
        "indexOf",
        "(L" + getClassName(Object.class) + ";)I");

    mv.visitLookupSwitchInsn(dflt, indexes, labels);
    idx = 0;
    for (Class c : fClassList) {
      mv.visitLabel(labels[idx]);

      //
      mv.visitVarInsn(ALOAD, THIS_VAR);
      mv.visitVarInsn(ALOAD, 1); // parent
      mv.visitVarInsn(ALOAD, 3); // object
      mv.visitTypeInsn(CHECKCAST, getClassName(c));
      mv.visitMethodInsn(
          INVOKESPECIAL,
          full_classname,
          "read" + getClassLeafName(c),
          "(L" + getClassName(ISVDBChildItem.class) + ";" + "L" + getClassName(c) + ";)V");
      mv.visitJumpInsn(GOTO, endcase);
      idx++;
    }
    mv.visitLabel(dflt);
    mv.visitVarInsn(ALOAD, THIS_VAR);
    mv.visitVarInsn(ALOAD, 3); // object
    mv.visitMethodInsn(
        INVOKESPECIAL, full_classname, "readObjectErr", "(L" + getClassName(Object.class) + ";)V");
    mv.visitLabel(endcase);
    mv.visitInsn(RETURN);
    mv.visitMaxs(4, 4);
    mv.visitEnd();
  }
  private void buildItemDispatchMethods(ClassWriter cw) {
    String classname = "SVDBPersistenceDelegate";
    String full_classname = transform_cls(fTargetPkg) + "/" + classname;

    Label labels[] = new Label[SVDBItemType.values().length];
    int indexes[] = new int[SVDBItemType.values().length];
    Label dflt, endcase;

    for (int i = 0; i < SVDBItemType.values().length; i++) {
      indexes[i] = i;
    }

    // writeItem Dispatch method
    MethodVisitor mv =
        cw.visitMethod(
            ACC_PUBLIC,
            "writeSVDBItem",
            "(L" + getClassName(ISVDBItemBase.class) + ";)V",
            null,
            new String[] {fDBWriteException});
    for (int i = 0; i < SVDBItemType.values().length; i++) {
      labels[i] = new Label();
    }
    dflt = new Label();
    endcase = new Label();

    // Retrieve the object type
    mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
    mv.visitMethodInsn(
        INVOKEINTERFACE,
        getClassName(ISVDBItemBase.class),
        "getType",
        "()L" + getClassName(SVDBItemType.class) + ";");
    mv.visitMethodInsn(INVOKEVIRTUAL, getClassName(SVDBItemType.class), "ordinal", "()I");
    mv.visitLookupSwitchInsn(dflt, indexes, labels);
    for (SVDBItemType t : SVDBItemType.values()) {
      Class c = fTypeClassMap.get(t);
      mv.visitLabel(labels[t.ordinal()]);

      mv.visitVarInsn(ALOAD, THIS_VAR);
      mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
      mv.visitTypeInsn(CHECKCAST, getClassName(c));
      mv.visitMethodInsn(
          INVOKESPECIAL, full_classname, "write" + t.name(), "(L" + getClassName(c) + ";)V");
      mv.visitJumpInsn(GOTO, endcase);
    }
    mv.visitLabel(dflt);
    mv.visitLabel(endcase);
    mv.visitInsn(RETURN);
    mv.visitMaxs(16, 16);
    mv.visitEnd();

    // readItem dispatch method
    mv =
        cw.visitMethod(
            ACC_PUBLIC,
            "readSVDBItem",
            "(L"
                + getClassName(SVDBItemType.class)
                + ";L"
                + getClassName(ISVDBChildItem.class)
                + ";)L"
                + getClassName(ISVDBItemBase.class)
                + ";",
            null,
            new String[] {fDBWriteException});
    for (int i = 0; i < SVDBItemType.values().length; i++) {
      labels[i] = new Label();
    }
    dflt = new Label();
    endcase = new Label();

    mv.visitVarInsn(ALOAD, 1); // object type
    mv.visitMethodInsn(INVOKEVIRTUAL, getClassName(SVDBItemType.class), "ordinal", "()I");
    mv.visitLookupSwitchInsn(dflt, indexes, labels);
    for (SVDBItemType t : SVDBItemType.values()) {
      Class c = fTypeClassMap.get(t);
      mv.visitLabel(labels[t.ordinal()]);

      mv.visitVarInsn(ALOAD, THIS_VAR);
      mv.visitVarInsn(ALOAD, 2); // parent
      mv.visitMethodInsn(
          INVOKESPECIAL,
          full_classname,
          "read" + t.name(),
          "(L" + getClassName(ISVDBChildItem.class) + ";)" + "L" + getClassName(c) + ";");
      mv.visitJumpInsn(GOTO, endcase);
    }
    mv.visitLabel(dflt);
    mv.visitInsn(ACONST_NULL);
    mv.visitLabel(endcase);
    mv.visitInsn(ARETURN);
    mv.visitMaxs(16, 16);
    mv.visitEnd();
  }
  @Override
  public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
    _touchBranch();

    super.visitLookupSwitchInsn(dflt, keys, labels);
  }
Example #8
0
 public void LOOKUPSWITCH(Label dflt, int[] keys, Label[] labels) {
   itsVisitor.visitLookupSwitchInsn(dflt, keys, labels);
 }