On Wed, 09 May 2012 11:00:01 -0700, Jonathan M Davis <[email protected]> wrote:

On Wednesday, May 09, 2012 10:41:31 Adam Wilson wrote:
On Wed, 09 May 2012 10:19:08 -0700, Jonathan M Davis <[email protected]>

wrote:
> On Wednesday, May 09, 2012 10:05:36 Adam Wilson wrote:
>> On Wed, 09 May 2012 08:58:56 -0700, Nicolas Sicard <[email protected]>
>>
>> wrote:
>> > On Wednesday, 9 May 2012 at 14:30:33 UTC, Andrei Alexandrescu wrote: >> http://www.reddit.com/r/programming/comments/telhj/voldemort_types_in_d/
>>
>> >> Andrei
>> >
>> > One drawback of Voldemort types, is that they are incompatible with
>>
>> the
>>
>> > generation of .di files (option -H).
>> >
>> > See http://d.puremagic.com/issues/show_bug.cgi?id=5461.
>> >
>> > Nicolas
>>
>> This pull fixes this problem and a bunch of others:
>> https://github.com/D-Programming-Language/dmd/pull/928. However, it
>> currently fails to build on Linux and fails the unittests on Windows
>> thanks to a problem with the dur template function in std.datetime. The
>> solution used by this pull is to include the function body of the
>> auto-function as that was needed to allow Phobos to build correctly
>> using
>> the DRT DI files. This is the only workable solution as DMD does not
>> know
>> the type of an auto-function when DI files are generated. No semantic
>> analysis has been performed and since semantic analysis could change the
>> layout of a module you wouldn't want it to be
>> performed.
>
> Actually, dur is in core.time (which is publicly imported by
> std.datetime),
> but regardless, what's wrong with it? It's incredibly straightforward.
>
> - Jonathan M Davis

All of this is a result of using the above mentioned 928 pull.

This from core.time.d:
Duration dur(string units)(long length) @safe pure nothrow
if(units == "weeks" ||
units == "days" ||
units == "hours" ||
units == "minutes" ||
units == "seconds" ||
units == "msecs" ||
units == "usecs" ||
units == "hnsecs" ||
units == "nsecs")
{
return Duration(convert!(units, "hnsecs")(length));
}

Gets translated to this in core.time.di:
template dur(string units) if (units == "weeks" || units == "days" ||
units == "hours" || units == "minutes" || units == "seconds" || units ==
"msecs" || units == "usecs" || units == "hnsecs" || units == "nsecs")
{
pure nothrow @safe Duration dur(long length)
{
return Duration(convert!(units,"hnsecs")(length));
}
}

Which results in this error from DMD (HEAD):
../druntime/import/core/time.di(218): Error: this cannot be interpreted at
compile time, because it has no available source code
std/net/curl.d(187): called from here: dur(2L)
make[1]: *** [generated/linux/release/32/libphobos2.a] Error 1
make: *** [release] Error 2

But DMD, there *IS* source code to read! Even if it is just a function
call...

Note the above D->DI translation is the same without the patch, I checked
on a vanilla DMD 2.059 install. Also, I don't know near enough about
core.time to begin to guess what D is whining about here... It all looks
good to me.

Line 187 of std.net.curl is an enum:

private enum _defaultDataTimeout = dur!"minutes"(2);

So, dur!"minutes(2) will be evaluated at compile time. That means that the
_full_ source of everything that's needed for dur!"minutes"(2) must be
available. At minimum, that's going to be Duration's source code (including
the full source for its constructor) and the source of convert.

Duration's constructor is quite straightforward, so as long as its full body is included, you should be fine. convert requires the source of hnsecsPer in addition to its own source, but hnsecsPer doesn't rely on anything else and both of those are templates, so their full source should be in the .di file
anyway.

So, I would think that as long as the basic declaration for Duration is
available along with the full source for Duration's constructor,
std.time.convert, and std.time.hnsecsPer is available, then CTFE should be able to evaluate dur!"minutes"(2), and std.curl.net should be fine. So, if any of that source is being stripped out, then there's your problem. If it's all
there, then I don't know what's wrong. Maybe there's another function in
Duration that got stripped when it was needed (though I don't know what else in Duration besides the constructor would be required for dur!"minutes"(2) to
be evaluated).

Personally, I think that the fact that CTFE requires the full source to work is a prime example of why .di files tend to be a very bad idea, but you can still strip at least some of it for at least stuff that wouldn't be used in
CTFE.

- Jonathan M Davis

Nuts. It's CTFE. Because the implementation source is being stripped out, that was *THE* main request of DI files and they are pointless without that.

Essentially DI files and CTFE are mutually exclusive.

I would say that Phobos' usage of CTFE breaks the cardinal rule of external code, never assume that it will always be available and won't change.

I'll be posting a larger message on the main forums about this ... It's a big issue.

--
Adam Wilson
IRC: LightBender
Project Coordinator
The Horizon Project
http://www.thehorizonproject.org/

Reply via email to