Using CtBehavior.addCatch() on method that was already instrumented with ExprEditor
results in unreachable code.
----------------------------------------------------------------------------------------------------------------
Key: JASSIST-100
URL:
https://jira.jboss.org/jira/browse/JASSIST-100
Project: Javassist
Issue Type: Bug
Affects Versions: 3.11.0.GA
Reporter: Martin Burger
Assignee: Shigeru Chiba
I want to instrument a method with CtBehavior.addCatch() after it was already modified by
an ExprEditor. Unfortunately, this results in unreachable code.
Here is the original method:
/**
* Decompiled by jad - The Fast JAva Decompiler:
* Original method.
*/
public Object getObject() {
/* 74*/ return new Object();
}
Using CtBehavior.addCatch() results in the expected modified code:
/**
* Decompiled by jad - The Fast JAva Decompiler:
* Method instrumented via m.addCatch("{ System.out.println($e); throw
$e; }", etype).
*/
public Object getObject() {
/* 74*/ try {
/* 74*/ return new Object();
}
/* 74*/ catch(Throwable throwable) {
/* 74*/ System.out.println(throwable);
/* 74*/ throw throwable;
}
}
If I only apply an ExprEditor alone, the modified code will look as expected as well:
/**
* Decompiled by jad - The Fast JAva Decompiler:
* Method instrumented via ExprEditor.edit(NewExpr ne):
* ne.replace("{ System.out.println(\"Constructor call.\"); $_
= $proceed($$); }");
*/
public Object getObject() {
/* 74*/ Object obj = null;
/* 74*/ Object obj1 = null;
/* 74*/ System.out.println("Constructor call.");
/* 74*/ obj1 = new Object();
/* 74*/ return obj1;
}
However, if I use both, the instrumented code contains an unreachable part:
/**
* Decompiled by jad - The Fast JAva Decompiler:
* Method first instrumented via ExprEditors, afterwards via addCatch(...) as
shown above.
*/
public Object getObject() {
/* 74*/ Object obj = null;
/* 74*/ Object obj1 = null;
/* 74*/ System.out.println("Constructor call.");
/* 74*/ obj1 = new Object();
/* 74*/ return obj1;
Throwable throwable;
/* 74*/ throwable;
/* 74*/ System.out.println(throwable);
/* 74*/ throw throwable;
}
I would expect something like that:
/**
* Expected result.
*/
public Object getObject() {
/* 74*/ try {
/* 74*/ System.out.println("Constructor call.");
/* 74*/ return new Object();
}
/* 74*/ catch(Throwable throwable) {
/* 74*/ System.out.println(throwable);
/* 74*/ throw throwable;
}
}
Currently, method CtBehavior.addCatch() seems to not work on code that was modified
before.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira