Mercurial > projects > ldc
annotate dmd/root/stringtable.h @ 1499:df11cdec45a2
Another shot at fixing the issues with (constant) struct literals and their addresses. See DMD2682, #218, #324.
The idea is to separate the notion of const from 'this variable can always be
replaced with its initializer' in the frontend. To do that, I introduced
Declaration::isSameAsInitializer, which is overridden in VarDeclaration to
return false for constants that have a struct literal initializer.
So
{{{
const S s = S(5);
void foo() { auto ps = &s; }
// is no longer replaced by
void foo() { auto ps = &(S(5)); }
}}}
To make taking the address of a struct constant with a struct-initializer
outside of function scope possible, I made sure that AddrExp::optimize doesn't
try to run the argument's optimization with WANTinterpret - that'd again
replace the constant with a struct literal temporary.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Sun, 14 Jun 2009 19:49:58 +0200 |
parents | 1853dcd9b944 |
children |
rev | line source |
---|---|
336 | 1 // Copyright (c) 1999-2008 by Digital Mars |
1 | 2 // All Rights Reserved |
3 // written by Walter Bright | |
336 | 4 // http://www.digitalmars.com |
1 | 5 // License for redistribution is by either the Artistic License |
6 // in artistic.txt, or the GNU General Public License in gnu.txt. | |
7 // See the included readme.txt for details. | |
8 | |
9 | |
10 #ifndef STRINGTABLE_H | |
11 #define STRINGTABLE_H | |
12 | |
13 #if __SC__ | |
14 #pragma once | |
15 #endif | |
16 | |
17 #include "root.h" | |
18 #include "dchar.h" | |
19 #include "lstring.h" | |
20 | |
21 struct StringValue | |
22 { | |
23 union | |
24 { int intvalue; | |
25 void *ptrvalue; | |
26 dchar *string; | |
27 }; | |
28 Lstring lstring; | |
29 }; | |
30 | |
31 struct StringTable : Object | |
32 { | |
33 void **table; | |
34 unsigned count; | |
35 unsigned tabledim; | |
36 | |
37 StringTable(unsigned size = 37); | |
38 ~StringTable(); | |
39 | |
40 StringValue *lookup(const dchar *s, unsigned len); | |
41 StringValue *insert(const dchar *s, unsigned len); | |
42 StringValue *update(const dchar *s, unsigned len); | |
43 | |
44 private: | |
45 void **search(const dchar *s, unsigned len); | |
46 }; | |
47 | |
48 #endif |