[SO] Modifing local class instance in pure function
bearophile
bearophileHUGS at lycos.com
Fri Jun 19 11:44:17 PDT 2009
div0:
> Objects are defined to have an identity, so by returning a new object
> from the function you are not getting the same result for the same inputs.
> Does D relax the definition of pure to say a function may return an
> equivalent object?
Interesting question, I have tried the following code with D2:
import std.stdio: writeln;
class C {}
pure C genc() { return new C; }
void main() {
writeln(genc() is genc());
}
The generated asm shows that pure of genc is ignored:
With "pure":
main:
L0: push EBX
mov EAX,offset FLAT:_D5temp31C7__ClassZ
push EAX
call near ptr __d_newclass
add ESP,4
mov ECX,offset FLAT:_D5temp31C7__ClassZ
push EAX
sub ESP,4
push ECX
call near ptr __d_newclass
add ESP,4
add ESP,4
mov EDX,EAX
mov EBX,1
pop EAX
cmp EAX,EDX
je L32
xor EBX,EBX
L32: mov EAX,offset FLAT:_D3std5stdio6stdoutS3std5stdio4File
push EBX
push 0Ah
call near ptr _D3std5stdio4File14__T5writeTbTaZ5writeMFbaZv
xor EAX,EAX
pop EBX
ret
Without "pure":
main:
L0: push EBX
mov EAX,offset FLAT:_D5temp31C7__ClassZ
push EAX
call near ptr __d_newclass
add ESP,4
mov ECX,offset FLAT:_D5temp31C7__ClassZ
push EAX
sub ESP,4
push ECX
call near ptr __d_newclass
add ESP,4
add ESP,4
mov EDX,EAX
mov EBX,1
pop EAX
cmp EAX,EDX
je L32
xor EBX,EBX
L32: mov EAX,offset FLAT:_D3std5stdio6stdoutS3std5stdio4File
push EBX
push 0Ah
call near ptr _D3std5stdio4File14__T5writeTbTaZ5writeMFbaZv
xor EAX,EAX
pop EBX
ret
I don't know what's happening under the hood into dmd here, Don may give a better answer.
Bye,
bearophile
More information about the Digitalmars-d-learn
mailing list