]> source.dussan.org Git - aspectj.git/commitdiff
placeholder readme for 1.2
authoracolyer <acolyer>
Fri, 19 Mar 2004 20:49:58 +0000 (20:49 +0000)
committeracolyer <acolyer>
Fri, 19 Mar 2004 20:49:58 +0000 (20:49 +0000)
docs/dist/doc/README-12.html [new file with mode: 0644]

diff --git a/docs/dist/doc/README-12.html b/docs/dist/doc/README-12.html
new file mode 100644 (file)
index 0000000..7ca9e55
--- /dev/null
@@ -0,0 +1,1542 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html> <head>
+<title>AspectJ 1.1 Readme</title>
+<style type="text/css">
+<!--
+  P   { margin-left:  20px; }
+  PRE { margin-left:  20px; }
+  LI  { margin-left:  20px; }
+  H4  { margin-left:  20px; }
+  H3  { margin-left:  10px; }
+-->
+</style>
+</head>
+
+<body>
+<div align="right"><small>
+&copy; Copyright 2002 Palo Alto Research Center, Incorporated,
+2003 Contributors.
+All rights reserved.
+</small></div>
+
+
+<h1>AspectJ 1.2 Readme</h1>
+
+<i> content to be replaced </i>
+
+
+<p> This is the initial release of AspectJ 1.1.  It includes a small
+number of new language features as well as major improvements to the
+functionality of the tools.   </p>
+
+<p>
+This document describes the differences between
+AspectJ versions 1.1 and 1.0.6.
+Users new to AspectJ need only read
+the <a href="progguide/index.html">AspectJ Programming Guide</a>
+since it describes the 1.1 language.
+Users familiar with AspectJ 1.0 may find this document
+a quicker way to learn what changed in the language
+and tools, and should use it as a guide for porting
+programs from 1.0 to 1.1.
+</p>
+
+<p>This document first summarizes changes from the 1.0 release in
+</p>
+
+<ul>
+  <li><a href="#language">the language</a>,</li>
+  <li><a href="#compiler">the compiler</a>,</li>
+  <li><a href="#tools">the support tools</a>,</li>
+  <li><a href="#runtime">the runtime</a>,</li>
+  <li><a href="#devenv">the development environment support</a>,</li>
+  <li><a href="#sources">the sources</a>, and</li> 
+  <li><a href="#distribution">the distribution</a>,</li>
+</ul>
+
+<p> then <a href="#details">details</a> some of the language 
+    and compiler changes,
+    and finally points readers to the bug database for any
+    <a href="#knownLimitations">known limitations</a>.
+</p>
+
+<!-- ============================== -->
+<hr>
+<h2><a name="language">The Language</a></h2>
+
+  <p> AspectJ 1.1 is a slightly different language than AspectJ 1.0.
+  In all but a few cases, programs written in AspectJ 1.0 should
+  compile correctly in AspectJ 1.1.  In many cases, there are
+  new or preferred forms in AspectJ 1.1.  However, some AspectJ 1.0
+  features have changed in 1.1, so some 1.0 programs
+  will not compile or will run differently in 1.1.
+  The corresponding features are marked below as compile-time 
+  or run-time incompatible (<em>CTI</em> or <em>RTI</em>, respectively).
+  When the language change involves a move in the static shadow effective
+  at run-time but also apparent at compile-time (e.g., in declare
+  error or warning statements), it is marked <em>CRTI</em>.
+  Programs using run-time incompatible forms should be verified that 
+  they are behaving as expected in 1.1.
+  </p>
+
+  <p>
+  Most changes to the language are additions to expressibility
+  requested by our users:
+  </p>
+
+  <ul>
+    <li><a href="#THROWS_PATTERN">Matching based on throws</a>: You can
+    now make finer discriminations between methods based on declared
+    exceptions. </li>
+
+    <li><a href="#NEW_PCDS">New kinded pointcut designators</a>: Now
+    every kind of join point has a corresponding kinded pointcut
+    designator. </li>
+  </ul>
+
+  <p> Some are have different behavior in edge cases but offer
+  improved power and clarity: </p>
+
+  <ul>
+    <li><a href="#ASPECT_PRECEDENCE">New aspect precedence form</a>:
+    AspectJ 1.1 has a new declare form, <code>declare
+    precedence</code>, that replaces the "dominates"
+    clause on aspects.  (<em>CTI</em>) </li>
+
+    <li>The order of <a href="#SUPER_IFACE_INITS">initialization join
+    points for super-interfaces</a> has been clarified. (<em>RTI</em>) </li>
+  </ul>
+
+  <p> But in order to support weaving into bytecode effectively,
+  several incompatible changes had to be made to the language: </p>
+
+  <ul>
+    <li>A class's default constructor may
+    <a href="#DEFAULT_CONSTRUCTOR_CONFLICT">conflict</a> with an
+    inter-type constructor. (<em>CTI</em>) </li>
+
+    <li><a href="#NO_CALLEE_SIDE_CALL">No callee-side call join
+    points</a>: The AspectJ 1.1 compiler does not expose call join
+    points unless it is given the calling code. (<em>CRTI</em>) </li>
+         
+    <li><a href="#SINGLE_INTERCLASS_TARGET">One target for intertype
+    declarations</a>. (<em>CTI</em>) </li>
+
+    <li><a href="#UNAVAILABLE_JOIN_POINTS">No initializer execution join
+    points</a>. (<em>RTI</em>)</li>
+
+    <li><a href="#AFTER_HANDLER">No after or around advice on handler 
+       join points</a>. (<em>CTI</em>) </li>
+
+    <li><a href="#CONSTRUCTOR_EXECUTION_IS_BIGGER">Initializers run
+    inside constructor execution join points</a>.  (<em>RTI</em>)</li>
+
+    <li><a href="#INTER_TYPE_FIELD_INITIALIZERS">inter-type field
+    initializers</a> run before class-local field initializers. (<em>RTI</em>) </li>
+
+    <li><a href="#WITHIN_MEMBER_TYPES">Small limitations of the within
+    pointcut.</a> (<em>CRTI</em>)</li>
+
+    <li><a href="#WITHIN_CODE">Small limitations of the withincode
+    pointcut.</a> (<em>CRTI</em>)</li>
+
+    <li><a href="#INSTANCEOF_ON_WILD">Can't do instanceof matching on
+        type patterns with wildcards</a>. (<em>CTI</em>) </li>
+
+    <li><a href="#NO_SOURCE_COLUMN">SourceLocation.getColumn() is
+        deprecated and will always return 0</a>. (<em>RTI</em>) </li>
+
+    <li>The interaction between aspect instantiation and advice has been
+        <a href="#ASPECT_INSTANTIATION_AND_ADVICE">clarified</a>.  (<em>RTI</em>) </li>
+
+    <li><a href="#STRINGBUFFER">The String + operator is now correctly advised</a>.
+        (<em>CRTI</em>) </li>
+  </ul>
+
+  <p><a name="NEW_LIMITATIONS">There</a> are a couple of language
+  limitations for things that are rarely used that make the
+  implementation simpler, so we have restricted the language accordingly.
+  </p>
+
+  <ul>
+    <li><a href="#VOID_FIELD_SET">Field set join points now have a
+    <code>void</code> return type.</a>  This will require 
+    porting of code that uses the <code>set</code> PCD in conjunction
+    with after-returning or around advice.  (<em>CTI</em>) <p></p></li>
+
+    <li>'declare soft: TYPE: POINTCUT;' - AspectJ 1.1 only 
+    accepts TYPE rather than a TYPE_PATTERN.  
+    This limitation makes declare soft
+    much easier to implement efficiently.  (<em>CTI</em>) <p></p></li>
+
+    <li>Inter-type field declarations only allow a single field per
+    line, i.e. this is now illegal 'int C.field1, D.field2;' This must
+    instead be, 'int C.field1; int D.field2;' (<em>CTI</em>) <p></p></li>
+    
+    <li>We did not implement the handling of more than one
+    <code>..</code> wildcard in args PCD's (rarely encountered in the
+    wild) because we didn't have the time.  This might be available
+    in later releases if there is significant outcry. (<em>CTI</em>) </li>
+    
+  </ul>
+
+  <p>We did not implement the long-awaited <a href="#PER_TYPE">new
+  pertype aspect specifier</a> in this release, but it may well
+  be in a future release.</p>
+  
+
+<!-- ============================== -->
+<hr>
+<h2><a name="compiler">The Compiler</a></h2>
+
+  <p> The compiler for AspectJ 1.1 is different than the compiler for
+  AspectJ 1.0.  While this document describes the differences in the
+  compiler, it's worthwhile noting that much effort has been made to
+  make sure that the interface to ajc 1.1 is, as much as possible, the
+  same as the interface to ajc 1.0.  There are two important changes
+  under the hood, however. </p>
+
+  <p> First, the 1.1 compiler is implemented on top of the
+  open-source Eclipse compiler.  This has two benefits: It allows us
+  to concentrate on the AspectJ extensions to Java and let the Eclipse
+  team worry about making sure the Java edge cases work, and it allows
+  us to piggyback on Eclipse's already mature incremental compilation
+  facilities.  </p>
+
+  <p> Second, ajc now cleanly delineates compilation of source code
+  from assembly (or "weaving") of bytecode.  The compiler still
+  accepts source code, but internally it transforms it into bytecode
+  format before weaving. </p>
+
+  <p> This new architecture, and other changes to the compiler, allows
+  us to implement some features that were defined in the AspectJ 1.0
+  language but not implementable in the 1.1 compiler.  It also makes
+  some new features available: </p>
+
+  <ul>
+    <li><a href="#SOURCEROOT">The -sourceroots option</a> 
+    takes one or more directories, and indicates that all the source
+    files in those directories should be passed to the compiler. </li>
+
+    <li><a href="#BYTECODE_WEAVING">The -injars option</a>
+    takes one or more jar files, and indicates that all the classfiles
+    in the jar files should be woven into.  </li>
+
+    <li><a href="#BINARY_ASPECTS">The -aspectpath option</a>
+     takes one or more jar files, and weaves any aspects in .class form
+     into the sources.</li>
+
+    <li><a href="#OUTJAR">The -outjar option</a> indicates
+    that the result classfiles of compiling and weaving should be placed
+    in the specified jar file. </li>
+
+    <li><a href="#XLINT">The -Xlint option</a> allows control over
+    warnings.</li>
+
+    <li><a href="#OTHER_X_OPTIONS">Various -X options</a> changed.</li>
+
+    <li><a href="#INCREMENTAL">The -incremental option</a> tells the
+    AspectJ 1.1 compiler to recompile only as necessary. </li>
+  </ul>
+
+  <p> Some other features we wanted to support for 1.1, but did not make
+  it into this release: </p>
+
+  <ul>
+    <li><a href="#ERROR_MESSAGES">Error messages will sometimes be scary</a></li>
+    <li><a href="#MESSAGE_CONTEXT">Source code context is not shown
+                for errors and warnings detected during bytecode weaving</a></li>
+  </ul>
+  
+  <p> But some features of the 1.0 compiler are not supported in the
+  1.1 compiler: </p>
+
+  <ul>
+    <li><a href="#NO_SOURCE">The source-related options</a> -preprocess,
+    -usejavac, -nocomment and -workingdir</li>
+
+    <li><a href="#NO_STRICT_LENIENT">The -strict and -lenient options</a>
+    </li>
+
+    <li><a href="#NO_PORTING">The -porting option</a></li>
+
+    <li><a href="#13_REQUIRED">J2SE 1.2 is not supported;
+    J2SE 1.3 or later is required.</a></li>
+  </ul>
+  
+  <p> A short description of the options ajc accepts is available with
+  "<code>ajc -help</code>". 
+  Longer descriptions are available in the 
+  <a href="devguide/ajc-ref.html">Development Environment Guide
+  section on ajc</a>. </p>
+  <p> </p>
+
+
+  <p> Some changes to the implementation are almost entirely
+  internal:
+  </p>
+  
+  <ul>
+    <li>The behavior of the compiler in
+    <a href="#TARGET_TYPES_MADE_PUBLIC">lifting the visibility</a> of
+    the target types of some declares and pointcuts to public has been
+    clarified. </li>
+  </ul>
+
+  <p> Also, it is worth noting that because AspectJ now works on bytecode,
+  it is somewhat sensitive to how different compilers generate
+  bytecode, especially when compiling with and without <a
+  href="#ONE_FOUR_METHOD_SIGNATURES">the -1.4 flag</a>. </p>
+
+  
+
+<!-- ============================== -->
+<hr>
+<h2><a name="tools">Support Tools</a></h2>
+
+  <p>This release includes an Ant task for old-style 1.0 build
+  scripts, a new task for all the new compiler options, and a
+  CompilerAdapter to support running <code>ajc</code> with the Javac
+  task by setting the <code>build.compiler</code> property.  
+  The new task can automatically copy input resources to output
+  and work in incremental mode using a "tag" file.
+  </p>
+
+  <p>This release does not include <code>ajdoc</code>, the
+  documentation tool for AspectJ sources.
+  Ajdoc is deeply dependent on the
+  abstract syntax tree classes from the old compiler, so it needs a
+  bottom-up rewrite. We think it best to use this opportunity to
+  implement more general API's for publishing and rendering static
+  structure. Because those API's are last to settle in the new
+  architecture, and because the compiler itself is a higher priority,
+  we are delaying work on ajdoc until after the 1.1 release.</p>
+
+  <p>AspectJ 1.1 will not include <tt>ajdb</tt>, the AspectJ
+  stand-alone debugger.  It is no longer necessary for two reasons.
+  First, the -XnoInline flag will tell the compiler to generate
+  code without inlining that should work correctly with any Java
+  debugger.  For code generated with inlining enabled, more
+  third-party debuggers are starting to work according to JSR 45,
+  "Debugging support for other languages," which is supported by
+  AspectJ 1.0.  We aim to support JSR-45 in AspectJ 1.1, but 
+  support will not be in the initial release.  Consider using 
+  the -XnoInline flag until support is available.</p>
+
+<!-- ============================== -->
+<hr>
+<h2><a name="runtime">The Runtime Library</a></h2>
+
+  <p>This release has minor additions to the runtime library classes.
+     As with any release, you should compile and run with the runtime
+     library that came with your compiler, and you may run with
+     a later version of the library without recompiling your code.</p>
+
+  <p> In one instance, however, runtime classes behave differently this release.
+  Because the AspectJ 1.1 compiler does its weaving through
+  bytecode, column numbers of source locations are not available.
+  Therefore, <code>thisJoinPoint.getSourceLocation().getColumn()</code>
+  is deprecated and will always return 0. </p>
+
+<!-- ============================== -->
+<hr>
+<h2><a name="devenv">The AJDE Tools</a></h2>
+
+  <p> The AspectJ Browser supports incremental compilation and running
+  programs.  AJDE for JBuilder, AJDE for NetBeans, and AJDE for Emacs 
+are now independent SourceForge projects (to keep their licenses).
+  They use the batch-build mode of the new compiler.  
+  </p>
+
+<!-- ============================== -->
+<hr>
+<h2><a name="sources">The Sources and the Licenses</a></h2>
+
+  <p> The AspectJ tools sources are available under the
+  <a href="http://eclipse.org/legal/cpl-v10.html">Common Public
+  License</a> in the CVS repository
+  at <a href="http://eclipse.org/aspectj">http://eclipse.org/aspectj</a>.
+  For more information, see the FAQ entry on
+    <a href="faq.html#q:buildingsource">building sources</a>.
+  </p>
+
+
+<!-- ============================== -->
+<hr>
+<h2><a name="distribution">The AspectJ distribution</a></h2>
+
+  <p> AspectJ 1.0 had many distributions - for the tools,
+      the documentation, each IDE support package,
+      their respective sources, and the Ant tasks -
+      because they came under different licenses.
+      All of AspectJ 1.1 is licensed under the CPL 1.0,
+         so the tools, Ant tasks, and documentation are all
+      in one distribution available from
+      <a href="http://eclipse.org/aspectj">
+               http://eclipse.org/aspectj</a>.
+To retain their MPL 1.1 license,
+Ajde for
+<a href="http://aspectj4emacs.sourceforge.net/">Emacs</a>,
+<a href="http://aspectj4netbean.sourceforge.net/">NetBeans</a> and
+<a href="http://aspectj4jbuildr.sourceforge.net/">JBuilder</a> 
+are now independent SourceForge projects. </p>
+
+  </p>
+
+
+<!-- ============================== -->
+<hr>
+<hr>
+<h2><a name="details">Details</a> of some language and compiler changes</h2>
+
+  <h3><a name="ASPECT_INSTANTIATION_AND_ADVICE">Aspect Instantiation
+  and Advice</a></h3>
+
+    <p> In AspectJ 1.0.6, we made an effort to hide some complications
+    with Aspect instantiation from the user.  In particular, the
+    following code compiled and ran:
+    </p>
+
+      <PRE>
+      public class Client
+      {
+          public static void main(String[] args) {
+              Client c = new Client();
+          }
+      }
+
+      aspect Watchcall {
+          pointcut myConstructor(): execution(new(..));
+
+          before(): myConstructor() {
+              System.err.println("Entering Constructor");
+          }
+      }
+      </PRE>
+
+    <p> But there's a conceptual problem with this code: The before
+    advice should run before the execution of all constructors in the
+    system.  It must run in the context of an instance of the
+    Watchcall aspect.  The only way to get such an instance is to have
+    Watchcall's default constructor execute.  But before that
+    executes, we need to run the before advice...</p>
+
+    <p> AspectJ 1.0.6 hid this circularity through the ad-hoc
+    mechanism of preventing an aspect's advice from matching join
+    points that were within the aspect's definition, and occurred
+    before the aspect was initialized.  But even in AspectJ 1.0.6,
+    this circularity could be exposed:
+    </p>
+
+      <PRE>
+      public class Client
+      {
+          public static int foo() { return 3; }
+          public static void main(String[] args) {
+              Client c = new Client();
+          }
+      }
+
+      aspect Watchcall {
+          int i = Client.foo();
+          pointcut myConstructor():
+              execution(new(..)) || execution(int foo());
+
+          before(): myConstructor() {
+              System.err.println("Entering Constructor");
+          }
+      }
+      </PRE>
+
+    <p>This program would throw a NullPointerException when run, since
+    Client.foo() was called before the Watchcall instance could be
+    instantiated.  </p>
+
+    <p> In AspectJ 1.1, we have decided that half-hiding the problem
+    just leads to trouble, and so we are no longer silently hiding
+    some join points before aspect initialization.  However, we have
+    provided a better exception than a NullPointerException for this
+    case.  In AspectJ 1.1, both of the above programs will throw
+    org.aspectj.lang.NoAspectBoundException. 
+    </p>
+
+  <h3><a name="THROWS_PATTERN">Matching based on throws</a></h3>
+
+    <p> Type patterns may now be used to pick out methods and
+    constructors based on their throws clauses.  This allows the
+    following two kinds of extremely wildcarded pointcuts: </p>
+
+    <pre>    pointcut throwsMathlike():
+      // each call to a method with a throws clause containing at least
+      // one exception with "Math" in its name.
+      call(* *(..) throws *..*Math*);
+
+    pointcut doesNotThrowMathlike():
+      // each call to a method with a throws clause containing no
+      // exceptions with "Math" in its name.
+      call(* *(..) throws !*..*Math*);
+    </pre>
+
+    <p> The longwinded rules are that a method or constructor pattern
+    can have a "throws clause pattern".  Throws clause patterns look
+    like: </p>
+
+    <pre>    ThrowsClausePattern:
+        ThrowsClausePatternItem ("," ThrowsClausePatternItem)*
+
+    ThrowsClausePatternItem:
+        ["!"] TypeNamePattern
+    </pre>
+
+    <p> A ThrowsClausePattern matches the ThrowsClause of any code
+    member signature. To match, each ThrowsClausePatternItem must
+    match the throws clause of the member in question. If any item
+    doesn't match, then the whole pattern doesn't match. This rule is
+    unchanged from AspectJ 1.0.  </p>
+
+    <p> If a ThrowsClausePatternItem begins with "!", then it matches
+    a particular throws clause if and only if <em>none</em> of the
+    types named in the throws clause is matched by the
+    TypeNamePattern. </p>
+
+    <p> If a ThrowsClausePatternItem does not begin with "!", then it
+    matches a throws clause if and only if <em>any</em> of the types
+    named in the throws clause is matched by the TypeNamePattern.</p>
+
+    <p> These rules are completely backwards compatible with
+    AspectJ 1.0. The rule for "!" matching has one potentially
+    surprising property, in that the two PCD's shown below will have
+    different matching rules. </p>
+
+    <pre>    [1] call(* *(..) throws !IOException)
+    [2] call(* *(..) throws (!IOException))
+
+    void m() throws RuntimeException, IOException {}
+    </pre>
+
+    <p> [1] will NOT match the method m(), because method m's throws
+    clause declares that it throws IOException. [2] WILL match the
+    method m(), because method m's throws clause declares the it
+    throws some exception which does not match IOException,
+    i.e. RuntimeException. </p>
+
+  <h3><a name="NEW_PCDS">New kinded pointcut designators</a></h3>
+
+    <p> AspectJ 1.0 does not provide kinded pointcut designators for
+    two (rarely used) join points: preinitialization (the code that
+    runs before a super constructor call is made) and advice
+    execution.  AspectJ 1.1 does not change the meaning of the join
+    points, but provides two new pointcut designators to pick out
+    these join points, thus making join points and pointcut
+    designators more parallel.  </p>
+
+    <p> <code>adviceexectuion()</code> will pick out advice execution
+    join points.  You will usually want to use <code>adviceexecution()
+    && within(Aspect)</code> to restrict it to only those pieces of
+    advice defined in a particular aspect. <br>
+    <code>preinitialization(<var>ConstructorPattern</var>)</code> will
+    pick out pre-initialization join points where the initialization
+    process is entered through
+    <code><var>ConstructorPattern</var></code>. </p>
+
+  <h3><a name="PER_TYPE">New pertype aspect specifier</a> (not in 1.1)</h3>
+
+    <p>We strongly considered adding a pertype aspect kind to 1.1.
+    This is somewhat motivated by the new
+    <a href="#SINGLE_INTERCLASS_TARGET">restrictions on inter-type
+    declarations<a>.  This is also motivated by many previous request
+    to support a common logging idiom.  Here's what pertype would look
+    like:</p>
+
+    <pre>    /** One instance of this aspect will be created for each class,
+     * interface or aspect in the com.bigboxco packages.
+     */
+    aspect Logger pertype(com.bigboxco..*) {
+        /* This field holds a logger for the class. */
+        Log log;
+
+        /* This advice will run for every public execution defined by
+         * a type for which a Logger aspect has been created, i.e.
+         * any type in com.bigboxco..*
+         */
+        before(): execution(public * *(..)) {
+            log.enterMethod(thisJoinPoint.getSignature().getName());
+        }
+
+        /* We can use a special constructor to initialize the log field */
+        public Logger(Class myType) {
+            this.log = new Log(myType);
+        }
+    }
+
+        /** External code could use aspectOf to get at the log, i.e. */
+        Log l = Logger.aspectOf(com.bigboxco.Foo.class).log;
+    </pre>
+
+    <p>The one open question that we see is how this should interact
+    with inner types.  If a pertype aspect is created for an outer
+    type should advice in that aspect run for join points in inner
+    types?  That is the behavior of the most common uses of this
+    idiom.  </p>
+
+    <p> In any case, this feature will not be in AspectJ 1.1.
+    </p>
+
+  <h3><a name="SINGLE_INTERCLASS_TARGET">One target for intertype
+  declarations</a></h3>
+
+    <p> Intertype declarations (once called "introductions") in
+    AspectJ 1.1 can only have one target type.  So the following code
+    intended to declare that there is a void doStuff() method on all
+    subtypes of Target is not legal AspectJ 1.1 code.
+    </p>
+
+    <pre>    aspect A {
+        public void Target+.doStuff() { ... }
+    }
+    </pre>
+
+    <p> The functionality of "multi-intertype declarations" can be
+    recovered by using a helper interface.
+    </p>
+
+    <pre>    aspect A {
+        private interface MyTarget {}
+        declare parents:  Target+ implements MyTarget;
+        public void MyTarget.doStuff() { ... }
+    }
+    </pre>
+
+    <p> We believe this is better style in AspectJ 1.0 as well, as it
+    makes clear the static type of "this" inside the method body.
+    </p>
+
+    <p> The one piece of functionality that can not be easily
+    recovered is the ability to add static fields to many classes.  We
+    believe that the <a href="#PER_TYPE">pertype proposal</a> provides
+    this functionality in a much more usable form.</p>
+
+  <h3><a name="UNAVAILABLE_JOIN_POINTS">No initializer execution join
+    points</a></h3>
+
+    <p> AspectJ 1.1 does not consider initializer execution a
+    principled join point.  The collection of initializer code (the
+    code that sets fields with initializers and the code in non-static
+    initializer blocks) is something that makes sense only in Java
+    source code, not in Java bytecode.  </p>
+
+  <h3><a name="AFTER_HANDLER"></a>No after or around advice on handler 
+       join points</h3>
+
+    <p> The end of an exception handler is underdetermined in bytecode,
+       so ajc will not implement after or around advice on handler join 
+    points, instead signaling a compile-time error.</p>
+
+  <h3><a name="CONSTRUCTOR_EXECUTION_IS_BIGGER">Initializers run
+    inside constructor execution join points</a></h3>
+
+    <p> The code generated by the initializers in Java source code now
+    runs inside of constructor execution join points.  This changes
+    how before advice runs on constructor execution join points.
+    Consider: </p>
+
+    <pre>    class C {
+        C() { }
+        String id = "identifier"; // this assignment
+                                  // has to happen sometime
+    }
+    aspect A {
+        before(C c) this(c) && execution(C.new()) {
+            System.out.println(c.id.length());
+        }
+    }
+    </pre>
+
+    <p> In AspectJ 1.0, this will print "10", since id is assigned its
+    initial value prior to the before advice's execution.  However, in
+    AspectJ 1.1, this will throw a NullPointerExcception, since "id"
+    does not have a value prior to the before advice's execution.
+    </p>
+
+    <p> Note that the various flavors of after returning advice are
+    unchanged in this respect in AspectJ 1.1.  Also note that this
+    only matters for the execution of constructors that call a
+    super-constructor.  Execution of constructors that call a
+    this-constructor are the same in AspectJ 1.1 as in AspectJ 1.0.
+    </p>
+
+    <p> We believe this difference should be minimal to real programs,
+    since programmers using before advice on constructor execution
+    must always assume incomplete object initialization, since the
+    constructor has not yet run.  </p>
+
+  <h3><a name="INTER_TYPE_FIELD_INITIALIZERS">Inter-type field initializers</a></h3>
+
+    <p> The initializer, if any, of an inter-type field definition runs
+    before the class-local initializers of its target class.  </p>
+
+    <p> In AspectJ 1.0.6, such an initializer would run after the
+    initializers of a class but before the execution of any of its
+    constructor bodies.  As already discussed in the sections about
+    <a href="#UNAVAILABLE_JOIN_POINTS">initializer execution join
+    points</a> and <a href="#CONSTRUCTOR_EXECUTION_IS_BIGGER">constructor
+    execution</a>, the point in code between the initializers of a class
+    and its constructor body is not principled in bytecode.  So we had a
+    choice of running the initializer of an inter-type field definition at
+    the beginning of initialization (i.e., before initializers from
+    the target class) or at the end (i.e., just before its called
+    constructor exits).  We chose the former, having this pattern in mind:
+    </p>
+
+    <PRE>
+    int C.methodCount = 0;
+    before(C c): this(c) &amp;&amp; execution(* *(..)) { c.methodCount++; }
+    </PRE>
+
+    <p> We felt there would be too much surprise if a constructor called a
+    method (thus incrementing the method count) and then the field was
+    reset to zero after the constructor was done. 
+    </p>
+
+  <h3><a name="WITHIN_MEMBER_TYPES">Small limitations of the within
+    pointcut</a></h3>
+
+   <p>Because of the guarantees made (and not made) by the Java
+    classfile format, there are cases where AspectJ 1.1 cannot
+    guarantee that the within pointcut designator will pick out all
+    code that was originally within the source code of a certain
+    type.
+    </p>
+
+    <p> The non-guarantee applies to code inside of anonymous and
+    local types inside member types.  While the within pointcut
+    designator behaves exactly as it did in AspectJ 1.0 when given a
+    package-level type (like C, below), if given a member-type (like
+    C.InsideC, below), it is not guaranteed to capture code in
+    contained local and anonymous types.  For example: </p>
+
+    <pre>    class C {
+        Thread t;
+        class InsideC {
+            void setupOuterThread() {
+                t = new Thread(
+                        new Runnable() {
+                            public void run() {
+                                // join points with code here
+                                // might not be captured by
+                                // within(C.InsideC), but are
+                                // captured by within(C)
+                                System.out.println("hi");
+                            }
+                        });
+            }
+        }
+    }
+    </pre>
+
+    <p> We believe the non-guarantee is small, and we haven't verified
+    that it is a problem in practice.  </p>
+
+  <h3><a name="WITHIN_CODE">Small limitations of the withincode
+    pointcut</a></h3>
+
+    <p>The withincode pointcut has similar issues to those described
+    above for within.  
+    </p>
+
+  <h3><a name="INSTANCEOF_ON_WILD">Can't do instanceof matching on
+        type patterns with wildcard</a></h3>
+
+    <p>The pointcut designators this, target and args specify a
+    dynamic test on their argument.  These tests can not be performed
+    on type patterns with wildcards in them.  The following code that
+    compiled under 1.0 will be an error in AspectJ-1.1:</p>
+
+    <pre>    pointcut oneOfMine(): this(com.bigboxco..*);
+    </pre>
+
+    <p>The only way to implement this kind of matching in a modular
+    way would be to use the reflection API at runtime on the Class of
+    the object.  This would have a very high performance cost and
+    possible security issues.  There are two good work-arounds.  If
+    you control the source or bytecode to the type you want to match
+    then you can use declare parents, i.e.:</p>
+
+    <pre>    private interface OneOfMine {}
+    declare parents: com.bigboxco..* implements OneOfMine;
+    pointcut oneOfMine(): this(OneOfMine);
+    </pre>
+
+    <p>If you want the more dynamic matching and are willing to pay
+    for the performance, then you should use the Java reflection API
+    combined with if.  That would look something like:</p>
+
+    <pre>    pointcut oneOfMine(): this(Object) &&
+        if(classMatches("com.bigboxco..*",
+                        thisJoinPoint.getTarget().getClass()));
+
+    static boolean classMatches(String pattern, Class _class) {
+        if (patternMatches(pattern, _class.getName())) return true;
+        ...
+    }
+    </pre>
+
+    <p>Note: wildcard type matching still works in all other PCD's that
+    match based on static types.  So, you can use
+    'within(com.bigboxco..*+)' to match any code lexically within one
+    of your classes or a subtype thereof.  This is often a good
+    choice.</p>
+    </p>
+
+
+  <h3><a name="NO_SOURCE_COLUMN">SourceLocation.getColumn()</a></h3>
+
+    <p>The Java .class file format contains information about the
+    source file and line numbers of its contents; however, it has no
+    information about source columns.  As a result, we can not
+    effectively support the access of column information in the
+    reflection API.  So, any calls to
+    thisJoinPoint.getSourceLocation().getColumn() will be marked as
+    deprecated by the compiler, and will always return 0.</p>
+
+  <h3><a name="ASPECT_PRECEDENCE">Aspect precedence</a></h3>
+
+    <p> AspectJ 1.1 has a new declare form:
+    </p>
+
+    <pre>    declare precedence ":"  TypePatternList ";"
+    </pre>
+
+    <p> This is used to declare advice ordering constraints on join
+    points.  For example, the constraints that (1) aspects that have
+    Security as part of their name should dominate all other aspects, and
+    (2) the Logging aspect (and any aspect that extends it) should
+    dominate all non-security aspects, can be expressed by: </p>
+
+    <pre>    declare precedence: *..*Security*, Logging+, *;
+    </pre>
+
+    <p> In the TypePatternList, the wildcard * means "any type not matched
+    by another type in the declare precedence".  </p>
+
+    <h4>Various cycles</h4>
+
+      <p> It is an error for any aspect to be matched by more than one
+      TypePattern in a single declare precedence, so: </p>
+
+      <pre>      declare precedence:  A, B, A ;  // error
+      </pre>
+
+      <p> However, multiple declare precedence forms may legally have this
+      kind of circularity.  For example, each of these declare precedence is
+      perfectly legal:
+      </p>
+
+      <pre>      declare precedence: B, A;
+      declare precedence: A, B;
+      </pre>
+
+      <p> And a system in which both constraints are active may also be
+      legal, so long as advice from A and B don't share a join point.  So
+      this is an idiom that can be used to enforce that A and B are strongly
+      independent.  </p>
+
+    <h4>Applies to concrete aspects</h4>
+
+      <p> Consider the following library aspects:
+      </p>
+
+      <pre>      abstract aspect Logging {
+          abstract pointcut logged();
+
+          before(): logged() {
+              System.err.println("thisJoinPoint: " + thisJoinPoint);
+          }
+      }
+
+      aspect MyProfiling {
+          abstract pointcut profiled();
+
+          Object around(): profiled() {
+              long beforeTime = System.currentTimeMillis();
+              try {
+                  return proceed();
+              } finally {
+                  long afterTime = System.currentTimeMillis();
+                  addToProfile(thisJoinPointStaticPart,
+                               afterTime - beforeTime);
+              }
+          }
+          abstract void addToProfile(
+              org.aspectj.JoinPoint.StaticPart jp,
+              long elapsed);
+      }
+      </pre>
+
+      <p> In order to use either aspect, they must be extended with
+      concrete aspects, say, MyLogging and MyProfiling.  In AspectJ
+      1.0, it was not possible to express that Logging's advice (when
+      concerned with the concrete aspect MyLogging) dominated
+      Profiling's advice (when concerned with the concrete aspect
+      MyProfiling) without adding a dominates clause to Logging
+      itself.  In AspectJ 1.1, we can express that constraint with a
+      simple: </p>
+
+      <pre>      declare precedence: MyLogging, MyProfiling;
+      </pre>
+
+    <h4>Changing order of advice for sub-aspects</h4>
+
+      <p> By default, advice in a sub-aspect has more precedence than
+      advice in a super-aspect.  One use of the AspectJ 1.0 dominates
+      form was to change this precedence:
+      </p>
+
+      <pre>      abstract aspect SuperA dominates SubA {
+          pointcut foo(): ... ;
+
+          before(): foo() {
+              // in AspectJ 1.0, runs before the advice in SubA
+              // because of the dominates clause
+          }
+      }
+
+      aspect SubA extends SuperA {
+          before(): foo() {
+              // in AspectJ 1.0, runs after the advice in SuperA
+              // because of the dominates clause
+          }
+      }
+      </pre>
+
+      <p> This no longer works in AspectJ 1.1, since declare precedence only
+      matters for concrete aspects.  Thus, if you want to regain this kind
+      of precedence change, you will need to refactor your aspects.
+      </p>
+
+  <h3><a name="SOURCEROOT">The -sourceroots option</a></h3>
+
+    <p> The AspectJ 1.1 compiler now accepts a -sourceroots option used to
+    pass all .java files in particular directories to the compiler.  It
+    takes either a single directory name, or a list of directory names
+    separated with the CLASSPATH separator character (":" for various
+    Unices, ";" for various Windows). </p>
+
+    <p> So, if you have your project separated into a gui module and a
+    base module, each of which is stored in a directory tree, you might
+    use one of
+    </p>
+
+    <pre>    ajc -sourceroots /myProject/gui:/myProject/base
+    ajc -sourceroots d:\myProject\gui;d:\myProject\base
+    </pre>
+
+    <p> This option may be used in conjunction with lst files, listing
+    .java files on the command line, and the -injars option.
+    </p>
+
+  <h3><a name="BYTECODE_WEAVING">The -injars option</a></h3>
+
+    <p> The AspectJ 1.1 compiler now accepts an -injars option used to
+    pass all .class files in a particular jar file to the compiler.  It
+    takes either a single directory name, or a list of directory names
+    separated with the CLASSPATH separator character (":" for various
+    Unices, ";" for various Windows). </p>
+
+    <p> So, if MyTracing.java defines a trace aspect that you want to
+    apply to all the classes in myBase.jar and myGui.jar, you would use
+    one of: </p>
+
+    <pre>    ajc -injars /bin/myBase.jar:/bin/myGui.jar MyTracing.java
+    ajc -injars d:\bin\myBase.jar;d:\bin\myGui.jar MyTracing.java
+    </pre>
+
+    <p> The class files in the input jars must not have had advice woven
+    into them, since AspectJ enforces the requirement that advice is woven
+    into a particular classfile only once.  So if the classfiles in the
+    jar file are to be created with the ajc compiler (as opposed to a pure
+    Java compiler), they should not be compiled with any non-abstract
+    aspects.  </p>
+
+    <p> This option may be used in conjunction with lst files, listing
+    .java files on the command line, and the -sourceroots option.
+    </p>
+
+  <h3><a name="OUTJAR">The -outjar option</a></h3>
+
+    <p> The -outjar option takes the name of a jar file into which the
+    results of the compilation should be put.  For example:
+
+    <pre>    ajc -injars myBase.jar MyTracing.java -outjar myTracedBase.jar
+    </pre>
+
+    <p> No meta information is placed in the output jar file. </p>
+
+  <h3><a name="INCREMENTAL">Incremental compilation</a></h3>
+
+    <p> The AspectJ 1.1 compiler now supports incremental compilation.
+    When ajc is called with the -incremental option, it must also be
+    passed a -sourceroots option specifying a directory to incrementally
+    compile.  Once the initial compile is done, ajc waits for console
+    input.  Every time it reads a new line (i.e., every time the user
+    hits return) ajc recompiles those input files that need recompiling.
+    </p>
+
+    <h4>Limitations</h4>
+
+    <p> This new functionality is still only lightly tested. </p>
+
+  <h3><a name="XNOWEAVE">-XnoWeave, a compiler option to suppress
+  weaving</a></h3>
+
+    <p> The -XnoWeave option suppresses weaving, and generates
+    classfiles and that can be passed to ajc again (through the
+    -injars option) to generate final, woven classfiles. </p>
+
+    <p> This option was originally envisioned to be the primary way to
+    generate binary aspects that could be linked with other code, and
+    so it was previously (in AspectJ 1.1beta1) named
+    <code>-noweave</code>.  We feel that using the
+    <code><a href="#BINARY_ASPECTS">-aspectpath</a></code> option is a
+    much better option.  There may still be use cases for unwoven
+    classfiles, but we've moved the flag to experimental status.
+    </p>
+
+  <h3><a name="BINARY_ASPECTS">-aspectpath, working with aspects in .class/.jar
+  form</a> </h3>
+
+    <p> When aspects are compiled into classfiles, they include all
+    information necessary for the ajc compiler to weave their advice
+    and deal with their inter-type declarations.  In order for these
+    aspects to have an effect on a compilation process, they must be
+    passed to the compiler on the -aspectpath.  Every .jar file on
+    this path will be searched for aspects and any aspects that are
+    found will be enabled during the compilation.  The binary forms of
+    this aspects will be untouched. </p>
+
+  <h3><a name="NO_CALLEE_SIDE_CALL">Callee-side call join
+  points</a></h3>
+
+    <p> The 1.0 implementation of AspectJ, when given:
+    </p>
+
+    <pre>    class MyRunnable implements Runnable {
+        public void run() { ... }
+    }
+
+    aspect A {
+        call(): (void run()) && target(MyRunnable) {
+            // do something here
+        }
+    }
+    </pre>
+
+    <p> would cause A's advice to execute even when, say, java.lang.Thread
+    called run() on a MyRunnable instance.
+    </p>
+
+    <p> With the new compiler, two things have happened in regard to
+    callee-side calls:
+    </p>
+
+    <ol>
+      <li>because the programmer has access to more code (i.e.,
+       bytecode, not just source code), callee-side calls are much
+       less important to have.</li>
+
+       <li>because compilation is more modular, allowing and
+       encouraging separate compilation, callee-side calls are much
+       more difficult to implement</li>
+    </ol>
+
+    <p> With these two points in mind, advice in an aspect will not be
+    applied to call join points whose call site is completely
+    unavailable to the aspect.  </p>
+
+    <ol>
+      <li>One reason (though not the only reason) we worked so hard in
+       the <em>implementation</em> of 1.0.6 to expose call join
+       points, even if we only had access to the callee's code, was
+       that otherwise users couldn't get access to call join points
+       where the call was made from bytecode.  This is no longer the
+       case.  In short, the implementation controls much more code (or
+       has the capability to) than ever before.</li>
+
+      <li>The implementation model for the AspectJ 1.1 compiler is to
+       separate the compilation of aspects/advice from their
+       weaving/linking.  A property of the model is that the
+       compilation requires no access to "target" code, only the
+       weaving/linking does, and weaving/linking is inherently
+       per-class local: No action at weaving/linking time depends on
+       the coordinated mangling of multiple classfiles.  Rather, all
+       weaving is done on a per classfile basis.  This is an essential
+       property for the current separate compilation model. <br>
+
+       However, allowing implementation of call advice on either
+       side requires simultaneous knowledge of both sides.  If we first
+       have access to a call, we can't decide to simply put the advice
+       on the call site, since later we may decide to implement on the
+       callee.</li>
+    </ol>
+
+    <p>This implementation decision is completely in the letter and
+    the spirit of the AspectJ language.  From the semantics guide
+    describing code the implementation controls:</p>
+
+    <blockquote>
+      But AspectJ implementations are permitted to deviate from this
+      in a well-defined way -- they are permitted to advise only
+      accesses in <em>code the implementation
+      controls</em>.  Each implementation is free within certain
+      bounds to provide its own definition of what it means to control
+      code.
+    </blockquote>
+
+    <p>And about a particular decision about the 1.0.6
+    implementation:</p>
+
+    <blockquote>
+       Different join points have different requirements.  Method call
+       join points can be advised only if ajc controls
+       <em>either</em> the code for the caller or the code
+       for the receiver, and some call pointcut designators may
+       require caller context (what the static type of the receiver
+       is, for example) to pick out join points.
+    </blockquote>
+
+    <p> The 1.1 implementation makes a different design decision:
+    Method call join points can be advised only if ajc (in compiler or
+    linker form) controls the code for the caller. </p>
+    
+    <p>What does 1.1 gain from this?</p>
+
+    <ul>
+      <li>a clear (and implemented) separate compilation model (see
+      point 2, above)</li>
+
+      <li>a less confusing interaction between call join points and
+      the thisJoinPoint reflective object: We still get bug reports
+      about source information sometimes existing and sometimes not
+      existing at call join points.</li>
+    </ul>
+
+    <p> What does 1.1 lose from this?</p>
+
+    <ul>
+      <li>The ability to capture all calls to Runnable.run() from
+      anywhere to code ajc has access too, even from Thread, even if
+      you don't compile java.lang with ajc.</li>
+
+      <li>The ability to, without access to the caller, capture entry to
+      a particular method, but not super calls.</li>
+
+      <li>A code-size-improvement performance optimization.</li>
+    </ul>
+
+    <p> What are the possibilities for the future?</p>
+
+    <ul>
+      <li>AspectJ 1.1.1 could expand its capture of call join points,
+      possibly at the expense of separate compilation clarity,
+      possibly not. </li>
+
+      <li>AspectJ 1.1.1 could re-introduce reception join points from
+      AspectJ 0.7 (what callee-side call join points actually are):
+      though they would never ever be taught in a tutorial or
+      entry-level description of the model, they may have specialized
+      uses.</li>
+    </ul>
+
+    <p> How will this affect developers?</p>
+    <ul>
+               <li>When using the call PCD but only supplying the callee
+            code, supply the calling code or use the execution PCD instead.
+               </li>
+    </ul>
+
+  <h3><a name="OTHER_X_OPTIONS">Various -X options</a></h3>
+
+    <p> The AspectJ 1.0 compiler supported a number of options that
+    started with X, for "experimental".  Some of them will not be
+    supported in 1.1, either because the "experiment" succeeded (in
+    which case it's part of the normal functionality) or failed.
+    Others will be supported as is (or nearly so) in 1.1:
+    </p>
+
+    <ul>
+      <li>-XOcodeSize: This is no longer necessary because inlining
+      of around advice is on by default.  We support its inverse,
+      <a href="#XNOINLINE"><code>-XnoInline</code></a>.
+      </li>
+
+      <li><a href="#XNOWEAVE">-XnoWeave, a compiler option to suppress
+           weaving</a></li>
+
+      <li>-XtargetNearSource: Not supported in this release. </li>
+
+      <li>-XserializableAspects: Supported. </li>
+
+      <li>-XaddSafePrefix: This option will not be supported in 1.1 at
+      all because we're now always using (what we believe to be) safe
+      prefixes. </li>
+
+      <li>-Xlint: Still supported, with <a href="#XLINT">various
+      options</a>. </li>
+    </ul>
+
+  <h3><a name="ERROR_MESSAGES">Some confusing error messages</a></h3>
+
+    <p>Building on the eclipse compiler has given us access to a very
+    sophisticated problem reporting system as well as highly optimized
+    error messages for pure Java code.  Often this leads to noticeably
+    better error messages than from ajc-1.0.6.  However, when we don't
+    handle errors correctly this can sometimes lead to cascading error
+    messages where a single small syntax error will produce dozens of
+    other messages.  Please report any very confusing error messages as
+    bugs.</p>
+
+
+  <h3><a name="MESSAGE_CONTEXT">Source code context is not shown
+                for errors and warnings detected during bytecode weaving</a></h3>
+
+       <p>For compiler errors and warnings detected during bytecode weaving,
+       source code context will not be displayed.  In particular, for declare
+       error and declare warning statements, the compiler now only emits the 
+       file and line.  We are investigating ways to overcome this in cases
+       where the source code is available; in cases where source code is 
+       not available, we might specify the signature of the offending code.
+       For more information, see bug 31724.</p>
+
+
+  <h3><a name="XLINT">The -Xlint option</a></h3>
+
+    <p><code>-Xlint:ignore,error,warning</code> will set the level for
+    all Xlint warnings.  <code>-Xlint</code>, alone, is an
+    abbreviation for <code>-Xlint:warning</code>.</p>
+
+    <p>The <code>-Xlintfile:lint.properties</code> allows fine-grained
+    control.  In tools.jar, see
+    <code>org/aspectj/weaver/XlintDefault.properties</code> for the
+    default behavior and a template to copy. </p>
+
+    <p> More <code>-Xlint</code> warnings are supported now, and
+    we may add disabled warnings in subsequent bug-fix releases of 1.1.    
+    Because the configurability allows users to turn off
+    warnings, we will be able to warn about more potentially
+    dangerous situations, such as the potentially unsafe casts used by
+    very polymorphic uses of proceed in around advice.  </p>
+
+  <h3><a name="NO_SOURCE">Source-specific options</a></h3>
+
+    <p> Because AspectJ 1.1 does not generate source code after
+    weaving, the source-code-specific options -preprocess, -usejavac,
+    -nocomment and -workingdir options are meaningless and so not
+    supported.  </p>
+
+  <h3><a name="NO_STRICT_LENIENT">The -strict and -lenient
+  options</a></h3>
+
+    <p> Because AspectJ 1.1 uses the Eclipse compiler, which has its
+    own mechanism for changing strictness, we no longer support the
+    -strict and -lenient options. </p>
+
+  <h3><a name="NO_PORTING">The -porting option</a></h3>
+
+    <p> AspectJ 1.1 does not have a -porting option.</p>
+
+  <h3><a name="13_REQUIRED">J2SE 1.3 required</a></h3>
+
+    <p>Because we build on Eclipse, the compiler will no longer run
+    under J2SE 1.2.  You must run the compiler (and all tools based on
+    the compiler) using J2SE 1.3 or later. The code generated by the
+    compiler can still run on Java 1.1 or later VM's if compiled against
+    the correct runtime libraries.</p>
+
+  <h3><a name="DEFAULT_CONSTRUCTOR_CONFLICT">Default
+  constructors</a></h3>
+
+    <p> AspectJ 1.1 does not allow the inter-type definition of a
+    zero-argument constructor on a class with a visible default
+    constructor.  So this is no longer allowed: </p>
+
+    <PRE>
+    class C {}
+
+    aspect A {
+        C.new() {}  // was allowed in 1.0.6
+                    // is a "multiple definitions" conflict in 1.1
+    }
+    </PRE>
+
+    <p> In the Java Programming Language, a class defined without a
+    constructor actually has a "default" constructor that takes no
+    arguments and just calls <code>super()</code>.  </p>
+
+    <p> This default constructor is a member of the class like any other
+    member, and can be referenced by other classes, and has code generated
+    for it in classfiles.  Therefore, it was an oversight that AspectJ
+    1.0.6 allowed such an "overriding" inter-type constructor definition.
+    </p>
+
+  <h3><a name="SUPER_IFACE_INITS">Initialization join points for
+    super-interfaces</a></h3>
+
+    <p> In AspectJ, interfaces may have non-static members due to
+    inter-type declarations.  Because of this, the semantics of AspectJ
+    defines the order that initializer code for interfaces is run.  
+    </p>
+
+    <p> In the semantics document for AspectJ 1.0.6, the following
+    promises were made about the order of this initialization:
+    </p>
+
+    <ol>
+      <li>a supertype is initialized before a subtype</li>
+      <li>initialized code runs only once</li>
+      <li>initializers for supertypes run in left-to-right order</li>
+    </ol>
+
+    <p> The first two properties are important and are preserved in
+    AspectJ 1.1, but the third property is and was ludicrous, and was
+    never properly implemented (and never could be) in AspectJ 1.0.6.
+    Consider: </p>
+
+    <PRE>
+    interface Top0 {}
+    interface Top1 {}
+    interface I extends Top0, Top1 {} 
+    interface J extends Top1, Top0 {}
+
+    class C implements I, J {}
+    // I says Top0's inits must run before Top1's
+    // J says Top1's inits must run before Top0's
+
+    aspect A {
+        int Top0.i = foo("I'm in Top0");
+        int Top1.i = foo("I'm in Top1");
+        static int foo(String s) {
+            System.out.println(s);
+            return 37;
+        }
+    }
+    </PRE>
+
+    <p> This was simply a bug in the AspectJ specification.  The correct
+    third rule is:
+    </p>
+
+    <blockquote>the initializers for a type's superclass are run before the
+    initializers for its superinterfaces.
+    </blockquote>
+
+
+  <h3><a name="VOID_FIELD_SET">Field Set Join Points</a></h3>
+
+    <p> In AspectJ 1.0.6, the join point for setting a field F had, as a
+    return type, F's type.  This was "java compatible" because
+    field assignment in java, such as "Foo.i = 37", is in fact an
+    expression, and does in fact return a value, the value that the
+    field is assigned to.
+    </p>
+
+    <p> This was never "java programmer compatible", however, largely
+    because programmers have absorbed the good style of rarely using an
+    assignment statement in a value context.  Programmers typically expect
+    "Foo.i = 37" not to return a value, but to simply assign a value. </p>
+
+    <p> Thus, programmers typically wanted to write something like:
+    </p>
+
+    <PRE>
+    void around(): set(int Foo.i) {
+        if (theSetIsAllowed()) {
+            proceed();
+        }
+    }
+    </PRE>
+
+    <p> And were confused by it being a compile-time error.  They weren't
+    confused for long, and soon adapted to writing:
+    </p>    
+
+    <PRE>
+    int around(): set(int Foo.i) {
+        if (theSetIsAllowed()) {
+            return proceed();
+        } else {
+            return Foo.i;
+        }
+    }
+    </PRE>
+
+    <p> But there was definitely a short disconnect.  </p>
+
+    <p> On top of that, we were never shown a convincing use-case for
+    returning an interesting value from a set join point.  When we
+    revisited this issue, in fact, we realized we had a long-standing bug
+    in 1.0.6 dealing with the return value of pre-increment expressions
+    (such as ++Foo.i) that nobody had found because nobody cares about the
+    return value of such join points. 
+    </p>
+
+    <p> So, because it's easier to implement, and because we believe that
+    this is the last possibility to make the semantics more useful, we
+    have made set join points have a void return type in 1.1. </p>
+
+  <h3><a name="XNOINLINE">The -XnoInline Option</a></h3>
+
+    <p> The <code>-XnoInline</code>
+    option to indicate that no inlining of any kind should be done.  This
+    is purely a compiler pragma:  No program semantics (apart from stack
+    traces) will be changed by the presence or absence of this option. 
+    </p>
+
+  <h3><a name="TARGET_TYPES_MADE_PUBLIC">Target types made
+  public</a></h3>
+
+    <p> Even in 1.0.6, the AspectJ compiler has occasionally needed to
+    convert the visibility of a package-level class to a public one.  This
+    was previously done in an ad-hoc basis that took whole-program
+    analysis into account.  With the incremental compilation model of
+    AspectJ 1.1, we can now specify the occasions when the compiler makes
+    these visibility changes.
+    </p>
+
+    <p> In particular, the types used in the <code>this</code>,
+    <code>target</code>, and <code>args</code> pointcuts are made public,
+    as are the super-types from <code>declare parents</code> and the
+    exception type from <code>declare soft</code>. 
+    </p> 
+
+    <p> We believe the visibility changes could be avoided in the future
+    with various implementation tricks if they become a serious
+    concern, but did not encounter them as such a concern when they were
+    done in the 1.0.6 implementation.  </p>
+
+<h3><a name="STRINGBUFFER">String + now advised</a></h3>
+
+<p> In Java, the + operator sometimes results in StringBuffer objects
+being created, appended to, and used to generate a new String.  Thus, 
+</p>
+
+<PRE>
+class Foo {
+    String makeEmphatic(String s) {
+        return s + "!";
+    }
+}
+</PRE>
+
+<p> is approximately the same at runtime as
+</p>
+
+<PRE>
+class Foo {
+    String makeEmphatic(String s) {
+        return new StringBuffer(s).append("!").toString();
+    }
+}
+</PRE>
+
+
+<p> In the design process of AspectJ 1.0.6 we didn't expose those
+StringBuffer methods and constructors as join points (though we did
+discuss it), but in 1.1 we do.  </p>
+
+<p> This change is likely to affect highly wildcarded aspects, and can
+do so in surprising ways.  In particular:
+</p>
+
+<PRE>
+class A {
+    before(int i): call(* *(int)) &amp;&amp; args(i) {
+        System.err.println("entering with " + i);
+    }
+}
+</PRE>
+
+<p> may result in a stack overflow error, since the argument to
+println is really </p>
+
+<PRE>
+new StringBuffer("entering with ").append(i).toString()
+</PRE>
+
+<p> which has a call to StringBuffer.append(int).  In such cases, it's
+worth restricting your pointcut, with something like one of:
+</p>
+
+<PRE>
+call(* *(int)) &amp;&amp; args(i) &amp;&amp; !within(A)
+call(* *(int)) &amp;&amp; args(i) &amp;&amp; !target(StringBuffer)
+</PRE>
+
+<h3><a name="ONE_FOUR_METHOD_SIGNATURES">The -1.4 flag and method signatures</a></h3>
+
+<p> Consider the following aspect
+</p>
+
+<PRE>
+public aspect SwingCalls {
+    
+    pointcut callingAnySwing(): call(* javax.swing..*+.*(..));
+
+    before(): callingAnySwing() {
+        System.out.println("Calling any Swing");
+    }
+}
+</PRE>
+
+<p> And then consider the two statements
+</p>
+
+<PRE>
+  JFrame frame = new JFrame();
+  frame.setTitle("Title");
+</PRE>
+
+<p> According to the Java Language Specification version 2, the call
+to <code>frame.setTitle("Title")</code> should always produce the
+bytecode for a call to <code>javax.swing.JFrame.setTitle</code>.
+However, older compilers (and eclipse when run without the
+<code>-1.4</code> flag) will generate the bytecode for a call to
+<code>java.awt.Frame.setTitle</code> instead since this method is not
+overriden by JFrame.  The AspectJ weaver depends on the correctly
+generated bytecode in order to match patterns like the one you show
+correctly.  </p>
+
+<p> This is a good example of why the pattern <code>call(* *(..)) &&
+target(JFrame)</code> is the recommended style.  In general, OO
+programmers don't want to care about the static type of an object at a
+call site, but only want to know the dynamic instanceof behavior which
+is what the target matching will handle.  </p>
+
+
+<h2><a name="knownLimitations">Known limitations</a></h2>
+
+<p>The AspectJ 1.1.0 release contains a small number of known limitations
+relative to the AspectJ 1.1 language.  
+For the most up-to-date information about known limitations in an
+AspectJ 1.1 release, see the bug database at 
+  <a href="http://bugs.eclipse.org/bugs">http://bugs.eclipse.org/bugs</a>,
+especially the open bugs for the 
+<a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=Compiler&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED">
+  compiler</a>, 
+<a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=IDE&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED">
+  IDE support</a>,
+<a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=Doc&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED">
+  documentation</a>, and 
+<a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=Ant&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED">
+  Ant tasks</a>.
+Developers should know about bugs marked with the "info" keyword
+because those bugs reflect failures to implement the 1.1 language perfectly.
+These might be fixed during the 1.1 release cycle; find them using the query
+  <a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&keywords=info">
+              http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&keywords=info</a>
+
+For ajc's 1.1 implementation limitations, see 
+  <a href="progguide/implementation.html">
+   Programming Guide Appendix: "Implementation Notes"</a>.
+  
+</p>
+</body> </html>