Bug 36329 - The compiler crashes when using aspect libraries created without using -noweave
Summary: The compiler crashes when using aspect libraries created without using -noweave
Status: RESOLVED FIXED
Alias: None
Product: AspectJ
Classification: Tools
Component: Compiler (show other bugs)
Version: unspecified   Edit
Hardware: PC Windows NT
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Jim Hugunin CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2003-04-10 04:08 EDT by Ramnivas Laddad CLA
Modified: 2003-04-27 18:56 EDT (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Ramnivas Laddad CLA 2003-04-10 04:08:55 EDT
The compiler crashes when I don't use -noweave to create aspect
libraries. Works fine with -noweave. 

Note, however, that iajc does not accept "noweave" attribute nor 
"Xnoweave" (filing this part as a separate bug).

F:\aspectj\bugs\1.1\rc1\noweave>ajc -outjar tracing.jar TraceAspect.java
F:\aspectj\bugs\1.1\rc1\noweave>ajc -outjar test.jar Test.java
F:\aspectj\bugs\1.1\rc1\noweave>ajc -injars test.jar;tracing.jar
trouble in:
public class TraceAspect extends java.lang.Object:
  private java.util.logging.Logger _logger
  public static final TraceAspect ajc$perSingletonInstance
  static void <clinit>():
                    INVOKESTATIC TraceAspect.ajc$postClinit ()V   (line 4)
                    RETURN
  end static void <clinit>()

  public void <init>():
                    ALOAD_0     // TraceAspect this   (line 4)
                    INVOKESPECIAL java.lang.Object.<init> ()V
                    ALOAD_0     // TraceAspect this   (line 5)
                    LDC "trace"
                    INVOKESTATIC java.util.logging.Logger.getLogger (Ljava/lang/
String;)Ljava/util/logging/Logger;
                    PUTFIELD TraceAspect._logger Ljava/util/logging/Logger;
                    RETURN   (line 4)
  end public void <init>()

  public void ajc$before$TraceAspect$ef(org.aspectj.lang.JoinPoint$StaticPart)
  AdviceAttribute(before, traceMethods(), 4, 239)
:
                    ALOAD_1     // org.aspectj.lang.JoinPoint$StaticPart thisJoi
nPointStaticPart   (line 11)
                    INVOKEINTERFACE org.aspectj.lang.JoinPoint$StaticPart.getSig
nature ()Lorg/aspectj/lang/Signature;
                    ASTORE_2
                    ALOAD_0     // TraceAspect this   (line 12)
                    GETFIELD TraceAspect._logger Ljava/util/logging/Logger;
                    GETSTATIC java.util.logging.Level.INFO Ljava/util/logging/Le
vel;
                    ALOAD_2     // org.aspectj.lang.Signature sig
                    INVOKEINTERFACE org.aspectj.lang.Signature.getDeclaringType
()Ljava/lang/Class;
                    INVOKEVIRTUAL java.lang.Class.getName ()Ljava/lang/String;
                    ALOAD_2     // org.aspectj.lang.Signature sig   (line 13)
                    INVOKEINTERFACE org.aspectj.lang.Signature.getName ()Ljava/l
ang/String;
                    LDC "Entering"
                    INVOKEVIRTUAL java.util.logging.Logger.logp (Ljava/util/logg
ing/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V   (line 12)
                    RETURN   (line 14)
  end public void ajc$before$TraceAspect$ef(org.aspectj.lang.JoinPoint$StaticPar
t)

  public static TraceAspect aspectOf()    org.aspectj.weaver.AjAttribute$AjSynth
etic@bdb503
:
                    GETSTATIC TraceAspect.ajc$perSingletonInstance LTraceAspect;

                    DUP
                    IFNULL L0
                    ARETURN
                L0: NEW org.aspectj.lang.NoAspectBoundException
                    DUP
                    INVOKESPECIAL org.aspectj.lang.NoAspectBoundException.<init>
 ()V
                    ATHROW
  end public static TraceAspect aspectOf()

  public static boolean hasAspect()    org.aspectj.weaver.AjAttribute$AjSyntheti
c@119dc16
:
                    GETSTATIC TraceAspect.ajc$perSingletonInstance LTraceAspect;

                    IFNULL L0
                    ICONST_1
                    IRETURN
                L0: ICONST_0
                    IRETURN
  end public static boolean hasAspect()

  private static void ajc$postClinit()    org.aspectj.weaver.AjAttribute$AjSynth
etic@c05d3b
:
                    NEW TraceAspect
                    DUP
                    INVOKESPECIAL TraceAspect.<init> ()V
                    PUTSTATIC TraceAspect.ajc$perSingletonInstance LTraceAspect;

                    RETURN
  end private static void ajc$postClinit()
end public class TraceAspect
ABORT
Exception thrown from AspectJ 1.1rc1

This might be logged as a bug already -- find current bugs at
  http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=Compiler

Bugs for exceptions thrown have titles File:line from the top stack,
e.g., "SomeFile.java:243"

If you don't find the exception below in a bug, please add a new bug
at http://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ
To make the bug a priority, please include a test program
that can reproduce this exception.
already woven: public class TraceAspect
already woven: public class TraceAspect
java.lang.RuntimeException: already woven: public class TraceAspect
        at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:23
9)
        at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:76
)
        at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:321)
        at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:302)
        at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:254)
        at org.aspectj.ajdt.internal.core.builder.AjBuildManager.weaveAndGenerat
