dmd 2.029 release

Don nospam at nospam.com
Tue Apr 21 08:39:15 PDT 2009


Don wrote:
> bearophile wrote:
>> I have also tested the semantics of nested function purity:
>>
>> import std.c.stdio: printf;
>> import std.conv: to;
>>
>> pure int double_sqr(int x) {
>>     pure int sqr(int y) { return y * y; }
>>     return sqr(x) + sqr(x);
>> }
>>
>> void main(string[] args) {
>>     int x = args.length == 2 ? to!(int)(args[1]) : 10;
>>     int y = double_sqr(x) + double_sqr(x);
>>     printf("4 * x * x = %d\n", y);
>> }
>>
>> Compiled without inlining:
>> -O -release
>>
>> double_sqr.sqr:
>>         mov EAX,4[ESP]
>>         imul    EAX,EAX
>>         ret 4
>>
>> double_sqr:
>> L0:     push    EAX
>>         push    EAX
>>         xor EAX,EAX
>>         call    near ptr double_sqr.sqr
>>         push    EAX
>>         sub ESP,4
>>         xor EAX,EAX
>>         push    dword ptr 8[ESP]
>>         call    near ptr double_sqr.sqr
>>         add ESP,4
>>         mov ECX,EAX
>>         pop EAX
>>         add EAX,ECX
>>         pop ECX
>>         ret
>>
>> main:
>> L0:     push    EAX
>>         cmp dword ptr 8[ESP],2
>>         jne L1D
>>         mov EDX,0Ch[ESP]
>>         mov EAX,8[ESP]
>>         push    dword ptr 0Ch[EDX]
>>         push    dword ptr 8[EDX]
>>         call    near ptr to!(int)()
>>         jmp short   L22
>> L1D:        mov EAX,0Ah
>> L22:        call    near ptr double_sqr
>>         add EAX,EAX
>>         mov ECX,offset FLAT:_DATA
>>         push    EAX
>>         push    ECX
>>         call    near ptr printf
>>
>> There's one call to double_sqr but unfortunately two to double_sqr.sqr.
>>
>> Bye,
>> bearophile
> 
> Yes. Actually, marking a nested function as pure doesn't make much sense.
> It's entirely equivalent to moving it outside the function; a nested 
> pure function shouldn't be able to access any members of the enclosing 
> function, otherwise it's not pure. But DMD doesn't enforce that, and so 
> it creates inefficient and possibly buggy code.

The bug is bugzilla 2807.

> I'm not sure that nested pure member functions should be legal.

And it turns out that sqr() isn't actually pure, in the same way that it 
wasn't nothrow in your first example. The 'pure' marker is silently 
being ignored. If you put the 'pure' at the end, you get bug 2807.

--


More information about the Digitalmars-d-announce mailing list