[
http://jira.jboss.com/jira/browse/JASSIST-40?page=all ]
Shigeru Chiba resolved JASSIST-40.
----------------------------------
Resolution: Done
Thank you for this bug report. The bug has been fixed.
Bug with 'insertAfter' called with 'asFinally' and
the '$w' keyword on methods with a 'void' return type
--------------------------------------------------------------------------------------------------------
Key: JASSIST-40
URL:
http://jira.jboss.com/jira/browse/JASSIST-40
Project: Javassist
Issue Type: Bug
Reporter: Patrice Bouillet
Assigned To: Shigeru Chiba
Altering a method with a void return type by calling insertAfter containing the $_
keyword results in the following exception for example:
Exception in thread "main" java.lang.VerifyError: (class: VoidReturnType,
method: doNothing signature: ()V) Register 2 contains wrong type
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:1618)
at java.lang.Class.getConstructor0(Class.java:1930)
at java.lang.Class.newInstance0(Class.java:278)
at java.lang.Class.newInstance(Class.java:261)
at InsertAfterAsFinally.main(InsertAfterAsFinally.java:16)
The test source code to generate this error:
public class InsertAfterAsFinally {
public static void main(String[] args) {
ClassPool cp = ClassPool.getDefault();
try {
CtClass cc = cp.get("VoidReturnType");
CtMethod cm = cc.getDeclaredMethod("doNothing");
cm.insertAfter("System.out.println(\"return value: \" + $_);",
true);
Class clazz = cc.toClass();
VoidReturnType vrt = (VoidReturnType) clazz.newInstance();
vrt.doNothing();
} catch (NotFoundException e) {
e.printStackTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
public class VoidReturnType {
void doNothing() {
}
}
========================================
The problem seems to be in the insertAfterHandler method in the CtBehaviour class. The
following modification from
if (rtype.isPrimitive())
to:
if (rtype.isPrimitive() && (rtype != CtClass.voidType))
fixes the error.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira