Bug 275625 - Strange compilation messages on iajc
Summary: Strange compilation messages on iajc
Status: RESOLVED FIXED
Alias: None
Product: AspectJ
Classification: Tools
Component: Ant (show other bugs)
Version: unspecified   Edit
Hardware: PC Linux
: P3 normal (vote)
Target Milestone: 1.6.5   Edit
Assignee: aspectj inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2009-05-11 05:46 EDT by Paulo Zenida CLA
Modified: 2009-06-04 14:12 EDT (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Paulo Zenida CLA 2009-05-11 05:46:47 EDT
Build ID: M20080911-1700

Steps To Reproduce:
Hello all.

I have recently updated the version of the AspectJ compiler in one of my projects and now, sometimes (don't know why this is presented only a few times and not always), I have the following errors while compiling it with the iajc ant task.

     [iajc] abort trouble in:
     [iajc] public class
net.sourceforge.fenixedu.applicationTier.Servico.administrativeOffice.externalUnits.CreateExternalUnit
extends net.sourceforge.fenixedu.applicationTier.Service:
     [iajc]   public void <init>():
     [iajc]                     ALOAD_0     //
Lnet/sourceforge/fenixedu/applicationTier/Servico/administrativeOffice/externalUnits/CreateExternalUnit;
this   (line 19)
     [iajc]                     INVOKESPECIAL
net.sourceforge.fenixedu.applicationTier.Service.<init> ()V
     [iajc]                     RETURN
     [iajc]   end public void <init>()

     [iajc]   public
net.sourceforge.fenixedu.domain.organizationalStructure.Unit
run(net.sourceforge.fenixedu.dataTransferObject.administrativeOffice.externalUnits.CreateExternalUnitBean)
throws
net.sourceforge.fenixedu.applicationTier.Servico.exceptions.FenixServiceException   
org.aspectj.weaver.MethodDeclarationLineNumber: 21:1073
     [iajc] :
     [iajc]                     ALOAD_1     //
Lnet/sourceforge/fenixedu/dataTransferObject/administrativeOffice/externalUnits/CreateExternalUnitBean;
externalUnitBean   (line 23)
     [iajc]                     INVOKEVIRTUAL
net.sourceforge.fenixedu.dataTransferObject.administrativeOffice.externalUnits.CreateExternalUnitBean.getUnitType
()Lnet/sourceforge/fenixedu/domain/organizationalStructure/PartyTypeEnum;
     [iajc]                     GETSTATIC
net.sourceforge.fenixedu.domain.organizationalStructure.PartyTypeEnum.DEPARTMENT
Lnet/sourceforge/fenixedu/domain/organizationalStructure/PartyTypeEnum;
     [iajc]                     IF_ACMPNE L0
     [iajc]                     ALOAD_1     //
Lnet/sourceforge/fenixedu/dataTransferObject/administrativeOffice/externalUnits/CreateExternalUnitBean;
externalUnitBean   (line 25)
     [iajc]                     INVOKEVIRTUAL
net.sourceforge.fenixedu.dataTransferObject.administrativeOffice.externalUnits.CreateExternalUnitBean.getUnitName
()Ljava/lang/String;
     [iajc]                     ALOAD_1     //
Lnet/sourceforge/fenixedu/dataTransferObject/administrativeOffice/externalUnits/CreateExternalUnitBean;
externalUnitBean
     [iajc]                     INVOKEVIRTUAL
net.sourceforge.fenixedu.dataTransferObject.administrativeOffice.externalUnits.CreateExternalUnitBean.getUnitCode
()Ljava/lang/String;
     [iajc]                     ALOAD_1     //
Lnet/sourceforge/fenixedu/dataTransferObject/administrativeOffice/externalUnits/CreateExternalUnitBean;
externalUnitBean
     [iajc]                     INVOKEVIRTUAL
net.sourceforge.fenixedu.dataTransferObject.administrativeOffice.externalUnits.CreateExternalUnitBean.getParentUnit
()Lnet/sourceforge/fenixedu/domain/organizationalStructure/Unit;
     [iajc]                     INVOKESTATIC
net.sourceforge.fenixedu.domain.organizationalStructure.DepartmentUnit.createNewOfficialExternalDepartmentUnit
(Ljava/lang/String;Ljava/lang/String;Lnet/sourceforge/fenixedu/domain/organizationalStructure/Unit;)Lnet/sourceforge/fenixedu/domain/organizationalStructure/DepartmentUnit;  
(line 24)
     [iajc]                     ARETURN
     [iajc]                 L0: NEW
net.sourceforge.fenixedu.applicationTier.Servico.manager.organizationalStructureManagement.CreateUnit  
(line 27)
     [iajc]                     DUP
     [iajc]                     INVOKESPECIAL
net.sourceforge.fenixedu.applicationTier.Servico.manager.organizationalStructureManagement.CreateUnit.<init>
()V
     [iajc]                     ALOAD_1     //
Lnet/sourceforge/fenixedu/dataTransferObject/administrativeOffice/externalUnits/CreateExternalUnitBean;
externalUnitBean
     [iajc]                     INVOKEVIRTUAL
net.sourceforge.fenixedu.dataTransferObject.administrativeOffice.externalUnits.CreateExternalUnitBean.getParentUnit
()Lnet/sourceforge/fenixedu/domain/organizationalStructure/Unit;
     [iajc]                     NEW
net.sourceforge.fenixedu.util.MultiLanguageString   (line 28)
     [iajc]                     DUP
     [iajc]                     INVOKESTATIC
net.sourceforge.fenixedu.util.LanguageUtils.getSystemLanguage
()Lnet/sourceforge/fenixedu/domain/Language;
     [iajc]                     ALOAD_1     //
Lnet/sourceforge/fenixedu/dataTransferObject/administrativeOffice/externalUnits/CreateExternalUnitBean;
externalUnitBean
     [iajc]                     INVOKEVIRTUAL
net.sourceforge.fenixedu.dataTransferObject.administrativeOffice.externalUnits.CreateExternalUnitBean.getUnitName
()Ljava/lang/String;
     [iajc]                     INVOKESPECIAL
net.sourceforge.fenixedu.util.MultiLanguageString.<init>
(Lnet/sourceforge/fenixedu/domain/Language;Ljava/lang/String;)V
     [iajc]                     ACONST_NULL   (line 29)
     [iajc]                     ALOAD_1     //
Lnet/sourceforge/fenixedu/dataTransferObject/administrativeOffice/externalUnits/CreateExternalUnitBean;
externalUnitBean
     [iajc]                     INVOKEVIRTUAL
net.sourceforge.fenixedu.dataTransferObject.administrativeOffice.externalUnits.CreateExternalUnitBean.getUnitCode
()Ljava/lang/String;
     [iajc]                     NEW org.joda.time.YearMonthDay
     [iajc]                     DUP
     [iajc]                     INVOKESPECIAL
org.joda.time.YearMonthDay.<init> ()V
     [iajc]                     ACONST_NULL
     [iajc]                     ALOAD_1     //
Lnet/sourceforge/fenixedu/dataTransferObject/administrativeOffice/externalUnits/CreateExternalUnitBean;
externalUnitBean
     [iajc]                     INVOKEVIRTUAL
net.sourceforge.fenixedu.dataTransferObject.administrativeOffice.externalUnits.CreateExternalUnitBean.getUnitType
()Lnet/sourceforge/fenixedu/domain/organizationalStructure/PartyTypeEnum;
     [iajc]                     ACONST_NULL   (line 30)
     [iajc]                     ACONST_NULL
     [iajc]                     ACONST_NULL
     [iajc]                     ACONST_NULL
     [iajc]                     ACONST_NULL
     [iajc]                     ACONST_NULL
     [iajc]                     ACONST_NULL
     [iajc]                     ACONST_NULL
     [iajc]                     INVOKEVIRTUAL
net.sourceforge.fenixedu.applicationTier.Servico.manager.organizationalStructureManagement.CreateUnit.run
(Lnet/sourceforge/fenixedu/domain/organizationalStructure/Unit;Lnet/sourceforge/fenixedu/util/MultiLanguageString;Ljava/lang/String;Ljava/lang/String;Lorg/joda/time/YearMonthDay;Lorg/joda/time/YearMonthDay;Lnet/sourceforge/fenixedu/domain/organizationalStructure/PartyTypeEnum;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lnet/sourceforge/fenixedu/domain/organizationalStructure/AccountabilityType;Ljava/lang/String;Lnet/sourceforge/fenixedu/domain/organizationalStructure/UnitClassification;Ljava/lang/Boolean;Ljava/lang/Integer;)Lnet/sourceforge/fenixedu/domain/organizationalStructure/Unit;  
(line 27)
     [iajc]                     ARETURN
     [iajc]   end public
net.sourceforge.fenixedu.domain.organizationalStructure.Unit
run(net.sourceforge.fenixedu.dataTransferObject.administrativeOffice.externalUnits.CreateExternalUnitBean)
throws
net.sourceforge.fenixedu.applicationTier.Servico.exceptions.FenixServiceException
     [iajc] end public class
net.sourceforge.fenixedu.applicationTier.Servico.administrativeOffice.externalUnits.CreateExternalUnit
     [iajc]  -- (ClassCastException)
org.aspectj.apache.bcel.classfile.ConstantMethodref
     [iajc] org.aspectj.apache.bcel.classfile.ConstantMethodref
     [iajc] java.lang.ClassCastException:
org.aspectj.apache.bcel.classfile.ConstantMethodref
     [iajc]     at
org.aspectj.apache.bcel.classfile.annotation.AnnotationGen.getTypeSignature(AnnotationGen.java:125)
     [iajc]     at
org.aspectj.apache.bcel.classfile.annotation.AnnotationGen.getTypeName(AnnotationGen.java:130)
     [iajc]     at
org.aspectj.weaver.bcel.AtAjAttributes.getAnnotation(AtAjAttributes.java:1634)
     [iajc]     at
org.aspectj.weaver.bcel.AtAjAttributes.handleBeforeAnnotation(AtAjAttributes.java:1001)
     [iajc]     at
org.aspectj.weaver.bcel.AtAjAttributes.readAj5MethodAttributes(AtAjAttributes.java:395)
     [iajc]     at
org.aspectj.weaver.bcel.BcelMethod.unpackAjAttributes(BcelMethod.java:189)
     [iajc]     at
org.aspectj.weaver.bcel.BcelMethod.<init>(BcelMethod.java:96)
     [iajc]     at
org.aspectj.weaver.bcel.LazyMethodGen.<init>(LazyMethodGen.java:197)
     [iajc]     at
org.aspectj.weaver.bcel.BcelClassWeaver.weaveDeclareAtMethodCtor(BcelClassWeaver.java:952)
     [iajc]     at
org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:450)
     [iajc]     at
org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:103)
     [iajc]     at
org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1735)
     [iajc]     at
org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump(BcelWeaver.java:1696)
     [iajc]     at
org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1458)
     [iajc]     at
org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1272)
     [iajc]     at
org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.weaveQueuedEntries(AjPipeliningCompilerAdapter.java:435)
     [iajc]     at
org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.queueForWeaving(AjPipeliningCompilerAdapter.java:371)
     [iajc]     at
org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.afterProcessing(AjPipeliningCompilerAdapter.java:358)
     [iajc]     at
org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$after$org_aspectj_ajdt_internal_compiler_CompilerAdapter$5$6b855184(CompilerAdapter.aj:98)
     [iajc]     at
org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:652)
     [iajc]     at
org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:392)
     [iajc]     at
org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:1001)
     [iajc]     at
org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:266)
     [iajc]     at
org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:180)
     [iajc]     at
org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:112)
     [iajc]     at
org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:60)
     [iajc]     at org.aspectj.tools.ajc.Main.run(Main.java:355)
     [iajc]     at org.aspectj.tools.ajc.Main.runMain(Main.java:234)
     [iajc]     at
org.aspectj.tools.ant.taskdefs.AjcTask.executeInSameVM(AjcTask.java:1211)
     [iajc]     at
org.aspectj.tools.ant.taskdefs.AjcTask.execute(AjcTask.java:1021)
     [iajc]     at
org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
     [iajc]     at org.apache.tools.ant.Task.perform(Task.java:364)
     [iajc]     at org.apache.tools.ant.Target.execute(Target.java:341)
     [iajc]     at org.apache.tools.ant.Target.performTasks(Target.java:369)
     [iajc]     at
org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
     [iajc]     at
org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:37)
     [iajc]     at
org.apache.tools.ant.Project.executeTargets(Project.java:1068)
     [iajc]     at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:382)
     [iajc]     at
org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
     [iajc]     at org.apache.tools.ant.Task.perform(Task.java:364)
     [iajc]     at org.apache.tools.ant.Target.execute(Target.java:341)
     [iajc]     at org.apache.tools.ant.Target.performTasks(Target.java:369)
     [iajc]     at
org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
     [iajc]     at
org.apache.tools.ant.Project.executeTarget(Project.java:1185)
     [iajc] 
[...]


Any ideas of what this might be?

I'll send the code with some more details on how to reproduce this to Andy Clement.
Comment 1 Andrew Clement CLA 2009-05-11 19:56:45 EDT
thanks to the 290meg testcase Paulo sent me, i have recreated it.  Currently wondering what it is but I have a suspicion.

Problematic class I'm looking at is:
net.sourceforge.fenixedu.applicationTier.Servico.administrativeOffice.externalUnits.CreateExternalUnit

That has some annotations:

RuntimeVisibleAnnotations: length = 0xF
00 02 00 4A 00 00 00 4B 00 01 00 4C 73 00 4D 

So there are (00 02) annotations:

00 4A 00 00 
Index 4A (74) into constant pool is: "Lnet/sourceforge/zas/metainfo/Shallow;"

00 4B 00 01 00 4C 73 00 4D 
Index 4B (75) into cp is: "Lnet/sourceforge/zas/metainfo/AccessControlled;"
and this one has a name value pair. 
Name is 4C (76): "value", value is of type 's' (73) so string and the string is 4D (77) "ACADEMIC_ADMINISTRATIVE_OFFICE"

Error I see is :

 [iajc]   end public net.sourceforge.fenixedu.domain.organizationalStructure.Unit run(net.sourceforge.fenixedu.dataTransferObject.administrativeOffice.externalUnits.CreateExternalUnitBean) throws net.sourceforge.fenixedu.applicationTier.Servico.exceptions.FenixServiceException
     [iajc] end public class net.sourceforge.fenixedu.applicationTier.Servico.administrativeOffice.externalUnits.CreateExternalUnit
     [iajc]  -- (ClassCastException) org.aspectj.apache.bcel.classfile.ConstantMethodref cannot be cast to org.aspectj.apache.bcel.classfile.ConstantUtf8
     [iajc] org.aspectj.apache.bcel.classfile.ConstantMethodref cannot be cast to org.aspectj.apache.bcel.classfile.ConstantUtf8
     [iajc] java.lang.ClassCastException: org.aspectj.apache.bcel.classfile.ConstantMethodref cannot be cast to org.aspectj.apache.bcel.classfile.ConstantUtf8

The annotation in there looks well formed, so wonder what is triggering the problem?
Comment 2 Paulo Zenida CLA 2009-05-12 05:23:21 EDT
After looking at the class more carefully, I believe this may be related with the bug 169699. The class in question is annotated, as

@Shallow
@AccessControlled(value = "ACADEMIC_ADMINISTRATIVE_OFFICE")
public class CreateExternalUnit extends Service {
   ...
   public void run(...) {
      ...
   }
}

In this particular class, non private methods should get annotations @Shallow, @AccessControlled and @AccessControlledInherited injected automatically. I don't know how or why but since the annotations injection has an unknown behavior, because of the unpredictable injection order, couldn't these two bugs be related somehow? The aspect that injects the annotations is defined as:

aspect X {

  ...

 @method : !@NotAccessControlled !private * (@AccessControlled *..*+).*(..) : @AccessControlledInherited;

  declare @method : !@AccessControlled !@NotAccessControlled !private * (@AccessControlled *..*+).*(..) : @AccessControlled;

  declare @method : @AccessControlledInherited * (@Shallow *..*+).*(..) : @Shallow;

  ...
}
Comment 3 Andrew Clement CLA 2009-05-12 11:53:16 EDT
first problem is fixed.  As I initially imagined (given the complex declare @methods Paulo is using) the problem would be with copying the annotations onto the target.  Due to the way in which they are processed there is a first loop that 'has a quick go' and if there are some that may later apply based on that, a second loop processes them.  The second loop failed to ensure that when the annotation was copied across that the constant pool entry for the type name was copied (so the annotation used the same cp index as it did in the original class).

However, getting past that juts reveals (for me) another problem:

 java.lang.StackOverflowError
     at org.aspectj.weaver.TypeFactory.createTypeFromSignature(TypeFactory.java:94)
     at org.aspectj.weaver.UnresolvedType.forSignature(UnresolvedType.java:411)
     at org.aspectj.weaver.UnresolvedType.getRawType(UnresolvedType.java:567)
     at org.aspectj.weaver.ReferenceType.getRawType(ReferenceType.java:733)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:389)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:363)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:389)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:363)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:389)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:363)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:389)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:363)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:389)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:363)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:389)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:363)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:389)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:363)
     at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:389)
Comment 4 Andrew Clement CLA 2009-05-12 11:55:14 EDT
the problem i just fixed for methods probably also exists for fields.
Comment 5 Andrew Clement CLA 2009-05-12 12:04:15 EDT
regression tests added for methods and fields - fields seem to work already (woo!) so just the stackoverflow to look at now
Comment 6 Andrew Clement CLA 2009-05-12 13:25:20 EDT
collecting diagnostics for the stackoverflow is a nightmare, but here we go.

It seems the problematic type is "Lnet/sourceforge/zas/aop/aspectj/Enforcer;"

and the problem is that it is considered generic but when we ask for the raw type, we get the generic type back again.  Enforcer is a generic aspect.

this is extremely hard to work on when i can't actively use the debugger.
Comment 7 Andrew Clement CLA 2009-05-12 13:56:34 EDT
managed to extract the compile string used from the build script, but running in eclipse it just works.

Fixes for declare annotation are in, i'll leave this for now to see if Paulo hits the problem I see when he runs with the fixes.
Comment 8 Paulo Zenida CLA 2009-05-12 14:04:45 EDT
What do you mean with "Fixes for declare annotation are in"? Does that mean that, now, the order of annotations injection has a predictable behavior, when declared in the same file?
Comment 9 Andrew Clement CLA 2009-05-12 14:20:56 EDT
> What do you mean with "Fixes for declare annotation are in"? Does that mean
> that, now, the order of annotations injection has a predictable behavior, when
> declared in the same file?

I mean the fix for the exception that this bug covers:

     [iajc]  -- (ClassCastException) org.aspectj.apache.bcel.classfile.ConstantMethodref
     [iajc] org.aspectj.apache.bcel.classfile.ConstantMethodref
     [iajc] java.lang.ClassCastException:

is committed.  The order of applicability is still undefined and when that changes I'll update bug 169699.
Comment 10 Andrew Clement CLA 2009-06-04 14:12:02 EDT
presumed fixed (ie. this exception - the reason why the bug was raised)

     [iajc] java.lang.ClassCastException:
org.aspectj.apache.bcel.classfile.ConstantMethodref
     [iajc]     at
org.aspectj.apache.bcel.classfile.annotation.AnnotationGen.getTypeSignature(AnnotationGen.java:125)

please reopen if still a problem.