[jboss-jira] [JBoss JIRA] Created: (JASSIST-40) Bug with 'insertAfter' called with 'asFinally' and the '$w' keyword on methods with a 'void' return type

Patrice Bouillet (JIRA) jira-events at lists.jboss.org
Wed Jan 2 08:39:44 EST 2008


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

        



More information about the jboss-jira mailing list