eClassFiles(AjBuildManager.java:394)
        at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBu
ildManager.java:149)
        at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:55)
        at org.aspectj.tools.ajc.Main.run(Main.java:216)
        at org.aspectj.tools.ajc.Main.runMain(Main.java:155)
        at org.aspectj.tools.ajc.Main.main(Main.java:72)


1 fail|abort

=================== Now with -noweave ==================
F:\aspectj\bugs\1.1\rc1\noweave>ajc -outjar tracing.jar -noweave TraceAspect.java
F:\aspectj\bugs\1.1\rc1\noweave>ajc -outjar test.jar Test.java
F:\aspectj\bugs\1.1\rc1\noweave>ajc -injars test.jar;tracing.jar
F:\aspectj\bugs\1.1\rc1\noweave>java Test
Apr 10, 2003 12:52:26 AM Test main
INFO: Entering


=== TraceAspect.java ===
import java.util.logging.*;
import org.aspectj.lang.*;

public aspect TraceAspect {
    private Logger _logger = Logger.getLogger("trace");

    pointcut traceMethods()
        : execution(* *.*(..)) && !within(TraceAspect);

    before() : traceMethods() {
        Signature sig = thisJoinPointStaticPart.getSignature();
        _logger.logp(Level.INFO, sig.getDeclaringType().getName(),
                     sig.getName(), "Entering");
    }
}


=== Test.java ===
public class Test {
    public static void main(String[] args) {
    }
}
Comment 1 Jim Hugunin CLA 2003-04-10 14:08:56 EDT
This is correct compiler behavior, but absolutely horrible error handling.  
This is being listed as a P3 bug but will hopefully be fixed for 1.1 anyway.

You should only be able to pass files compiled with -noweave as an input to -
injars.  This test is only enforced for code that contains aspects or was 
actually woven into.

The expected model is to provide aspect libraries using the -aspectpath 
option.  This way you can ensure that the aspect library code will not be 
modified by any weaving process and the same binary library can be used for 
weaving with multiple targets.  I'd recommend a process such as:

ajc -outjar tracing.jar TraceAspect.java
ajc -aspectpath tracing.jar Test.java


Comment 2 Jim Hugunin CLA 2003-04-27 18:56:50 EDT
fixed in tree, and test in new/options11

This now produces a nice error message instead of an exception.