Den 12-01-2011 20:47, Jonas Maebe skrev:
The weakexternal directive already "defines" a symbol, it will exist at 
runtime, but it might be nil.
What I meant is that there is a semantic difference between referencing a 
symbol that may or may not be defined somewhere else (regardless of whether a 
programmer or the linker creates the referenced symbol), and defining a new 
symbol. This is independent of whether a symbol is weak or not.

Defining a weak symbol also exists, but is not yet supported by FPC. In fact, the example you gave 
would seem more logical to me as follows (assuming that FPC could define "weak" symbols 
using the "weak" modifier):

    procedure IRQHandler; weak;
      begin
        { default dummy implementation, the "NoHandler" from your example }
      end;

    procedure MyIRQHandler; public; alias: 'IRQHandler';
      begin
        { real implementation, overrides the weak definition of IRQHandler; if 
there
          is no such definition, the dummy one is used }
      end;

(and of course, if we'd have a plain "weak" modifier, then "weakexternal;" could be "weak; 
external;", although this is annoying to still change because "weakexternal" support is already in 
released FPC versions)


If you have no control over the original definition and it is not weak (maybe the reason 
you did that is because FPC does not yet support defining weak symbols), then we indeed 
need some way to define weak symbols whose "default value" is something else 
than nil, because I guess wrapping is not good enough (although it's not that bad, since 
it only results in an extra call in the case where the weak symbol is not replaced):

    procedure NoHandler;
      begin
        { dummy implementation }
      end;

    procedure MyIRQHandler; weak;
      begin
        { default behaviour: one extra call }
        NoHandler;
      end;

    { overriding implementation }
    procedure RealIRQHandler; public; alias: 'MyIRQHandler';
      begin
        { real code }
      end;

I can't immediately think of a good syntax to directly define MyIRQHandler as a 
weak symbol with the address of NoHandler as default value. Maybe this, 
although I'm not 100% happy with it either:

    procedure MyIRQHandler; weak 'NoHandler';
Maybe something like instead? Requiring a symbol reference to a matching implementation of a default value, like Paul suggested, would make the solution more Pascal-like

  procedure NoHandler;
    begin
      { dummy implementation }
    end;

  { Declaration NoHandler must exist and match }
  procedure MyIRQHandler; weak NoHandler;

{ This will emit just a weak reference, the same as weakexternal; Not guaranteed to be resolved after compiletime }
  procedure MyIRQHandler2; weak;

This of course just introduces a new keyword weak, which was why I tried to base it off the weakexternal keyword
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to