annotate lphobos/std/moduleinit.d @ 117:56a21f3e5d3e trunk

[svn r121] Finished ModuleInfo implementation. Static ctors/dtors now work according to spec. Changed class vtable types slightly in some cases. Overridden functions now always take the the type of the first class declaring the method as this parameter. This helps when using headers (w. implementation somewhere else)
author lindquist
date Mon, 26 Nov 2007 04:49:23 +0100
parents fd7ad91fd713
children 373489eeaf90
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
89
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
1 // Modified for LLVMDC
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
2
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
3 module std.moduleinit;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
4
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
5 //debug = 1;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
6
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
7 private
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
8 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
9 import object;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
10 import std.c.stdio;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
11 import std.c.stdlib;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
12 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
13
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
14 enum
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
15 { MIctorstart = 1, // we've started constructing it
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
16 MIctordone = 2, // finished construction
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
17 MIstandalone = 4, // module ctor does not depend on other module
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
18 // ctors being done first
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
19 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
20
116
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 89
diff changeset
21 // had to move the class to object.d, as its declaration is needed in the compiler code,
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 89
diff changeset
22 // otherwise the DMDFE Module::moduleinfo member is NULL
89
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
23
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
24 class ModuleCtorError : Exception
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
25 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
26 this(ModuleInfo m)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
27 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
28 super("circular initialization dependency with module " ~ m.name);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
29 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
30 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
31
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
32
117
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
33 // this gets initialized in _moduleCtor()
89
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
34 extern (C) ModuleInfo[] _moduleinfo_array;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
35
117
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
36 // this method returns the linker constructed, null terminated, array of moduleinfos
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
37 extern (C) void** _d_get_moduleinfo_array();
89
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
38
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
39 ModuleInfo[] _moduleinfo_dtors;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
40 uint _moduleinfo_dtors_i;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
41
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
42 // Register termination function pointers
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
43 extern (C) int _fatexit(void *);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
44
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
45 /*************************************
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
46 * Initialize the modules.
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
47 */
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
48
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
49 extern (C) void _moduleCtor()
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
50 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
51 debug printf("_moduleCtor()\n");
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
52 int len = 0;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
53
117
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
54 ModuleInfo* mrbegin = cast(ModuleInfo*)_d_get_moduleinfo_array();
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
55 assert(mrbegin !is null);
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
56
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
57 ModuleInfo* mr;
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
58 for (mr = mrbegin; *mr !is null; ++mr)
89
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
59 len++;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
60 _moduleinfo_array = new ModuleInfo[len];
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
61 len = 0;
117
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
62 for (mr = mrbegin; *mr !is null; ++mr)
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
63 { _moduleinfo_array[len] = *mr;
89
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
64 len++;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
65 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
66
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
67 version (Win32)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
68 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
69 // Ensure module destructors also get called on program termination
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
70 //_fatexit(&_STD_moduleDtor);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
71 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
72
117
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
73 _moduleinfo_dtors = new ModuleInfo[len];
89
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
74 debug printf("_moduleinfo_dtors = x%x\n", cast(void *)_moduleinfo_dtors);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
75 _moduleCtor2(_moduleinfo_array, 0);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
76
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
77 version (none)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
78 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
79 foreach (m; _moduleinfo_array)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
80 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
81 writefln("module %s, %d", m.name, m.localClasses.length);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
82 foreach (c; m.localClasses)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
83 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
84 writefln("\tclass %s", c.name);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
85 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
86 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
87 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
88 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
89
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
90 void _moduleCtor2(ModuleInfo[] mi, int skip)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
91 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
92 debug printf("_moduleCtor2(): %d modules\n", mi.length);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
93 for (uint i = 0; i < mi.length; i++)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
94 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
95 ModuleInfo m = mi[i];
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
96
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
97 debug printf("\tmodule[%d] = '%p'\n", i, m);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
98 if (!m)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
99 continue;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
100 debug printf("\tmodule[%d] = '%.*s'\n", i, m.name);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
101 if (m.flags & MIctordone)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
102 continue;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
103 debug printf("\tmodule[%d] = '%.*s', m = x%x\n", i, m.name, m);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
104
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
105 if (m.ctor || m.dtor)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
106 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
107 if (m.flags & MIctorstart)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
108 { if (skip || m.flags & MIstandalone)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
109 continue;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
110 throw new ModuleCtorError(m);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
111 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
112
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
113 m.flags |= MIctorstart;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
114 _moduleCtor2(m.importedModules, 0);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
115 if (m.ctor)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
116 (*m.ctor)();
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
117 m.flags &= ~MIctorstart;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
118 m.flags |= MIctordone;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
119
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
120 // Now that construction is done, register the destructor
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
121 //printf("\tadding module dtor x%x\n", m);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
122 assert(_moduleinfo_dtors_i < _moduleinfo_dtors.length);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
123 _moduleinfo_dtors[_moduleinfo_dtors_i++] = m;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
124 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
125 else
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
126 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
127 m.flags |= MIctordone;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
128 _moduleCtor2(m.importedModules, 1);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
129 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
130 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
131 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
132
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
133
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
134 /**********************************
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
135 * Destruct the modules.
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
136 */
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
137
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
138 // Starting the name with "_STD" means under linux a pointer to the
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
139 // function gets put in the .dtors segment.
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
140
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
141 extern (C) void _moduleDtor()
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
142 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
143 debug printf("_moduleDtor(): %d modules\n", _moduleinfo_dtors_i);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
144 for (uint i = _moduleinfo_dtors_i; i-- != 0;)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
145 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
146 ModuleInfo m = _moduleinfo_dtors[i];
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
147
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
148 debug printf("\tmodule[%d] = '%.*s', x%x\n", i, m.name, m);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
149 if (m.dtor)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
150 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
151 (*m.dtor)();
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
152 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
153 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
154 debug printf("_moduleDtor() done\n");
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
155 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
156
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
157 /**********************************
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
158 * Run unit tests.
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
159 */
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
160
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
161 extern (C) void _moduleUnitTests()
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
162 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
163 debug printf("_moduleUnitTests()\n");
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
164 for (uint i = 0; i < _moduleinfo_array.length; i++)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
165 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
166 ModuleInfo m = _moduleinfo_array[i];
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
167
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
168 if (!m)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
169 continue;
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
170
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
171 debug printf("\tmodule[%d] = '%.*s'\n", i, m.name);
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
172 if (m.unitTest)
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
173 {
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
174 (*m.unitTest)();
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
175 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
176 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
177 }
ccca1c13e13a [svn r93] a few fixes, some phobos additions.
lindquist
parents:
diff changeset
178