Package net.sf.joafip.asm

Examples of net.sf.joafip.asm.Type


import net.sf.joafip.asm.Type;

public class MainNotStorableClass {

  public static void main(String[] args) {
    Type type = Type.getType(NotStorableClass.class);
    System.out.println(type.getDescriptor());
    type = Type.getType(int.class);
    System.out.println(type.getDescriptor());
  }
View Full Code Here


    Frame handler = newFrame(m.maxLocals, m.maxStack);
    current.setReturn(interpreter.newValue(Type.getReturnType(m.desc)));
    Type[] args = Type.getArgumentTypes(m.desc);
    int local = 0;
    if ((m.access & ACC_STATIC) == 0) {
      Type ctype = Type.getObjectType(owner);
      current.setLocal(local++, interpreter.newValue(ctype));
    }
    for (int i = 0; i < args.length; ++i) {
      current.setLocal(local++, interpreter.newValue(args[i]));
      if (args[i].getSize() == 2) {
        current.setLocal(local++, interpreter.newValue(null));
      }
    }
    while (local < m.maxLocals) {
      current.setLocal(local++, interpreter.newValue(null));
    }
    merge(0, current, null);

    // control flow analysis
    while (top > 0) {
      int insn = queue[--top];
      Frame f = frames[insn];
      Subroutine subroutine = subroutines[insn];
      queued[insn] = false;

      AbstractInsnNode insnNode = null;
      try {
        insnNode = m.instructions.get(insn);
        int insnOpcode = insnNode.getOpcode();
        int insnType = insnNode.getType();

        if (insnType == AbstractInsnNode.LABEL
            || insnType == AbstractInsnNode.LINE
            || insnType == AbstractInsnNode.FRAME) {
          merge(insn + 1, f, subroutine);
          newControlFlowEdge(insn, insn + 1);
        } else {
          current.init(f).execute(insnNode, interpreter);
          subroutine = subroutine == null ? null : subroutine.copy();

          if (insnNode instanceof JumpInsnNode) {
            JumpInsnNode j = (JumpInsnNode) insnNode;
            if (insnOpcode != GOTO && insnOpcode != JSR) {
              merge(insn + 1, current, subroutine);
              newControlFlowEdge(insn, insn + 1);
            }
            int jump = insns.indexOf(j.label);
            if (insnOpcode == JSR) {
              merge(jump, current, new Subroutine(j.label,
                  m.maxLocals, j));
            } else {
              merge(jump, current, subroutine);
            }
            newControlFlowEdge(insn, jump);
          } else if (insnNode instanceof LookupSwitchInsnNode) {
            LookupSwitchInsnNode lsi = (LookupSwitchInsnNode) insnNode;
            int jump = insns.indexOf(lsi.dflt);
            merge(jump, current, subroutine);
            newControlFlowEdge(insn, jump);
            for (int j = 0; j < lsi.labels.size(); ++j) {
              LabelNode label = (LabelNode) lsi.labels.get(j);
              jump = insns.indexOf(label);
              merge(jump, current, subroutine);
              newControlFlowEdge(insn, jump);
            }
          } else if (insnNode instanceof TableSwitchInsnNode) {
            TableSwitchInsnNode tsi = (TableSwitchInsnNode) insnNode;
            int jump = insns.indexOf(tsi.dflt);
            merge(jump, current, subroutine);
            newControlFlowEdge(insn, jump);
            for (int j = 0; j < tsi.labels.size(); ++j) {
              LabelNode label = (LabelNode) tsi.labels.get(j);
              jump = insns.indexOf(label);
              merge(jump, current, subroutine);
              newControlFlowEdge(insn, jump);
            }
          } else if (insnOpcode == RET) {
            if (subroutine == null) {
              throw new AnalyzerException(insnNode,
                  "RET instruction outside of a sub routine");
            }
            for (int i = 0; i < subroutine.callers.size(); ++i) {
              Object caller = subroutine.callers.get(i);
              int call = insns.indexOf((AbstractInsnNode) caller);
              if (frames[call] != null) {
                merge(call + 1, frames[call], current,
                    subroutines[call], subroutine.access);
                newControlFlowEdge(insn, call + 1);
              }
            }
          } else if (insnOpcode != ATHROW
              && (insnOpcode < IRETURN || insnOpcode > RETURN)) {
            if (subroutine != null) {
              if (insnNode instanceof VarInsnNode) {
                int var = ((VarInsnNode) insnNode).var;
                subroutine.access[var] = true;
                if (insnOpcode == LLOAD || insnOpcode == DLOAD
                    || insnOpcode == LSTORE
                    || insnOpcode == DSTORE) {
                  subroutine.access[var + 1] = true;
                }
              } else if (insnNode instanceof IincInsnNode) {
                int var = ((IincInsnNode) insnNode).var;
                subroutine.access[var] = true;
              }
            }
            merge(insn + 1, current, subroutine);
            newControlFlowEdge(insn, insn + 1);
          }
        }

        List insnHandlers = handlers[insn];
        if (insnHandlers != null) {
          for (int i = 0; i < insnHandlers.size(); ++i) {
            TryCatchBlockNode tcb = (TryCatchBlockNode) insnHandlers
                .get(i);
            Type type;
            if (tcb.type == null) {
              type = Type.getObjectType("java/lang/Throwable");
            } else {
              type = Type.getObjectType(tcb.type);
            }
View Full Code Here

    }
    return v;
  }

  protected boolean isArrayValue(final Value value) {
    Type t = ((BasicValue) value).getType();
    return t != null
        && ("Lnull;".equals(t.getDescriptor()) || t.getSort() == Type.ARRAY);
  }
View Full Code Here

        && ("Lnull;".equals(t.getDescriptor()) || t.getSort() == Type.ARRAY);
  }

  protected Value getElementValue(final Value objectArrayValue)
      throws AnalyzerException {
    Type arrayType = ((BasicValue) objectArrayValue).getType();
    if (arrayType != null) {
      if (arrayType.getSort() == Type.ARRAY) {
        return newValue(Type.getType(arrayType.getDescriptor()
            .substring(1)));
      } else if ("Lnull;".equals(arrayType.getDescriptor())) {
        return objectArrayValue;
      }
    }
    throw new Error("Internal error");
  }
View Full Code Here

    }
    throw new Error("Internal error");
  }

  protected boolean isSubTypeOf(final Value value, final Value expected) {
    Type expectedType = ((BasicValue) expected).getType();
    Type type = ((BasicValue) value).getType();
    switch (expectedType.getSort()) {
    case Type.INT:
    case Type.FLOAT:
    case Type.LONG:
    case Type.DOUBLE:
      return type.equals(expectedType);
    case Type.ARRAY:
    case Type.OBJECT:
      if ("Lnull;".equals(type.getDescriptor())) {
        return true;
      } else if (type.getSort() == Type.OBJECT
          || type.getSort() == Type.ARRAY) {
        return isAssignableFrom(expectedType, type);
      } else {
        return false;
      }
    default:
View Full Code Here

    }
  }

  public Value merge(final Value v, final Value w) {
    if (!v.equals(w)) {
      Type t = ((BasicValue) v).getType();
      Type u = ((BasicValue) w).getType();
      if (t != null
          && (t.getSort() == Type.OBJECT || t.getSort() == Type.ARRAY)) {
        if (u != null
            && (u.getSort() == Type.OBJECT || u.getSort() == Type.ARRAY)) {
          if ("Lnull;".equals(t.getDescriptor())) {
            return w;
          }
          if ("Lnull;".equals(u.getDescriptor())) {
            return v;
          }
          if (isAssignableFrom(t, u)) {
            return v;
          }
View Full Code Here

      if (isAssignableFrom(t, currentSuperClass)) {
        return true;
      }
      if (currentClassInterfaces != null) {
        for (int i = 0; i < currentClassInterfaces.size(); ++i) {
          Type v = (Type) currentClassInterfaces.get(i);
          if (isAssignableFrom(t, v)) {
            return true;
          }
        }
      }
View Full Code Here

      }
    } else {
      int i = 0;
      int j = 0;
      if (opcode != INVOKESTATIC && opcode != INVOKEDYNAMIC) {
        Type owner = Type.getObjectType(((MethodInsnNode) insn).owner);
        if (!isSubTypeOf((Value) values.get(i++), newValue(owner))) {
          throw new AnalyzerException(insn, "Method owner",
              newValue(owner), (Value) values.get(0));
        }
      }
View Full Code Here

    verify(cn, loader, dump, pw);
  }

  public static void verify(ClassNode cn, final ClassLoader loader,
      final boolean dump, final PrintWriter pw) {
    Type syperType = cn.superName == null ? null : Type
        .getObjectType(cn.superName);
    List methods = cn.methods;

    List interfaces = new ArrayList();
    for (Iterator i = cn.interfaces.iterator(); i.hasNext();) {
View Full Code Here

      // restore stack for original getField
      methodVisitor.visitVarInsn(ALOAD, maxLocals + 1);
      // original GETFIELD instruction
      methodVisitor.visitFieldInsn(opcode, owner, name, desc);
    } else if (opcode == PUTFIELD) {
      final Type type = Type.getType(desc);
      // store value
      methodVisitor.visitVarInsn(type.getOpcode(ISTORE), maxLocals + 2);
      // store object reference
      methodVisitor.visitVarInsn(ASTORE, maxLocals + 1);
      // this
      methodVisitor.visitVarInsn(ALOAD, 0);
      // object reference is second argument
      methodVisitor.visitVarInsn(ALOAD, maxLocals + 1);

      // call forceLoad$JOAFIP$
      methodVisitor.visitMethodInsn(INVOKESTATIC, JOAFIP_CALL_BACK,
          "forceLoad$JOAFIP$",
          LJAVA_LANG_OBJECT_LJAVA_LANG_OBJECT_V_DESC);

      // restore stack for original PUTFIELD instruction
      methodVisitor.visitVarInsn(ALOAD, maxLocals + 1);
      methodVisitor.visitVarInsn(type.getOpcode(ILOAD), maxLocals + 2);
      // original PUTFIELD instruction
      methodVisitor.visitFieldInsn(opcode, owner, name, desc);
    } else if (opcode == GETSTATIC || opcode == PUTSTATIC) {
      methodVisitor.visitMethodInsn(
      /**/INVOKESTATIC, JOAFIP_CALL_BACK, INVOKE_BEGIN$JOAFIP$,
View Full Code Here

TOP

Related Classes of net.sf.joafip.asm.Type

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.