enum array is not compile time generated?

tsukikage tsukikage at dmail.com
Sat Mar 19 05:35:58 PDT 2011


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


More information about the Digitalmars-d-learn mailing list