Den 14-02-2011 14:00, Jonas Maebe skrev:
On 14 Feb 2011, at 13:45, Jeppe Johansen wrote:
I did a little change to the patch though. I changed the syntax to be
"weakexternal ['library'] [name 'name'] [default 'initialvalue'];"
since I figured default made more sense than set, in the given
context. I still think using weakexternal makes sense(over adding a
new "weak" keyword), since the meaning and functionality still is the
same
It's not the same.
"weak" (without external) would be a definition, which means that it
would be used in a situation like this:
procedure Test; weak;
begin
writeln('test');
end;
And the compiler would then generate something like this:
.weak Test
Test:
<code for test>
This would however be invalid code:
procedure Test; weak; external; // or "weakexternal" instead of
"weak; external;"
begin
end;
And this would be an incomplete declaration (missing function body):
procedure Test; weak;
That's why it was not a good idea (from me) to introduce
"weakexternal", since "weak" combined with "external" would be the
same (even if "weak" by itself weren't supported immediately).
Furthermore, the whole "default 'initialvalue'" stuff is actually
superfluous, since it basically is already part of the weak(external)
declaration:
procedure Test; weakexternal name 'aliasedTest';
could be defined to generate this:
.weak Test
.set Test,aliasedTest
After all, the above states that references to "Test" should be
treated as weak references to a symbol called "aliasedTest". It would
also be equivalent to what C does. I also don't think it would break
much, if any, existing code that uses "weakexternal" if the semantics
were to be redefined in this way.
Jonas
_______________________________________________
fpc-devel maillist - [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel
Sure, the weak declaration as a procedure directive could be added, and
it would indeed be something different from a weakexternal procedure.
Weakexternal should stay as it is, a procedure declaration directive. I
can see how a "weak" directive could be useful, but I don't need that. I
need a linker directive that points to one of two external functions
The reason weakexternal makes sense is because it's a weak undefined
symbol reference to some external symbol, which - if it doesn't exist -
points to some other external reference. A weak procedure would be
almost the same, you just add the default reference as code explicitly
The problem with weak is that it's tagged onto a piece of code. So in a
case like the one that originally provoked the proposal
procedure EmptyFunc;
begin // Empty function
end;
procedure Func1; weakexternal name 'Func1' default 'EmptyFunc';
procedure Func2; weakexternal name 'Func2' default 'EmptyFunc';
using weak you would need two procedures. This would waste the space
required for the function prologues/epilogues
procedure Func1; weak;
begin //Empty function
end;
procedure Func2; weak;
begin //Another empty function
end;
It's some of the same functionality, but there's still a difference.
It's two different use cases
_______________________________________________
fpc-devel maillist - [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel