Den 12-01-2011 23:18, Jonas Maebe skrev:
On 12 Jan 2011, at 22:54, Jeppe Johansen wrote:
Den 12-01-2011 20:47, Jonas Maebe skrev:
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;
The type checking will have to be delayed, since you can only compare the 
procdef types after the entire second declaration has been parsed (there could 
e.g. still be calling convention modifiers after that).
Okay. Do you have any tip on where the best place to compare them would be? The initial proposal did it in read_proc, but if the implementation of the procedure comes after, this probably wouldn't be the right place to do it
  { 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
This second example cannot be the same as "weakexternal". Just like a regular "external" 
declaration does not generate any data, code or reference by itself, a "weakexternal" declaration does not do 
so either. external/weakexternal are simply Pascal-level aliases that can be used to refer to non-Pascal external 
symbols, a bit like "absolute" can be used for Pascal symbols.

I don't think that "procedure MyIRQHandler2; weak;" without any implementation should be allowed. 
It would create a weak symbol in the middle of nowhere, not associated with any particular code or data (and 
hence probably merged by the linker with the next symbol in the section). It would be the same as allowing 
"procedure MyIRQHandler2;" without any code or "(weak)external".
The following is allowed currently, even if no Test symbol exists in the linked objects. The declaration doesn't emit anything, except for a .weak Test assembler directive if it's used. If Test is not used, nothing will be emitted

   procedure Test; weakexternal;

   procedure SomeOtherFunction;
   begin
      Test;
   end.

But I think you're right, that it would make a lot of sense not to allow it
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to