Problems with Template codegen
kris
foo at bar.com
Sun Feb 4 16:50:02 PST 2007
At this time, D templates are a bit finicky when it comes to argument
matching -- IFTI matching, to be explicit. For example:
# uint locate(T) (T[] source, T match, uint start=0);
#
# locate ("wumpus", 'p', 1);
will not compile because '1' is an integer literal, and does not match
the template parameter 'uint'.
To get around this, template writers will revert to tricks like this one:
# uint locate(T) (T[] source, T match, uint start=0);
#
# uint locate(T, U=uint) (T[] source, T match, U start=0)
# {
# return locate!(T) (source, match, start);
# }
#
# locate ("wumpus", 'p', 1);
See what's going on? There's a stub added, which marshalls (for want of
a better term) the 'int' argument across. This is done to (a) permit
use of both int & uint arguments and (b) to avoid template duplication
for both int and uint types.
So, that's a current shortcoming of IFTI -- but it's one that we hope
will be fixed. Moving onto the primary concern ...
As one would expect, the DM compiler generates code for the stub to
re-push the arguments and call the /real/ implementation. However, in
/all/ cases we really want to eliminate the stub since it is nothing but
a pass-through call; one generated to workaround what seems to be an
IFTI limitation.
Unfortunately, the DM tools will remove the stub /only/ when you use the
-inline switch. This is a very powerful switch, causing all kinds of
inlining to occur -- in some cases, things which many engineers would
balk at. Inline is often just too /big/ a switch to pull.
However, we'd still like darned stubs to be removed from the codegen.
How do we get that to happen?
More information about the Digitalmars-d
mailing list