1 Reply Latest reply on Jul 17, 2007 11:09 AM by flonou

    NewExpr with no dup

    flonou

      Hello,

      I had a problem with a new statement without DUP in the bytecode
      (code like this :
      void method {
      new Object();
      }
      has no dup statement because the result isn't stored )

      So I had the following error :

      javassist.CannotCompileException: sorry, cannot edit NEW followed by no DUP

      and I corrected it by changing the folowwing lines in NewExpr.java:

      private int canReplace() throws CannotCompileException {
      int op = iterator.byteAt(newPos + 3);
      if (op == Opcode.DUP)
      return 4;
      else if (op == Opcode.DUP_X1
      && iterator.byteAt(newPos + 4) == Opcode.SWAP)
      return 5;
      else if (op == Opcode.INVOKESPECIAL)
      return 3; // for Eclipse's compiler
      else
      throw new CannotCompileException(
      "sorry, cannot edit NEW followed by no DUP");
      }

      by
      private int canReplace() throws CannotCompileException {
      int op = iterator.byteAt(newPos + 3);
      if (op == Opcode.DUP)
      return 4;
      else if (op == Opcode.DUP_X1
      && iterator.byteAt(newPos + 4) == Opcode.SWAP)
      return 5;
      else if (op == Opcode.INVOKESPECIAL)
      return 3; // for Eclipse's compiler
      else
      return 3;
      }

      (just the last else changed)

      I don't know if this will always work correctly but in my case, it does (I'm instrumenting jetty, a java server with javassist).