Ejemplo n.º 1
0
  private static byte[] insertGapCore1(
      byte[] code,
      int where,
      int gapLength,
      boolean exclusive,
      ExceptionTable etable,
      CodeAttribute ca)
      throws BadBytecode, AlignmentException {
    int codeLength = code.length;
    byte[] newcode = new byte[codeLength + gapLength];
    insertGap2(code, where, gapLength, codeLength, newcode, exclusive);
    etable.shiftPc(where, gapLength, exclusive);
    LineNumberAttribute na = (LineNumberAttribute) ca.getAttribute(LineNumberAttribute.tag);
    if (na != null) na.shiftPc(where, gapLength, exclusive);

    LocalVariableAttribute va =
        (LocalVariableAttribute) ca.getAttribute(LocalVariableAttribute.tag);
    if (va != null) va.shiftPc(where, gapLength, exclusive);

    LocalVariableAttribute vta =
        (LocalVariableAttribute) ca.getAttribute(LocalVariableAttribute.typeTag);
    if (vta != null) vta.shiftPc(where, gapLength, exclusive);

    StackMapTable smt = (StackMapTable) ca.getAttribute(StackMapTable.tag);
    if (smt != null) smt.shiftPc(where, gapLength, exclusive);

    StackMap sm = (StackMap) ca.getAttribute(StackMap.tag);
    if (sm != null) sm.shiftPc(where, gapLength, exclusive);

    return newcode;
  }
Ejemplo n.º 2
0
 Pointers(int cur, int m, int m0, ExceptionTable et, CodeAttribute ca) {
   cursor = cur;
   mark = m;
   mark0 = m0;
   etable = et; // non null
   line = (LineNumberAttribute) ca.getAttribute(LineNumberAttribute.tag);
   vars = (LocalVariableAttribute) ca.getAttribute(LocalVariableAttribute.tag);
   types = (LocalVariableAttribute) ca.getAttribute(LocalVariableAttribute.typeTag);
   stack = (StackMapTable) ca.getAttribute(StackMapTable.tag);
   stack2 = (StackMap) ca.getAttribute(StackMap.tag);
 }
Ejemplo n.º 3
0
  /**
   * Returns the line number of the source line corresponding to the specified bytecode contained in
   * this method.
   *
   * @param pos the position of the bytecode (>= 0). an index into the code array.
   * @return -1 if this information is not available.
   */
  public int getLineNumber(int pos) {
    CodeAttribute ca = getCodeAttribute();
    if (ca == null) return -1;

    LineNumberAttribute ainfo = (LineNumberAttribute) ca.getAttribute(LineNumberAttribute.tag);
    if (ainfo == null) return -1;

    return ainfo.toLineNumber(pos);
  }
Ejemplo n.º 4
0
  private void initExtraHarvest() {
    try {
      CtClass terraForming =
          HookManager.getInstance()
              .getClassPool()
              .get("com.wurmonline.server.behaviours.Terraforming");

      CtClass[] paramTypes = {
        HookManager.getInstance().getClassPool().get("com.wurmonline.server.creatures.Creature"),
        CtPrimitiveType.intType,
        CtPrimitiveType.intType,
        CtPrimitiveType.booleanType,
        CtPrimitiveType.intType,
        CtPrimitiveType.floatType,
        HookManager.getInstance().getClassPool().get("com.wurmonline.server.items.Item")
      };

      CtMethod method =
          terraForming.getMethod(
              "harvest", Descriptor.ofMethod(CtPrimitiveType.booleanType, paramTypes));
      MethodInfo methodInfo = method.getMethodInfo();
      CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
      CodeIterator codeIterator = codeAttribute.iterator();

      LocalVariableAttribute attr =
          (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
      int quantityIndex = -1;
      for (int i = 0; i < attr.tableLength(); i++) {
        if ("quantity".equals(attr.variableName(i))) {
          quantityIndex = attr.index(i);
        }
      }

      if (quantityIndex == -1) {
        throw new HookException("Quantity variable can not be resolved");
      }

      while (codeIterator.hasNext()) {
        int pos = codeIterator.next();
        int op = codeIterator.byteAt(pos);
        if (op == CodeIterator.ISTORE) {
          int fieldRefIdx = codeIterator.byteAt(pos + 1);
          if (quantityIndex == fieldRefIdx) {
            Bytecode bytecode = new Bytecode(codeIterator.get().getConstPool());
            bytecode.addIconst(extraHarvest);
            bytecode.add(Bytecode.IADD);
            codeIterator.insertAt(pos, bytecode.get());
            break;
          }
        }
      }
    } catch (NotFoundException | BadBytecode e) {
      throw new HookException(e);
    }
  }
Ejemplo n.º 5
0
  /**
   * Return javaassist source snippet which lists all the parameters and their values. If available
   * the source names are extracted from the debug information and used, otherwise just a number is
   * shown.
   *
   * @param method
   * @return
   * @throws NotFoundException
   */
  public static String getSignature(CtBehavior method) throws NotFoundException {

    CtClass[] parameterTypes = method.getParameterTypes();

    CodeAttribute codeAttribute = method.getMethodInfo().getCodeAttribute();

    LocalVariableAttribute locals = null;

    if (codeAttribute != null) {
      AttributeInfo attribute;
      attribute = codeAttribute.getAttribute("LocalVariableTable");
      locals = (LocalVariableAttribute) attribute;
    }

    String methodName = method.getName();

    StringBuilder sb = new StringBuilder(methodName).append("(\" ");
    for (int i = 0; i < parameterTypes.length; i++) {
      if (i > 0) {
        // add a comma and a space between printed values
        sb.append(" + \", \" ");
      }

      CtClass parameterType = parameterTypes[i];
      boolean isArray = parameterType.isArray();
      CtClass arrayType = parameterType.getComponentType();
      if (isArray) {
        while (arrayType.isArray()) {
          arrayType = arrayType.getComponentType();
        }
      }

      sb.append(" + \"");
      try {
        sb.append(parameterNameFor(method, locals, i));
      } catch (Exception e) {
        sb.append(i + 1);
      }
      sb.append("\" + \"=");

      if (parameterType.isPrimitive()) {
        // let the compiler handle primitive -> string
        sb.append("\"+ $").append(i + 1);
      } else {
        String s = "org.slf4j.instrumentation.ToStringHelper.render";
        sb.append("\"+ ").append(s).append("($").append(i + 1).append(')');
      }
    }
    sb.append("+\")");

    String signature = sb.toString();
    return signature;
  }