You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Shil Sinha (JIRA)" <ji...@apache.org> on 2015/10/23 03:09:27 UTC
[jira] [Created] (GROOVY-7644) AutoExternalize generates incorrect
bytecode for statically compiled nested classes
Shil Sinha created GROOVY-7644:
----------------------------------
Summary: AutoExternalize generates incorrect bytecode for statically compiled nested classes
Key: GROOVY-7644
URL: https://issues.apache.org/jira/browse/GROOVY-7644
Project: Groovy
Issue Type: Bug
Components: Static compilation
Affects Versions: 2.4.5
Environment: OSX 10.10, JDK 1.8
Reporter: Shil Sinha
Assignee: Cédric Champeau
When @AutoExternalize and @CompileStatic are both applied to a nested (static) class, the generated writeExternal and readExternal methods call writeObject/readObject on 'this' rather than on their arguments. This results in IncompatibleClassChange errors at runtime. Example:
{code}
class Person {
@groovy.transform.ToString(includePackage=false)
@groovy.transform.AutoExternalize
@groovy.transform.CompileStatic
static class AddressCS {
String street, town
}
}
{code}
The bytecode generated for the Person.AddressCS.writeExternal method is:
{code}
public writeExternal(Ljava/io/ObjectOutput;)V throws java/io/IOException
L0
ALOAD 0
ALOAD 0
GETFIELD Person$AddressCS.street : Ljava/lang/String;
INVOKEINTERFACE java/io/ObjectOutput.writeObject (Ljava/lang/Object;)V
ACONST_NULL
POP
ALOAD 0
ALOAD 0
GETFIELD Person$AddressCS.town : Ljava/lang/String;
INVOKEINTERFACE java/io/ObjectOutput.writeObject (Ljava/lang/Object;)V
ACONST_NULL
POP
L1
RETURN
LOCALVARIABLE this LPerson$AddressCS; L0 L1 0
LOCALVARIABLE out Ljava/io/ObjectOutput; L0 L1 1
MAXSTACK = 2
MAXLOCALS = 2
{code}
This seems to occur because the writeObject method call expressions within writeExternal have implicitThis set to true.
The problem is essentially the same for generated readExternal methods.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)