digitalmars.D.learn - enum array is not compile time generated?
- tsukikage (96/96) Mar 19 2011 Hi,
- tsukikage (3/3) Mar 19 2011 correction:
- bearophile (4/5) Mar 19 2011 enum is currently very broken. The same happens with associative arrays,...
- tsukikage (2/10) Mar 19 2011
- Jonathan M Davis (11/16) Mar 19 2011 Well, enum works perfectly in that its value doesn't change. It's always...
Hi, I previous expected that the enum A inside foo, or enum B at module level used by baz are immutable compile time generated static array, but by looking at the disassembled source, I found A is constructed every time entering the function in run time. Instaed, static A inside bar is construct at compile time (found at section CRT$XIA), seems to be mutable at run time. Would please someone explain why enum A etc. is constructed at run time? thank you! -------------- import std.stdio ; enum B = [0x1234,0x2222,0x3333,0x4444] ; enum D = [0x9999,0x8888,0x7777,0x6666] ; int foo(int i) { enum A = [0x1111,0x2222,0x3333,0x4444] ; return A[i] ; } int bar(int i) { static A = [0x4444,0x3333,0x2222,0x1111] ; return A[i] ; } int baz(int i) { return B[i] ; } void main() { auto c = baz(2) ; auto b = bar(2) ; auto a = foo(2) ; auto d = D[2] ; writefln("Hey here! %d %d %D", a, b, c, d) ; } -------------- compile with only -release, dmd windows. disassembled: 00402010: enter 00004,000 // baz - module enum 00402014: mov [ebp][-04],eax 00402017: push 000004444 0040201C: push 000003333 00402021: push 000002222 00402026: push 000001111 0040202B: push 004 0040202D: mov ecx,000466080 00402032: push ecx 00402033: call 000408158 00402038: mov edx,[ebp][-04] 0040203B: mov eax,[eax][edx]*4 0040203E: add esp,018 00402041: leave 00402042: retn 00402043: 00402044: enter 00004,000 // bar - static 00402048: push ebx 00402049: mov ecx,fs:[0000002C] 00402050: mov edx,[ecx] 00402052: mov ebx,[edx][00000004] 00402058: mov edx,[edx][00000008] 0040205E: mov eax,[edx][eax]*4 // found THE STATIC ARRAY 00402061: pop ebx // at section CRT$XIA 00402062: leave 00402063: retn 00402064: enter 00004,000 // baz - module enum 00402068: mov [ebp][-04],eax 0040206B: push 000004444 00402070: push 000003333 00402075: push 000002222 0040207A: push 000001234 0040207F: push 004 00402081: mov ecx,000466080 00402086: push ecx 00402087: call 000408158 0040208C: mov edx,[ebp][-04] 0040208F: mov eax,[eax][edx]*4 00402092: add esp,018 00402095: leave 00402096: retn 00402097: 00402098: enter 00008,000 0040209C: mov eax,000000002 004020A1: call 000402064 // baz - moudle enum 004020A6: mov [ebp][-08],eax 004020A9: mov eax,000000002 004020AE: call 000402044 // bar - static 004020B3: mov [ebp][-04],eax 004020B6: mov eax,000000002 004020BB: call 000402010 // foo - function enum 004020C0: mov ecx,000007777 // D[2] hardcoded 004020C5: push d,[004650AC] // other elements of D, eg 0x9999 004020CB: push d,[004650A8] // not found at exe 004020D1: push eax 004020D2: push d,[ebp][-04] 004020D5: push d,[ebp][-08] 004020D8: mov eax,ecx 004020DA: call 0004020E4 004020DF: xor eax,eax 004020E1: leave 004020E2: retn
Mar 19 2011
correction: 00402010: enter 00004,000 // foo - function enum 00402014: mov [ebp][-04],eax
Mar 19 2011
tsukikage:Would please someone explain why enum A etc. is constructed at run time?enum is currently very broken. The same happens with associative arrays, etc. Bye, bearophile
Mar 19 2011
Oh, I see. Thanks. bearophile wrote:tsukikage:Would please someone explain why enum A etc. is constructed at run time?enum is currently very broken. The same happens with associative arrays, etc. Bye, bearophile
Mar 19 2011
On Saturday 19 March 2011 06:02:49 bearophile wrote:tsukikage:Well, enum works perfectly in that its value doesn't change. It's always the same value. The problem is that the way that it's currently implemented is highly inefficient - though the fact that it recreates the value every time would make it so that is failed where you'd expect it to succeed - though arguably that's also an implementation detail. Regardless, enum works fine in the general case, but it's current implementation is inefficient. I expect that it will be fixed at some point, but as with many things, who knows where it is on the TODO list. There's always something more important/critical that needs to be done. - Jonathan M DavisWould please someone explain why enum A etc. is constructed at run time?enum is currently very broken. The same happens with associative arrays, etc.
Mar 19 2011