Re: Re: [Findbugs-core] toward ASM 4.0?

Eric Bruneton <[email protected]>
Newsgroups gmane.comp.java.objectweb.asm
Message-ID <[email protected]>
Rémi Forax wrote:
> I wonder if it's not better to create a special package "compat"
> with the abstract classes implementing the already existing interfaces.
> This will let users decide if they want the ability to use several
> version of visitors or not.

being able to use several versions of visitors is only a "by product" of 
the fact that we want to ensure backward compatibility (which is the 
main goal). Indeed, ensuring backward compatibility means that an old 
visitor written by users must still work with recent ClassReader and 
ClassWriter implementations. But a visitor + a reader and/or a writer is 
nothing more than a small "transformation" chain. Thus, supporting 
backward compatibility is equivalent to being able to support 
transformation chains with a mix of versions.

> Anyway, as Eric says, it will take times before having an implementation
> of that
> and we should not delay the release of ASM4.

do you think that users cannot wait one month?

> The package compat can be added in a following version, by ex. 4.1.

but it would eventually be removed, yielding yet another incompatible 
change. This contradicts its goal, which is to avoid incompatible 
changes in the future!

> On 08/19/2011 06:36 PM, Eric Bruneton wrote:
>> So far, I assumed that when a method signature is changed, i.e. when
>> we have several versions of a method in FooVisitor, users will
>> override *at most one* of these methods, the one corresponding to the
>> version declared in the FooVisitor constructor. It is easy to see
>> that, if this hypothesis is not respected, unexpected behavior can occur.
>>
>> And it is easy to arrive in such a situation without noticing it. It
>> suffice to have a subclass B of a class A itself extending FooVisitor:
>>
>> in version X we have:
>>
>> class A extends FooVisitor {
>> A(FooVisitor next) { super(V_X, next); }
>> void visitBar(int i) { ... behavior A ... }
>> ...
>> }
>>
>> class B extends A {
>> B(FooVisitor next) { super(next); }
>> void visitBar(int i) { ... behavior B ... }
>> }
>>
>> now suppose that A is provided by some library, and B by another (for
>> instance A is provided by ASM itself, e.g, it is a asm.commons
>> component, while B is provided by the user; or A is provided by
>> FindBugs, and B is provided by a 3rd party detector). At some time, A
>> is upgraded to version Y, but not B. Then we get:
>>
>> class A extends FooVisitor {
>> A(FooVisitor next) { super(V_Y, next); }
>> void visitBar(int i, int j) { ... behavior A ... }
>> ...
>> }
>>
>> and now B overrides both versions of visitBar, with different
>> behaviors in each version! Additionally, its version is wrongly

if we do not detect these situations, B will fail with ASM Y. If, on the 
other hand, we detect them, an exception will be thrown when trying to 
instantiate B. In both cases B is no longer usable.

In fact it is possible to do better. When can write version Y of A a bit 
differently so that B can still work with ASM Y, on classes that do not 
use the new features introduced in version Y:

class A extends FooVisitor {
     ...
     void visitBar(int i, int j) {
         if (version < V_Y) {
             super.visitBar(i, j);
         } else {
             ... behavior A ...
         }
     }
     ...
}

but in this case the fact that B will override both versions of visitBar 
(via inheritance) is no longer a problem, and so we must not throw an 
exception in these cases. Instead, we must hope that users will follow 
the above rule (that we can document) in their code.

Eric
message-footer.txt (text/plain, 238 B)
-- 
You receive this message as a subscriber of the [email protected] mailing list.
To unsubscribe: mailto:[email protected]
For general help: mailto:[email protected]?subject=help
OW2 mailing lists service home page: http://www.ow2.org/wws
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.