This e-mail had a fatal bug!

Anders::dance() obviously needs to be marked FINAL for the inlining to occur :-)

-Andreas

On Jul 26, 2013, at 7:43 PM, Andreas Kling <akl...@apple.com> wrote:

> Hi WebKittens!
> 
> I’m about to re-land <http://webkit.org/b/115977> now that the OS X bots have 
> had their clang installations updated.
> 
> Let me take a moment to explain what FINAL and OVERRIDE do, and how to apply 
> them.
> 
> OVERRIDE is used to decorate virtual methods that override a method inherited 
> from a superclass. This makes the code slightly more self-documenting but 
> more importantly, gives us a compiler warning if there is no superclass 
> method with the same signature. In other words, OVERRIDE protects you from 
> forgetting to update subclasses when changing the signature of a method in a 
> superclass.
> 
> Example of OVERRIDE:
> 
> class Human { 
> public:
>     virtual void eat();
> };
> 
> class Anders : public Human { 
> public:
>     virtual void eat() OVERRIDE;
> };
> 
> If you rename eat() to drink() in “B”, you’ll get a compiler warning:
> huehuehue.cpp:8:15: error: 'drink' marked 'override' but does not override 
> any member functions
> 
> FINAL is used to decorate overridden virtual methods that are known (at 
> compile time) to have no further subclass overrides. This allows the compiler 
> to optimize call sites that operate on specific-enough pointer types to avoid 
> the overhead of virtual dispatch.
> 
> If a subclass is known to never have any subclasses, the whole class can be 
> marked FINAL, which is equivalent to making every overridden function in that 
> class FINAL.
> 
> Example of FINAL:
> 
> class Human { 
> public:
>     virtual void dance();
> };
> 
> class Swede : public Human { 
> public:
>     virtual void dance() OVERRIDE FINAL;
> };
> 
> class Anders : public Swede {
> public:
>     virtual void dance() OVERRIDE { /* No. */ }
> };
> 
> This code will fail with the following error:
> 
> teehee.cpp:15:18: error: declaration of ‘dance' overrides a 'final’ function
> 
> In other words, if Anders really wants to dance differently from other 
> Swedes, you’ll have to remove the FINAL from Swede::dance().
> 
> What happens when we tell Anders to dance?
> 
> Human* man = getHuman();
> man->dance(); // Virtual function call
> 
> Anders* ders = getAnders();
> ders->dance(); // Inlined!
> 
> Because the compiler knows that “ders” is of type Anders, it doesn’t have to 
> do a virtual function call, but can just inline the dance() implementation 
> (or lack thereof) right there.
> 
> Pretty cool right? Giving the compiler this information means that it can 
> generate smaller and faster code wherever we are using tighter pointer types.
> 
> Anyways, that’s pretty much it.
> 
> -Andreas
> 
> PS. Making a whole class FINAL looks like this:
> 
> class Countdown FINAL : public SwedishObject {
> 
> _______________________________________________
> webkit-dev mailing list
> webkit-dev@lists.webkit.org
> https://lists.webkit.org/mailman/listinfo/webkit-dev

_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to