| Hi!   An 
optimization of if(false) is just what I submitted to Bugzilla today (FastMatch) 
so it's a bit coincidental that this is coming up right today cause I was 
thinking about the very same problem today.   I 
have seen that the use of "somePointcut() && if(false)" is a commonly 
used idiom in order to deactivate certain code for debugging etc. Thus if(false) 
should be considered separately and should not generate a dynamic "check" at 
all. That's what my small patch leads to. So something like   declare warning : if(false) : "somewarning";    will 
now not issue any warning any more - before it did, because every time check was 
deferred to runtime.   Another question might be something like "somepointcut() 
&& if(A_FINAL_FIELD)". I think this should also be allowed in a declare. 
However every other if-check should be forbidden in my eyes.   A 
Possible enhancement would be to check the method passes to "if" if it is 
completely sideffect-free. If it is, one could also allow such a method be used 
in an "if". However that employs a more sophisticated analysis of 
course.   So 
in general I would vote for Ron's suggestion, too.   Eric   --Eric Bodden
 RWTH Aachen University
 ICQ UIN: 
12656220
 Website: http://www.bodden.de
 PGP key: http://www.bodden.de/pub_key.asc
 
 
   
 
  
  
  It seems to me that it would be more useful to produce 3 kinds of results 
  when matching declare warning/error at a given shadow:   1) never matches 2) always matches - emit warning/error 3) possible match - emit warning, possible warning/error: output of declare 
  .. this is the case where there is a dynamic check (I won't say anything 
  about residue!)   Today users often write dummy advice to get the AJ tools to determine 
  possible matches of dynamic PCDs (to find the shadow). Why not allow 
  dynamic pointcuts but warn that it's only a possible match?   This strategy also allows for incremental improvement over time (e.g., if 
  the weaver optimizes if(false) to never match).   Ron Bodkin Chief Technology Officer New Aspects of Software m: (415) 509-2895     
    ------------Original Message------------ From: "Gregor Kiczales" <gregor@xxxxxxxxx> To: <aspectj-dev@xxxxxxxxxxx> Date: Mon, Feb-23-2004 9:45 AM Subject: RE: [aspectj-dev] Use of non-statically resolvable pointcut 
    designators in declare error/warning. I 
    agree.   The circumstances under which a dynamic pointcut can be statically 
    resolved are too subtle to have that be an explicit part of the language, at 
    least for now.     
      
      
      
      In the 1.0 
      language design we decided that you could only use statically resolvable 
      pcds in declare eow statements.  It’s possible that this didn’t make 
      it into the docs, but this was a clear part of the language design for 
      1.0.   The 1.0 version 
      of ajc would detect any use of if, cflow, this, target or args for a 
      declare eow and produce a compile time error.  Apparently, when we 
      did the re-write for 1.1, we neglected to include this error 
      check.   I think that for 
      1.2 we should restore the simple error check of 1.0 that forbids the use 
      of these non-statically resolvable pcds.  This might break some 
      existing programs that are “getting away with it”, but that seems a small 
      price to pay for keeping this simple and understandable rule about what 
      can and can’t be used in declare eow.  Any programs that might break 
      will do so in a clear and unambiguous way with this new error message, so 
      it won’t cause any subtle problems for people.   If you decide to 
      allow the special cases where this, target and args ARE statically 
      determinable you’ll have to go through the implementation and make sure 
      that’s what you’re doing.  The current implementation was not 
      designed to support this because I had assumed that the original test from 
      1.1 prohibiting any use of these pcds in declare eow was in 
      place.   BTW – dynamic 
      residue is a term used for the implementation of AspectJ.  It’s used 
      in Erik’s and my implementation paper.  I think it does a great job 
      of describing the runtime tests that can be left over when weaving join 
      point shadows in the implementation.  This term was never intended 
      for user-level docs.   -Jim   
      
      
      
 From: 
      aspectj-dev-admin@xxxxxxxxxxx [mailto:aspectj-dev-admin@xxxxxxxxxxx] 
      On Behalf Of Adrian 
      ColyerSent: Monday, 
      February 23, 2004 9:05 AM
 To: 
      aspectj-dev@xxxxxxxxxxx
 Subject: Re: [aspectj-dev] Use of 
      non-statically resolvable pointcut designators in declare 
      error/warning.
   As a 
      follow-up - Andy & I went searching all through our docs looking for 
      the place where we say that you can only use statically evaluable 
      pointcuts in declare eow statements, but I couldn't find it clearly stated 
      anywhere. (I half recall seeing a list that said "You can only use the 
      following pcds..." but if it's there, I couldn't find it).
 
 I think the simplest 
      thing for users to understand is a compilation error if any of this, 
      target, args, cflow, cflowbelow or 'if' are used in the pointcut 
      _expression_ associated with a deow. But, this might break many existing 
      programs that are currently "getting away with it."
 
 The next best option 
      seems to me to be to emit a compiler warning saying that "xxx pcd cannot 
      be used in declare error or warning statements and will be ignored." (And 
      then of course, make sure that we really do ignore it). Given our current 
      position, this is possibly what we should do for 1.2 (leaving us the 
      option to make it an error in 1.3 once programs have been tidied up 
      perhaps?).
 
 Both of these options 
      have the drawback of not supporting some deow tests that would have 
      succumbed to full static evaluation. If that's important enough, we could 
      consider warning only when a non-statically determinable situation occurs 
      - but what I dislike about this option is that this can't be determined 
      when compiling the aspect, but only during shadow matching (which could be 
      at a completely different time if e.g. you are binary weaving).
 
 So I think at the moment 
      I'm leaning towards:=
 1) making the docs 
      clearer about exactly which pcds are supported for deow, and
 2) following a 
      warn-and-ignore strategy for violations of that policy
 
 Open to counter-arguments 
      though...
 
 -- 
      Adrian
 Adrian_Colyer@xxxxxxxxxx
 
 
 
        
        
          |   | Andrew 
            Clement/UK/IBM@IBMGB Sent 
            by: aspectj-dev-admin@xxxxxxxxxxx
 23/02/2004 
            16:16 Please respond to 
            aspectj-dev
 |       
              To:       
             aspectj-dev@xxxxxxxxxxx
 cc:
 Subject:        [aspectj-dev] Use 
            of non-statically resolvable pointcut designators in declare 
            error/warning.
 |  
 
 
 Hi,
 
 I'm looking at a 
      bug on this - and I noticed someone else mailed
 the list on a similar 
      topic earlier today.
 
 Eric 
      Bodden reported a problem with using if() in a declare
 warning/error 
      message.  This was a ClassCastException - which of
 course I'll fix - 
      but it made me think more about what our
 position is on allowing users 
      to use pointcuts that can't
 be 
      wholely resolved at compile time with the declare 
      error/warning
 mechanism.
 
 At the moment, if 
      a pointcut cannot be entirely statically
 evaluated then it 
      will behave as if it has matched and the error
 or warning message 
      will be produced.  I don't think this is
 quite what we 
      want.
 
 However, it is not 
      clear whether we should be flagging an
 error if any of the designators 
      that exhibit this behavior
 are used against declare error/warning or 
      if we should be
 flagging an error/warning if it just the case that the 
      entire
 pointcut cannot be completely resolved statically.  There 
      are
 some designators that *could* lead to runtime tests but might
 not if there is enough static info around.  For example
 target()/this() may or may not create an instanceof test for
 execution at runtime depending on what the compiler can
 determine 
      statically.
 
 So, we have the 
      options:
 
 Error/Warning if 
      we see a declare error/warning statement whose
 pointcut uses any 
      of the designators that *might*
 lead 
      to dynamic residue.
 
 Error/Warning if 
      we see a declare error/warning statement whose
 pointcut cannot be 
      completely statically evaluated.
 
 Any 
      comments?
 Andy.
 ---
 Andy 
      Clement
 AJDT/AspectJ 
      Development
 |